From b8fb68b44c29e4667f6ea5746119413809a60a9e Mon Sep 17 00:00:00 2001
From: z8018 <1282578289@qq.com>
Date: 星期三, 11 二月 2026 11:14:46 +0800
Subject: [PATCH] 添加 WMS 初始项目
---
KH.WMS/Test/KH.WMS.TestProj/TestOneService.cs | 22
KH.WMS/KH.WMS.Core/Database/UnitOfWorks/IUnitOfWork.cs | 50
KH.WMS/Test/KH.WMS.TestProj/ICallTraceDemoService.cs | 47
KH.WMS/Extensions/KH.WMS.Extensions/KH.WMS.Extensions.csproj | 9
KH.WMS/KH.WMS.Core/Logging/LogContext.cs | 77
KH.WMS/Tools/KH.WMS.Tools/KH.WMS.Tools.csproj | 16
KH.WMS/KH.WMS.Core/KH.WMS.Core.csproj | 38
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/SelfRegisteredServiceAttribute.cs | 17
KH.WMS/KH.WMS.Server/appsettings.json | 125 +
KH.WMS/Tools/KH.WMS.Tools/Program.cs | 2
KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogSetup.cs | 297 ++
KH.WMS/KH.WMS.Core/Setup/MiddlewareSetup.cs | 51
KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogOptions.cs | 77
KH.WMS/.vs/KH.WMS/v17/DocumentLayout.json | 855 +++++++
KH.WMS/KH.WMS.Core/Database/IDbContext.cs | 44
KH.WMS/KH.WMS.Server/Program.cs | 49
KH.WMS/Test/KH.WMS.TestProj/TestService.cs | 38
KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/SemanticSymbols.db | 0
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceExtensions.cs | 57
KH.WMS/Test/KH.WMS.TestProj/TestTwoService.cs | 21
KH.WMS/KH.WMS.sln | 77
KH.WMS/KH.WMS.Core/Setup/LoggingSetup.cs | 31
KH.WMS/KH.WMS.Core/Database/Repositories/RepositoryBase.cs | 121 +
KH.WMS/KH.WMS.Core/Constants/AppSettingsConstants.cs | 26
KH.WMS/KH.WMS.Core/AOP/LoggingInterceptor.cs | 83
KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/CodeChunks.db | 0
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/RegisteredServiceAttribute.cs | 21
KH.WMS/KH.WMS.Core/Monitoring/MiniProfiler/MiniProfilerSetup.cs | 86
KH.WMS/KH.WMS.Server/Properties/launchSettings.json | 29
KH.WMS/KH.WMS.Core/Setup/DatabaseSetup.cs | 18
KH.WMS/Common/KH.WMS.Common/KH.WMS.Common.csproj | 9
KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarSetup.cs | 120 +
KH.WMS/KH.WMS.Core/Setup/ServiceCollectionSetup.cs | 39
KH.WMS/KH.WMS.Core/DependencyInjection/IServiceRegistrar.cs | 15
KH.WMS/KH.WMS.Core/Api/Responses/ApiResponse.cs | 97
KH.WMS/KH.WMS.Server/Controllers/TestController.cs | 24
KH.WMS/.vs/KH.WMS/v17/DocumentLayout.backup.json | 854 +++++++
KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWorkExtensions.cs | 160 +
KH.WMS/.vs/KH.WMS/config/applicationhost.config | 1021 +++++++++
KH.WMS/KH.WMS.Core/Logging/LogModuleDetector.cs | 194 +
KH.WMS/KH.WMS.Core/Setup/ApiDocumentationSetup.cs | 30
KH.WMS/KH.WMS.Core/Attributes/LogInterceptorAttribute.cs | 37
KH.WMS/KH.WMS.Core/Setup/MonitoringSetup.cs | 28
KH.WMS/.vs/KH.WMS/v17/HierarchyCache.v1.txt | 0
KH.WMS/KH.WMS.Server/KH.WMS.Server.csproj | 18
KH.WMS/KH.WMS.Model/KH.WMS.Model.csproj | 9
KH.WMS/Test/KH.WMS.TestProj/ITestService.cs | 13
KH.WMS/KH.WMS.Core/Database/Repositories/IRepository.cs | 97
KH.WMS/KH.WMS.Core/Api/Responses/Pagination.cs | 167 +
KH.WMS/KH.WMS.Core/Logging/ILoggerService.cs | 71
KH.WMS/Test/KH.WMS.TestProj/KH.WMS.TestProj.csproj | 13
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogType.cs | 66
KH.WMS/KH.WMS.Core/Api/Documentation/Swagger/SwaggerSetup.cs | 160 +
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogModule.cs | 167 +
KH.WMS/KH.WMS.Core/Logging/Serilog/LoggerService.cs | 283 ++
KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarDbContext.cs | 93
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceRegistrar.cs | 168 +
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogLevelType.cs | 50
KH.WMS/KH.WMS.Server/appsettings.Development.json | 8
KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWork.cs | 100
KH.WMS/Test/KH.WMS.TestProj/CallTraceDemoService.cs | 67
61 files changed, 6,562 insertions(+), 0 deletions(-)
diff --git a/KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/CodeChunks.db b/KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/CodeChunks.db
new file mode 100644
index 0000000..a5631f3
--- /dev/null
+++ b/KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/CodeChunks.db
Binary files differ
diff --git a/KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/SemanticSymbols.db b/KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/SemanticSymbols.db
new file mode 100644
index 0000000..d80a4ab
--- /dev/null
+++ b/KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/SemanticSymbols.db
Binary files differ
diff --git a/KH.WMS/.vs/KH.WMS/config/applicationhost.config b/KH.WMS/.vs/KH.WMS/config/applicationhost.config
new file mode 100644
index 0000000..269dc55
--- /dev/null
+++ b/KH.WMS/.vs/KH.WMS/config/applicationhost.config
@@ -0,0 +1,1021 @@
+锘�<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ IIS configuration sections.
+
+ For schema documentation, see
+ %IIS_BIN%\config\schema\IIS_schema.xml.
+
+ Please make a backup of this file before making any changes to it.
+
+ NOTE: The following environment variables are available to be used
+ within this file and are understood by the IIS Express.
+
+ %IIS_USER_HOME% - The IIS Express home directory for the user
+ %IIS_SITES_HOME% - The default home directory for sites
+ %IIS_BIN% - The location of the IIS Express binaries
+ %SYSTEMDRIVE% - The drive letter of %IIS_BIN%
+
+-->
+
+<configuration>
+
+ <!--
+
+ The <configSections> section controls the registration of sections.
+ Section is the basic unit of deployment, locking, searching and
+ containment for configuration settings.
+
+ Every section belongs to one section group.
+ A section group is a container of logically-related sections.
+
+ Sections cannot be nested.
+ Section groups may be nested.
+
+ <section
+ name="" [Required, Collection Key] [XML name of the section]
+ allowDefinition="Everywhere" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set]
+ overrideModeDefault="Allow" [Allow|Deny] [Default delegation mode]
+ allowLocation="true" [true|false] [Allowed in location tags]
+ />
+
+ The recommended way to unlock sections is by using a location tag:
+ <location path="Default Web Site" overrideMode="Allow">
+ <system.webServer>
+ <asp />
+ </system.webServer>
+ </location>
+
+ -->
+ <configSections>
+ <sectionGroup name="system.applicationHost">
+ <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ </sectionGroup>
+
+ <sectionGroup name="system.webServer">
+ <section name="asp" overrideModeDefault="Deny" />
+ <section name="caching" overrideModeDefault="Allow" />
+ <section name="cgi" overrideModeDefault="Deny" />
+ <section name="defaultDocument" overrideModeDefault="Allow" />
+ <section name="directoryBrowse" overrideModeDefault="Allow" />
+ <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="globalModules" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="handlers" overrideModeDefault="Deny" />
+ <section name="httpCompression" overrideModeDefault="Allow" allowDefinition="Everywhere" />
+ <section name="httpErrors" overrideModeDefault="Allow" />
+ <section name="httpLogging" overrideModeDefault="Deny" />
+ <section name="httpProtocol" overrideModeDefault="Allow" />
+ <section name="httpRedirect" overrideModeDefault="Allow" />
+ <section name="httpTracing" overrideModeDefault="Deny" />
+ <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+ <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" />
+ <section name="applicationInitialization" allowDefinition="MachineToApplication" overrideModeDefault="Allow" />
+ <section name="odbcLogging" overrideModeDefault="Deny" />
+ <sectionGroup name="security">
+ <section name="access" overrideModeDefault="Deny" />
+ <section name="applicationDependencies" overrideModeDefault="Deny" />
+ <sectionGroup name="authentication">
+ <section name="anonymousAuthentication" overrideModeDefault="Deny" />
+ <section name="basicAuthentication" overrideModeDefault="Deny" />
+ <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+ <section name="digestAuthentication" overrideModeDefault="Deny" />
+ <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" />
+ <section name="windowsAuthentication" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <section name="authorization" overrideModeDefault="Allow" />
+ <section name="ipSecurity" overrideModeDefault="Deny" />
+ <section name="dynamicIpSecurity" overrideModeDefault="Deny" />
+ <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
+ <section name="requestFiltering" overrideModeDefault="Allow" />
+ </sectionGroup>
+ <section name="serverRuntime" overrideModeDefault="Deny" />
+ <section name="serverSideInclude" overrideModeDefault="Deny" />
+ <section name="staticContent" overrideModeDefault="Allow" />
+ <sectionGroup name="tracing">
+ <section name="traceFailedRequests" overrideModeDefault="Allow" />
+ <section name="traceProviderDefinitions" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <section name="urlCompression" overrideModeDefault="Allow" />
+ <section name="validation" overrideModeDefault="Allow" />
+ <sectionGroup name="webdav">
+ <section name="globalSettings" overrideModeDefault="Deny" />
+ <section name="authoring" overrideModeDefault="Deny" />
+ <section name="authoringRules" overrideModeDefault="Deny" />
+ </sectionGroup>
+ <sectionGroup name="rewrite">
+ <section name="allowedServerVariables" overrideModeDefault="Deny" />
+ <section name="rules" overrideModeDefault="Allow" />
+ <section name="outboundRules" overrideModeDefault="Allow" />
+ <section name="globalRules" overrideModeDefault="Deny" allowDefinition="AppHostOnly" />
+ <section name="providers" overrideModeDefault="Allow" />
+ <section name="rewriteMaps" overrideModeDefault="Allow" />
+ </sectionGroup>
+ <section name="webSocket" overrideModeDefault="Deny" />
+ </sectionGroup>
+ </configSections>
+
+ <configProtectedData>
+ <providers>
+ <add name="IISWASOnlyRsaProvider" type="" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" />
+ <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisConfigurationKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAA/HKxkz6alrlAPez0IUgujj/6k3WxCDriHp6jvpv3yEZmo7h6SMzGLxo4mTrIQVHSkB7tmElHKfUFTzE2BWF7nFWHY6Z6qmGBauFzwJMwESjril7Gjz69RBFH259HQ6aRDq9Xfx7U7H4HtdmnKNqGjgl/hwPQBGeIlWiDh+sYv3vKB0QU971tjX6H2B+9armlnC8UOuA6JYMDMI/VLLL16sng0fWAy5JYe0YVABVjiAWDW264RZW9Tr1Oax4qHZKg+SdjULxeOc2YmpX+d0yeITo1HkPF1hN1gHpIPIUDo05ilHUNfR3OkjVCIQK4cFKCq1s8NH+y+13MxUC4Fn1AlQ==" />
+ <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAALmU8lTC+v2qtfQiiiquvvLpUQqKLEXs+jSKoWCM/uPhyB++k4dwug19mGidNK5FYiWK2KYE1yhjVJcbp12E98Q0R2nT7eBiCMY2JairxQ591rqABK7keGaIjwH7PwGzSpILl3RJ4YFvJ/7ZXEJxeDZIjW8ZxWVXx+/VyHs9U3WguLEkgMUX3jrxJi8LouxaIVPJAv/YQ1ZCWs8zImitxX/C/7o7yaIxznfsN5nGQzQfpUDPeby99aw2zPVTtZI2LaWIBON8guABvZ6JtJVDWmfdK6sodbnwdZkr6/Z2rfvamT1dC1SpQrGG7ulR/f9/GXvCaW10ZVKxekBF/CYlNMg==" />
+ </providers>
+ </configProtectedData>
+
+ <system.applicationHost>
+
+ <applicationPools>
+ <add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr4ClassicAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr2IntegratedAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="Clr2ClassicAppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true" />
+ <add name="UnmanagedClassicAppPool" managedRuntimeVersion="" managedPipelineMode="Classic" autoStart="true" />
+ <applicationPoolDefaults managedRuntimeVersion="v4.0">
+ <processModel loadUserProfile="true" setProfileEnvironment="false" />
+ </applicationPoolDefaults>
+ </applicationPools>
+
+ <!--
+
+ The <listenerAdapters> section defines the protocols with which the
+ Windows Process Activation Service (WAS) binds.
+
+ -->
+ <listenerAdapters>
+ <add name="http" />
+ </listenerAdapters>
+
+ <sites>
+ <site name="WebSite1" id="1" serverAutoStart="true">
+ <application path="/">
+ <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
+ </application>
+ <bindings>
+ <binding protocol="http" bindingInformation=":8080:localhost" />
+ </bindings>
+ </site>
+ <siteDefaults>
+ <!-- To enable logging, please change the below attribute "enabled" to "true" -->
+ <logFile logFormat="W3C" directory="%AppData%\Microsoft\IISExpressLogs" enabled="false"/>
+ <traceFailedRequestsLogging directory="%AppData%\Microsoft" enabled="false" maxLogFileSizeKB="1024" />
+ </siteDefaults>
+ <applicationDefaults applicationPool="Clr4IntegratedAppPool" />
+ <virtualDirectoryDefaults allowSubDirConfig="true" />
+ </sites>
+
+ <webLimits />
+
+ </system.applicationHost>
+
+ <system.webServer>
+
+ <serverRuntime />
+
+ <asp scriptErrorSentToBrowser="true">
+ <cache diskTemplateCacheDirectory="%TEMP%\iisexpress\ASP Compiled Templates" />
+ <limits />
+ </asp>
+
+ <caching enabled="true" enableKernelCache="true">
+ </caching>
+
+ <cgi />
+
+ <defaultDocument enabled="true">
+ <files>
+ <add value="Default.htm" />
+ <add value="Default.asp" />
+ <add value="index.htm" />
+ <add value="index.html" />
+ <add value="iisstart.htm" />
+ <add value="default.aspx" />
+ </files>
+ </defaultDocument>
+
+ <directoryBrowse enabled="false" />
+
+ <fastCgi />
+
+ <!--
+
+ The <globalModules> section defines all native-code modules.
+ To enable a module, specify it in the <modules> section.
+
+ -->
+ <globalModules>
+ <add name="HttpLoggingModule" image="%IIS_BIN%\loghttp.dll" />
+ <add name="UriCacheModule" image="%IIS_BIN%\cachuri.dll" />
+ <add name="TokenCacheModule" image="%IIS_BIN%\cachtokn.dll" />
+ <add name="DynamicCompressionModule" image="%IIS_BIN%\compdyn.dll" />
+ <add name="StaticCompressionModule" image="%IIS_BIN%\compstat.dll" />
+ <add name="DefaultDocumentModule" image="%IIS_BIN%\defdoc.dll" />
+ <add name="DirectoryListingModule" image="%IIS_BIN%\dirlist.dll" />
+ <add name="ProtocolSupportModule" image="%IIS_BIN%\protsup.dll" />
+ <add name="HttpRedirectionModule" image="%IIS_BIN%\redirect.dll" />
+ <add name="ServerSideIncludeModule" image="%IIS_BIN%\iis_ssi.dll" />
+ <add name="StaticFileModule" image="%IIS_BIN%\static.dll" />
+ <add name="AnonymousAuthenticationModule" image="%IIS_BIN%\authanon.dll" />
+ <add name="CertificateMappingAuthenticationModule" image="%IIS_BIN%\authcert.dll" />
+ <add name="UrlAuthorizationModule" image="%IIS_BIN%\urlauthz.dll" />
+ <add name="BasicAuthenticationModule" image="%IIS_BIN%\authbas.dll" />
+ <add name="WindowsAuthenticationModule" image="%IIS_BIN%\authsspi.dll" />
+ <add name="IISCertificateMappingAuthenticationModule" image="%IIS_BIN%\authmap.dll" />
+ <add name="IpRestrictionModule" image="%IIS_BIN%\iprestr.dll" />
+ <add name="DynamicIpRestrictionModule" image="%IIS_BIN%\diprestr.dll" />
+ <add name="RequestFilteringModule" image="%IIS_BIN%\modrqflt.dll" />
+ <add name="CustomLoggingModule" image="%IIS_BIN%\logcust.dll" />
+ <add name="CustomErrorModule" image="%IIS_BIN%\custerr.dll" />
+ <add name="FailedRequestsTracingModule" image="%IIS_BIN%\iisfreb.dll" />
+ <add name="RequestMonitorModule" image="%IIS_BIN%\iisreqs.dll" />
+ <add name="IsapiModule" image="%IIS_BIN%\isapi.dll" />
+ <add name="IsapiFilterModule" image="%IIS_BIN%\filter.dll" />
+ <add name="CgiModule" image="%IIS_BIN%\cgi.dll" />
+ <add name="FastCgiModule" image="%IIS_BIN%\iisfcgi.dll" />
+<!-- <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> -->
+ <add name="RewriteModule" image="%IIS_BIN%\rewrite.dll" />
+ <add name="ConfigurationValidationModule" image="%IIS_BIN%\validcfg.dll" />
+ <add name="WebSocketModule" image="%IIS_BIN%\iiswsock.dll" />
+ <add name="WebMatrixSupportModule" image="%IIS_BIN%\webmatrixsup.dll" />
+ <add name="ManagedEngine" image="%windir%\Microsoft.NET\Framework\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness32" />
+ <add name="ManagedEngine64" image="%windir%\Microsoft.NET\Framework64\v2.0.50727\webengine.dll" preCondition="integratedMode,runtimeVersionv2.0,bitness64" />
+ <add name="ManagedEngineV4.0_32bit" image="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness32" />
+ <add name="ManagedEngineV4.0_64bit" image="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" preCondition="integratedMode,runtimeVersionv4.0,bitness64" />
+ <add name="ApplicationInitializationModule" image="%IIS_BIN%\warmup.dll" />
+ </globalModules>
+
+ <httpCompression directory="%TEMP%">
+ <scheme name="gzip" dll="%IIS_BIN%\gzip.dll" />
+ <dynamicTypes>
+ <add mimeType="text/*" enabled="true" />
+ <add mimeType="message/*" enabled="true" />
+ <add mimeType="application/x-javascript" enabled="true" />
+ <add mimeType="application/javascript" enabled="true" />
+ <add mimeType="*/*" enabled="false" />
+ </dynamicTypes>
+ <staticTypes>
+ <add mimeType="text/*" enabled="true" />
+ <add mimeType="message/*" enabled="true" />
+ <add mimeType="application/javascript" enabled="true" />
+ <add mimeType="application/atom+xml" enabled="true" />
+ <add mimeType="application/xaml+xml" enabled="true" />
+ <add mimeType="image/svg+xml" enabled="true" />
+ <add mimeType="*/*" enabled="false" />
+ </staticTypes>
+ </httpCompression>
+
+ <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">
+ <error statusCode="401" prefixLanguageFilePath="%IIS_BIN%\custerr" path="401.htm" />
+ <error statusCode="403" prefixLanguageFilePath="%IIS_BIN%\custerr" path="403.htm" />
+ <error statusCode="404" prefixLanguageFilePath="%IIS_BIN%\custerr" path="404.htm" />
+ <error statusCode="405" prefixLanguageFilePath="%IIS_BIN%\custerr" path="405.htm" />
+ <error statusCode="406" prefixLanguageFilePath="%IIS_BIN%\custerr" path="406.htm" />
+ <error statusCode="412" prefixLanguageFilePath="%IIS_BIN%\custerr" path="412.htm" />
+ <error statusCode="500" prefixLanguageFilePath="%IIS_BIN%\custerr" path="500.htm" />
+ <error statusCode="501" prefixLanguageFilePath="%IIS_BIN%\custerr" path="501.htm" />
+ <error statusCode="502" prefixLanguageFilePath="%IIS_BIN%\custerr" path="502.htm" />
+ </httpErrors>
+
+ <httpLogging dontLog="false" />
+
+ <httpProtocol>
+ <customHeaders>
+ <clear />
+ <add name="X-Powered-By" value="ASP.NET" />
+ </customHeaders>
+ <redirectHeaders>
+ <clear />
+ </redirectHeaders>
+ </httpProtocol>
+
+ <httpRedirect enabled="false" />
+
+ <httpTracing />
+
+ <isapiFilters>
+ <filter name="ASP.Net_2.0.50727-64" path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv2.0" />
+ <filter name="ASP.Net_2.0.50727.0" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv2.0" />
+ <filter name="ASP.Net_2.0_for_v1.1" path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll" enableCache="true" preCondition="runtimeVersionv1.1" />
+ <filter name="ASP.Net_4.0_32bit" path="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness32,runtimeVersionv4.0" />
+ <filter name="ASP.Net_4.0_64bit" path="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_filter.dll" enableCache="true" preCondition="bitness64,runtimeVersionv4.0" />
+ </isapiFilters>
+
+ <odbcLogging />
+
+ <security>
+
+ <access sslFlags="None" />
+
+ <applicationDependencies>
+ <application name="Active Server Pages" groupId="ASP" />
+ </applicationDependencies>
+
+ <authentication>
+
+ <anonymousAuthentication enabled="true" userName="" />
+
+ <basicAuthentication enabled="false" />
+
+ <clientCertificateMappingAuthentication enabled="false" />
+
+ <digestAuthentication enabled="false" />
+
+ <iisClientCertificateMappingAuthentication enabled="false">
+ </iisClientCertificateMappingAuthentication>
+
+ <windowsAuthentication enabled="false">
+ <providers>
+ <add value="Negotiate" />
+ <add value="NTLM" />
+ </providers>
+ </windowsAuthentication>
+
+ </authentication>
+
+ <authorization>
+ <add accessType="Allow" users="*" />
+ </authorization>
+
+ <ipSecurity allowUnlisted="true" />
+
+ <isapiCgiRestriction notListedIsapisAllowed="true" notListedCgisAllowed="true">
+ <add path="%windir%\Microsoft.NET\Framework64\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
+ <add path="%windir%\Microsoft.NET\Framework\v4.0.30319\webengine4.dll" allowed="true" groupId="ASP.NET_v4.0" description="ASP.NET_v4.0" />
+ <add path="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
+ <add path="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" allowed="true" groupId="ASP.NET v2.0.50727" description="ASP.NET v2.0.50727" />
+ </isapiCgiRestriction>
+
+ <requestFiltering>
+ <fileExtensions allowUnlisted="true" applyToWebDAV="true">
+ <add fileExtension=".asa" allowed="false" />
+ <add fileExtension=".asax" allowed="false" />
+ <add fileExtension=".ascx" allowed="false" />
+ <add fileExtension=".master" allowed="false" />
+ <add fileExtension=".skin" allowed="false" />
+ <add fileExtension=".browser" allowed="false" />
+ <add fileExtension=".sitemap" allowed="false" />
+ <add fileExtension=".config" allowed="false" />
+ <add fileExtension=".cs" allowed="false" />
+ <add fileExtension=".csproj" allowed="false" />
+ <add fileExtension=".vb" allowed="false" />
+ <add fileExtension=".vbproj" allowed="false" />
+ <add fileExtension=".webinfo" allowed="false" />
+ <add fileExtension=".licx" allowed="false" />
+ <add fileExtension=".resx" allowed="false" />
+ <add fileExtension=".resources" allowed="false" />
+ <add fileExtension=".mdb" allowed="false" />
+ <add fileExtension=".vjsproj" allowed="false" />
+ <add fileExtension=".java" allowed="false" />
+ <add fileExtension=".jsl" allowed="false" />
+ <add fileExtension=".ldb" allowed="false" />
+ <add fileExtension=".dsdgm" allowed="false" />
+ <add fileExtension=".ssdgm" allowed="false" />
+ <add fileExtension=".lsad" allowed="false" />
+ <add fileExtension=".ssmap" allowed="false" />
+ <add fileExtension=".cd" allowed="false" />
+ <add fileExtension=".dsprototype" allowed="false" />
+ <add fileExtension=".lsaprototype" allowed="false" />
+ <add fileExtension=".sdm" allowed="false" />
+ <add fileExtension=".sdmDocument" allowed="false" />
+ <add fileExtension=".mdf" allowed="false" />
+ <add fileExtension=".ldf" allowed="false" />
+ <add fileExtension=".ad" allowed="false" />
+ <add fileExtension=".dd" allowed="false" />
+ <add fileExtension=".ldd" allowed="false" />
+ <add fileExtension=".sd" allowed="false" />
+ <add fileExtension=".adprototype" allowed="false" />
+ <add fileExtension=".lddprototype" allowed="false" />
+ <add fileExtension=".exclude" allowed="false" />
+ <add fileExtension=".refresh" allowed="false" />
+ <add fileExtension=".compiled" allowed="false" />
+ <add fileExtension=".msgx" allowed="false" />
+ <add fileExtension=".vsdisco" allowed="false" />
+ <add fileExtension=".rules" allowed="false" />
+ </fileExtensions>
+ <verbs allowUnlisted="true" applyToWebDAV="true" />
+ <hiddenSegments applyToWebDAV="true">
+ <add segment="web.config" />
+ <add segment="bin" />
+ <add segment="App_code" />
+ <add segment="App_GlobalResources" />
+ <add segment="App_LocalResources" />
+ <add segment="App_WebReferences" />
+ <add segment="App_Data" />
+ <add segment="App_Browsers" />
+ </hiddenSegments>
+ </requestFiltering>
+
+ </security>
+
+ <serverSideInclude ssiExecDisable="false" />
+
+ <staticContent lockAttributes="isDocFooterFileName">
+ <mimeMap fileExtension=".323" mimeType="text/h323" />
+ <mimeMap fileExtension=".3g2" mimeType="video/3gpp2" />
+ <mimeMap fileExtension=".3gp2" mimeType="video/3gpp2" />
+ <mimeMap fileExtension=".3gp" mimeType="video/3gpp" />
+ <mimeMap fileExtension=".3gpp" mimeType="video/3gpp" />
+ <mimeMap fileExtension=".aac" mimeType="audio/aac" />
+ <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".accdb" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".accde" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".accdt" mimeType="application/msaccess" />
+ <mimeMap fileExtension=".acx" mimeType="application/internet-property-stream" />
+ <mimeMap fileExtension=".adt" mimeType="audio/vnd.dlna.adts" />
+ <mimeMap fileExtension=".adts" mimeType="audio/vnd.dlna.adts" />
+ <mimeMap fileExtension=".afm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ai" mimeType="application/postscript" />
+ <mimeMap fileExtension=".aif" mimeType="audio/x-aiff" />
+ <mimeMap fileExtension=".aifc" mimeType="audio/aiff" />
+ <mimeMap fileExtension=".aiff" mimeType="audio/aiff" />
+ <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" />
+ <mimeMap fileExtension=".application" mimeType="application/x-ms-application" />
+ <mimeMap fileExtension=".art" mimeType="image/x-jg" />
+ <mimeMap fileExtension=".asd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".asf" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".asi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".asm" mimeType="text/plain" />
+ <mimeMap fileExtension=".asr" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".asx" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".atom" mimeType="application/atom+xml" />
+ <mimeMap fileExtension=".au" mimeType="audio/basic" />
+ <mimeMap fileExtension=".avi" mimeType="video/avi" />
+ <mimeMap fileExtension=".axs" mimeType="application/olescript" />
+ <mimeMap fileExtension=".bas" mimeType="text/plain" />
+ <mimeMap fileExtension=".bcpio" mimeType="application/x-bcpio" />
+ <mimeMap fileExtension=".bin" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".bmp" mimeType="image/bmp" />
+ <mimeMap fileExtension=".c" mimeType="text/plain" />
+ <mimeMap fileExtension=".cab" mimeType="application/vnd.ms-cab-compressed" />
+ <mimeMap fileExtension=".calx" mimeType="application/vnd.ms-office.calx" />
+ <mimeMap fileExtension=".cat" mimeType="application/vnd.ms-pki.seccat" />
+ <mimeMap fileExtension=".cdf" mimeType="application/x-cdf" />
+ <mimeMap fileExtension=".chm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".class" mimeType="application/x-java-applet" />
+ <mimeMap fileExtension=".clp" mimeType="application/x-msclip" />
+ <mimeMap fileExtension=".cmx" mimeType="image/x-cmx" />
+ <mimeMap fileExtension=".cnf" mimeType="text/plain" />
+ <mimeMap fileExtension=".cod" mimeType="image/cis-cod" />
+ <mimeMap fileExtension=".cpio" mimeType="application/x-cpio" />
+ <mimeMap fileExtension=".cpp" mimeType="text/plain" />
+ <mimeMap fileExtension=".crd" mimeType="application/x-mscardfile" />
+ <mimeMap fileExtension=".crl" mimeType="application/pkix-crl" />
+ <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" />
+ <mimeMap fileExtension=".csh" mimeType="application/x-csh" />
+ <mimeMap fileExtension=".css" mimeType="text/css" />
+ <mimeMap fileExtension=".csv" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".cur" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dcr" mimeType="application/x-director" />
+ <mimeMap fileExtension=".deploy" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".der" mimeType="application/x-x509-ca-cert" />
+ <mimeMap fileExtension=".dib" mimeType="image/bmp" />
+ <mimeMap fileExtension=".dir" mimeType="application/x-director" />
+ <mimeMap fileExtension=".disco" mimeType="text/xml" />
+ <mimeMap fileExtension=".dll" mimeType="application/x-msdownload" />
+ <mimeMap fileExtension=".dll.config" mimeType="text/xml" />
+ <mimeMap fileExtension=".dlm" mimeType="text/dlm" />
+ <mimeMap fileExtension=".doc" mimeType="application/msword" />
+ <mimeMap fileExtension=".docm" mimeType="application/vnd.ms-word.document.macroEnabled.12" />
+ <mimeMap fileExtension=".docx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
+ <mimeMap fileExtension=".dot" mimeType="application/msword" />
+ <mimeMap fileExtension=".dotm" mimeType="application/vnd.ms-word.template.macroEnabled.12" />
+ <mimeMap fileExtension=".dotx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" />
+ <mimeMap fileExtension=".dsp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dtd" mimeType="text/xml" />
+ <mimeMap fileExtension=".dvi" mimeType="application/x-dvi" />
+ <mimeMap fileExtension=".dvr-ms" mimeType="video/x-ms-dvr" />
+ <mimeMap fileExtension=".dwf" mimeType="drawing/x-dwf" />
+ <mimeMap fileExtension=".dwp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".dxr" mimeType="application/x-director" />
+ <mimeMap fileExtension=".eml" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".emz" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
+ <mimeMap fileExtension=".eps" mimeType="application/postscript" />
+ <mimeMap fileExtension=".esd" mimeType="application/vnd.ms-cab-compressed" />
+ <mimeMap fileExtension=".etx" mimeType="text/x-setext" />
+ <mimeMap fileExtension=".evy" mimeType="application/envoy" />
+ <mimeMap fileExtension=".exe" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".exe.config" mimeType="text/xml" />
+ <mimeMap fileExtension=".fdf" mimeType="application/vnd.fdf" />
+ <mimeMap fileExtension=".fif" mimeType="application/fractals" />
+ <mimeMap fileExtension=".fla" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".flr" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".flv" mimeType="video/x-flv" />
+ <mimeMap fileExtension=".gif" mimeType="image/gif" />
+ <mimeMap fileExtension=".glb" mimeType="model/gltf-binary" />
+ <mimeMap fileExtension=".gtar" mimeType="application/x-gtar" />
+ <mimeMap fileExtension=".gz" mimeType="application/x-gzip" />
+ <mimeMap fileExtension=".h" mimeType="text/plain" />
+ <mimeMap fileExtension=".hdf" mimeType="application/x-hdf" />
+ <mimeMap fileExtension=".hdml" mimeType="text/x-hdml" />
+ <mimeMap fileExtension=".hhc" mimeType="application/x-oleobject" />
+ <mimeMap fileExtension=".hhk" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".hhp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".hlp" mimeType="application/winhlp" />
+ <mimeMap fileExtension=".hqx" mimeType="application/mac-binhex40" />
+ <mimeMap fileExtension=".hta" mimeType="application/hta" />
+ <mimeMap fileExtension=".htc" mimeType="text/x-component" />
+ <mimeMap fileExtension=".htm" mimeType="text/html" />
+ <mimeMap fileExtension=".html" mimeType="text/html" />
+ <mimeMap fileExtension=".htt" mimeType="text/webviewhtml" />
+ <mimeMap fileExtension=".hxt" mimeType="text/html" />
+ <mimeMap fileExtension=".ico" mimeType="image/x-icon" />
+ <mimeMap fileExtension=".ics" mimeType="text/calendar" />
+ <mimeMap fileExtension=".ief" mimeType="image/ief" />
+ <mimeMap fileExtension=".iii" mimeType="application/x-iphone" />
+ <mimeMap fileExtension=".inf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ins" mimeType="application/x-internet-signup" />
+ <mimeMap fileExtension=".isp" mimeType="application/x-internet-signup" />
+ <mimeMap fileExtension=".IVF" mimeType="video/x-ivf" />
+ <mimeMap fileExtension=".jar" mimeType="application/java-archive" />
+ <mimeMap fileExtension=".java" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".jck" mimeType="application/liquidmotion" />
+ <mimeMap fileExtension=".jcz" mimeType="application/liquidmotion" />
+ <mimeMap fileExtension=".jfif" mimeType="image/pjpeg" />
+ <mimeMap fileExtension=".jpb" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".jpe" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".jpeg" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
+ <mimeMap fileExtension=".js" mimeType="application/javascript" />
+ <mimeMap fileExtension=".json" mimeType="application/json" />
+ <mimeMap fileExtension=".jsonld" mimeType="application/ld+json" />
+ <mimeMap fileExtension=".jsx" mimeType="text/jscript" />
+ <mimeMap fileExtension=".latex" mimeType="application/x-latex" />
+ <mimeMap fileExtension=".less" mimeType="text/css" />
+ <mimeMap fileExtension=".lit" mimeType="application/x-ms-reader" />
+ <mimeMap fileExtension=".lpk" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".lsf" mimeType="video/x-la-asf" />
+ <mimeMap fileExtension=".lsx" mimeType="video/x-la-asf" />
+ <mimeMap fileExtension=".lzh" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".m13" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".m14" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".m1v" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".m2ts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".m3u" mimeType="audio/x-mpegurl" />
+ <mimeMap fileExtension=".m4a" mimeType="audio/mp4" />
+ <mimeMap fileExtension=".m4v" mimeType="video/mp4" />
+ <mimeMap fileExtension=".man" mimeType="application/x-troff-man" />
+ <mimeMap fileExtension=".manifest" mimeType="application/x-ms-manifest" />
+ <mimeMap fileExtension=".map" mimeType="text/plain" />
+ <mimeMap fileExtension=".mdb" mimeType="application/x-msaccess" />
+ <mimeMap fileExtension=".mdp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".me" mimeType="application/x-troff-me" />
+ <mimeMap fileExtension=".mht" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".mhtml" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".mid" mimeType="audio/mid" />
+ <mimeMap fileExtension=".midi" mimeType="audio/mid" />
+ <mimeMap fileExtension=".mix" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mmf" mimeType="application/x-smaf" />
+ <mimeMap fileExtension=".mno" mimeType="text/xml" />
+ <mimeMap fileExtension=".mny" mimeType="application/x-msmoney" />
+ <mimeMap fileExtension=".mov" mimeType="video/quicktime" />
+ <mimeMap fileExtension=".movie" mimeType="video/x-sgi-movie" />
+ <mimeMap fileExtension=".mp2" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mp3" mimeType="audio/mpeg" />
+ <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
+ <mimeMap fileExtension=".mp4v" mimeType="video/mp4" />
+ <mimeMap fileExtension=".mpa" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpe" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpeg" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpg" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".mpp" mimeType="application/vnd.ms-project" />
+ <mimeMap fileExtension=".mpv2" mimeType="video/mpeg" />
+ <mimeMap fileExtension=".ms" mimeType="application/x-troff-ms" />
+ <mimeMap fileExtension=".msi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mso" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".mvb" mimeType="application/x-msmediaview" />
+ <mimeMap fileExtension=".mvc" mimeType="application/x-miva-compiled" />
+ <mimeMap fileExtension=".nc" mimeType="application/x-netcdf" />
+ <mimeMap fileExtension=".nsc" mimeType="video/x-ms-asf" />
+ <mimeMap fileExtension=".nws" mimeType="message/rfc822" />
+ <mimeMap fileExtension=".ocx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".oda" mimeType="application/oda" />
+ <mimeMap fileExtension=".odc" mimeType="text/x-ms-odc" />
+ <mimeMap fileExtension=".ods" mimeType="application/oleobject" />
+ <mimeMap fileExtension=".oga" mimeType="audio/ogg" />
+ <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
+ <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
+ <mimeMap fileExtension=".one" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onea" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetoc" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetoc2" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onetmp" mimeType="application/onenote" />
+ <mimeMap fileExtension=".onepkg" mimeType="application/onenote" />
+ <mimeMap fileExtension=".osdx" mimeType="application/opensearchdescription+xml" />
+ <mimeMap fileExtension=".otf" mimeType="font/otf" />
+ <mimeMap fileExtension=".p10" mimeType="application/pkcs10" />
+ <mimeMap fileExtension=".p12" mimeType="application/x-pkcs12" />
+ <mimeMap fileExtension=".p7b" mimeType="application/x-pkcs7-certificates" />
+ <mimeMap fileExtension=".p7c" mimeType="application/pkcs7-mime" />
+ <mimeMap fileExtension=".p7m" mimeType="application/pkcs7-mime" />
+ <mimeMap fileExtension=".p7r" mimeType="application/x-pkcs7-certreqresp" />
+ <mimeMap fileExtension=".p7s" mimeType="application/pkcs7-signature" />
+ <mimeMap fileExtension=".pbm" mimeType="image/x-portable-bitmap" />
+ <mimeMap fileExtension=".pcx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pcz" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pdf" mimeType="application/pdf" />
+ <mimeMap fileExtension=".pfb" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pfm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pfx" mimeType="application/x-pkcs12" />
+ <mimeMap fileExtension=".pgm" mimeType="image/x-portable-graymap" />
+ <mimeMap fileExtension=".pko" mimeType="application/vnd.ms-pki.pko" />
+ <mimeMap fileExtension=".pma" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmc" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pml" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmr" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".pmw" mimeType="application/x-perfmon" />
+ <mimeMap fileExtension=".png" mimeType="image/png" />
+ <mimeMap fileExtension=".pnm" mimeType="image/x-portable-anymap" />
+ <mimeMap fileExtension=".pnz" mimeType="image/png" />
+ <mimeMap fileExtension=".pot" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".potm" mimeType="application/vnd.ms-powerpoint.template.macroEnabled.12" />
+ <mimeMap fileExtension=".potx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" />
+ <mimeMap fileExtension=".ppam" mimeType="application/vnd.ms-powerpoint.addin.macroEnabled.12" />
+ <mimeMap fileExtension=".ppm" mimeType="image/x-portable-pixmap" />
+ <mimeMap fileExtension=".pps" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".ppsm" mimeType="application/vnd.ms-powerpoint.slideshow.macroEnabled.12" />
+ <mimeMap fileExtension=".ppsx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" />
+ <mimeMap fileExtension=".ppt" mimeType="application/vnd.ms-powerpoint" />
+ <mimeMap fileExtension=".pptm" mimeType="application/vnd.ms-powerpoint.presentation.macroEnabled.12" />
+ <mimeMap fileExtension=".pptx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
+ <mimeMap fileExtension=".prf" mimeType="application/pics-rules" />
+ <mimeMap fileExtension=".prm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".prx" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ps" mimeType="application/postscript" />
+ <mimeMap fileExtension=".psd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".psm" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".psp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".pub" mimeType="application/x-mspublisher" />
+ <mimeMap fileExtension=".qt" mimeType="video/quicktime" />
+ <mimeMap fileExtension=".qtl" mimeType="application/x-quicktimeplayer" />
+ <mimeMap fileExtension=".qxd" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ra" mimeType="audio/x-pn-realaudio" />
+ <mimeMap fileExtension=".ram" mimeType="audio/x-pn-realaudio" />
+ <mimeMap fileExtension=".rar" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".ras" mimeType="image/x-cmu-raster" />
+ <mimeMap fileExtension=".rf" mimeType="image/vnd.rn-realflash" />
+ <mimeMap fileExtension=".rgb" mimeType="image/x-rgb" />
+ <mimeMap fileExtension=".rm" mimeType="application/vnd.rn-realmedia" />
+ <mimeMap fileExtension=".rmi" mimeType="audio/mid" />
+ <mimeMap fileExtension=".roff" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".rpm" mimeType="audio/x-pn-realaudio-plugin" />
+ <mimeMap fileExtension=".rtf" mimeType="application/rtf" />
+ <mimeMap fileExtension=".rtx" mimeType="text/richtext" />
+ <mimeMap fileExtension=".scd" mimeType="application/x-msschedule" />
+ <mimeMap fileExtension=".sct" mimeType="text/scriptlet" />
+ <mimeMap fileExtension=".sea" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".setpay" mimeType="application/set-payment-initiation" />
+ <mimeMap fileExtension=".setreg" mimeType="application/set-registration-initiation" />
+ <mimeMap fileExtension=".sgml" mimeType="text/sgml" />
+ <mimeMap fileExtension=".sh" mimeType="application/x-sh" />
+ <mimeMap fileExtension=".shar" mimeType="application/x-shar" />
+ <mimeMap fileExtension=".sit" mimeType="application/x-stuffit" />
+ <mimeMap fileExtension=".sldm" mimeType="application/vnd.ms-powerpoint.slide.macroEnabled.12" />
+ <mimeMap fileExtension=".sldx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slide" />
+ <mimeMap fileExtension=".smd" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".smi" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".smx" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".smz" mimeType="audio/x-smd" />
+ <mimeMap fileExtension=".snd" mimeType="audio/basic" />
+ <mimeMap fileExtension=".snp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".spc" mimeType="application/x-pkcs7-certificates" />
+ <mimeMap fileExtension=".spl" mimeType="application/futuresplash" />
+ <mimeMap fileExtension=".spx" mimeType="audio/ogg" />
+ <mimeMap fileExtension=".src" mimeType="application/x-wais-source" />
+ <mimeMap fileExtension=".ssm" mimeType="application/streamingmedia" />
+ <mimeMap fileExtension=".sst" mimeType="application/vnd.ms-pki.certstore" />
+ <mimeMap fileExtension=".stl" mimeType="application/vnd.ms-pki.stl" />
+ <mimeMap fileExtension=".sv4cpio" mimeType="application/x-sv4cpio" />
+ <mimeMap fileExtension=".sv4crc" mimeType="application/x-sv4crc" />
+ <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
+ <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" />
+ <mimeMap fileExtension=".swf" mimeType="application/x-shockwave-flash" />
+ <mimeMap fileExtension=".t" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".tar" mimeType="application/x-tar" />
+ <mimeMap fileExtension=".tcl" mimeType="application/x-tcl" />
+ <mimeMap fileExtension=".tex" mimeType="application/x-tex" />
+ <mimeMap fileExtension=".texi" mimeType="application/x-texinfo" />
+ <mimeMap fileExtension=".texinfo" mimeType="application/x-texinfo" />
+ <mimeMap fileExtension=".tgz" mimeType="application/x-compressed" />
+ <mimeMap fileExtension=".thmx" mimeType="application/vnd.ms-officetheme" />
+ <mimeMap fileExtension=".thn" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tif" mimeType="image/tiff" />
+ <mimeMap fileExtension=".tiff" mimeType="image/tiff" />
+ <mimeMap fileExtension=".toc" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tr" mimeType="application/x-troff" />
+ <mimeMap fileExtension=".trm" mimeType="application/x-msterminal" />
+ <mimeMap fileExtension=".ts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".tsv" mimeType="text/tab-separated-values" />
+ <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".tts" mimeType="video/vnd.dlna.mpeg-tts" />
+ <mimeMap fileExtension=".txt" mimeType="text/plain" />
+ <mimeMap fileExtension=".u32" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".uls" mimeType="text/iuls" />
+ <mimeMap fileExtension=".ustar" mimeType="application/x-ustar" />
+ <mimeMap fileExtension=".vbs" mimeType="text/vbscript" />
+ <mimeMap fileExtension=".vcf" mimeType="text/x-vcard" />
+ <mimeMap fileExtension=".vcs" mimeType="text/plain" />
+ <mimeMap fileExtension=".vdx" mimeType="application/vnd.ms-visio.viewer" />
+ <mimeMap fileExtension=".vml" mimeType="text/xml" />
+ <mimeMap fileExtension=".vsd" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vss" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vst" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vsto" mimeType="application/x-ms-vsto" />
+ <mimeMap fileExtension=".vsw" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vsx" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".vtx" mimeType="application/vnd.visio" />
+ <mimeMap fileExtension=".wasm" mimeType="application/wasm" />
+ <mimeMap fileExtension=".wav" mimeType="audio/wav" />
+ <mimeMap fileExtension=".wax" mimeType="audio/x-ms-wax" />
+ <mimeMap fileExtension=".wbmp" mimeType="image/vnd.wap.wbmp" />
+ <mimeMap fileExtension=".wcm" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wdb" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".webm" mimeType="video/webm" />
+ <mimeMap fileExtension=".wks" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wm" mimeType="video/x-ms-wm" />
+ <mimeMap fileExtension=".wma" mimeType="audio/x-ms-wma" />
+ <mimeMap fileExtension=".wmd" mimeType="application/x-ms-wmd" />
+ <mimeMap fileExtension=".wmf" mimeType="application/x-msmetafile" />
+ <mimeMap fileExtension=".wml" mimeType="text/vnd.wap.wml" />
+ <mimeMap fileExtension=".wmlc" mimeType="application/vnd.wap.wmlc" />
+ <mimeMap fileExtension=".wmls" mimeType="text/vnd.wap.wmlscript" />
+ <mimeMap fileExtension=".wmlsc" mimeType="application/vnd.wap.wmlscriptc" />
+ <mimeMap fileExtension=".wmp" mimeType="video/x-ms-wmp" />
+ <mimeMap fileExtension=".wmv" mimeType="video/x-ms-wmv" />
+ <mimeMap fileExtension=".wmx" mimeType="video/x-ms-wmx" />
+ <mimeMap fileExtension=".wmz" mimeType="application/x-ms-wmz" />
+ <mimeMap fileExtension=".woff" mimeType="font/x-woff" />
+ <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
+ <mimeMap fileExtension=".wps" mimeType="application/vnd.ms-works" />
+ <mimeMap fileExtension=".wri" mimeType="application/x-mswrite" />
+ <mimeMap fileExtension=".wrl" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".wrz" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".wsdl" mimeType="text/xml" />
+ <mimeMap fileExtension=".wtv" mimeType="video/x-ms-wtv" />
+ <mimeMap fileExtension=".wvx" mimeType="video/x-ms-wvx" />
+ <mimeMap fileExtension=".x" mimeType="application/directx" />
+ <mimeMap fileExtension=".xaf" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".xaml" mimeType="application/xaml+xml" />
+ <mimeMap fileExtension=".xap" mimeType="application/x-silverlight-app" />
+ <mimeMap fileExtension=".xbap" mimeType="application/x-ms-xbap" />
+ <mimeMap fileExtension=".xbm" mimeType="image/x-xbitmap" />
+ <mimeMap fileExtension=".xdr" mimeType="text/plain" />
+ <mimeMap fileExtension=".xht" mimeType="application/xhtml+xml" />
+ <mimeMap fileExtension=".xhtml" mimeType="application/xhtml+xml" />
+ <mimeMap fileExtension=".xla" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlam" mimeType="application/vnd.ms-excel.addin.macroEnabled.12" />
+ <mimeMap fileExtension=".xlc" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlm" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xls" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xlsb" mimeType="application/vnd.ms-excel.sheet.binary.macroEnabled.12" />
+ <mimeMap fileExtension=".xlsm" mimeType="application/vnd.ms-excel.sheet.macroEnabled.12" />
+ <mimeMap fileExtension=".xlsx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
+ <mimeMap fileExtension=".xlt" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xltm" mimeType="application/vnd.ms-excel.template.macroEnabled.12" />
+ <mimeMap fileExtension=".xltx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" />
+ <mimeMap fileExtension=".xlw" mimeType="application/vnd.ms-excel" />
+ <mimeMap fileExtension=".xml" mimeType="text/xml" />
+ <mimeMap fileExtension=".xof" mimeType="x-world/x-vrml" />
+ <mimeMap fileExtension=".xpm" mimeType="image/x-xpixmap" />
+ <mimeMap fileExtension=".xps" mimeType="application/vnd.ms-xpsdocument" />
+ <mimeMap fileExtension=".xsd" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsf" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsl" mimeType="text/xml" />
+ <mimeMap fileExtension=".xslt" mimeType="text/xml" />
+ <mimeMap fileExtension=".xsn" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".xtp" mimeType="application/octet-stream" />
+ <mimeMap fileExtension=".xwd" mimeType="image/x-xwindowdump" />
+ <mimeMap fileExtension=".z" mimeType="application/x-compress" />
+ <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" />
+ </staticContent>
+
+ <tracing>
+
+ <traceFailedRequests>
+ <add path="*">
+ <traceAreas>
+ <add provider="ASP" verbosity="Verbose" />
+ <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
+ <add provider="ISAPI Extension" verbosity="Verbose" />
+ <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" />
+ </traceAreas>
+ <failureDefinitions statusCodes="200-999" />
+ </add>
+ </traceFailedRequests>
+
+ <traceProviderDefinitions>
+ <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}">
+ <areas>
+ <clear />
+ <add name="Authentication" value="2" />
+ <add name="Security" value="4" />
+ <add name="Filter" value="8" />
+ <add name="StaticFile" value="16" />
+ <add name="CGI" value="32" />
+ <add name="Compression" value="64" />
+ <add name="Cache" value="128" />
+ <add name="RequestNotifications" value="256" />
+ <add name="Module" value="512" />
+ <add name="Rewrite" value="1024" />
+ <add name="FastCGI" value="4096" />
+ <add name="WebSocket" value="16384" />
+ </areas>
+ </add>
+ <add name="ASP" guid="{06b94d9a-b15e-456e-a4ef-37c984a2cb4b}">
+ <areas>
+ <clear />
+ </areas>
+ </add>
+ <add name="ISAPI Extension" guid="{a1c2040e-8840-4c31-ba11-9871031a19ea}">
+ <areas>
+ <clear />
+ </areas>
+ </add>
+ <add name="ASPNET" guid="{AFF081FE-0247-4275-9C4E-021F3DC1DA35}">
+ <areas>
+ <add name="Infrastructure" value="1" />
+ <add name="Module" value="2" />
+ <add name="Page" value="4" />
+ <add name="AppServices" value="8" />
+ </areas>
+ </add>
+ </traceProviderDefinitions>
+
+ </tracing>
+
+ <urlCompression />
+
+ <validation />
+ <webdav>
+ <globalSettings>
+ <propertyStores>
+ <add name="webdav_simple_prop" image="%IIS_BIN%\webdav_simple_prop.dll" image32="%IIS_BIN%\webdav_simple_prop.dll" />
+ </propertyStores>
+ <lockStores>
+ <add name="webdav_simple_lock" image="%IIS_BIN%\webdav_simple_lock.dll" image32="%IIS_BIN%\webdav_simple_lock.dll" />
+ </lockStores>
+
+ </globalSettings>
+ <authoring>
+ <locks enabled="true" lockStore="webdav_simple_lock" />
+ </authoring>
+ <authoringRules />
+ </webdav>
+ <webSocket />
+ <applicationInitialization />
+
+ </system.webServer>
+ <location path="" overrideMode="Allow">
+ <system.webServer>
+ <modules>
+ <add name="IsapiFilterModule" lockItem="true" />
+ <add name="BasicAuthenticationModule" lockItem="true" />
+ <add name="IsapiModule" lockItem="true" />
+ <add name="HttpLoggingModule" lockItem="true" />
+ <add name="DynamicCompressionModule" lockItem="true" />
+ <add name="StaticCompressionModule" lockItem="true" />
+ <add name="DefaultDocumentModule" lockItem="true" />
+ <add name="DirectoryListingModule" lockItem="true" />
+ <add name="ProtocolSupportModule" lockItem="true" />
+ <add name="HttpRedirectionModule" lockItem="true" />
+ <add name="ServerSideIncludeModule" lockItem="true" />
+ <add name="StaticFileModule" lockItem="true" />
+ <add name="AnonymousAuthenticationModule" lockItem="true" />
+ <add name="CertificateMappingAuthenticationModule" lockItem="true" />
+ <add name="UrlAuthorizationModule" lockItem="true" />
+ <add name="WindowsAuthenticationModule" lockItem="true" />
+ <add name="IISCertificateMappingAuthenticationModule" lockItem="true" />
+ <add name="WebMatrixSupportModule" lockItem="true" />
+ <add name="IpRestrictionModule" lockItem="true" />
+ <add name="DynamicIpRestrictionModule" lockItem="true" />
+ <add name="RequestFilteringModule" lockItem="true" />
+ <add name="CustomLoggingModule" lockItem="true" />
+ <add name="CustomErrorModule" lockItem="true" />
+ <add name="FailedRequestsTracingModule" lockItem="true" />
+ <add name="CgiModule" lockItem="true" />
+ <add name="FastCgiModule" lockItem="true" />
+<!-- <add name="WebDAVModule" /> -->
+ <add name="RewriteModule" />
+ <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" preCondition="managedHandler" />
+ <add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="managedHandler" />
+ <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" preCondition="managedHandler" />
+ <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="managedHandler" />
+ <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" preCondition="managedHandler" />
+ <add name="RoleManager" type="System.Web.Security.RoleManagerModule" preCondition="managedHandler" />
+ <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
+ <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" preCondition="managedHandler" />
+ <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" preCondition="managedHandler" />
+ <add name="Profile" type="System.Web.Profile.ProfileModule" preCondition="managedHandler" />
+ <add name="UrlMappingsModule" type="System.Web.UrlMappingsModule" preCondition="managedHandler" />
+ <add name="ApplicationInitializationModule" lockItem="true" />
+ <add name="WebSocketModule" lockItem="true" />
+ <add name="ServiceModel-4.0" type="System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel.Activation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ConfigurationValidationModule" lockItem="true" />
+ <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler,runtimeVersionv4.0" />
+ <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler,runtimeVersionv2.0" />
+ </modules>
+ <handlers accessPolicy="Read, Script">
+<!-- <add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" /> -->
+ <add name="AXD-ISAPI-4.0_64bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-4.0_64bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-4.0_64bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
+ <add name="aspq-ISAPI-4.0_64bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="cshtm-ISAPI-4.0_64bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="cshtml-ISAPI-4.0_64bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="vbhtm-ISAPI-4.0_64bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="vbhtml-ISAPI-4.0_64bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
+ <add name="AXD-ISAPI-4.0_32bit" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-4.0_32bit" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-4.0_32bit" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
+ <add name="aspq-ISAPI-4.0_32bit" path="*.aspq" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="cshtm-ISAPI-4.0_32bit" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="cshtml-ISAPI-4.0_32bit" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="vbhtm-ISAPI-4.0_32bit" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="vbhtml-ISAPI-4.0_32bit" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="TraceHandler-Integrated-4.0" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="WebAdminHandler-Integrated-4.0" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="AssemblyResourceLoader-Integrated-4.0" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="WebServiceHandlerFactory-Integrated-4.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="HttpRemotingHandlerFactory-rem-Integrated-4.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="HttpRemotingHandlerFactory-soap-Integrated-4.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="aspq-Integrated-4.0" path="*.aspq" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="cshtm-Integrated-4.0" path="*.cshtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="cshtml-Integrated-4.0" path="*.cshtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="vbhtm-Integrated-4.0" path="*.vbhtm" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="vbhtml-Integrated-4.0" path="*.vbhtml" verb="GET,HEAD,POST,DEBUG" type="System.Web.HttpForbiddenHandler" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ScriptHandlerFactoryAppServices-Integrated-4.0" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ScriptResourceIntegrated-4.0" path="*ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv4.0" />
+ <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
+ <add name="SecurityCertificate" path="*.cer" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%IIS_BIN%\asp.dll" resourceType="File" />
+ <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
+ <add name="TraceHandler-Integrated" path="trace.axd" verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TraceHandler" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="WebAdminHandler-Integrated" path="WebAdmin.axd" verb="GET,DEBUG" type="System.Web.Handlers.WebAdminHandler" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="AssemblyResourceLoader-Integrated" path="WebResource.axd" verb="GET,DEBUG" type="System.Web.Handlers.AssemblyResourceLoader" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.SimpleHandlerFactory" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="WebServiceHandlerFactory-Integrated" path="*.asmx" verb="GET,HEAD,POST,DEBUG" type="System.Web.Services.Protocols.WebServiceHandlerFactory,System.Web.Services,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="HttpRemotingHandlerFactory-rem-Integrated" path="*.rem" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="HttpRemotingHandlerFactory-soap-Integrated" path="*.soap" verb="GET,HEAD,POST,DEBUG" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
+ <add name="AXD-ISAPI-2.0" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-2.0" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
+ <add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="AXD-ISAPI-2.0-64" path="*.axd" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="SimpleHandlerFactory-ISAPI-2.0-64" path="*.ashx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="WebServiceHandlerFactory-ISAPI-2.0-64" path="*.asmx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-rem-ISAPI-2.0-64" path="*.rem" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="HttpRemotingHandlerFactory-soap-ISAPI-2.0-64" path="*.soap" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
+ <add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
+ <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" resourceType="File" requireAccess="Execute" allowPathInfo="true" />
+ <add name="SSINC-stm" path="*.stm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="SSINC-shtm" path="*.shtm" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="SSINC-shtml" path="*.shtml" verb="GET,HEAD,POST" modules="ServerSideIncludeModule" resourceType="File" />
+ <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" />
+ <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" />
+ <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
+ <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
+ <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
+ <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
+ </handlers>
+ </system.webServer>
+ </location>
+</configuration>
diff --git a/KH.WMS/.vs/KH.WMS/v17/DocumentLayout.backup.json b/KH.WMS/.vs/KH.WMS/v17/DocumentLayout.backup.json
new file mode 100644
index 0000000..f21e77f
--- /dev/null
+++ b/KH.WMS/.vs/KH.WMS/v17/DocumentLayout.backup.json
@@ -0,0 +1,854 @@
+{
+ "Version": 1,
+ "WorkspaceRootPath": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\",
+ "Documents": [
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\api\\responses\\apiresponse.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\api\\responses\\apiresponse.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\api\\documentation\\swagger\\swaggersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\api\\documentation\\swagger\\swaggersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\api\\responses\\pagination.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\api\\responses\\pagination.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\monitoringsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\monitoringsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\servicecollectionsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\servicecollectionsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\middlewaresetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\middlewaresetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\loggingsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\loggingsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\databasesetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\databasesetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\apidocumentationsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\apidocumentationsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\monitoring\\miniprofiler\\miniprofilersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\monitoring\\miniprofiler\\miniprofilersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\repositories\\repositorybase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\repositories\\repositorybase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\repositories\\irepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\repositories\\irepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\serviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\serviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\serviceextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\serviceextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\iserviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\iserviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\servicelifetimes\\selfregisteredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\servicelifetimes\\selfregisteredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\servicelifetimes\\registeredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\servicelifetimes\\registeredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\constants\\appsettingsconstants.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\constants\\appsettingsconstants.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\unitofworks\\unitofworkextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\unitofworks\\unitofworkextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\serilog\\serilogsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\serilog\\serilogsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\unitofworks\\unitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\unitofworks\\unitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\unitofworks\\iunitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\unitofworks\\iunitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\idbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\idbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\sqlsugar\\sqlsugardbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\sqlsugar\\sqlsugardbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\sqlsugar\\sqlsugarsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\sqlsugar\\sqlsugarsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\attributes\\loginterceptorattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\attributes\\loginterceptorattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\logcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\logcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\iloggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\iloggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\serilog\\serilogoptions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\serilog\\serilogoptions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\serilog\\loggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\serilog\\loggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\aop\\logginginterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\aop\\logginginterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\warning-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\warning-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\log-20260203.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\log-20260203.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\log-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\log-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\error-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\error-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\custom\\cachinginterceptor-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\custom\\cachinginterceptor-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E2D70705-05DB-5D0E-169D-82766317D467}|Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\extensions\\kh.wms.extensions\\kh.wms.extensions.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{E2D70705-05DB-5D0E-169D-82766317D467}|Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj|solutionrelative:extensions\\kh.wms.extensions\\kh.wms.extensions.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\logenums\\logleveltype.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\logenums\\logleveltype.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{C45B4DD7-40D4-C442-2392-8568CE6151A5}|KH.WMS.Model\\KH.WMS.Model.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.model\\kh.wms.model.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{C45B4DD7-40D4-C442-2392-8568CE6151A5}|KH.WMS.Model\\KH.WMS.Model.csproj|solutionrelative:kh.wms.model\\kh.wms.model.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\kh.wms.core.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\kh.wms.core.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\logmoduledetector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\logmoduledetector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\test\\kh.wms.testproj\\testoneservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|solutionrelative:test\\kh.wms.testproj\\testoneservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\test\\kh.wms.testproj\\testservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|solutionrelative:test\\kh.wms.testproj\\testservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\tools\\kh.wms.tools\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|solutionrelative:tools\\kh.wms.tools\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\kh.wms.server.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\kh.wms.server.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}|Common\\KH.WMS.Common\\KH.WMS.Common.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\common\\kh.wms.common\\kh.wms.common.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}|Common\\KH.WMS.Common\\KH.WMS.Common.csproj|solutionrelative:common\\kh.wms.common\\kh.wms.common.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\test\\kh.wms.testproj\\kh.wms.testproj.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|solutionrelative:test\\kh.wms.testproj\\kh.wms.testproj.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\tools\\kh.wms.tools\\kh.wms.tools.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|solutionrelative:tools\\kh.wms.tools\\kh.wms.tools.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ }
+ ],
+ "DocumentGroupContainers": [
+ {
+ "Orientation": 0,
+ "VerticalTabListWidth": 256,
+ "DocumentGroups": [
+ {
+ "DockedWidth": 200,
+ "SelectedChildIndex": 6,
+ "Children": [
+ {
+ "$type": "Bookmark",
+ "Name": "ST:0:0:{0174dea2-fdbe-4ef1-8f99-c0beae78880f}"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 7,
+ "Title": "DatabaseSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:26:00.802Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 6,
+ "Title": "LoggingSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:03:10.917Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 5,
+ "Title": "MiddlewareSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAACgAAAALAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:03:35.073Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 3,
+ "Title": "MonitoringSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAuwBwAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:04:43.444Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 4,
+ "Title": "ServiceCollectionSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAACAAAAALAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:05:46.174Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 0,
+ "Title": "ApiResponse.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "ViewState": "AgIAAAEAAAAAAAAAAAAIwAwAAAAsAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:14:06.616Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 2,
+ "Title": "Pagination.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "ViewState": "AgIAAHoAAAAAAAAAAAAlwKEAAAAYAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:14:54.116Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 1,
+ "Title": "SwaggerSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "ViewState": "AgIAACUAAAAAAAAAAAAQwE4AAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:12:25.805Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 8,
+ "Title": "ApiDocumentationSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAAjAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:01:39.163Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 9,
+ "Title": "MiniProfilerSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "ViewState": "AgIAABIAAAAAAAAAAAArwDgAAAAeAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:16:38.586Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 10,
+ "Title": "RepositoryBase.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "ViewState": "AgIAAAIAAAAAAAAAAADwvwkAAAAoAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:34.673Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 11,
+ "Title": "IRepository.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:31.839Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 18,
+ "Title": "UnitOfWorkExtensions.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "ViewState": "AgIAAHIAAAAAAAAAAAAAwIgAAAAmAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:45.808Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 12,
+ "Title": "ServiceRegistrar.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "ViewState": "AgIAAG0AAAAAAAAAAAArwIsAAAAQAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:38:53.95Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 14,
+ "Title": "IServiceRegistrar.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:11:16.444Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 15,
+ "Title": "SelfRegisteredServiceAttribute.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T08:13:43.016Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 16,
+ "Title": "RegisteredServiceAttribute.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAWAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T08:13:35.889Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 13,
+ "Title": "ServiceExtensions.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAC8AAAANAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:52:40.728Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 17,
+ "Title": "AppSettingsConstants.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABgAAAAFAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T05:54:17.718Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 19,
+ "Title": "SerilogSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAgAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T06:48:55.7Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 20,
+ "Title": "UnitOfWork.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "ViewState": "AgIAADQAAAAAAAAAAAAowDQAAAAjAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:45.074Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 21,
+ "Title": "IUnitOfWork.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:44.31Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 22,
+ "Title": "IDbContext.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\IDbContext.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\IDbContext.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\IDbContext.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\IDbContext.cs",
+ "ViewState": "AgIAAAgAAAAAAAAAAAAxwB0AAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:25:23.173Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 23,
+ "Title": "SqlSugarDbContext.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "ViewState": "AgIAABYAAAAAAAAAAAASwEIAAAAsAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:41.069Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 24,
+ "Title": "SqlSugarSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:42.689Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 25,
+ "Title": "LogInterceptorAttribute.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-11T02:50:01.612Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 26,
+ "Title": "LogContext.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogContext.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\LogContext.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogContext.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\LogContext.cs",
+ "ViewState": "AgIAACUAAAAAAAAAAAAkwCkAAAAQAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:53:24.449Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 27,
+ "Title": "ILoggerService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "ViewState": "AgIAADQAAAAAAAAAAADwv0UAAABIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T07:23:08.095Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 28,
+ "Title": "SerilogOptions.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "ViewState": "AgIAABoAAAAAAAAAAAA3wAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T07:09:37.957Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 29,
+ "Title": "LoggerService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "ViewState": "AgIAAJ4AAAAAAAAAAAAnwLMAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:50:03.054Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 30,
+ "Title": "LoggingInterceptor.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "RelativeToolTip": "KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "ViewState": "AgIAAAsAAAAAAAAAAAAxwCoAAABIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:45:33.609Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 31,
+ "Title": "appsettings.json",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\appsettings.json",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\appsettings.json",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\appsettings.json",
+ "RelativeToolTip": "KH.WMS.Server\\appsettings.json",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAARAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
+ "WhenOpened": "2026-02-02T06:37:23.257Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 32,
+ "Title": "Program.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Program.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Program.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Program.cs",
+ "RelativeToolTip": "KH.WMS.Server\\Program.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:23:10.575Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 33,
+ "Title": "warning-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "ViewState": "AgIAAAMAAAAAAAAAAAAAACAAAADEAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-02T07:07:25.434Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 34,
+ "Title": "log-20260203.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260203.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\log-20260203.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260203.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\log-20260203.txt",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-03T03:30:40.49Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 35,
+ "Title": "log-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\log-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\log-20260202.txt",
+ "ViewState": "AgIAALkAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-02T07:07:26.104Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 36,
+ "Title": "error-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\error-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\error-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\error-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\error-20260202.txt",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-02T08:14:49.932Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 37,
+ "Title": "CachingInterceptor-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-03T03:30:02.819Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 38,
+ "Title": "KH.WMS.Extensions.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "RelativeDocumentMoniker": "Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "RelativeToolTip": "Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:58.377Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 39,
+ "Title": "launchSettings.json",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Properties\\launchSettings.json",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Properties\\launchSettings.json",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Properties\\launchSettings.json",
+ "RelativeToolTip": "KH.WMS.Server\\Properties\\launchSettings.json",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAcAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
+ "WhenOpened": "2026-01-30T08:44:08.796Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 40,
+ "Title": "LogLevelType.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAiAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T02:44:25.368Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 41,
+ "Title": "KH.WMS.Model.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Model\\KH.WMS.Model.csproj",
+ "RelativeDocumentMoniker": "KH.WMS.Model\\KH.WMS.Model.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Model\\KH.WMS.Model.csproj",
+ "RelativeToolTip": "KH.WMS.Model\\KH.WMS.Model.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:40.591Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 42,
+ "Title": "KH.WMS.Core.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\KH.WMS.Core.csproj",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\KH.WMS.Core.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\KH.WMS.Core.csproj",
+ "RelativeToolTip": "KH.WMS.Core\\KH.WMS.Core.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-01-30T09:13:04.723Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 43,
+ "Title": "LogModuleDetector.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAGwAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:50:32.068Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 44,
+ "Title": "TestOneService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "RelativeDocumentMoniker": "Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "RelativeToolTip": "Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:37:25.677Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 45,
+ "Title": "TestService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestService.cs",
+ "RelativeDocumentMoniker": "Test\\KH.WMS.TestProj\\TestService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestService.cs",
+ "RelativeToolTip": "Test\\KH.WMS.TestProj\\TestService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T03:25:38.474Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 46,
+ "Title": "Program.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\Program.cs",
+ "RelativeDocumentMoniker": "Tools\\KH.WMS.Tools\\Program.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\Program.cs",
+ "RelativeToolTip": "Tools\\KH.WMS.Tools\\Program.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:37:19.895Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 49,
+ "Title": "KH.WMS.TestProj.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "RelativeDocumentMoniker": "Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "RelativeToolTip": "Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:55:09.175Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 47,
+ "Title": "KH.WMS.Server.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\KH.WMS.Server.csproj",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\KH.WMS.Server.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\KH.WMS.Server.csproj",
+ "RelativeToolTip": "KH.WMS.Server\\KH.WMS.Server.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:16.348Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 48,
+ "Title": "KH.WMS.Common.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "RelativeDocumentMoniker": "Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "RelativeToolTip": "Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:58:02.392Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 50,
+ "Title": "KH.WMS.Tools.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "RelativeDocumentMoniker": "Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "RelativeToolTip": "Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:48.749Z"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/KH.WMS/.vs/KH.WMS/v17/DocumentLayout.json b/KH.WMS/.vs/KH.WMS/v17/DocumentLayout.json
new file mode 100644
index 0000000..9b78a13
--- /dev/null
+++ b/KH.WMS/.vs/KH.WMS/v17/DocumentLayout.json
@@ -0,0 +1,855 @@
+{
+ "Version": 1,
+ "WorkspaceRootPath": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\",
+ "Documents": [
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\aop\\logginginterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\aop\\logginginterceptor.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\api\\responses\\apiresponse.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\api\\responses\\apiresponse.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\api\\documentation\\swagger\\swaggersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\api\\documentation\\swagger\\swaggersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\api\\responses\\pagination.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\api\\responses\\pagination.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\monitoringsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\monitoringsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\servicecollectionsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\servicecollectionsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\middlewaresetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\middlewaresetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\loggingsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\loggingsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\databasesetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\databasesetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\setup\\apidocumentationsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\setup\\apidocumentationsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\monitoring\\miniprofiler\\miniprofilersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\monitoring\\miniprofiler\\miniprofilersetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\repositories\\repositorybase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\repositories\\repositorybase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\repositories\\irepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\repositories\\irepository.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\serviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\serviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\serviceextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\serviceextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\iserviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\iserviceregistrar.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\servicelifetimes\\selfregisteredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\servicelifetimes\\selfregisteredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\dependencyinjection\\servicelifetimes\\registeredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\dependencyinjection\\servicelifetimes\\registeredserviceattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\constants\\appsettingsconstants.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\constants\\appsettingsconstants.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\unitofworks\\unitofworkextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\unitofworks\\unitofworkextensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\serilog\\serilogsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\serilog\\serilogsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\unitofworks\\unitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\unitofworks\\unitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\unitofworks\\iunitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\unitofworks\\iunitofwork.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\idbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\idbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\sqlsugar\\sqlsugardbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\sqlsugar\\sqlsugardbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\database\\sqlsugar\\sqlsugarsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\database\\sqlsugar\\sqlsugarsetup.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\attributes\\loginterceptorattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\attributes\\loginterceptorattribute.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\logcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\logcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\iloggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\iloggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\serilog\\serilogoptions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\serilog\\serilogoptions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\serilog\\loggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\serilog\\loggerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\warning-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\warning-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\log-20260203.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\log-20260203.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\log-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\log-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\error-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\error-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\logs\\custom\\cachinginterceptor-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\logs\\custom\\cachinginterceptor-20260202.txt||{8B382828-6202-11D1-8870-0000F87579D2}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{E2D70705-05DB-5D0E-169D-82766317D467}|Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\extensions\\kh.wms.extensions\\kh.wms.extensions.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{E2D70705-05DB-5D0E-169D-82766317D467}|Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj|solutionrelative:extensions\\kh.wms.extensions\\kh.wms.extensions.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\logenums\\logleveltype.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\logenums\\logleveltype.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{C45B4DD7-40D4-C442-2392-8568CE6151A5}|KH.WMS.Model\\KH.WMS.Model.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.model\\kh.wms.model.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{C45B4DD7-40D4-C442-2392-8568CE6151A5}|KH.WMS.Model\\KH.WMS.Model.csproj|solutionrelative:kh.wms.model\\kh.wms.model.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\kh.wms.core.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\kh.wms.core.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.core\\logging\\logmoduledetector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}|KH.WMS.Core\\KH.WMS.Core.csproj|solutionrelative:kh.wms.core\\logging\\logmoduledetector.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\test\\kh.wms.testproj\\testoneservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|solutionrelative:test\\kh.wms.testproj\\testoneservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\test\\kh.wms.testproj\\testservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|solutionrelative:test\\kh.wms.testproj\\testservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\tools\\kh.wms.tools\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|solutionrelative:tools\\kh.wms.tools\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\kh.wms.server\\kh.wms.server.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{30290226-69D6-B736-0678-A3950D90BAA9}|KH.WMS.Server\\KH.WMS.Server.csproj|solutionrelative:kh.wms.server\\kh.wms.server.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}|Common\\KH.WMS.Common\\KH.WMS.Common.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\common\\kh.wms.common\\kh.wms.common.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}|Common\\KH.WMS.Common\\KH.WMS.Common.csproj|solutionrelative:common\\kh.wms.common\\kh.wms.common.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\test\\kh.wms.testproj\\kh.wms.testproj.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}|Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj|solutionrelative:test\\kh.wms.testproj\\kh.wms.testproj.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|e:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\wmsrefactor\\kh.wms\\tools\\kh.wms.tools\\kh.wms.tools.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|",
+ "RelativeMoniker": "D:0:0:{F51A470B-FC5D-43A3-A721-23007FD3416B}|Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj|solutionrelative:tools\\kh.wms.tools\\kh.wms.tools.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}|"
+ }
+ ],
+ "DocumentGroupContainers": [
+ {
+ "Orientation": 0,
+ "VerticalTabListWidth": 256,
+ "DocumentGroups": [
+ {
+ "DockedWidth": 200,
+ "SelectedChildIndex": 8,
+ "Children": [
+ {
+ "$type": "Bookmark",
+ "Name": "ST:0:0:{0174dea2-fdbe-4ef1-8f99-c0beae78880f}"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 6,
+ "Title": "MiddlewareSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\MiddlewareSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAACgAAAALAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:03:35.073Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 4,
+ "Title": "MonitoringSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\MonitoringSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAuwBwAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:04:43.444Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 5,
+ "Title": "ServiceCollectionSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\ServiceCollectionSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAACAAAAALAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:05:46.174Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 1,
+ "Title": "ApiResponse.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Api\\Responses\\ApiResponse.cs",
+ "ViewState": "AgIAAAEAAAAAAAAAAAAIwAwAAAAsAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:14:06.616Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 3,
+ "Title": "Pagination.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Api\\Responses\\Pagination.cs",
+ "ViewState": "AgIAAHoAAAAAAAAAAAAlwKEAAAAYAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:14:54.116Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 2,
+ "Title": "SwaggerSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Api\\Documentation\\Swagger\\SwaggerSetup.cs",
+ "ViewState": "AgIAACUAAAAAAAAAAAAQwE4AAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:12:25.805Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 9,
+ "Title": "ApiDocumentationSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\ApiDocumentationSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAkAAAAjAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:01:39.163Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 0,
+ "Title": "LoggingInterceptor.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "RelativeToolTip": "KH.WMS.Core\\AOP\\LoggingInterceptor.cs",
+ "ViewState": "AgIAABsAAAAAAAAAAAAYwCwAAAA0AAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:45:33.609Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 7,
+ "Title": "LoggingSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\LoggingSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:03:10.917Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 8,
+ "Title": "DatabaseSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Setup\\DatabaseSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:26:00.802Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 10,
+ "Title": "MiniProfilerSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Monitoring\\MiniProfiler\\MiniProfilerSetup.cs",
+ "ViewState": "AgIAABIAAAAAAAAAAAArwDgAAAAeAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:16:38.586Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 11,
+ "Title": "RepositoryBase.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\Repositories\\RepositoryBase.cs",
+ "ViewState": "AgIAAAIAAAAAAAAAAADwvwkAAAAoAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:34.673Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 12,
+ "Title": "IRepository.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\Repositories\\IRepository.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:31.839Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 19,
+ "Title": "UnitOfWorkExtensions.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWorkExtensions.cs",
+ "ViewState": "AgIAAHIAAAAAAAAAAAAAwIgAAAAmAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:45.808Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 13,
+ "Title": "ServiceRegistrar.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceRegistrar.cs",
+ "ViewState": "AgIAAG0AAAAAAAAAAAArwIsAAAAQAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:38:53.95Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 15,
+ "Title": "IServiceRegistrar.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\IServiceRegistrar.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T06:11:16.444Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 16,
+ "Title": "SelfRegisteredServiceAttribute.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\SelfRegisteredServiceAttribute.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T08:13:43.016Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 17,
+ "Title": "RegisteredServiceAttribute.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceLifetimes\\RegisteredServiceAttribute.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAWAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T08:13:35.889Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 14,
+ "Title": "ServiceExtensions.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "RelativeToolTip": "KH.WMS.Core\\DependencyInjection\\ServiceExtensions.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAC8AAAANAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:52:40.728Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 18,
+ "Title": "AppSettingsConstants.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Constants\\AppSettingsConstants.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABgAAAAFAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T05:54:17.718Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 20,
+ "Title": "SerilogSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\Serilog\\SerilogSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAgAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T06:48:55.7Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 21,
+ "Title": "UnitOfWork.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\UnitOfWorks\\UnitOfWork.cs",
+ "ViewState": "AgIAADQAAAAAAAAAAAAowDQAAAAjAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:45.074Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 22,
+ "Title": "IUnitOfWork.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\UnitOfWorks\\IUnitOfWork.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:44.31Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 23,
+ "Title": "IDbContext.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\IDbContext.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\IDbContext.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\IDbContext.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\IDbContext.cs",
+ "ViewState": "AgIAAAgAAAAAAAAAAAAxwB0AAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:25:23.173Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 24,
+ "Title": "SqlSugarDbContext.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarDbContext.cs",
+ "ViewState": "AgIAABYAAAAAAAAAAAASwEIAAAAsAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:41.069Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 25,
+ "Title": "SqlSugarSetup.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Database\\SqlSugar\\SqlSugarSetup.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-10T06:24:42.689Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 26,
+ "Title": "LogInterceptorAttribute.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Attributes\\LogInterceptorAttribute.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-11T02:50:01.612Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 27,
+ "Title": "LogContext.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogContext.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\LogContext.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogContext.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\LogContext.cs",
+ "ViewState": "AgIAACUAAAAAAAAAAAAkwCkAAAAQAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:53:24.449Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 28,
+ "Title": "ILoggerService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\ILoggerService.cs",
+ "ViewState": "AgIAADQAAAAAAAAAAADwv0UAAABIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T07:23:08.095Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 29,
+ "Title": "SerilogOptions.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\Serilog\\SerilogOptions.cs",
+ "ViewState": "AgIAABoAAAAAAAAAAAA3wAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T07:09:37.957Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 30,
+ "Title": "LoggerService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\Serilog\\LoggerService.cs",
+ "ViewState": "AgIAAJ4AAAAAAAAAAAAnwLMAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:50:03.054Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 31,
+ "Title": "appsettings.json",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\appsettings.json",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\appsettings.json",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\appsettings.json",
+ "RelativeToolTip": "KH.WMS.Server\\appsettings.json",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAARAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
+ "WhenOpened": "2026-02-02T06:37:23.257Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 32,
+ "Title": "Program.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Program.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Program.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Program.cs",
+ "RelativeToolTip": "KH.WMS.Server\\Program.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T09:23:10.575Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 33,
+ "Title": "warning-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\warning-20260202.txt",
+ "ViewState": "AgIAAAMAAAAAAAAAAAAAACAAAADEAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-02T07:07:25.434Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 34,
+ "Title": "log-20260203.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260203.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\log-20260203.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260203.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\log-20260203.txt",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-03T03:30:40.49Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 35,
+ "Title": "log-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\log-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\log-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\log-20260202.txt",
+ "ViewState": "AgIAALkAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-02T07:07:26.104Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 36,
+ "Title": "error-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\error-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\error-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\error-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\error-20260202.txt",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-02T08:14:49.932Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 37,
+ "Title": "CachingInterceptor-20260202.txt",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "RelativeToolTip": "KH.WMS.Server\\Logs\\custom\\CachingInterceptor-20260202.txt",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003109|",
+ "WhenOpened": "2026-02-03T03:30:02.819Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 38,
+ "Title": "KH.WMS.Extensions.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "RelativeDocumentMoniker": "Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "RelativeToolTip": "Extensions\\KH.WMS.Extensions\\KH.WMS.Extensions.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:58.377Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 39,
+ "Title": "launchSettings.json",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Properties\\launchSettings.json",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\Properties\\launchSettings.json",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\Properties\\launchSettings.json",
+ "RelativeToolTip": "KH.WMS.Server\\Properties\\launchSettings.json",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAcAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
+ "WhenOpened": "2026-01-30T08:44:08.796Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 40,
+ "Title": "LogLevelType.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\LogEnums\\LogLevelType.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAA4AAAAiAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-03T02:44:25.368Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 41,
+ "Title": "KH.WMS.Model.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Model\\KH.WMS.Model.csproj",
+ "RelativeDocumentMoniker": "KH.WMS.Model\\KH.WMS.Model.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Model\\KH.WMS.Model.csproj",
+ "RelativeToolTip": "KH.WMS.Model\\KH.WMS.Model.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:40.591Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 42,
+ "Title": "KH.WMS.Core.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\KH.WMS.Core.csproj",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\KH.WMS.Core.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\KH.WMS.Core.csproj",
+ "RelativeToolTip": "KH.WMS.Core\\KH.WMS.Core.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-01-30T09:13:04.723Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 43,
+ "Title": "LogModuleDetector.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "RelativeDocumentMoniker": "KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "RelativeToolTip": "KH.WMS.Core\\Logging\\LogModuleDetector.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAGwAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-01-30T08:50:32.068Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 44,
+ "Title": "TestOneService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "RelativeDocumentMoniker": "Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "RelativeToolTip": "Test\\KH.WMS.TestProj\\TestOneService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABYAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:37:25.677Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 45,
+ "Title": "TestService.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestService.cs",
+ "RelativeDocumentMoniker": "Test\\KH.WMS.TestProj\\TestService.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\TestService.cs",
+ "RelativeToolTip": "Test\\KH.WMS.TestProj\\TestService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T03:25:38.474Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 46,
+ "Title": "Program.cs",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\Program.cs",
+ "RelativeDocumentMoniker": "Tools\\KH.WMS.Tools\\Program.cs",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\Program.cs",
+ "RelativeToolTip": "Tools\\KH.WMS.Tools\\Program.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-02-02T02:37:19.895Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 49,
+ "Title": "KH.WMS.TestProj.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "RelativeDocumentMoniker": "Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "RelativeToolTip": "Test\\KH.WMS.TestProj\\KH.WMS.TestProj.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:55:09.175Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 47,
+ "Title": "KH.WMS.Server.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\KH.WMS.Server.csproj",
+ "RelativeDocumentMoniker": "KH.WMS.Server\\KH.WMS.Server.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\KH.WMS.Server\\KH.WMS.Server.csproj",
+ "RelativeToolTip": "KH.WMS.Server\\KH.WMS.Server.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:16.348Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 48,
+ "Title": "KH.WMS.Common.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "RelativeDocumentMoniker": "Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "RelativeToolTip": "Common\\KH.WMS.Common\\KH.WMS.Common.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAMAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:58:02.392Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 50,
+ "Title": "KH.WMS.Tools.csproj",
+ "DocumentMoniker": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "RelativeDocumentMoniker": "Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "ToolTip": "E:\\4.\u91CD\u6784\\2026\u5E742\u67083\u65E5\\WMSrefactor\\KH.WMS\\Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "RelativeToolTip": "Tools\\KH.WMS.Tools\\KH.WMS.Tools.csproj",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAZAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
+ "WhenOpened": "2026-02-02T01:57:48.749Z"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/KH.WMS/.vs/KH.WMS/v17/HierarchyCache.v1.txt b/KH.WMS/.vs/KH.WMS/v17/HierarchyCache.v1.txt
new file mode 100644
index 0000000..3a6bf51
--- /dev/null
+++ b/KH.WMS/.vs/KH.WMS/v17/HierarchyCache.v1.txt
Binary files differ
diff --git a/KH.WMS/Common/KH.WMS.Common/KH.WMS.Common.csproj b/KH.WMS/Common/KH.WMS.Common/KH.WMS.Common.csproj
new file mode 100644
index 0000000..30402ac
--- /dev/null
+++ b/KH.WMS/Common/KH.WMS.Common/KH.WMS.Common.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net8.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+</Project>
diff --git a/KH.WMS/Extensions/KH.WMS.Extensions/KH.WMS.Extensions.csproj b/KH.WMS/Extensions/KH.WMS.Extensions/KH.WMS.Extensions.csproj
new file mode 100644
index 0000000..30402ac
--- /dev/null
+++ b/KH.WMS/Extensions/KH.WMS.Extensions/KH.WMS.Extensions.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net8.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+</Project>
diff --git a/KH.WMS/KH.WMS.Core/AOP/LoggingInterceptor.cs b/KH.WMS/KH.WMS.Core/AOP/LoggingInterceptor.cs
new file mode 100644
index 0000000..372c893
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/AOP/LoggingInterceptor.cs
@@ -0,0 +1,83 @@
+using System.Reflection;
+using Castle.DynamicProxy;
+using KH.WMS.Core.Attributes;
+using KH.WMS.Core.Logging;
+using Microsoft.Extensions.Logging;
+
+namespace KH.WMS.Core.AOP;
+
+/// <summary>
+/// 鎷︽埅鍣ㄥ熀绫�
+/// </summary>
+public class LoggingInterceptor : IInterceptor
+{
+ private readonly ILoggerService _logger;
+
+
+ public LoggingInterceptor(ILoggerService logger)
+ {
+ _logger = logger;
+ }
+
+ public void Intercept(IInvocation invocation)
+ {
+ string methodName = $"{invocation.TargetType.Name}.{invocation.Method.Name}";
+ MethodInfo method = invocation.Method;
+
+ try
+ {
+ // 浠庢柟娉曚笂鑾峰彇鐗规��
+ LogInterceptorAttribute? _attribute = invocation.MethodInvocationTarget.GetCustomAttributes(typeof(LogInterceptorAttribute), false)
+ .FirstOrDefault() as LogInterceptorAttribute;
+
+ // 濡傛灉鏂规硶涓婃病鏈夌壒鎬э紝灏濊瘯浠庣被涓婅幏鍙�
+ if (_attribute == null)
+ {
+ _attribute = invocation.TargetType.GetCustomAttributes(typeof(LogInterceptorAttribute), false)
+ .FirstOrDefault() as LogInterceptorAttribute;
+ }
+ if (_attribute == null)
+ return;
+
+ // 濡傛灉娌℃湁鐗规�э紝浣跨敤榛樿鍊�
+ var logLevel = _attribute?.LogLevel ?? LogLevel.Information;
+
+ _logger.LogInfo("[鏂规硶寮�濮媇 -> {MethodName}",
+ methodName);
+ // 鎵ц鏂规硶
+ invocation.Proceed();
+
+ if (_attribute == null)
+ return;
+
+ var message = $"[鏂规硶缁撴潫] <- {methodName}";
+
+ _logger.LogInfo(message);
+ }
+ catch (Exception ex)
+ {
+ // 寮傚父澶勭悊
+ OnException(invocation, methodName, ex);
+ }
+ finally
+ {
+ // 娓呯悊閫昏緫
+ OnFinally(invocation, methodName);
+ }
+
+ }
+
+ /// <summary>
+ /// 寮傚父澶勭悊
+ /// </summary>
+ protected void OnException(IInvocation invocation, string methodName, Exception ex)
+ {
+ }
+
+ /// <summary>
+ /// 娓呯悊閫昏緫
+ /// </summary>
+ protected void OnFinally(IInvocation invocation, string methodName)
+ {
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Api/Documentation/Swagger/SwaggerSetup.cs b/KH.WMS/KH.WMS.Core/Api/Documentation/Swagger/SwaggerSetup.cs
new file mode 100644
index 0000000..97c456a
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Api/Documentation/Swagger/SwaggerSetup.cs
@@ -0,0 +1,160 @@
+using Microsoft.OpenApi;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Configuration;
+using Microsoft.AspNetCore.Builder;
+
+namespace KH.WMS.Core.Api.Documentation.Swagger;
+
+/// <summary>
+/// Swagger 閰嶇疆
+/// </summary>
+public static class SwaggerSetup
+{
+ /// <summary>
+ /// 娣诲姞 Swagger 鏈嶅姟
+ /// </summary>
+ public static IServiceCollection AddSwaggerDocumentation(this IServiceCollection services, IConfiguration configuration)
+ {
+ var swaggerOptions = configuration.GetSection("Swagger").Get<SwaggerOptions>();
+ swaggerOptions ??= new SwaggerOptions();
+
+ services.AddSwaggerGen(options =>
+ {
+ var info = new OpenApiInfo
+ {
+ Title = swaggerOptions.Title,
+ Version = swaggerOptions.Version,
+ Description = swaggerOptions.Description
+ };
+
+ // 鍙湁鍦� URL 涓嶄负绌烘椂鎵嶈缃� Contact
+ if (!string.IsNullOrWhiteSpace(swaggerOptions.ContactName) ||
+ !string.IsNullOrWhiteSpace(swaggerOptions.ContactEmail) ||
+ !string.IsNullOrWhiteSpace(swaggerOptions.ContactUrl))
+ {
+ info.Contact = new OpenApiContact
+ {
+ Name = swaggerOptions.ContactName,
+ Email = swaggerOptions.ContactEmail
+ };
+ if (!string.IsNullOrWhiteSpace(swaggerOptions.ContactUrl))
+ {
+ info.Contact.Url = new Uri(swaggerOptions.ContactUrl);
+ }
+ }
+
+ // 鍙湁鍦� URL 涓嶄负绌烘椂鎵嶈缃� License
+ if (!string.IsNullOrWhiteSpace(swaggerOptions.LicenseName) ||
+ !string.IsNullOrWhiteSpace(swaggerOptions.LicenseUrl))
+ {
+ info.License = new OpenApiLicense
+ {
+ Name = swaggerOptions.LicenseName
+ };
+ if (!string.IsNullOrWhiteSpace(swaggerOptions.LicenseUrl))
+ {
+ info.License.Url = new Uri(swaggerOptions.LicenseUrl);
+ }
+ }
+
+ options.SwaggerDoc(swaggerOptions.Version, info);
+
+ // 娣诲姞 JWT 璁よ瘉
+ if (swaggerOptions.EnableJwt)
+ {
+ options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
+ {
+ Description = "JWT 鎺堟潈浠ょ墝锛岃鍦ㄤ笅鏂硅緭鍏ユ涓緭鍏� Bearer {token}锛堟敞鎰忎袱鑰呬箣闂存湁涓�涓┖鏍硷級",
+ Name = "Authorization",
+ In = ParameterLocation.Header,
+ Type = SecuritySchemeType.ApiKey,
+ Scheme = "Bearer"
+ });
+
+ options.AddSecurityRequirement(document => new OpenApiSecurityRequirement
+ {
+ [new OpenApiSecuritySchemeReference("Bearer")] = new List<string>()
+ });
+ }
+
+ });
+
+ return services;
+ }
+
+ /// <summary>
+ /// 浣跨敤 Swagger 涓棿浠�
+ /// </summary>
+ public static IApplicationBuilder UseSwaggerDocumentation(this IApplicationBuilder app, IConfiguration configuration)
+ {
+ var swaggerOptions = configuration.GetSection("Swagger").Get<SwaggerOptions>();
+ swaggerOptions ??= new SwaggerOptions();
+
+ app.UseSwagger();
+ app.UseSwaggerUI(options =>
+ {
+ options.SwaggerEndpoint($"/swagger/{swaggerOptions.Version}/swagger.json", $"{swaggerOptions.Title} {swaggerOptions.Version}");
+ options.RoutePrefix = swaggerOptions.RoutePrefix;
+ options.DocumentTitle = swaggerOptions.Title;
+ options.DefaultModelsExpandDepth(-1); // 闅愯棌妯″瀷
+ });
+
+ return app;
+ }
+}
+
+/// <summary>
+/// Swagger 閰嶇疆閫夐」
+/// </summary>
+public class SwaggerOptions
+{
+ /// <summary>
+ /// 鏍囬
+ /// </summary>
+ public string Title { get; set; } = "API Documentation";
+
+ /// <summary>
+ /// 鐗堟湰
+ /// </summary>
+ public string Version { get; set; } = "v1";
+
+ /// <summary>
+ /// 鎻忚堪
+ /// </summary>
+ public string Description { get; set; } = "API Documentation";
+
+ /// <summary>
+ /// 鑱旂郴浜哄悕绉�
+ /// </summary>
+ public string ContactName { get; set; } = "";
+
+ /// <summary>
+ /// 鑱旂郴浜洪偖绠�
+ /// </summary>
+ public string ContactEmail { get; set; } = "";
+
+ /// <summary>
+ /// 鑱旂郴浜篣RL
+ /// </summary>
+ public string ContactUrl { get; set; } = "";
+
+ /// <summary>
+ /// 璁稿彲璇佸悕绉�
+ /// </summary>
+ public string LicenseName { get; set; } = "";
+
+ /// <summary>
+ /// 璁稿彲璇乁RL
+ /// </summary>
+ public string LicenseUrl { get; set; } = "";
+
+ /// <summary>
+ /// 璺敱鍓嶇紑
+ /// </summary>
+ public string RoutePrefix { get; set; } = "swagger";
+
+ /// <summary>
+ /// 鏄惁鍚敤 JWT 璁よ瘉
+ /// </summary>
+ public bool EnableJwt { get; set; } = true;
+}
diff --git a/KH.WMS/KH.WMS.Core/Api/Responses/ApiResponse.cs b/KH.WMS/KH.WMS.Core/Api/Responses/ApiResponse.cs
new file mode 100644
index 0000000..70390f6
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Api/Responses/ApiResponse.cs
@@ -0,0 +1,97 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace KH.WMS.Core.Api.Responses;
+
+/// <summary>
+/// API 缁熶竴鍝嶅簲鏍煎紡
+/// </summary>
+public class ApiResponse
+{
+ /// <summary>
+ /// 鍝嶅簲鐮�
+ /// </summary>
+ public string Code { get; set; } = "200";
+
+ /// <summary>
+ /// 鍝嶅簲娑堟伅
+ /// </summary>
+ public string Message { get; set; } = "鎿嶄綔鎴愬姛";
+
+ /// <summary>
+ /// 鏃堕棿鎴�
+ /// </summary>
+ public long Timestamp { get; set; } = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+
+ /// <summary>
+ /// 鍝嶅簲鏁版嵁
+ /// </summary>
+ public object? Data { get; set; }
+
+ /// <summary>
+ /// 璇锋眰璺熻釜ID
+ /// </summary>
+ public string? TraceId { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鎴愬姛鍝嶅簲
+ /// </summary>
+ public static ApiResponse Ok(object? data = null, string message = "鎿嶄綔鎴愬姛")
+ {
+ return new ApiResponse
+ {
+ Code = "200",
+ Message = message,
+ Data = data
+ };
+ }
+
+ /// <summary>
+ /// 鍒涘缓澶辫触鍝嶅簲
+ /// </summary>
+ public static ApiResponse Fail(string code, string message)
+ {
+ return new ApiResponse
+ {
+ Code = code,
+ Message = message
+ };
+ }
+
+}
+
+/// <summary>
+/// API 娉涘瀷鍝嶅簲鏍煎紡
+/// </summary>
+public class ApiResponse<T> : ApiResponse
+{
+ /// <summary>
+ /// 鍝嶅簲鏁版嵁
+ /// </summary>
+ public new T? Data { get; set; }
+
+ /// <summary>
+ /// 鍒涘缓鎴愬姛鍝嶅簲
+ /// </summary>
+ public static ApiResponse<T> Ok(T? data, string message = "鎿嶄綔鎴愬姛")
+ {
+ return new ApiResponse<T>
+ {
+ Code = "200",
+ Message = message,
+ Data = data
+ };
+ }
+
+ /// <summary>
+ /// 鍒涘缓澶辫触鍝嶅簲
+ /// </summary>
+ public static new ApiResponse<T> Fail(string code, string message)
+ {
+ return new ApiResponse<T>
+ {
+ Code = code,
+ Message = message
+ };
+ }
+}
+
diff --git a/KH.WMS/KH.WMS.Core/Api/Responses/Pagination.cs b/KH.WMS/KH.WMS.Core/Api/Responses/Pagination.cs
new file mode 100644
index 0000000..b7b049b
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Api/Responses/Pagination.cs
@@ -0,0 +1,167 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace KH.WMS.Core.Api.Responses;
+
+/// <summary>
+/// 鍒嗛〉璇锋眰鍙傛暟
+/// </summary>
+public class Pagination
+{
+ private int _pageIndex = 1;
+ private int _pageSize = 20;
+
+ /// <summary>
+ /// 椤电爜锛堜粠1寮�濮嬶級
+ /// </summary>
+ [Range(1, int.MaxValue, ErrorMessage = "椤电爜蹇呴』澶т簬0")]
+ public int PageIndex
+ {
+ get => _pageIndex;
+ set => _pageIndex = value < 1 ? 1 : value;
+ }
+
+ /// <summary>
+ /// 姣忛〉鏁伴噺
+ /// </summary>
+ [Range(1, 100, ErrorMessage = "姣忛〉鏁伴噺蹇呴』鍦�1-100涔嬮棿")]
+ public int PageSize
+ {
+ get => _pageSize;
+ set => _pageSize = value < 1 ? 20 : value > 100 ? 100 : value;
+ }
+
+ /// <summary>
+ /// 鎺掑簭瀛楁
+ /// </summary>
+ public string? SortField { get; set; }
+
+ /// <summary>
+ /// 鎺掑簭鏂瑰悜锛坅sc/desc锛�
+ /// </summary>
+ public string SortDirection { get; set; } = "asc";
+
+ /// <summary>
+ /// 璁$畻璺宠繃鏁伴噺
+ /// </summary>
+ public int Skip => (PageIndex - 1) * PageSize;
+
+ /// <summary>
+ /// 鑾峰彇鏁伴噺
+ /// </summary>
+ public int Take => PageSize;
+
+ /// <summary>
+ /// 鍒涘缓鍒嗛〉鍙傛暟
+ /// </summary>
+ public static Pagination Create(int pageIndex = 1, int pageSize = 20, string? sortField = null, string sortDirection = "asc")
+ {
+ return new Pagination
+ {
+ PageIndex = pageIndex,
+ PageSize = pageSize,
+ SortField = sortField,
+ SortDirection = sortDirection
+ };
+ }
+}
+
+/// <summary>
+/// 鍒嗛〉缁撴灉
+/// </summary>
+public class PagedResult<T>
+{
+ /// <summary>
+ /// 鏁版嵁鍒楄〃
+ /// </summary>
+ public List<T> Items { get; set; } = new();
+
+ /// <summary>
+ /// 鎬昏褰曟暟
+ /// </summary>
+ public int Total { get; set; }
+
+ /// <summary>
+ /// 褰撳墠椤电爜
+ /// </summary>
+ public int PageIndex { get; set; }
+
+ /// <summary>
+ /// 姣忛〉鏁伴噺
+ /// </summary>
+ public int PageSize { get; set; }
+
+ /// <summary>
+ /// 鎬婚〉鏁�
+ /// </summary>
+ public int PageCount => PageSize > 0 ? (int)Math.Ceiling((double)Total / PageSize) : 0;
+
+ /// <summary>
+ /// 鏄惁鏈変笂涓�椤�
+ /// </summary>
+ public bool HasPrevious => PageIndex > 1;
+
+ /// <summary>
+ /// 鏄惁鏈変笅涓�椤�
+ /// </summary>
+ public bool HasNext => PageIndex < PageCount;
+
+ /// <summary>
+ /// 鍒涘缓鍒嗛〉缁撴灉
+ /// </summary>
+ public static PagedResult<T> Create(List<T> items, int total, int pageIndex, int pageSize)
+ {
+ return new PagedResult<T>
+ {
+ Items = items,
+ Total = total,
+ PageIndex = pageIndex,
+ PageSize = pageSize
+ };
+ }
+
+ /// <summary>
+ /// 鍒涘缓绌哄垎椤电粨鏋�
+ /// </summary>
+ public static PagedResult<T> Empty(int pageIndex = 1, int pageSize = 20)
+ {
+ return new PagedResult<T>
+ {
+ Items = new List<T>(),
+ Total = 0,
+ PageIndex = pageIndex,
+ PageSize = pageSize
+ };
+ }
+}
+
+/// <summary>
+/// 鍒嗛〉鍝嶅簲鍖呰
+/// </summary>
+public class PagedResponse<T> : ApiResponse<PagedResult<T>>
+{
+ /// <summary>
+ /// 鍒涘缓鎴愬姛鍒嗛〉鍝嶅簲
+ /// </summary>
+ public static PagedResponse<T> Ok(List<T> items, int total, int pageIndex, int pageSize, string message = "鏌ヨ鎴愬姛")
+ {
+ return new PagedResponse<T>
+ {
+ Code = "200",
+ Message = message,
+ Data = PagedResult<T>.Create(items, total, pageIndex, pageSize)
+ };
+ }
+
+ /// <summary>
+ /// 鍒涘缓绌哄垎椤靛搷搴�
+ /// </summary>
+ public static PagedResponse<T> Empty(int pageIndex = 1, int pageSize = 20, string message = "鏆傛棤鏁版嵁")
+ {
+ return new PagedResponse<T>
+ {
+ Code = "200",
+ Message = message,
+ Data = PagedResult<T>.Empty(pageIndex, pageSize)
+ };
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Attributes/LogInterceptorAttribute.cs b/KH.WMS/KH.WMS.Core/Attributes/LogInterceptorAttribute.cs
new file mode 100644
index 0000000..4a95324
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Attributes/LogInterceptorAttribute.cs
@@ -0,0 +1,37 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+
+namespace KH.WMS.Core.Attributes
+{
+ /// <summary>
+ /// 鏃ュ織鎷︽埅鍣ㄧ壒鎬�
+ /// </summary>
+ [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
+ public class LogInterceptorAttribute : Attribute
+ {
+ /// <summary>
+ /// 鏄惁璁板綍鍙傛暟
+ /// </summary>
+ public bool LogParameters { get; set; } = true;
+
+ /// <summary>
+ /// 鏄惁璁板綍杩斿洖鍊�
+ /// </summary>
+ public bool LogReturnValue { get; set; } = false;
+
+ /// <summary>
+ /// 鏄惁璁板綍鎵ц鏃堕棿
+ /// </summary>
+ public bool LogExecutionTime { get; set; } = true;
+
+ /// <summary>
+ /// 鏃ュ織绾у埆
+ /// </summary>
+ public LogLevel LogLevel { get; set; } = LogLevel.Information;
+ }
+
+}
diff --git a/KH.WMS/KH.WMS.Core/Constants/AppSettingsConstants.cs b/KH.WMS/KH.WMS.Core/Constants/AppSettingsConstants.cs
new file mode 100644
index 0000000..99e5c6e
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Constants/AppSettingsConstants.cs
@@ -0,0 +1,26 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace KH.WMS.Core.Constants
+{
+ public class AppSettingsConstants
+ {
+ /// <summary>
+ /// 鏁版嵁搴撹繛鎺ュ瓧绗︿覆閰嶇疆鑺傜偣
+ /// </summary>
+ public const string DbConnection = "DbConnection";
+
+ public const string DbType_MySql = "mysql";
+
+ public const string DbType_SqlServer = "sqlserver";
+
+ public const string DbType_PostgreSql = "postgresql";
+
+ public const string DbType_Oracle = "oracle";
+
+ public const string DbType_Sqlite = "sqlite";
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Database/IDbContext.cs b/KH.WMS/KH.WMS.Core/Database/IDbContext.cs
new file mode 100644
index 0000000..f5234dd
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/IDbContext.cs
@@ -0,0 +1,44 @@
+using KH.WMS.Core.Database.Repositories;
+using SqlSugar;
+
+namespace KH.WMS.Core.Database;
+
+/// <summary>
+/// 鏁版嵁搴撲笂涓嬫枃鎺ュ彛
+/// </summary>
+public interface IDbContext : IDisposable
+{
+ /// <summary>
+ /// 鏁版嵁搴撴搷浣滃璞�
+ /// </summary>
+ ISqlSugarClient Db { get; }
+
+ /// <summary>
+ /// 寮�濮嬩簨鍔�
+ /// </summary>
+ Task BeginTransactionAsync(System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted);
+
+ /// <summary>
+ /// 鎻愪氦浜嬪姟
+ /// </summary>
+ Task CommitTransactionAsync();
+
+ /// <summary>
+ /// 鍥炴粴浜嬪姟
+ /// </summary>
+ Task RollbackTransactionAsync();
+
+ /// <summary>
+ /// 鑾峰彇褰撳墠浜嬪姟闅旂绾у埆
+ /// </summary>
+ System.Data.IsolationLevel? CurrentIsolationLevel { get; }
+
+ /// <summary>
+ /// 鑾峰彇浠撳偍
+ /// </summary>
+ IRepository<T, TKey> GetRepository<T, TKey>()
+ where T : class
+ where TKey : struct;
+}
+
+
diff --git a/KH.WMS/KH.WMS.Core/Database/Repositories/IRepository.cs b/KH.WMS/KH.WMS.Core/Database/Repositories/IRepository.cs
new file mode 100644
index 0000000..e53d799
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/Repositories/IRepository.cs
@@ -0,0 +1,97 @@
+using System.Linq.Expressions;
+using SqlSugar;
+
+namespace KH.WMS.Core.Database.Repositories;
+
+/// <summary>
+/// 浠撳偍鎺ュ彛
+/// </summary>
+/// <typeparam name="T">瀹炰綋绫诲瀷</typeparam>
+public interface IRepository<T, TKey>
+ where T : class
+ where TKey : struct
+{
+ /// <summary>
+ /// 鏍规嵁ID鑾峰彇瀹炰綋
+ /// </summary>
+ Task<T?> GetByIdAsync(TKey id);
+
+ /// <summary>
+ /// 鑾峰彇鎵�鏈夊疄浣�
+ /// </summary>
+ Task<List<T>> GetAllAsync();
+
+ /// <summary>
+ /// 鏍规嵁鏉′欢鏌ヨ瀹炰綋
+ /// </summary>
+ Task<List<T>> GetListAsync(Expression<Func<T, bool>> expression);
+
+ /// <summary>
+ /// 鏍规嵁鏉′欢鏌ヨ鍗曚釜瀹炰綋
+ /// </summary>
+ Task<T?> GetFirstOrDefaultAsync(Expression<Func<T, bool>> expression);
+
+ /// <summary>
+ /// 鍒嗛〉鏌ヨ
+ /// </summary>
+ Task<(List<T> Items, int Total)> GetPagedListAsync(int pageIndex, int pageSize, Expression<Func<T, bool>>? expression = null);
+
+ /// <summary>
+ /// 鎻掑叆瀹炰綋
+ /// </summary>
+ Task<TKey> InsertAsync(T entity);
+
+ /// <summary>
+ /// 鎵归噺鎻掑叆瀹炰綋
+ /// </summary>
+ Task<List<TKey>> InsertAsync(List<T> entities);
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="entity"></param>
+ /// <returns></returns>
+ Task<T> InsertReturnEntityAsync(T entity);
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="entities"></param>
+ /// <returns></returns>
+ Task<List<T>> InsertReturnEntityAsync(List<T> entities);
+
+ /// <summary>
+ /// 鏇存柊瀹炰綋
+ /// </summary>
+ Task<bool> UpdateAsync(T entity);
+
+ /// <summary>
+ /// 鎵归噺鏇存柊瀹炰綋
+ /// </summary>
+ Task<bool> UpdateAsync(List<T> entities);
+
+ /// <summary>
+ /// 鍒犻櫎瀹炰綋
+ /// </summary>
+ Task<bool> DeleteAsync(TKey id);
+
+ /// <summary>
+ /// 鎵归噺鍒犻櫎瀹炰綋
+ /// </summary>
+ Task<bool> DeleteAsync(List<TKey> ids);
+
+ /// <summary>
+ /// 鏍规嵁鏉′欢鍒犻櫎瀹炰綋
+ /// </summary>
+ Task<bool> DeleteAsync(Expression<Func<T, bool>> expression);
+
+ /// <summary>
+ /// 妫�鏌ュ疄浣撴槸鍚﹀瓨鍦�
+ /// </summary>
+ Task<bool> ExistsAsync(Expression<Func<T, bool>> expression);
+
+ /// <summary>
+ /// 鑾峰彇瀹炰綋鏁伴噺
+ /// </summary>
+ Task<int> CountAsync(Expression<Func<T, bool>>? expression = null);
+}
diff --git a/KH.WMS/KH.WMS.Core/Database/Repositories/RepositoryBase.cs b/KH.WMS/KH.WMS.Core/Database/Repositories/RepositoryBase.cs
new file mode 100644
index 0000000..0688b8c
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/Repositories/RepositoryBase.cs
@@ -0,0 +1,121 @@
+using SqlSugar;
+using Microsoft.Extensions.Logging;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+
+namespace KH.WMS.Core.Database.Repositories;
+
+/// <summary>
+/// 浠撳偍鍩虹被瀹炵幇
+/// </summary>
+/// <typeparam name="T">瀹炰綋绫诲瀷</typeparam>
+public class RepositoryBase<T, TKey> : IRepository<T, TKey>
+ where T : class, new()
+ where TKey : struct
+{
+ protected readonly ISqlSugarClient _db;
+ protected readonly ILogger? _logger;
+
+ public RepositoryBase(ISqlSugarClient db, ILogger? logger = null)
+ {
+ _db = db;
+ _logger = logger;
+ }
+
+ public async Task<T?> GetByIdAsync(TKey id)
+ {
+ return await _db.Queryable<T>().In(id).FirstAsync();
+ }
+
+ public async Task<List<T>> GetAllAsync()
+ {
+ return await _db.Queryable<T>().ToListAsync();
+ }
+
+ public async Task<List<T>> GetListAsync(System.Linq.Expressions.Expression<Func<T, bool>> expression)
+ {
+ return await _db.Queryable<T>().Where(expression).ToListAsync();
+ }
+
+ public async Task<T?> GetFirstOrDefaultAsync(System.Linq.Expressions.Expression<Func<T, bool>> expression)
+ {
+ return await _db.Queryable<T>().FirstAsync(expression);
+ }
+
+ public async Task<(List<T> Items, int Total)> GetPagedListAsync(int pageIndex, int pageSize, System.Linq.Expressions.Expression<Func<T, bool>>? expression = null)
+ {
+ var query = _db.Queryable<T>();
+
+ if (expression != null)
+ {
+ query = query.Where(expression);
+ }
+
+ var total = await query.CountAsync();
+ var items = await query.ToPageListAsync(pageIndex, pageSize);
+
+ return (items, total);
+ }
+
+ public async Task<TKey> InsertAsync(T entity)
+ {
+ return (await _db.Insertable(entity).ExecuteReturnPkListAsync<TKey>()).First();
+ }
+
+ public async Task<List<TKey>> InsertAsync(List<T> entities)
+ {
+ return await _db.Insertable(entities).ExecuteReturnPkListAsync<TKey>();
+ }
+
+ public async Task<T> InsertReturnEntityAsync(T entity)
+ {
+ return await _db.Insertable(entity).ExecuteReturnEntityAsync();
+ }
+
+ public async Task<List<T>> InsertReturnEntityAsync(List<T> entities)
+ {
+ List<TKey> keys = await _db.Insertable(entities).ExecuteReturnPkListAsync<TKey>();
+ return await _db.Queryable<T>().In(keys).ToListAsync();
+ }
+
+ public async Task<bool> UpdateAsync(T entity)
+ {
+ return await _db.Updateable(entity).ExecuteCommandAsync() > 0;
+ }
+
+ public async Task<bool> UpdateAsync(List<T> entities)
+ {
+ return await _db.Updateable(entities).ExecuteCommandAsync() > 0;
+ }
+
+ public async Task<bool> DeleteAsync(TKey id)
+ {
+ return await _db.Deleteable<T>().In(id).ExecuteCommandAsync() > 0;
+ }
+
+ public async Task<bool> DeleteAsync(List<TKey> ids)
+ {
+ return await _db.Deleteable<T>().In(ids).ExecuteCommandAsync() > 0;
+ }
+
+ public async Task<bool> DeleteAsync(System.Linq.Expressions.Expression<Func<T, bool>> expression)
+ {
+ return await _db.Deleteable<T>().Where(expression).ExecuteCommandAsync() > 0;
+ }
+
+ public async Task<bool> ExistsAsync(System.Linq.Expressions.Expression<Func<T, bool>> expression)
+ {
+ return await _db.Queryable<T>().Where(expression).AnyAsync();
+ }
+
+ public async Task<int> CountAsync(System.Linq.Expressions.Expression<Func<T, bool>>? expression = null)
+ {
+ var query = _db.Queryable<T>();
+
+ if (expression != null)
+ {
+ query = query.Where(expression);
+ }
+
+ return await query.CountAsync();
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarDbContext.cs b/KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarDbContext.cs
new file mode 100644
index 0000000..05ddfba
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarDbContext.cs
@@ -0,0 +1,93 @@
+using KH.WMS.Core.Database.Repositories;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+using Microsoft.AspNetCore.DataProtection.KeyManagement;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using SqlSugar;
+
+namespace KH.WMS.Core.Database.SqlSugar;
+
+/// <summary>
+/// SQL Sugar 鏁版嵁搴撲笂涓嬫枃锛堟敮鎸佷簨鍔″祵濂楋級
+/// </summary>
+[RegisteredService(Lifetime = Microsoft.Extensions.DependencyInjection.ServiceLifetime.Scoped)]
+public class SqlSugarDbContext : IDbContext
+{
+ private readonly ISqlSugarClient _sqlSugarClient;
+ private readonly ILogger<SqlSugarDbContext> _logger;
+ private readonly DatabaseOptions _options;
+
+ // 浜嬪姟鏍堬紝鐢ㄤ簬鏀寔宓屽浜嬪姟
+ private readonly Stack<TransactionScope> _transactionScopes = new();
+
+ public SqlSugarDbContext(
+ ISqlSugarClient sqlSugarClient,
+ ILogger<SqlSugarDbContext> logger,
+ IOptions<DatabaseOptions> options)
+ {
+ _sqlSugarClient = sqlSugarClient;
+ _logger = logger;
+ _options = options.Value;
+ }
+
+ /// <summary>
+ /// 鑾峰彇褰撳墠浜嬪姟闅旂绾у埆
+ /// </summary>
+ public System.Data.IsolationLevel? CurrentIsolationLevel =>
+ _transactionScopes.Count > 0 ? _transactionScopes.Peek().IsolationLevel : null;
+
+ public ISqlSugarClient Db => _sqlSugarClient;
+
+ public async Task BeginTransactionAsync(System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
+ {
+ await _sqlSugarClient.Ado.BeginTranAsync(isolationLevel);
+ }
+
+ public async Task CommitTransactionAsync()
+ {
+ await _sqlSugarClient.Ado.CommitTranAsync();
+ _logger.LogInformation("浜嬪姟宸叉彁浜�");
+ }
+
+ public async Task RollbackTransactionAsync()
+ {
+ await _sqlSugarClient.Ado.RollbackTranAsync();
+ _logger.LogInformation("浜嬪姟宸插洖婊�");
+ }
+
+ public IRepository<T, TKey> GetRepository<T, TKey>() where T : class, new() where TKey : struct
+ {
+ return new RepositoryBase<T, TKey>(_sqlSugarClient, _logger);
+ }
+
+ public void Dispose()
+ {
+ // 濡傛灉鏈夋湭鎻愪氦鐨勪簨鍔★紝鑷姩鍥炴粴
+
+ _sqlSugarClient?.Ado.RollbackTran();
+
+ _sqlSugarClient?.Dispose();
+ }
+
+ IRepository<T, TKey> IDbContext.GetRepository<T, TKey>()
+ {
+ throw new NotImplementedException();
+ }
+
+ /// <summary>
+ /// 浜嬪姟浣滅敤鍩�
+ /// </summary>
+ private class TransactionScope
+ {
+ public System.Data.IsolationLevel IsolationLevel { get; }
+ public bool IsCompleted { get; set; }
+ public bool RequiresRollback { get; set; }
+
+ public TransactionScope(System.Data.IsolationLevel isolationLevel)
+ {
+ IsolationLevel = isolationLevel;
+ IsCompleted = false;
+ RequiresRollback = false;
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarSetup.cs b/KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarSetup.cs
new file mode 100644
index 0000000..154b6a7
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarSetup.cs
@@ -0,0 +1,120 @@
+using KH.WMS.Core.Constants;
+using KH.WMS.Core.Database.UnitOfWorks;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using SqlSugar;
+using StackExchange.Profiling;
+
+namespace KH.WMS.Core.Database.SqlSugar;
+
+/// <summary>
+/// SQL Sugar 閰嶇疆
+/// </summary>
+public static class SqlSugarSetup
+{
+ /// <summary>
+ /// 娣诲姞 SQL Sugar 鏈嶅姟
+ /// </summary>
+ public static IServiceCollection AddSqlSugar(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.Configure<DatabaseOptions>(configuration.GetSection(AppSettingsConstants.DbConnection));
+
+ Console.WriteLine("SqlSugar 姝e湪鍒濆鍖栨暟鎹簱杩炴帴...");
+
+ services.AddSingleton<ISqlSugarClient>(provider =>
+ {
+ var options = provider.GetRequiredService<IOptions<DatabaseOptions>>().Value;
+ var logger = provider.GetService<ILogger<SqlSugarClient>>();
+
+ var config = new ConnectionConfig
+ {
+ ConnectionString = options.ConnectionString,
+ DbType = GetDbType(options.DbType),
+ IsAutoCloseConnection = true,
+ InitKeyType = InitKeyType.Attribute,
+ AopEvents = new AopEvents
+ {
+ OnLogExecuting = (sql, pars) =>
+ {
+ var paramStr = string.Join(", ", pars.Select(p => $"{p.ParameterName}={p.Value}"));
+ Parallel.For(0, 1, e =>
+ {
+ MiniProfiler.Current.CustomTiming("SQL锛�", paramStr + "銆怱QL璇彞銆戯細" + sql);
+ });
+
+ // 浣跨敤 Verbose 绾у埆璁板綍姣忎竴琛� SQL 鎵ц
+ if (options.EnableSqlLog && logger != null)
+ {
+ logger.LogTrace("[SQL鎵ц] {Sql} | 鍙傛暟: {Params}", sql, paramStr);
+ }
+
+ // 寮�鍙戠幆澧冨悓鏃惰緭鍑哄埌鎺у埗鍙�
+ if (options.EnableSqlLog)
+ {
+ Console.WriteLine($"SQL: {sql}\nPARAMS: {paramStr}");
+ }
+ }
+ },
+ };
+
+ // 寮�鍙戠幆澧冩墦鍗癝QL
+ if (options.EnableSqlLog)
+ {
+ config.ConfigureExternalServices = new ConfigureExternalServices
+ {
+ //SqlFuncServices = new SqlFuncExternalService(),
+ EntityService = null,
+ //DataInfoCacheService =
+ };
+ }
+
+ return new SqlSugarClient(config);
+ });
+
+ //services.AddScoped<IDbContext, SqlSugarDbContext>();
+ //services.AddScoped<IUnitOfWork, UnitOfWork>();
+
+ return services;
+ }
+
+ private static DbType GetDbType(string dbType)
+ {
+ return dbType.ToLower() switch
+ {
+ AppSettingsConstants.DbType_MySql => DbType.MySql,
+ AppSettingsConstants.DbType_SqlServer => DbType.SqlServer,
+ AppSettingsConstants.DbType_PostgreSql => DbType.PostgreSQL,
+ AppSettingsConstants.DbType_Oracle => DbType.Oracle,
+ AppSettingsConstants.DbType_Sqlite => DbType.Sqlite,
+ _ => DbType.SqlServer
+ };
+ }
+}
+
+/// <summary>
+/// 鏁版嵁搴撻厤缃�夐」
+/// </summary>
+public class DatabaseOptions
+{
+ /// <summary>
+ /// 杩炴帴瀛楃涓�
+ /// </summary>
+ public string ConnectionString { get; set; } = string.Empty;
+
+ /// <summary>
+ /// 鏁版嵁搴撶被鍨�
+ /// </summary>
+ public string DbType { get; set; } = AppSettingsConstants.DbType_SqlServer;
+
+ /// <summary>
+ /// 鏄惁鍚敤SQL鏃ュ織
+ /// </summary>
+ public bool EnableSqlLog { get; set; } = true;
+
+ /// <summary>
+ /// 鍛戒护瓒呮椂鏃堕棿锛堢锛�
+ /// </summary>
+ public int CommandTimeout { get; set; } = 30;
+}
diff --git a/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/IUnitOfWork.cs b/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/IUnitOfWork.cs
new file mode 100644
index 0000000..b2a90e5
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/IUnitOfWork.cs
@@ -0,0 +1,50 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using KH.WMS.Core.Database.Repositories;
+
+namespace KH.WMS.Core.Database.UnitOfWorks
+{
+ /// <summary>
+ /// 宸ヤ綔鍗曞厓鎺ュ彛
+ /// </summary>
+ public interface IUnitOfWork : IDisposable
+ {
+ /// <summary>
+ /// 寮�濮嬩簨鍔�
+ /// </summary>
+ Task BeginTransactionAsync(System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted);
+
+ /// <summary>
+ /// 鎻愪氦浜嬪姟
+ /// </summary>
+ Task CommitAsync();
+
+ /// <summary>
+ /// 鍥炴粴浜嬪姟
+ /// </summary>
+ Task RollbackAsync();
+
+ /// <summary>
+ /// 鑾峰彇鏁版嵁搴撲笂涓嬫枃
+ /// </summary>
+ IDbContext DbContext { get; }
+
+ /// <summary>
+ /// 鑾峰彇浠撳偍
+ /// </summary>
+ IRepository<T, TKey> GetRepository<T, TKey>() where T : class where TKey : struct;
+
+ /// <summary>
+ /// 鎵ц SQL 鍛戒护
+ /// </summary>
+ Task<int> ExecuteSqlAsync<TKey>(string sql, params object?[] parameters) where TKey : struct;
+
+ /// <summary>
+ /// 鎵ц SQL 鍛戒护锛堣繑鍥炲垪琛級
+ /// </summary>
+ Task<List<T>> ExecuteSqlAsync<T, TKey>(string sql, params object?[] parameters) where T : class where TKey : struct;
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWork.cs b/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWork.cs
new file mode 100644
index 0000000..fe694f2
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWork.cs
@@ -0,0 +1,100 @@
+
+using Microsoft.Extensions.Logging;
+using KH.WMS.Core.Database.Repositories;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+
+namespace KH.WMS.Core.Database.UnitOfWorks;
+
+/// <summary>
+/// 宸ヤ綔鍗曞厓瀹炵幇锛堥潰鍚戞帴鍙o紝鏀寔浜嬪姟宓屽锛�
+/// </summary>
+[RegisteredService(Lifetime = Microsoft.Extensions.DependencyInjection.ServiceLifetime.Scoped)]
+public class UnitOfWork : IUnitOfWork
+{
+ private readonly IDbContext _dbContext;
+ private readonly ILogger<UnitOfWork> _logger;
+ private bool _disposed;
+
+ public UnitOfWork(IDbContext dbContext, ILogger<UnitOfWork> logger)
+ {
+ _dbContext = dbContext;
+ _logger = logger;
+ }
+
+ /// <summary>
+ /// 鑾峰彇鏁版嵁搴撲笂涓嬫枃
+ /// </summary>
+ public IDbContext DbContext => _dbContext;
+
+ /// <summary>
+ /// 寮�濮嬩簨鍔�
+ /// </summary>
+ public async Task BeginTransactionAsync(System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
+ {
+ await _dbContext.BeginTransactionAsync(isolationLevel);
+ _logger.LogDebug("宸ヤ綔鍗曞厓浜嬪姟宸插紑鍚�");
+ }
+
+ /// <summary>
+ /// 鎻愪氦浜嬪姟
+ /// </summary>
+ public async Task CommitAsync()
+ {
+ await _dbContext.CommitTransactionAsync();
+ _logger.LogDebug("宸ヤ綔鍗曞厓浜嬪姟宸叉彁浜�");
+ }
+
+ /// <summary>
+ /// 鍥炴粴浜嬪姟
+ /// </summary>
+ public async Task RollbackAsync()
+ {
+ await _dbContext.RollbackTransactionAsync();
+ _logger.LogDebug("宸ヤ綔鍗曞厓浜嬪姟宸插洖婊�");
+ }
+
+ /// <summary>
+ /// 鑾峰彇浠撳偍
+ /// </summary>
+ public IRepository<T, TKey> GetRepository<T, TKey>() where T : class where TKey : struct
+ {
+ return _dbContext.GetRepository<T, TKey>();
+ }
+
+ /// <summary>
+ /// 鎵ц SQL 鍛戒护
+ /// </summary>
+ public async Task<int> ExecuteSqlAsync<TKey>(string sql, params object?[] parameters) where TKey : struct
+ {
+ var repository = GetRepository<dynamic, TKey>();
+ // 浣跨敤 Ado 鎵ц鍛戒护
+ // 杩欓噷闇�瑕佹牴鎹疄闄呯殑 ISqlSugarClient 瀹炵幇鏉ユ墽琛� SQL
+ return await Task.FromResult(0);
+ }
+
+ /// <summary>
+ /// 鎵ц SQL 鍛戒护锛堣繑鍥炲垪琛級
+ /// </summary>
+ public async Task<List<T>> ExecuteSqlAsync<T, TKey>(string sql, params object?[] parameters) where T : class where TKey : struct
+ {
+ var repository = GetRepository<T, TKey>();
+ // 浣跨敤 Ado 鎵ц鏌ヨ
+ // 杩欓噷闇�瑕佹牴鎹疄闄呯殑 ISqlSugarClient 瀹炵幇鏉ユ墽琛� SQL
+ return await Task.FromResult(new List<T>());
+ }
+
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ _dbContext?.Dispose();
+ _disposed = true;
+ }
+ }
+
+ IRepository<T, TKey> IUnitOfWork.GetRepository<T, TKey>() where T : class where TKey : struct
+ {
+ return _dbContext.GetRepository<T, TKey>();
+ }
+}
+
diff --git a/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWorkExtensions.cs b/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWorkExtensions.cs
new file mode 100644
index 0000000..46b0b3d
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWorkExtensions.cs
@@ -0,0 +1,160 @@
+using Microsoft.Extensions.Logging;
+
+namespace KH.WMS.Core.Database.UnitOfWorks;
+
+/// <summary>
+/// UnitOfWork 鎵╁睍鏂规硶
+/// </summary>
+public static class UnitOfWorkExtensions
+{
+ /// <summary>
+ /// 鍒涘缓浜嬪姟浣滅敤鍩燂紝鑷姩绠$悊浜嬪姟鐢熷懡鍛ㄦ湡
+ /// </summary>
+ /// <param name="unitOfWork">宸ヤ綔鍗曞厓</param>
+ /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+ /// <param name="isolationLevel">浜嬪姟闅旂绾у埆</param>
+ /// <returns>浜嬪姟浣滅敤鍩�</returns>
+ public static async Task<ITransactionScope> BeginTransactionScopeAsync(
+ this IUnitOfWork unitOfWork,
+ ILogger logger,
+ System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
+ {
+ await unitOfWork.BeginTransactionAsync(isolationLevel);
+ return new TransactionScopeWrapper(unitOfWork, logger);
+ }
+
+ /// <summary>
+ /// 鍦ㄤ簨鍔′綔鐢ㄥ煙涓墽琛屾搷浣�
+ /// </summary>
+ /// <param name="unitOfWork">宸ヤ綔鍗曞厓</param>
+ /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+ /// <param name="action">瑕佹墽琛岀殑鎿嶄綔</param>
+ /// <param name="isolationLevel">浜嬪姟闅旂绾у埆</param>
+ public static async Task ExecuteInTransactionAsync(
+ this IUnitOfWork unitOfWork,
+ ILogger logger,
+ Func<Task> action,
+ System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
+ {
+ await using var scope = await unitOfWork.BeginTransactionScopeAsync(logger, isolationLevel);
+ try
+ {
+ await action();
+ await scope.CommitAsync();
+ }
+ catch
+ {
+ await scope.RollbackAsync();
+ throw;
+ }
+ }
+
+ /// <summary>
+ /// 鍦ㄤ簨鍔′綔鐢ㄥ煙涓墽琛屾搷浣滐紙甯﹁繑鍥炲�硷級
+ /// </summary>
+ /// <typeparam name="T">杩斿洖鍊肩被鍨�</typeparam>
+ /// <param name="unitOfWork">宸ヤ綔鍗曞厓</param>
+ /// <param name="logger">鏃ュ織璁板綍鍣�</param>
+ /// <param name="action">瑕佹墽琛岀殑鎿嶄綔</param>
+ /// <param name="isolationLevel">浜嬪姟闅旂绾у埆</param>
+ /// <returns>鎿嶄綔缁撴灉</returns>
+ public static async Task<T> ExecuteInTransactionAsync<T>(
+ this IUnitOfWork unitOfWork,
+ ILogger logger,
+ Func<Task<T>> action,
+ System.Data.IsolationLevel isolationLevel = System.Data.IsolationLevel.ReadCommitted)
+ {
+ await using var scope = await unitOfWork.BeginTransactionScopeAsync(logger, isolationLevel);
+ try
+ {
+ var result = await action();
+ await scope.CommitAsync();
+ return result;
+ }
+ catch
+ {
+ await scope.RollbackAsync();
+ throw;
+ }
+ }
+}
+
+/// <summary>
+/// 浜嬪姟浣滅敤鍩熸帴鍙�
+/// </summary>
+public interface ITransactionScope : IAsyncDisposable
+{
+ /// <summary>
+ /// 鎻愪氦浜嬪姟
+ /// </summary>
+ Task CommitAsync();
+
+ /// <summary>
+ /// 鍥炴粴浜嬪姟
+ /// </summary>
+ Task RollbackAsync();
+
+ /// <summary>
+ /// 浜嬪姟鏄惁宸叉彁浜�
+ /// </summary>
+ bool IsCommitted { get; }
+}
+
+/// <summary>
+/// 浜嬪姟浣滅敤鍩熷寘瑁呭櫒
+/// </summary>
+public class TransactionScopeWrapper : ITransactionScope
+{
+ private readonly IUnitOfWork _unitOfWork;
+ private readonly ILogger _logger;
+ private bool _disposed;
+ private bool _committed;
+
+ public TransactionScopeWrapper(IUnitOfWork unitOfWork, ILogger logger)
+ {
+ _unitOfWork = unitOfWork;
+ _logger = logger;
+ }
+
+ public bool IsCommitted => _committed;
+
+ public async Task CommitAsync()
+ {
+ if (!_committed)
+ {
+ await _unitOfWork.CommitAsync();
+ _committed = true;
+ _logger.LogDebug("浜嬪姟浣滅敤鍩熷凡鎻愪氦");
+ }
+ }
+
+ public async Task RollbackAsync()
+ {
+ if (!_committed)
+ {
+ await _unitOfWork.RollbackAsync();
+ _committed = true;
+ _logger.LogDebug("浜嬪姟浣滅敤鍩熷凡鍥炴粴");
+ }
+ }
+
+ public async ValueTask DisposeAsync()
+ {
+ if (!_disposed)
+ {
+ if (!_committed)
+ {
+ _logger.LogWarning("浜嬪姟浣滅敤鍩熼噴鏀炬椂鏈彁浜わ紝鑷姩鍥炴粴");
+ try
+ {
+ await _unitOfWork.RollbackAsync();
+ }
+ catch
+ {
+ // 蹇界暐 dispose 鏃剁殑寮傚父
+ }
+ }
+ _disposed = true;
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/DependencyInjection/IServiceRegistrar.cs b/KH.WMS/KH.WMS.Core/DependencyInjection/IServiceRegistrar.cs
new file mode 100644
index 0000000..6997c36
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/DependencyInjection/IServiceRegistrar.cs
@@ -0,0 +1,15 @@
+using Autofac;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.Core.DependencyInjection;
+
+/// <summary>
+/// 鏈嶅姟娉ㄥ唽鍣ㄦ帴鍙�
+/// </summary>
+public interface IServiceRegistrar
+{
+ /// <summary>
+ /// 娉ㄥ唽鏈嶅姟
+ /// </summary>
+ void Register(ContainerBuilder builder, params System.Reflection.Assembly[] assemblies);
+}
diff --git a/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceExtensions.cs b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceExtensions.cs
new file mode 100644
index 0000000..6b78362
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceExtensions.cs
@@ -0,0 +1,57 @@
+using System.Reflection;
+using Autofac;
+using Autofac.Core;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyModel;
+
+namespace KH.WMS.Core.DependencyInjection;
+
+/// <summary>
+/// 鏈嶅姟闆嗗悎鎵╁睍鏂规硶
+/// </summary>
+public class ServiceExtensions : Autofac.Module
+{
+ protected override void Load(ContainerBuilder builder)
+ {
+ List<Assembly> assemblies = GetReferencedAssemblies();
+
+ IServiceRegistrar registrar = new ServiceRegistrar();
+ registrar.Register(builder, assemblies.ToArray());
+ }
+
+ /// <summary>
+ /// 鑾峰彇椤圭洰鍐呯殑绋嬪簭闆�
+ /// </summary>
+ /// <returns></returns>
+ private List<Assembly> GetReferencedAssemblies()
+ {
+ List<Assembly> assemblies = new();
+ string basePath = AppContext.BaseDirectory;
+ try
+ {
+ List<RuntimeLibrary> compilationLibraries = DependencyContext.Default.RuntimeLibraries.Where(x => x.Name.StartsWith("KH.WMS")).ToList();
+ foreach (var library in compilationLibraries)
+ {
+ try
+ {
+ string path = Path.Combine(basePath, $"{library.Name}.dll");
+ if (!File.Exists(path))
+ {
+ continue;
+ }
+ assemblies.Add(Assembly.LoadFrom(path));
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine(library.Name + ex.Message);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine($"閿欒: 鑾峰彇绋嬪簭闆嗗け璐�: {ex.Message}");
+ }
+
+ return assemblies;
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/RegisteredServiceAttribute.cs b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/RegisteredServiceAttribute.cs
new file mode 100644
index 0000000..e32fa1b
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/RegisteredServiceAttribute.cs
@@ -0,0 +1,21 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.Core.DependencyInjection.ServiceLifetimes
+{
+ /// <summary>
+ /// 鑷敞鍐屾湇鍔℃爣璁� - 鐢ㄤ簬鏍囪闇�瑕佽嚜鍔ㄦ敞鍐屽埌渚濊禆娉ㄥ叆瀹瑰櫒鐨勬湇鍔�
+ /// </summary>
+ [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
+ public class RegisteredServiceAttribute : Attribute
+ {
+ /// <summary>
+ /// 鏈嶅姟鐢熷懡鍛ㄦ湡
+ /// </summary>
+ public ServiceLifetime Lifetime { get; set; } = ServiceLifetime.Scoped;
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/SelfRegisteredServiceAttribute.cs b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/SelfRegisteredServiceAttribute.cs
new file mode 100644
index 0000000..410b9c4
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/SelfRegisteredServiceAttribute.cs
@@ -0,0 +1,17 @@
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+
+/// <summary>
+/// 鑷敞鍐屾湇鍔℃爣璁� - 鏈嶅姟鑷韩浣滀负瀹炵幇绫诲瀷
+/// </summary>
+[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
+public class SelfRegisteredServiceAttribute : Attribute
+{
+ /// <summary>
+ /// 鏈嶅姟鐢熷懡鍛ㄦ湡
+ /// </summary>
+ public ServiceLifetime Lifetime { get; set; } = ServiceLifetime.Scoped;
+}
+
+
diff --git a/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceRegistrar.cs b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceRegistrar.cs
new file mode 100644
index 0000000..576c53a
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/DependencyInjection/ServiceRegistrar.cs
@@ -0,0 +1,168 @@
+using System.Reflection;
+using Autofac;
+using Autofac.Extras.DynamicProxy;
+using Castle.DynamicProxy;
+using KH.WMS.Core.AOP;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace KH.WMS.Core.DependencyInjection;
+
+/// <summary>
+/// 鑷姩鏈嶅姟娉ㄥ唽鍣�
+/// </summary>
+public class ServiceRegistrar : IServiceRegistrar
+{
+ public void Register(ContainerBuilder builder, params Assembly[] assemblies)
+ {
+ // 濡傛灉娌℃湁浼犲叆绋嬪簭闆嗭紝浣跨敤璋冪敤绋嬪簭闆�
+ if (assemblies == null || assemblies.Length == 0)
+ {
+ assemblies = new[] { Assembly.GetCallingAssembly() };
+ }
+
+ // 娉ㄥ唽鎵�鏈夊甫鐢熷懡鍛ㄦ湡鏍囪鐨勬湇鍔�
+ RegisterServicesWithLifetime(builder, assemblies);
+
+ Console.WriteLine("鏈嶅姟娉ㄥ唽瀹屾垚");
+ }
+
+ private Type[] interceptors = new Type[]
+ {
+ typeof(LoggingInterceptor),
+ };
+
+ private void RegisterServicesWithLifetime(ContainerBuilder builder, Assembly[] assemblies)
+ {
+ var serviceTypes = new[]
+ {
+ typeof(RegisteredServiceAttribute),
+ typeof(SelfRegisteredServiceAttribute)
+ };
+
+ builder.RegisterType<LoggingInterceptor>();
+
+ foreach (var assembly in assemblies)
+ {
+ var types = assembly.GetTypes()
+ .Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface)
+ .SelectMany(t => t.GetCustomAttributes(), (t, attr) => new { Type = t, Attribute = attr })
+ .Where(x => serviceTypes.Contains(x.Attribute.GetType()));
+
+ foreach (var item in types)
+ {
+ if (item.Type.Name.Contains("LoggerService"))
+ {
+ RegisterServiceWithoutInterceptor(builder, item.Type, item.Attribute, assemblies);
+ continue;
+ }
+
+ var interfaces = item.Type.GetInterfaces();
+ var serviceType = interfaces.FirstOrDefault() ?? item.Type;
+
+ if (item.Attribute is RegisteredServiceAttribute registeredAttr)
+ {
+ if (serviceType == item.Type)
+ {
+ Console.WriteLine($"绫诲瀷 {item.Type.Name} 鏍囪涓� RegisteredServiceAttribute锛屼絾鏈疄鐜颁换浣曟帴鍙o紝寤鸿浣跨敤 SelfRegisteredServiceAttribute 杩涜鑷敞鍐屻��");
+ Console.WriteLine($"缁х画娉ㄥ唽 {item.Type.Name} 涓鸿嚜娉ㄥ唽鏈嶅姟銆�");
+
+ RegisterSelfService(builder, item.Type, registeredAttr.Lifetime);
+ continue;
+ }
+
+ RegisterService(builder, serviceType, item.Type, registeredAttr.Lifetime);
+ }
+ else if (item.Attribute is SelfRegisteredServiceAttribute selfRegisteredAttr)
+ {
+ RegisterSelfService(builder, item.Type, selfRegisteredAttr.Lifetime);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// 娉ㄥ唽鏈嶅姟浣嗕笉娣诲姞鎷︽埅鍣紙鐢ㄤ簬 LoggerService 绛夊熀纭�鏈嶅姟锛�
+ /// </summary>
+ private void RegisterServiceWithoutInterceptor(ContainerBuilder builder, Type implementationType, Attribute attribute, Assembly[] assemblies)
+ {
+ if (attribute is RegisteredServiceAttribute registeredAttr)
+ {
+ var interfaces = implementationType.GetInterfaces();
+ var serviceType = interfaces.FirstOrDefault() ?? implementationType;
+
+ switch (registeredAttr.Lifetime)
+ {
+ case ServiceLifetime.Singleton:
+ builder.RegisterType(implementationType).As(serviceType).SingleInstance();
+ Console.WriteLine($"娉ㄥ唽 Singleton 鏈嶅姟锛堟棤鎷︽埅鍣級: {serviceType.Name}");
+ break;
+ case ServiceLifetime.Scoped:
+ builder.RegisterType(implementationType).As(serviceType).InstancePerLifetimeScope();
+ Console.WriteLine($"娉ㄥ唽 Scoped 鏈嶅姟锛堟棤鎷︽埅鍣級: {serviceType.Name}");
+ break;
+ case ServiceLifetime.Transient:
+ builder.RegisterType(implementationType).As(serviceType).InstancePerDependency();
+ Console.WriteLine($"娉ㄥ唽 Transient 鏈嶅姟锛堟棤鎷︽埅鍣級: {serviceType.Name}");
+ break;
+ }
+ }
+ else if (attribute is SelfRegisteredServiceAttribute selfRegisteredAttr)
+ {
+ switch (selfRegisteredAttr.Lifetime)
+ {
+ case ServiceLifetime.Singleton:
+ builder.RegisterType(implementationType).SingleInstance();
+ Console.WriteLine($"娉ㄥ唽鑷敞鍐� Singleton 鏈嶅姟锛堟棤鎷︽埅鍣級: {implementationType.Name}");
+ break;
+ case ServiceLifetime.Scoped:
+ builder.RegisterType(implementationType).InstancePerLifetimeScope();
+ Console.WriteLine($"娉ㄥ唽鑷敞鍐� Scoped 鏈嶅姟锛堟棤鎷︽埅鍣級: {implementationType.Name}");
+ break;
+ case ServiceLifetime.Transient:
+ builder.RegisterType(implementationType).InstancePerDependency();
+ Console.WriteLine($"娉ㄥ唽鑷敞鍐� Transient 鏈嶅姟锛堟棤鎷︽埅鍣級: {implementationType.Name}");
+ break;
+ }
+ }
+ }
+
+ private void RegisterService(ContainerBuilder builder, Type serviceType, Type implementationType, ServiceLifetime lifetime)
+ {
+ switch (lifetime)
+ {
+ case ServiceLifetime.Singleton:
+ builder.RegisterType(implementationType).As(serviceType).SingleInstance().EnableInterfaceInterceptors().InterceptedBy(interceptors);
+ Console.WriteLine($"娉ㄥ唽 Singleton 鏈嶅姟: {serviceType.Name}");
+ break;
+ case ServiceLifetime.Scoped:
+ builder.RegisterType(implementationType).As(serviceType).InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(interceptors);
+ Console.WriteLine($"娉ㄥ唽 Scoped 鏈嶅姟: {serviceType.Name}");
+ break;
+ case ServiceLifetime.Transient:
+ builder.RegisterType(implementationType).As(serviceType).InstancePerDependency().EnableInterfaceInterceptors().InterceptedBy(interceptors);
+ Console.WriteLine($"娉ㄥ唽 Transient 鏈嶅姟: {serviceType.Name}");
+ break;
+ }
+ }
+
+ private void RegisterSelfService(ContainerBuilder builder, Type implementationType, ServiceLifetime lifetime)
+ {
+ switch (lifetime)
+ {
+ case ServiceLifetime.Singleton:
+ builder.RegisterType(implementationType).SingleInstance().EnableClassInterceptors().InterceptedBy(interceptors);
+ Console.WriteLine($"娉ㄥ唽鑷敞鍐� Singleton 鏈嶅姟: {implementationType.Name}");
+ break;
+ case ServiceLifetime.Scoped:
+ builder.RegisterType(implementationType).InstancePerLifetimeScope().EnableClassInterceptors().InterceptedBy(interceptors);
+ Console.WriteLine($"娉ㄥ唽鑷敞鍐� Scoped 鏈嶅姟: {implementationType.Name}");
+ break;
+ case ServiceLifetime.Transient:
+ builder.RegisterType(implementationType).InstancePerDependency().EnableClassInterceptors().InterceptedBy(interceptors);
+ Console.WriteLine($"娉ㄥ唽鑷敞鍐� Transient 鏈嶅姟: {implementationType.Name}");
+ break;
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/KH.WMS.Core.csproj b/KH.WMS/KH.WMS.Core/KH.WMS.Core.csproj
new file mode 100644
index 0000000..a563977
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/KH.WMS.Core.csproj
@@ -0,0 +1,38 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net8.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+ <ItemGroup>
+ <PackageReference Include="AutoMapper" Version="16.0.0" />
+ <PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.5.4" />
+ <PackageReference Include="Serilog.AspNetCore" Version="10.0.0" />
+ <PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
+ <PackageReference Include="Serilog.Sinks.Map" Version="2.0.0" />
+ <PackageReference Include="Serilog.Sinks.Seq" Version="9.0.0" />
+ <PackageReference Include="Serilog.Enrichers.CorrelationId" Version="3.0.1" />
+ <PackageReference Include="Autofac" Version="9.0.0" />
+ <PackageReference Include="SqlSugarCore" Version="5.1.4.211" />
+ <PackageReference Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />
+ <PackageReference Include="Castle.Core.AsyncInterceptor" Version="2.1.0" />
+ <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
+ <PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.1" />
+ <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.29" />
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Authentication\" />
+ <Folder Include="Caching\" />
+ <Folder Include="Configuration\" />
+ <Folder Include="Extensions\" />
+ <Folder Include="Filters\" />
+ <Folder Include="Middlewares\" />
+ <Folder Include="Models\" />
+ <Folder Include="Helpers\" />
+ <Folder Include="Security\" />
+ <Folder Include="Serialization\" />
+ <Folder Include="Services\" />
+ </ItemGroup>
+
+</Project>
diff --git a/KH.WMS/KH.WMS.Core/Logging/ILoggerService.cs b/KH.WMS/KH.WMS.Core/Logging/ILoggerService.cs
new file mode 100644
index 0000000..2e14868
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/ILoggerService.cs
@@ -0,0 +1,71 @@
+using System.Runtime.CompilerServices;
+using Microsoft.Extensions.Logging;
+
+namespace KH.WMS.Core.Logging;
+
+
+/// <summary>
+/// 鏃ュ織鏈嶅姟鎺ュ彛锛堣嚜鍔ㄨ瘑鍒ā鍧楋級
+/// </summary>
+public interface ILoggerService
+{
+ /// <summary>
+ /// 璁板綍璇︾粏璺熻釜鏃ュ織 - 姣忎竴琛孲QL鎵ц銆佽缁嗘祦绋嬭窡韪�
+ /// </summary>
+ void LogVerbose(string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍璋冭瘯鏃ュ織 - 鏂规硶鍙傛暟銆佷腑闂村彉閲�
+ /// </summary>
+ void LogDebug(string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍淇℃伅鏃ュ織 - 鐢ㄦ埛鐧诲綍銆佸崟鎹垱寤�
+ /// </summary>
+ void LogInfo(string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍璀﹀憡鏃ュ織 - API璋冪敤鎱€�佺紦瀛樻湭鍛戒腑锛岄渶鍏虫敞
+ /// </summary>
+ void LogWarning(string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍閿欒鏃ュ織 - HTTP 500銆佷笟鍔″紓甯革紝浣嗙郴缁熷彲缁х画
+ /// </summary>
+ void LogError(string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍閿欒鏃ュ織锛堝甫寮傚父锛�- HTTP 500銆佷笟鍔″紓甯革紝浣嗙郴缁熷彲缁х画
+ /// </summary>
+ void LogError(Exception exception, string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍鑷村懡閿欒鏃ュ織 - 鏁版嵁搴撹繛鎺ュけ璐ャ�佺鐩樻弧锛岀郴缁熸棤娉曠户缁�
+ /// </summary>
+ void LogFatal(string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍鑷村懡閿欒鏃ュ織锛堝甫寮傚父锛�- 鏁版嵁搴撹繛鎺ュけ璐ャ�佺鐩樻弧锛岀郴缁熸棤娉曠户缁�
+ /// </summary>
+ void LogFatal(Exception exception, string message, params object?[] args);
+
+ /// <summary>
+ /// 璁板綍鎿嶄綔鏃ュ織
+ /// </summary>
+ void LogOperation(string operation, string? userName = null, long? userId = null, object? data = null);
+
+ /// <summary>
+ /// 璁板綍涓氬姟鏃ュ織
+ /// </summary>
+ void LogBusiness(string businessType, string message, object? data = null);
+
+ /// <summary>
+ /// 璁板綍鎬ц兘鏃ュ織
+ /// </summary>
+ void LogPerformance(string operation, long elapsedMs, object? data = null);
+
+ /// <summary>
+ /// 浣跨敤涓婁笅鏂囪褰曟棩蹇楋紙鍙墜鍔ㄦ寚瀹氭ā鍧楋級
+ /// </summary>
+ void Log(LogContext context, string message, params object?[] args);
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/LogContext.cs b/KH.WMS/KH.WMS.Core/Logging/LogContext.cs
new file mode 100644
index 0000000..79fe885
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/LogContext.cs
@@ -0,0 +1,77 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using KH.WMS.Core.Logging.LogEnums;
+
+namespace KH.WMS.Core.Logging
+{
+
+ /// <summary>
+ /// 鏃ュ織涓婁笅鏂�
+ /// </summary>
+ public class LogContext
+ {
+ /// <summary>
+ /// 鏃ュ織绾у埆
+ /// </summary>
+ public LogLevelType Level { get; set; } = LogLevelType.Information;
+
+ /// <summary>
+ /// 鏃ュ織妯″潡
+ /// </summary>
+ public LogModule Module { get; set; }
+
+ /// <summary>
+ /// 鏃ュ織绫诲瀷
+ /// </summary>
+ public LogType Type { get; set; } = LogType.System;
+
+ /// <summary>
+ /// 鐢ㄦ埛ID
+ /// </summary>
+ public long? UserId { get; set; }
+
+ /// <summary>
+ /// 鐢ㄦ埛鍚�
+ /// </summary>
+ public string? UserName { get; set; }
+
+ /// <summary>
+ /// 绉熸埛ID
+ /// </summary>
+ public long? TenantId { get; set; }
+
+ /// <summary>
+ /// 璇锋眰ID
+ /// </summary>
+ public string? RequestId { get; set; }
+
+ /// <summary>
+ /// 鍏宠仈ID
+ /// </summary>
+ public string? CorrelationId { get; set; }
+
+ /// <summary>
+ /// 瀹㈡埛绔疘P
+ /// </summary>
+ public string? ClientIp { get; set; }
+
+ /// <summary>
+ /// 鎿嶄綔绫诲瀷
+ /// </summary>
+ public string? Operation { get; set; }
+
+ /// <summary>
+ /// 涓氬姟鏁版嵁
+ /// </summary>
+ public Dictionary<string, object?> Data { get; set; } = new();
+
+ /// <summary>
+ /// 鎵╁睍灞炴��
+ /// </summary>
+ public Dictionary<string, object?> Properties { get; set; } = new();
+ }
+
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogLevelType.cs b/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogLevelType.cs
new file mode 100644
index 0000000..343125d
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogLevelType.cs
@@ -0,0 +1,50 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace KH.WMS.Core.Logging.LogEnums
+{
+ /// <summary>
+ /// 鏃ュ織绾у埆鏋氫妇
+ /// </summary>
+ public enum LogLevelType
+ {
+ /// <summary>
+ /// 璇︾粏璺熻釜 - 姣忎竴琛孲QL鎵ц銆佽缁嗘祦绋嬭窡韪�
+ /// </summary>
+ Verbose = 0,
+
+ /// <summary>
+ /// 璋冭瘯淇℃伅 - 鏂规硶鍙傛暟銆佷腑闂村彉閲�
+ /// </summary>
+ Debug = 1,
+
+ /// <summary>
+ /// 涓�鑸俊鎭� - 鐢ㄦ埛鐧诲綍銆佸崟鎹垱寤�
+ /// </summary>
+ Information = 2,
+
+ /// <summary>
+ /// 璀﹀憡 - API璋冪敤鎱€�佺紦瀛樻湭鍛戒腑锛岄渶鍏虫敞
+ /// </summary>
+ Warning = 3,
+
+ /// <summary>
+ /// 閿欒 - HTTP 500銆佷笟鍔″紓甯革紝浣嗙郴缁熷彲缁х画
+ /// </summary>
+ Error = 4,
+
+ /// <summary>
+ /// 鑷村懡閿欒 - 鏁版嵁搴撹繛鎺ュけ璐ャ�佺鐩樻弧锛岀郴缁熸棤娉曠户缁�
+ /// </summary>
+ Fatal = 5,
+
+ /// <summary>
+ /// 鏃�
+ /// </summary>
+ None = 6
+ }
+
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogModule.cs b/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogModule.cs
new file mode 100644
index 0000000..b97bc52
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogModule.cs
@@ -0,0 +1,167 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace KH.WMS.Core.Logging.LogEnums
+{
+
+ /// <summary>
+ /// 鏃ュ織妯″潡鏋氫妇
+ /// </summary>
+ public enum LogModule
+ {
+ /// <summary>
+ /// 绯荤粺鏍稿績
+ /// </summary>
+ Core = 1000,
+
+ /// <summary>
+ /// API鎺ュ彛
+ /// </summary>
+ Api = 1001,
+
+ /// <summary>
+ /// 鏁版嵁搴�
+ /// </summary>
+ Database = 1002,
+
+ /// <summary>
+ /// 缂撳瓨
+ /// </summary>
+ Cache = 1003,
+
+ /// <summary>
+ /// 璁よ瘉鎺堟潈
+ /// </summary>
+ Auth = 1004,
+
+ /// <summary>
+ /// 涓氬姟閫昏緫
+ /// </summary>
+ Business = 1005,
+
+ /// <summary>
+ /// 澶栭儴鏈嶅姟
+ /// </summary>
+ External = 1006,
+
+ /// <summary>
+ /// 浠诲姟璋冨害
+ /// </summary>
+ Job = 1007,
+
+ /// <summary>
+ /// 鏂囦欢澶勭悊
+ /// </summary>
+ File = 1008,
+
+ // WMS 妯″潡
+ /// <summary>
+ /// 鍏ュ簱绠$悊
+ /// </summary>
+ WMS_Inbound = 2001,
+
+ /// <summary>
+ /// 鍑哄簱绠$悊
+ /// </summary>
+ WMS_Outbound = 2002,
+
+ /// <summary>
+ /// 搴撳瓨绠$悊
+ /// </summary>
+ WMS_Inventory = 2003,
+
+ /// <summary>
+ /// 璐т富绠$悊
+ /// </summary>
+ WMS_Owner = 2004,
+
+ /// <summary>
+ /// 鍟嗗搧绠$悊
+ /// </summary>
+ WMS_Product = 2005,
+
+ /// <summary>
+ /// 浠撳簱绠$悊
+ /// </summary>
+ WMS_Warehouse = 2006,
+
+ /// <summary>
+ /// 搴撳尯绠$悊
+ /// </summary>
+ WMS_Zone = 2007,
+
+ /// <summary>
+ /// 搴撲綅绠$悊
+ /// </summary>
+ WMS_Location = 2008,
+
+ /// <summary>
+ /// 鐩樼偣绠$悊
+ /// </summary>
+ WMS_Counting = 2009,
+
+ /// <summary>
+ /// 绉诲簱绠$悊
+ /// </summary>
+ WMS_Transfer = 2010,
+
+ /// <summary>
+ /// 娉㈡绠$悊
+ /// </summary>
+ WMS_Wave = 2011,
+
+ /// <summary>
+ /// 鎷h揣绠$悊
+ /// </summary>
+ WMS_Picking = 2012,
+
+ /// <summary>
+ /// 瑁呰溅绠$悊
+ /// </summary>
+ WMS_Loading = 2013,
+
+ /// <summary>
+ /// 鍗歌溅绠$悊
+ /// </summary>
+ WMS_Unloading = 2014,
+
+ /// <summary>
+ /// 搴撳唴鍔犲伐
+ /// </summary>
+ WMS_Processing = 2015,
+
+ /// <summary>
+ /// 琛ヨ揣绠$悊
+ /// </summary>
+ WMS_Replenishment = 2016,
+
+ /// <summary>
+ /// 绛栫暐绠$悊
+ /// </summary>
+ WMS_Strategy = 2017,
+
+ /// <summary>
+ /// 鍗曟嵁绠$悊
+ /// </summary>
+ WMS_Order = 2018,
+
+ /// <summary>
+ /// 杩愯緭绠$悊
+ /// </summary>
+ WMS_Transport = 2019,
+
+ /// <summary>
+ /// 璁¤垂绠$悊
+ /// </summary>
+ WMS_Billing = 2020,
+
+ /// <summary>
+ /// 鎶ヨ〃绠$悊
+ /// </summary>
+ WMS_Report = 2021
+ }
+
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogType.cs b/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogType.cs
new file mode 100644
index 0000000..aeea36e
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/LogEnums/LogType.cs
@@ -0,0 +1,66 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace KH.WMS.Core.Logging.LogEnums
+{
+
+ /// <summary>
+ /// 鏃ュ織绫诲瀷鏋氫妇
+ /// </summary>
+ public enum LogType
+ {
+ /// <summary>
+ /// 绯荤粺鏃ュ織
+ /// </summary>
+ System = 0,
+
+ /// <summary>
+ /// 鎿嶄綔鏃ュ織
+ /// </summary>
+ Operation = 1,
+
+ /// <summary>
+ /// 涓氬姟鏃ュ織
+ /// </summary>
+ Business = 2,
+
+ /// <summary>
+ /// 寮傚父鏃ュ織
+ /// </summary>
+ Exception = 3,
+
+ /// <summary>
+ /// 鎬ц兘鏃ュ織
+ /// </summary>
+ Performance = 4,
+
+ /// <summary>
+ /// 瀹夊叏鏃ュ織
+ /// </summary>
+ Security = 5,
+
+ /// <summary>
+ /// 瀹¤鏃ュ織
+ /// </summary>
+ Audit = 6,
+
+ /// <summary>
+ /// 璋冭瘯鏃ュ織
+ /// </summary>
+ Debug = 7,
+
+ /// <summary>
+ /// 璁块棶鏃ュ織
+ /// </summary>
+ Access = 8,
+
+ /// <summary>
+ /// 浠诲姟鏃ュ織
+ /// </summary>
+ Job = 9
+ }
+
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/LogModuleDetector.cs b/KH.WMS/KH.WMS.Core/Logging/LogModuleDetector.cs
new file mode 100644
index 0000000..5ae93e9
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/LogModuleDetector.cs
@@ -0,0 +1,194 @@
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using KH.WMS.Core.Logging.LogEnums;
+
+namespace KH.WMS.Core.Logging;
+
+/// <summary>
+/// 鏃ュ織妯″潡鑷姩璇嗗埆鍣�
+/// </summary>
+public static class LogModuleDetector
+{
+ /// <summary>
+ /// 妯″潡鍛藉悕绌洪棿鏄犲皠閰嶇疆
+ /// </summary>
+ private static readonly Dictionary<string, LogModule> NamespaceModuleMapping = new(StringComparer.OrdinalIgnoreCase)
+ {
+ // 鍩虹璁炬柦灞�
+ ["KH.WMS.Core.Api"] = LogModule.Api,
+ ["KH.WMS.Core.Database"] = LogModule.Database,
+ ["KH.WMS.Core.Cache"] = LogModule.Cache,
+ ["KH.WMS.Core.Authentication"] = LogModule.Auth,
+ ["KH.WMS.Core.Security"] = LogModule.Auth,
+ ["KH.WMS.Core.Middleware"] = LogModule.Core,
+ ["KH.WMS.Core.BackgroundServices"] = LogModule.Job,
+ ["KH.WMS.Core.Logging"] = LogModule.Core,
+
+ // WMS 涓氬姟灞� - 鍏ュ簱绠$悊
+ ["KH.WMS.Core.Inbound"] = LogModule.WMS_Inbound,
+ ["KH.WMS.Core.Receiving"] = LogModule.WMS_Inbound,
+ ["KH.WMS.Core.PutAway"] = LogModule.WMS_Inbound,
+ ["KH.WMS.Core.Quality"] = LogModule.WMS_Inbound,
+
+ // WMS 涓氬姟灞� - 鍑哄簱绠$悊
+ ["KH.WMS.Core.Outbound"] = LogModule.WMS_Outbound,
+ ["KH.WMS.Core.Picking"] = LogModule.WMS_Picking,
+ ["KH.WMS.Core.Packing"] = LogModule.WMS_Outbound,
+ ["KH.WMS.Core.Shipping"] = LogModule.WMS_Outbound,
+ ["KH.WMS.Core.Loading"] = LogModule.WMS_Loading,
+
+ // WMS 涓氬姟灞� - 搴撳瓨绠$悊
+ ["KH.WMS.Core.Inventory"] = LogModule.WMS_Inventory,
+ ["KH.WMS.Core.Stock"] = LogModule.WMS_Inventory,
+ ["KH.WMS.Core.Stocktaking"] = LogModule.WMS_Counting,
+ ["KH.WMS.Core.Counting"] = LogModule.WMS_Counting,
+
+ // WMS 涓氬姟灞� - 鍩虹鏁版嵁
+ ["WMKH.WMS.CoreS.Owner"] = LogModule.WMS_Owner,
+ ["KH.WMS.Core.Product"] = LogModule.WMS_Product,
+ ["KH.WMS.Core.Sku"] = LogModule.WMS_Product,
+ ["KH.WMS.Core.Warehouse"] = LogModule.WMS_Warehouse,
+ ["KH.WMS.Core.Zone"] = LogModule.WMS_Zone,
+ ["KH.WMS.Core.Location"] = LogModule.WMS_Location,
+
+ // WMS 涓氬姟灞� - 鍏朵粬
+ ["KH.WMS.Core.Transfer"] = LogModule.WMS_Transfer,
+ ["KH.WMS.Core.Move"] = LogModule.WMS_Transfer,
+ ["KH.WMS.Core.Wave"] = LogModule.WMS_Wave,
+ ["KH.WMS.Core.Unloading"] = LogModule.WMS_Unloading,
+ ["KH.WMS.Core.Processing"] = LogModule.WMS_Processing,
+ ["KH.WMS.Core.Replenishment"] = LogModule.WMS_Replenishment,
+ ["KH.WMS.Core.Strategy"] = LogModule.WMS_Strategy,
+ ["KH.WMS.Core.Order"] = LogModule.WMS_Order,
+ ["KH.WMS.Core.Transport"] = LogModule.WMS_Transport,
+ ["KH.WMS.Core.Billing"] = LogModule.WMS_Billing,
+ ["KH.WMS.Core.Report"] = LogModule.WMS_Report,
+
+ // TODO
+ // 閫氱敤涓氬姟灞�
+ ["Application.Services"] = LogModule.Business,
+ ["Domain.Services"] = LogModule.Business,
+ ["Core.Services"] = LogModule.Business,
+
+ // API 灞�
+ ["Controllers"] = LogModule.Api,
+ ["Api"] = LogModule.Api,
+ ["Controllers.Api"] = LogModule.Api,
+
+ // 澶栭儴鏈嶅姟
+ ["External"] = LogModule.External,
+ ["ThirdParty"] = LogModule.External,
+ ["Integration"] = LogModule.External,
+
+ // 鏂囦欢澶勭悊
+ ["File"] = LogModule.File,
+ ["Storage"] = LogModule.File,
+ ["Upload"] = LogModule.File,
+ ["Download"] = LogModule.File,
+ };
+
+ /// <summary>
+ /// 浠庤皟鐢ㄦ爤涓嚜鍔ㄨ瘑鍒ā鍧�
+ /// </summary>
+ /// <param name="skipFrames">璺宠繃鐨勫抚鏁帮紙榛樿璺宠繃 LoggerService 鍐呴儴璋冪敤锛�</param>
+ /// <returns>璇嗗埆鍑虹殑妯″潡锛岄粯璁よ繑鍥� Core</returns>
+ public static LogModule DetectModule(int skipFrames = 2)
+ {
+ try
+ {
+ var stackTrace = new StackTrace(skipFrames, false);
+
+ for (int i = 0; i < stackTrace.FrameCount; i++)
+ {
+ var frame = stackTrace.GetFrame(i);
+ if (frame == null) continue;
+
+ var namespaceName = frame.GetMethod()?.DeclaringType?.Namespace;
+ if (string.IsNullOrEmpty(namespaceName)) continue;
+
+ // 璺宠繃鏃ュ織绯荤粺鏈韩鐨勫懡鍚嶇┖闂�
+ if (namespaceName.StartsWith("KH.WMS.Core.Logging", StringComparison.OrdinalIgnoreCase) ||
+ namespaceName.StartsWith("Microsoft.Extensions.Logging", StringComparison.OrdinalIgnoreCase))
+ {
+ continue;
+ }
+
+ // 鏌ユ壘鍖归厤鐨勬ā鍧�
+ var module = FindModuleByNamespace(namespaceName);
+ if (module != LogModule.Core)
+ {
+ return module;
+ }
+ }
+
+ return LogModule.Core;
+ }
+ catch
+ {
+ return LogModule.Core;
+ }
+ }
+
+ /// <summary>
+ /// 鏍规嵁鍛藉悕绌洪棿鏌ユ壘瀵瑰簲鐨勬ā鍧�
+ /// </summary>
+ private static LogModule FindModuleByNamespace(string namespaceName)
+ {
+ // 瀹屽叏鍖归厤
+ if (NamespaceModuleMapping.TryGetValue(namespaceName, out var module))
+ {
+ return module;
+ }
+
+ // 鍓嶇紑鍖归厤
+ foreach (var mapping in NamespaceModuleMapping)
+ {
+ if (namespaceName.StartsWith(mapping.Key, StringComparison.OrdinalIgnoreCase))
+ {
+ return mapping.Value;
+ }
+ }
+
+ // 榛樿杩斿洖涓氬姟妯″潡
+ if (namespaceName.Contains("Service", StringComparison.OrdinalIgnoreCase) ||
+ namespaceName.Contains("Domain", StringComparison.OrdinalIgnoreCase) ||
+ namespaceName.Contains("Application", StringComparison.OrdinalIgnoreCase))
+ {
+ return LogModule.Business;
+ }
+
+ return LogModule.Core;
+ }
+
+ /// <summary>
+ /// 浠庣被鍨嬫帹鏂ā鍧�
+ /// </summary>
+ public static LogModule DetectModuleFromType(Type type)
+ {
+ if (type == null) return LogModule.Core;
+
+ var namespaceName = type.Namespace;
+ return string.IsNullOrEmpty(namespaceName) ? LogModule.Core : FindModuleByNamespace(namespaceName);
+ }
+
+ /// <summary>
+ /// 娣诲姞鑷畾涔夊懡鍚嶇┖闂存槧灏�
+ /// </summary>
+ /// <param name="namespacePrefix">鍛藉悕绌洪棿鍓嶇紑</param>
+ /// <param name="module">瀵瑰簲鐨勬ā鍧�</param>
+ public static void AddMapping(string namespacePrefix, LogModule module)
+ {
+ NamespaceModuleMapping[namespacePrefix] = module;
+ }
+
+ /// <summary>
+ /// 鎵归噺娣诲姞鍛藉悕绌洪棿鏄犲皠
+ /// </summary>
+ public static void AddMappings(Dictionary<string, LogModule> mappings)
+ {
+ foreach (var mapping in mappings)
+ {
+ NamespaceModuleMapping[mapping.Key] = mapping.Value;
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/Serilog/LoggerService.cs b/KH.WMS/KH.WMS.Core/Logging/Serilog/LoggerService.cs
new file mode 100644
index 0000000..7c5c518
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/Serilog/LoggerService.cs
@@ -0,0 +1,283 @@
+using System;
+using System.Text.Json;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+using KH.WMS.Core.Logging.LogEnums;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using SerilogLogContext = Serilog.Context.LogContext;
+
+namespace KH.WMS.Core.Logging.Serilog;
+
+/// <summary>
+/// 鏃ュ織鏈嶅姟瀹炵幇锛堣嚜鍔ㄨ瘑鍒ā鍧楋級
+/// </summary>
+[RegisteredService(Lifetime = ServiceLifetime.Scoped)]
+public class LoggerService : ILoggerService
+{
+ private readonly ILogger<LoggerService> _logger;
+ private readonly IHttpContextAccessor? _httpContextAccessor;
+
+ public LoggerService(ILogger<LoggerService> logger, IHttpContextAccessor? httpContextAccessor = null)
+ {
+ _logger = logger;
+ _httpContextAccessor = httpContextAccessor;
+ }
+
+ public void LogVerbose(string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ WriteLog(LogLevel.Trace, message, module, null, args);
+ }
+
+ public void LogDebug(string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ WriteLog(LogLevel.Debug, message, module, null, args);
+ }
+
+ public void LogInfo(string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ WriteLog(LogLevel.Information, message, module, null, args);
+ }
+
+ public void LogWarning(string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ WriteLog(LogLevel.Warning, message, module, null, args);
+ }
+
+ public void LogError(string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ WriteLog(LogLevel.Error, message, module, null, args);
+ }
+
+ public void LogError(Exception exception, string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ var context = CreateLogContext(LogLevel.Error, module);
+ context.Type = LogType.Exception;
+
+ using (PushFileName(null))
+ {
+ if (args != null && args.Length > 0)
+ {
+ var messageTemplate = $"[{GetModuleCode(module)}] {message}";
+ _logger.LogError(exception, messageTemplate, args);
+ }
+ else
+ {
+ _logger.LogError(exception, "[{ModuleCode}] {Message}", GetModuleCode(module), message);
+ }
+ }
+ }
+
+ public void LogFatal(string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ WriteLog(LogLevel.Critical, message, module, null, args);
+ }
+
+ public void LogFatal(Exception exception, string message, params object?[] args)
+ {
+ var module = LogModuleDetector.DetectModule();
+ var context = CreateLogContext(LogLevel.Critical, module);
+ context.Type = LogType.Exception;
+
+ using (PushFileName(null))
+ {
+ if (args != null && args.Length > 0)
+ {
+ var messageTemplate = $"[{GetModuleCode(module)}] {message}";
+ _logger.LogCritical(exception, messageTemplate, args);
+ }
+ else
+ {
+ _logger.LogCritical(exception, "[{ModuleCode}] {Message}", GetModuleCode(module), message);
+ }
+ }
+ }
+
+ public void LogOperation(string operation, string? userName = null, long? userId = null, object? data = null)
+ {
+ var module = LogModuleDetector.DetectModule();
+ var context = CreateLogContext(LogLevel.Information, module);
+ context.Type = LogType.Operation;
+ context.Operation = operation;
+ context.UserName = userName ?? context.UserName;
+ context.UserId = userId ?? context.UserId;
+
+ var dataJson = data != null ? JsonSerializer.Serialize(data) : null;
+
+ using (PushFileName(null))
+ {
+ _logger.LogInformation("[{ModuleCode}] [OPERATION] {Operation} by {UserName} (UserId:{UserId}) {Data}",
+ GetModuleCode(module), operation, context.UserName, context.UserId, dataJson ?? "");
+ }
+ }
+
+ public void LogBusiness(string businessType, string message, object? data = null)
+ {
+ var module = LogModuleDetector.DetectModule();
+ var context = CreateLogContext(LogLevel.Information, module);
+ context.Type = LogType.Business;
+ context.Operation = businessType;
+
+ var dataJson = data != null ? JsonSerializer.Serialize(data) : null;
+
+ using (PushFileName(null))
+ {
+ _logger.LogInformation("[{ModuleCode}] [BUSINESS:{Type}] {Message} {Data}",
+ GetModuleCode(module), businessType, message, dataJson ?? "");
+ }
+ }
+
+ public void LogPerformance(string operation, long elapsedMs, object? data = null)
+ {
+ var module = LogModuleDetector.DetectModule();
+ var context = CreateLogContext(LogLevel.Information, module);
+ context.Type = LogType.Performance;
+ context.Operation = operation;
+ context.Data["ElapsedMs"] = elapsedMs;
+ context.Data["ElapsedSeconds"] = elapsedMs / 1000.0;
+
+ if (elapsedMs > 3000)
+ {
+ context.Level = LogLevelType.Warning;
+ }
+
+ var dataJson = data != null ? JsonSerializer.Serialize(data) : null;
+ var logLevel = elapsedMs > 3000 ? LogLevel.Warning : LogLevel.Information;
+
+ using (PushFileName(null))
+ {
+ _logger.Log(logLevel, "[{ModuleCode}] [PERFORMANCE] {Operation} 鑰楁椂 {Elapsed}ms {Data}",
+ GetModuleCode(module), operation, elapsedMs, dataJson ?? "");
+ }
+ }
+
+ public void Log(LogContext context, string message, params object?[] args)
+ {
+ var logLevel = ConvertLogLevel(context.Level);
+ var messageFormat = $"[{GetModuleCode(context.Module)}] [LogType:{context.Type}] {message}";
+
+ var state = new Dictionary<string, object?>
+ {
+ ["UserId"] = context.UserId,
+ ["UserName"] = context.UserName,
+ ["TenantId"] = context.TenantId,
+ ["RequestId"] = context.RequestId,
+ ["Operation"] = context.Operation
+ };
+
+ using (_logger.BeginScope(state))
+ {
+ _logger.Log(logLevel, messageFormat, args);
+ }
+ }
+
+ // ==================== 绉佹湁鏂规硶 ====================
+
+ private void WriteLog(LogLevel level, string message, LogModule module, string? fileName, object?[] args)
+ {
+ using (PushFileName(fileName))
+ {
+ if (args != null && args.Length > 0)
+ {
+ var messageTemplate = $"[{GetModuleCode(module)}] {message}";
+ _logger.Log(level, messageTemplate, args);
+ }
+ else
+ {
+ _logger.Log(level, $"[{GetModuleCode(module)}] {message}");
+ }
+ }
+ }
+
+ private IDisposable? PushFileName(string? fileName)
+ {
+ if (string.IsNullOrEmpty(fileName))
+ {
+ return null;
+ }
+
+ return SerilogLogContext.PushProperty("FileName", fileName);
+ }
+
+ private LogContext CreateLogContext(LogLevel level, LogModule module)
+ {
+ var context = new LogContext
+ {
+ Level = ConvertToLogLevelType(level),
+ Module = module
+ };
+
+ if (_httpContextAccessor?.HttpContext != null)
+ {
+ var httpContext = _httpContextAccessor.HttpContext;
+ var user = httpContext.User;
+
+ var userIdClaim = user?.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
+ if (long.TryParse(userIdClaim, out var userId))
+ {
+ context.UserId = userId;
+ }
+
+ context.UserName = user?.FindFirst(System.Security.Claims.ClaimTypes.Name)?.Value;
+
+ var tenantIdClaim = user?.FindFirst("TenantId")?.Value;
+ if (long.TryParse(tenantIdClaim, out var tenantId))
+ {
+ context.TenantId = tenantId;
+ }
+
+ context.RequestId = httpContext.TraceIdentifier;
+ context.CorrelationId = httpContext.Request.Headers["X-Correlation-ID"].FirstOrDefault();
+ context.ClientIp = httpContext.Connection.RemoteIpAddress?.ToString();
+ }
+
+ return context;
+ }
+
+ private LogLevel ConvertLogLevel(LogLevelType level)
+ {
+ return level switch
+ {
+ LogLevelType.Verbose => LogLevel.Trace,
+ LogLevelType.Debug => LogLevel.Debug,
+ LogLevelType.Information => LogLevel.Information,
+ LogLevelType.Warning => LogLevel.Warning,
+ LogLevelType.Error => LogLevel.Error,
+ LogLevelType.Fatal => LogLevel.Critical,
+ LogLevelType.None => LogLevel.None,
+ _ => LogLevel.Information
+ };
+ }
+
+ private LogLevelType ConvertToLogLevelType(LogLevel level)
+ {
+ return level switch
+ {
+ Microsoft.Extensions.Logging.LogLevel.Trace => LogLevelType.Verbose,
+ Microsoft.Extensions.Logging.LogLevel.Debug => LogLevelType.Debug,
+ Microsoft.Extensions.Logging.LogLevel.Information => LogLevelType.Information,
+ Microsoft.Extensions.Logging.LogLevel.Warning => LogLevelType.Warning,
+ Microsoft.Extensions.Logging.LogLevel.Error => LogLevelType.Error,
+ Microsoft.Extensions.Logging.LogLevel.Critical => LogLevelType.Fatal,
+ Microsoft.Extensions.Logging.LogLevel.None => LogLevelType.None,
+ _ => LogLevelType.Information
+ };
+ }
+
+ private string GetModuleCode(LogModule module)
+ {
+ return ((int)module).ToString() + " " + module;
+ }
+
+ private string GetModuleName(LogModule module)
+ {
+ return module.ToString();
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogOptions.cs b/KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogOptions.cs
new file mode 100644
index 0000000..1f27553
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogOptions.cs
@@ -0,0 +1,77 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace KH.WMS.Core.Logging.Serilog
+{
+ /// <summary>
+ /// 鏃ュ織閰嶇疆閫夐」
+ /// </summary>
+ public class SerilogOptions
+ {
+ /// <summary>
+ /// 鏈�浣庢棩蹇楃骇鍒�
+ /// </summary>
+ public string MinimumLevel { get; set; } = "Information";
+
+ /// <summary>
+ /// 鏃ュ織鐩綍
+ /// </summary>
+ public string LogDirectory { get; set; } = "Logs";
+
+ /// <summary>
+ /// 鏃ュ織淇濈暀澶╂暟
+ /// </summary>
+ public int RetentionDays { get; set; } = 30;
+
+ /// <summary>
+ /// 鍗曚釜鏂囦欢鏈�澶уぇ灏忥紙MB锛�
+ /// </summary>
+ public int MaxFileSizeMB { get; set; } = 100;
+
+ /// <summary>
+ /// 鏄惁鎸夋ā鍧楀垎绂绘棩蹇�
+ /// </summary>
+ public bool SplitByModule { get; set; } = false;
+
+ /// <summary>
+ /// 鏄惁杈撳嚭鍒版帶鍒跺彴
+ /// </summary>
+ public bool WriteToConsole { get; set; } = true;
+
+ /// <summary>
+ /// 鏄惁杈撳嚭鍒版枃浠�
+ /// </summary>
+ public bool WriteToFile { get; set; } = true;
+
+ /// <summary>
+ /// 妯″潡绾у埆瑕嗙洊
+ /// </summary>
+ public Dictionary<string, string> ModuleOverrides { get; set; } = new()
+ {
+ ["Microsoft"] = "Warning",
+ ["Microsoft.EntityFrameworkCore"] = "Warning",
+ ["System"] = "Warning"
+ };
+
+ /// <summary>
+ /// 鑷畾涔夋棩蹇楁枃浠跺悕锛堜笉鍚矾寰勫拰鎵╁睍鍚嶏紝渚嬪: "myapp" 浼氱敓鎴� "myapp-.txt"锛�
+ /// 涓� null 鏃朵娇鐢ㄩ粯璁ゆ枃浠跺悕
+ /// </summary>
+ public string? CustomLogFileName { get; set; }
+
+ /// <summary>
+ /// 鑷畾涔夐敊璇棩蹇楁枃浠跺悕锛堜笉鍚矾寰勫拰鎵╁睍鍚嶏級
+ /// 涓� null 鏃朵娇鐢ㄩ粯璁ゆ枃浠跺悕 "error"
+ /// </summary>
+ public string? CustomErrorFileName { get; set; }
+
+ /// <summary>
+ /// 鑷畾涔夎鍛婃棩蹇楁枃浠跺悕锛堜笉鍚矾寰勫拰鎵╁睍鍚嶏級
+ /// 涓� null 鏃朵娇鐢ㄩ粯璁ゆ枃浠跺悕 "warning"
+ /// </summary>
+ public string? CustomWarningFileName { get; set; }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogSetup.cs b/KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogSetup.cs
new file mode 100644
index 0000000..237afa0
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogSetup.cs
@@ -0,0 +1,297 @@
+using Serilog;
+using Serilog.Events;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Http;
+using KH.WMS.Core.Logging.LogEnums;
+using System.Collections.Generic;
+using Serilog.Core;
+
+namespace KH.WMS.Core.Logging.Serilog;
+
+/// <summary>
+/// Serilog 閰嶇疆
+/// </summary>
+public static class SerilogSetup
+{
+ /// <summary>
+ /// 閰嶇疆 Serilog锛堟敮鎸佹枃浠跺ぇ灏忛檺鍒讹級
+ /// </summary>
+ public static LoggerConfiguration ConfigureSerilog(
+ string appName,
+ string logDirectory = "Logs",
+ LogEventLevel minimumLevel = LogEventLevel.Information,
+ int retentionDays = 30,
+ int maxFileSizeMB = 100,
+ string? logFileName = null,
+ string? errorFileName = null,
+ string? warningFileName = null)
+ {
+ // 纭繚鏃ュ織鐩綍瀛樺湪
+ EnsureLogDirectoryExists(logDirectory);
+
+ var fileSizeLimitBytes = maxFileSizeMB * 1024 * 1024L;
+
+ // 浣跨敤鑷畾涔夋枃浠跺悕鎴栭粯璁ゅ��
+ var logFile = string.IsNullOrEmpty(logFileName) ? "log-.txt" : $"{logFileName}-.txt";
+ var errorFile = string.IsNullOrEmpty(errorFileName) ? "error-.txt" : $"{errorFileName}-.txt";
+ var warningFile = string.IsNullOrEmpty(warningFileName) ? "warning-.txt" : $"{warningFileName}-.txt";
+
+ return new LoggerConfiguration()
+ .MinimumLevel.Is(minimumLevel)
+ .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
+ .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
+ .MinimumLevel.Override("System", LogEventLevel.Warning)
+ .Enrich.FromLogContext()
+ .Enrich.WithProperty("Application", appName)
+ .WriteTo.Console(outputTemplate: GetConsoleOutputTemplate())
+ .WriteTo.File(
+ path: $"{logDirectory}/{logFile}",
+ rollingInterval: RollingInterval.Day,
+ outputTemplate: GetFileOutputTemplate(),
+ restrictedToMinimumLevel: LogEventLevel.Information,
+ encoding: System.Text.Encoding.UTF8,
+ fileSizeLimitBytes: fileSizeLimitBytes,
+ retainedFileCountLimit: retentionDays,
+ rollOnFileSizeLimit: true,
+ flushToDiskInterval: TimeSpan.FromSeconds(1))
+ .WriteTo.File(
+ path: $"{logDirectory}/{errorFile}",
+ rollingInterval: RollingInterval.Day,
+ outputTemplate: GetFileOutputTemplate(),
+ restrictedToMinimumLevel: LogEventLevel.Error,
+ encoding: System.Text.Encoding.UTF8,
+ fileSizeLimitBytes: fileSizeLimitBytes,
+ retainedFileCountLimit: retentionDays,
+ rollOnFileSizeLimit: true,
+ flushToDiskInterval: TimeSpan.FromSeconds(1))
+ .WriteTo.File(
+ path: $"{logDirectory}/{warningFile}",
+ rollingInterval: RollingInterval.Day,
+ outputTemplate: GetFileOutputTemplate(),
+ restrictedToMinimumLevel: LogEventLevel.Warning,
+ encoding: System.Text.Encoding.UTF8,
+ fileSizeLimitBytes: fileSizeLimitBytes,
+ retainedFileCountLimit: retentionDays,
+ rollOnFileSizeLimit: true,
+ flushToDiskInterval: TimeSpan.FromSeconds(1));
+ }
+
+ /// <summary>
+ /// 閰嶇疆 Serilog锛堜娇鐢� SerilogOptions锛�
+ /// </summary>
+ public static LoggerConfiguration ConfigureSerilog(
+ string appName,
+ SerilogOptions options)
+ {
+ return ConfigureSerilog(
+ appName,
+ options.LogDirectory,
+ GetMinimumLogLevelFromString(options.MinimumLevel),
+ options.RetentionDays,
+ options.MaxFileSizeMB,
+ options.CustomLogFileName,
+ options.CustomErrorFileName,
+ options.CustomWarningFileName);
+ }
+
+ /// <summary>
+ /// 娣诲姞 Serilog 鍒颁富鏈猴紙瀹屾暣鐗堬紝鏀寔鏂囦欢澶у皬闄愬埗鍜岃嚜瀹氫箟鏂囦欢鍚嶏級
+ /// </summary>
+ public static IHostBuilder AddSerilog(
+ this IHostBuilder hostBuilder,
+ string appName,
+ string logDirectory = "Logs",
+ int retentionDays = 30,
+ int maxFileSizeMB = 100,
+ string? logFileName = null,
+ string? errorFileName = null,
+ string? warningFileName = null)
+ {
+ return hostBuilder.UseSerilog((context, services, loggerConfiguration) =>
+ {
+ var config = context.Configuration;
+ var appNameValue = config["App:AppName"] ?? appName;
+
+ // 浠庨厤缃鍙栨垨浣跨敤榛樿鍊�
+ var logPath = config["Serilog:LogPath"] ?? logDirectory;
+ var retention = int.Parse(config["Serilog:RetentionDays"] ?? retentionDays.ToString());
+ var maxSize = int.Parse(config["Serilog:MaxFileSizeMB"] ?? maxFileSizeMB.ToString());
+ var fileSizeLimitBytes = maxSize * 1024 * 1024L;
+
+ // 鏄惁杈撳嚭鍒版帶鍒跺彴
+ var writeToConsole = bool.Parse(config["Serilog:WriteToConsole"] ?? "true");
+
+ // 浠庨厤缃鍙栬嚜瀹氫箟鏂囦欢鍚嶏紙鏀寔閫氳繃閰嶇疆鏂囦欢璁剧疆锛�
+ var customLogFileName = config["Serilog:FileNames:Log"] ?? logFileName;
+ var customErrorFileName = config["Serilog:FileNames:Error"] ?? errorFileName;
+ var customWarningFileName = config["Serilog:FileNames:Warning"] ?? warningFileName;
+
+ // 浣跨敤鑷畾涔夋枃浠跺悕鎴栭粯璁ゅ��
+ var logFile = string.IsNullOrEmpty(customLogFileName) ? "log-.txt" : $"{customLogFileName}-.txt";
+ var errorFile = string.IsNullOrEmpty(customErrorFileName) ? "error-.txt" : $"{customErrorFileName}-.txt";
+ var warningFile = string.IsNullOrEmpty(customWarningFileName) ? "warning-.txt" : $"{customWarningFileName}-.txt";
+
+ // 纭繚鏃ュ織鐩綍瀛樺湪
+ EnsureLogDirectoryExists(logPath);
+
+ loggerConfiguration
+ .ReadFrom.Configuration(config)
+ .ReadFrom.Services(services)
+ .MinimumLevel.Is(GetMinimumLogLevel(config))
+ .MinimumLevel.Override("Microsoft", GetModuleLogLevel(config, "Microsoft"))
+ .MinimumLevel.Override("Microsoft.EntityFrameworkCore", GetModuleLogLevel(config, "EntityFrameworkCore"))
+ .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
+ .MinimumLevel.Override("System", GetModuleLogLevel(config, "System"))
+ .Enrich.FromLogContext()
+ .Enrich.WithProperty("Application", appNameValue)
+ .Enrich.WithProperty("Environment", context.HostingEnvironment.EnvironmentName);
+
+ // 鏍规嵁閰嶇疆鍐冲畾鏄惁杈撳嚭鍒版帶鍒跺彴
+ if (writeToConsole)
+ {
+ loggerConfiguration.WriteTo.Console(outputTemplate: GetConsoleOutputTemplate());
+ }
+
+ // 鏂囦欢杈撳嚭
+ loggerConfiguration
+ // 鏅�氭棩蹇� - 鍙褰� Information 绾у埆
+ .WriteTo.File(
+ path: Path.Combine(logPath, logFile),
+ rollingInterval: RollingInterval.Day,
+ outputTemplate: GetFileOutputTemplate(),
+ restrictedToMinimumLevel: LogEventLevel.Information,
+ encoding: System.Text.Encoding.UTF8,
+ fileSizeLimitBytes: fileSizeLimitBytes,
+ retainedFileCountLimit: retention,
+ rollOnFileSizeLimit: true,
+ flushToDiskInterval: TimeSpan.FromSeconds(1))
+ // 閿欒鏃ュ織 - 鍙褰� Error 鍙� Fatal 绾у埆
+ .WriteTo.Logger(lc => lc
+ .Filter.ByIncludingOnly(e => e.Level >= LogEventLevel.Error)
+ .WriteTo.File(
+ path: Path.Combine(logPath, errorFile),
+ rollingInterval: RollingInterval.Day,
+ outputTemplate: GetFileOutputTemplate(),
+ encoding: System.Text.Encoding.UTF8,
+ fileSizeLimitBytes: fileSizeLimitBytes,
+ retainedFileCountLimit: retention,
+ rollOnFileSizeLimit: true,
+ flushToDiskInterval: TimeSpan.FromSeconds(1)))
+ // 璀﹀憡鏃ュ織 - 鍙褰� Warning 绾у埆锛堜笉鍖呮嫭 Error锛�
+ .WriteTo.Logger(lc => lc
+ .Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning)
+ .WriteTo.File(
+ path: Path.Combine(logPath, warningFile),
+ rollingInterval: RollingInterval.Day,
+ outputTemplate: GetFileOutputTemplate(),
+ encoding: System.Text.Encoding.UTF8,
+ fileSizeLimitBytes: fileSizeLimitBytes,
+ retainedFileCountLimit: retention,
+ rollOnFileSizeLimit: true,
+ flushToDiskInterval: TimeSpan.FromSeconds(1)));
+ });
+ }
+
+ /// <summary>
+ /// 娣诲姞 Serilog 鍒颁富鏈猴紙浣跨敤 SerilogOptions锛�
+ /// </summary>
+ public static IHostBuilder AddSerilog(
+ this IHostBuilder hostBuilder,
+ string appName,
+ SerilogOptions options)
+ {
+ return AddSerilog(
+ hostBuilder,
+ appName,
+ options.LogDirectory,
+ options.RetentionDays,
+ options.MaxFileSizeMB,
+ options.CustomLogFileName,
+ options.CustomErrorFileName,
+ options.CustomWarningFileName);
+ }
+
+ /// <summary>
+ /// 纭繚鏃ュ織鐩綍瀛樺湪
+ /// </summary>
+ private static void EnsureLogDirectoryExists(string logDirectory)
+ {
+ if (!Directory.Exists(logDirectory))
+ {
+ Directory.CreateDirectory(logDirectory);
+ }
+ }
+
+ /// <summary>
+ /// 鑾峰彇鎺у埗鍙拌緭鍑烘ā鏉�
+ /// </summary>
+ private static string GetConsoleOutputTemplate()
+ {
+ return "[{Timestamp:HH:mm:ss} {Level:u3}] [{ModuleCode}] {Message:lj}{NewLine}{Exception}";
+ }
+
+ /// <summary>
+ /// 鑾峰彇鏂囦欢杈撳嚭妯℃澘
+ /// </summary>
+ private static string GetFileOutputTemplate()
+ {
+ return "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] [{ModuleCode}] [LogType:{LogType}] [TenantId:{TenantId}] [UserId:{UserId}] [RequestId:{RequestId}] {Message:lj}{NewLine}{Exception}";
+ }
+
+ /// <summary>
+ /// 鑾峰彇鏈�浣庢棩蹇楃骇鍒�
+ /// </summary>
+ private static LogEventLevel GetMinimumLogLevel(IConfiguration config)
+ {
+ var level = config["Serilog:MinimumLevel:Default"];
+ return level switch
+ {
+ "Verbose" => LogEventLevel.Verbose,
+ "Debug" => LogEventLevel.Debug,
+ "Information" => LogEventLevel.Information,
+ "Warning" => LogEventLevel.Warning,
+ "Error" => LogEventLevel.Error,
+ "Fatal" => LogEventLevel.Fatal,
+ _ => LogEventLevel.Information
+ };
+ }
+
+ /// <summary>
+ /// 鑾峰彇妯″潡鏃ュ織绾у埆
+ /// </summary>
+ private static LogEventLevel GetModuleLogLevel(IConfiguration config, string module)
+ {
+ var level = config[$"Serilog:MinimumLevel:Override:{module}"];
+ return level switch
+ {
+ "Verbose" => LogEventLevel.Verbose,
+ "Debug" => LogEventLevel.Debug,
+ "Information" => LogEventLevel.Information,
+ "Warning" => LogEventLevel.Warning,
+ "Error" => LogEventLevel.Error,
+ "Fatal" => LogEventLevel.Fatal,
+ _ => LogEventLevel.Warning
+ };
+ }
+
+ /// <summary>
+ /// 浠庡瓧绗︿覆鑾峰彇鏃ュ織绾у埆
+ /// </summary>
+ private static LogEventLevel GetMinimumLogLevelFromString(string level)
+ {
+ return level switch
+ {
+ "Verbose" => LogEventLevel.Verbose,
+ "Debug" => LogEventLevel.Debug,
+ "Information" => LogEventLevel.Information,
+ "Warning" => LogEventLevel.Warning,
+ "Error" => LogEventLevel.Error,
+ "Fatal" => LogEventLevel.Fatal,
+ _ => LogEventLevel.Information
+ };
+ }
+}
+
+
diff --git a/KH.WMS/KH.WMS.Core/Monitoring/MiniProfiler/MiniProfilerSetup.cs b/KH.WMS/KH.WMS.Core/Monitoring/MiniProfiler/MiniProfilerSetup.cs
new file mode 100644
index 0000000..2cac5ca
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Monitoring/MiniProfiler/MiniProfilerSetup.cs
@@ -0,0 +1,86 @@
+using System.Text;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using StackExchange.Profiling;
+using StackExchange.Profiling.Storage;
+
+namespace KH.WMS.Core.Monitoring.MiniProfiler;
+
+/// <summary>
+/// MiniProfiler 閰嶇疆
+/// </summary>
+public static class MiniProfilerSetup
+{
+ /// <summary>
+ /// 娣诲姞 MiniProfiler 鏈嶅姟
+ /// </summary>
+ public static IServiceCollection AddMiniProfilerCustom(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment environment)
+ {
+ var miniProfilerSettings = configuration.GetSection("MiniProfiler").Get<MiniProfilerSettings>();
+ miniProfilerSettings ??= new MiniProfilerSettings();
+
+ // 璋冪敤瀹樻柟 MiniProfiler 鐨勬墿灞曟柟娉�
+ services.AddMiniProfiler(options =>
+ {
+ options.RouteBasePath = miniProfilerSettings.RouteBasePath;
+ options.PopupRenderPosition = RenderPosition.BottomLeft;
+ options.PopupShowTimeWithChildren = true;
+
+ // 鐢熶骇鐜閰嶇疆
+ if (!miniProfilerSettings.EnableInProduction && !environment.IsDevelopment())
+ {
+ options.ShouldProfile = _ => false;
+ }
+ else
+ {
+ // 寮�鍙戠幆澧冩垨閰嶇疆涓哄惎鐢ㄦ椂锛屽垎鏋愭墍鏈夎姹�
+ options.ShouldProfile = _ => true;
+ }
+
+ // 鏁版嵁搴撲紭鍖�
+ options.TrackConnectionOpenClose = miniProfilerSettings.TrackConnectionOpenClose;
+
+ });
+
+ return services;
+ }
+
+ /// <summary>
+ /// 浣跨敤 MiniProfiler 涓棿浠�
+ /// </summary>
+ public static IApplicationBuilder UseMiniProfilerCustom(this IApplicationBuilder app)
+ {
+ app.UseMiniProfiler();
+ return app;
+ }
+}
+
+/// <summary>
+/// MiniProfiler 閰嶇疆閫夐」
+/// </summary>
+public class MiniProfilerSettings
+{
+ /// <summary>
+ /// 璺敱鍩虹璺緞
+ /// </summary>
+ public string RouteBasePath { get; set; } = "/profiler";
+
+ /// <summary>
+ /// 鏄惁鍦ㄧ敓浜х幆澧冨惎鐢�
+ /// </summary>
+ public bool EnableInProduction { get; set; } = false;
+
+ /// <summary>
+ /// 鏄惁璺熻釜鏁版嵁搴撹繛鎺�
+ /// </summary>
+ public bool TrackConnectionOpenClose { get; set; } = true;
+
+ /// <summary>
+ /// 鍫嗘爤璺熻釜闀垮害
+ /// </summary>
+ public int StackTraceLength { get; set; } = 5;
+}
diff --git a/KH.WMS/KH.WMS.Core/Setup/ApiDocumentationSetup.cs b/KH.WMS/KH.WMS.Core/Setup/ApiDocumentationSetup.cs
new file mode 100644
index 0000000..a4715cd
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Setup/ApiDocumentationSetup.cs
@@ -0,0 +1,30 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.Core.Setup;
+
+/// <summary>
+/// API 鏂囨。閰嶇疆
+/// </summary>
+public static class ApiDocumentationSetup
+{
+ /// <summary>
+ /// 閰嶇疆 Swagger
+ /// </summary>
+ public static IServiceCollection AddApiDocumentationSetup(this IServiceCollection services, IConfiguration configuration)
+ {
+ return KH.WMS.Core.Api.Documentation.Swagger.SwaggerSetup.AddSwaggerDocumentation(services, configuration);
+ }
+
+ /// <summary>
+ /// 浣跨敤 Swagger
+ /// </summary>
+ public static IApplicationBuilder UseSwaggerDocumentation(this IApplicationBuilder app)
+ {
+ // 浠庢湇鍔¤幏鍙栭厤缃�
+ var serviceProvider = app.ApplicationServices;
+ var configuration = serviceProvider.GetRequiredService<IConfiguration>();
+ return KH.WMS.Core.Api.Documentation.Swagger.SwaggerSetup.UseSwaggerDocumentation(app, configuration);
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Setup/DatabaseSetup.cs b/KH.WMS/KH.WMS.Core/Setup/DatabaseSetup.cs
new file mode 100644
index 0000000..1589ea0
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Setup/DatabaseSetup.cs
@@ -0,0 +1,18 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.Core.Setup;
+
+/// <summary>
+/// 鏁版嵁搴撻厤缃�
+/// </summary>
+public static class DatabaseSetup
+{
+ /// <summary>
+ /// 閰嶇疆 SQL Sugar
+ /// </summary>
+ public static IServiceCollection AddSqlSugarSetup(this IServiceCollection services, IConfiguration configuration)
+ {
+ return KH.WMS.Core.Database.SqlSugar.SqlSugarSetup.AddSqlSugar(services, configuration);
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Setup/LoggingSetup.cs b/KH.WMS/KH.WMS.Core/Setup/LoggingSetup.cs
new file mode 100644
index 0000000..8d5870c
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Setup/LoggingSetup.cs
@@ -0,0 +1,31 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Serilog;
+
+namespace KH.WMS.Core.Setup;
+
+/// <summary>
+/// 鏃ュ織閰嶇疆
+/// </summary>
+public static class LoggingSetup
+{
+ /// <summary>
+ /// 閰嶇疆 Serilog
+ /// </summary>
+ public static IHostBuilder AddSerilog(this IHostBuilder hostBuilder)
+ {
+ return KH.WMS.Core.Logging.Serilog.SerilogSetup.AddSerilog(hostBuilder, "KH.WMS", "Logs");
+ }
+
+ /// <summary>
+ /// 閰嶇疆鏈嶅姟鏃ュ織
+ /// </summary>
+ public static IServiceCollection AddLoggingSetup(this IServiceCollection services, IConfiguration configuration)
+ {
+ // 娣诲姞鏃ュ織鏈嶅姟
+ services.AddSingleton<KH.WMS.Core.Logging.ILoggerService, KH.WMS.Core.Logging.Serilog.LoggerService>();
+
+ return services;
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Setup/MiddlewareSetup.cs b/KH.WMS/KH.WMS.Core/Setup/MiddlewareSetup.cs
new file mode 100644
index 0000000..70ed772
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Setup/MiddlewareSetup.cs
@@ -0,0 +1,51 @@
+
+using KH.WMS.Core.Monitoring.MiniProfiler;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+
+namespace KH.WMS.Core.Setup;
+
+/// <summary>
+/// 涓棿浠堕厤缃� - 缁熶竴鍏ュ彛
+/// </summary>
+public static class MiddlewareSetup
+{
+ /// <summary>
+ /// 浣跨敤鎵�鏈夎嚜瀹氫箟涓棿浠讹紙鎸夋帹鑽愰『搴忥級
+ /// </summary>
+ /// <summary>
+ /// 浣跨敤鎵�鏈夎嚜瀹氫箟涓棿浠讹紙鎸夋帹鑽愰『搴忥級
+ /// </summary>
+ public static IApplicationBuilder UseCustomMiddleware(this IApplicationBuilder app, IWebHostEnvironment env)
+ {
+ // HTTPS 閲嶅畾鍚戯紙鐢熶骇鐜锛�
+ if (!env.IsDevelopment())
+ {
+ app.UseHttpsRedirection();
+ }
+
+ // 璺敱
+ app.UseRouting();
+
+ // 鎬ц兘鐩戞帶锛堝湪 UseRouting 涔嬪悗锛�
+ app.UseMiniProfilerCustom();
+
+ // 璁よ瘉
+ app.UseAuthentication();
+
+ // 鎺堟潈
+ app.UseAuthorization();
+
+ // 绔偣鏄犲皠
+ app.UseEndpoints(endpoints =>
+ {
+ endpoints.MapControllers();
+ endpoints.MapRazorPages(); // MiniProfiler UI 闇�瑕�
+ });
+
+ return app;
+ }
+
+}
diff --git a/KH.WMS/KH.WMS.Core/Setup/MonitoringSetup.cs b/KH.WMS/KH.WMS.Core/Setup/MonitoringSetup.cs
new file mode 100644
index 0000000..4a30c8d
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Setup/MonitoringSetup.cs
@@ -0,0 +1,28 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.Core.Setup;
+
+/// <summary>
+/// 鎬ц兘鐩戞帶閰嶇疆
+/// </summary>
+public static class MonitoringSetup
+{
+ /// <summary>
+ /// 閰嶇疆 MiniProfiler
+ /// </summary>
+ public static IServiceCollection AddMonitoringSetup(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment environment)
+ {
+ return KH.WMS.Core.Monitoring.MiniProfiler.MiniProfilerSetup.AddMiniProfilerCustom(services, configuration, environment);
+ }
+
+ /// <summary>
+ /// 浣跨敤 MiniProfiler
+ /// </summary>
+ public static IApplicationBuilder UseMiniProfiler(this IApplicationBuilder app)
+ {
+ return KH.WMS.Core.Monitoring.MiniProfiler.MiniProfilerSetup.UseMiniProfilerCustom(app);
+ }
+}
diff --git a/KH.WMS/KH.WMS.Core/Setup/ServiceCollectionSetup.cs b/KH.WMS/KH.WMS.Core/Setup/ServiceCollectionSetup.cs
new file mode 100644
index 0000000..beffb5c
--- /dev/null
+++ b/KH.WMS/KH.WMS.Core/Setup/ServiceCollectionSetup.cs
@@ -0,0 +1,39 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Configuration;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using KH.WMS.Core.Setup;
+
+// 姝ゅ懡鍚嶇┖闂存槸涓轰簡鍚戝悗鍏煎
+namespace KH.WMS.Core.Setup;
+
+/// <summary>
+/// 鏈嶅姟闆嗗悎閰嶇疆 - 缁熶竴鍏ュ彛
+/// </summary>
+public static class ServiceCollectionSetup
+{
+ /// <summary>
+ /// 娣诲姞鎵�鏈夊熀纭�璁炬柦鏈嶅姟
+ /// </summary>
+ public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment environment)
+ {
+ // 鏁版嵁搴�
+ services.AddSqlSugarSetup(configuration);
+
+ // 鏃ュ織
+ services.AddLoggingSetup(configuration);
+
+ // 鎬ц兘鐩戞帶
+ services.AddMonitoringSetup(configuration, environment);
+
+ // API 鏂囨。
+ services.AddApiDocumentationSetup(configuration);
+
+ // HTTP 瀹㈡埛绔�
+ services.AddHttpClient();
+
+ return services;
+ }
+
+}
diff --git a/KH.WMS/KH.WMS.Model/KH.WMS.Model.csproj b/KH.WMS/KH.WMS.Model/KH.WMS.Model.csproj
new file mode 100644
index 0000000..30402ac
--- /dev/null
+++ b/KH.WMS/KH.WMS.Model/KH.WMS.Model.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net8.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+</Project>
diff --git a/KH.WMS/KH.WMS.Server/Controllers/TestController.cs b/KH.WMS/KH.WMS.Server/Controllers/TestController.cs
new file mode 100644
index 0000000..c7585ff
--- /dev/null
+++ b/KH.WMS/KH.WMS.Server/Controllers/TestController.cs
@@ -0,0 +1,24 @@
+锘縰sing KH.WMS.TestProj;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace KH.WMS.Server.Controllers
+{
+ [Route("api/[controller]")]
+ [ApiController]
+ public class TestController : ControllerBase
+ {
+ private readonly ITestService _testService;
+ public TestController(ITestService testService)
+ {
+ _testService = testService;
+ }
+
+ [HttpGet, Route("GetTestObject"), AllowAnonymous]
+ public object GetTestObject()
+ {
+ return _testService.GetTestObject();
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Server/KH.WMS.Server.csproj b/KH.WMS/KH.WMS.Server/KH.WMS.Server.csproj
new file mode 100644
index 0000000..a1692df
--- /dev/null
+++ b/KH.WMS/KH.WMS.Server/KH.WMS.Server.csproj
@@ -0,0 +1,18 @@
+锘�<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>net8.0</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\KH.WMS.Core\KH.WMS.Core.csproj" />
+ <ProjectReference Include="..\Test\KH.WMS.TestProj\KH.WMS.TestProj.csproj" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Folder Include="wwwroot\" />
+ </ItemGroup>
+
+</Project>
diff --git a/KH.WMS/KH.WMS.Server/Program.cs b/KH.WMS/KH.WMS.Server/Program.cs
new file mode 100644
index 0000000..eb9b8b5
--- /dev/null
+++ b/KH.WMS/KH.WMS.Server/Program.cs
@@ -0,0 +1,49 @@
+using Autofac;
+using Autofac.Extensions.DependencyInjection;
+using KH.WMS.Core.AOP;
+using KH.WMS.Core.Api.Documentation.Swagger;
+using KH.WMS.Core.DependencyInjection;
+using KH.WMS.Core.Logging.Serilog;
+using KH.WMS.Core.Monitoring.MiniProfiler;
+using KH.WMS.Core.Setup;
+using KH.WMS.TestProj;
+using StackExchange.Profiling;
+using Swashbuckle.AspNetCore.SwaggerUI;
+
+var builder = WebApplication.CreateBuilder(args);
+
+
+// 閰嶇疆 Serilog 鏃ュ織
+builder.Host.AddSerilog(
+ appName: "KH.WMS",
+ logDirectory: "Logs",
+ retentionDays: 30,
+ maxFileSizeMB: 5);
+
+
+builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()).ConfigureContainer<ContainerBuilder>(builder =>
+{
+ builder.RegisterModule(new ServiceExtensions());//甯︽湁鎺ュ彛灞傜殑鏈嶅姟娉ㄥ叆
+});
+
+// 娣诲姞 HttpContextAccessor锛堢敤浜庢棩蹇椾腑鑾峰彇鐢ㄦ埛淇℃伅锛�
+builder.Services.AddHttpContextAccessor();
+
+builder.Services.AddInfrastructure(builder.Configuration, builder.Environment);
+
+// Add services to the container.
+builder.Services.AddControllers();
+builder.Services.AddRazorPages(); // MiniProfiler UI 鍙兘闇�瑕�
+builder.Services.AddEndpointsApiExplorer();
+
+var app = builder.Build();
+
+app.UseCustomMiddleware(app.Environment);
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+ app.UseSwaggerDocumentation(builder.Configuration);
+}
+
+app.Run();
diff --git a/KH.WMS/KH.WMS.Server/Properties/launchSettings.json b/KH.WMS/KH.WMS.Server/Properties/launchSettings.json
new file mode 100644
index 0000000..a7b6cf2
--- /dev/null
+++ b/KH.WMS/KH.WMS.Server/Properties/launchSettings.json
@@ -0,0 +1,29 @@
+锘縶
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:9058",
+ "sslPort": 44305
+ }
+ },
+ "profiles": {
+ "KH.WMS.Server": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "http://localhost:5006",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Server/appsettings.Development.json b/KH.WMS/KH.WMS.Server/appsettings.Development.json
new file mode 100644
index 0000000..0c208ae
--- /dev/null
+++ b/KH.WMS/KH.WMS.Server/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.Server/appsettings.json b/KH.WMS/KH.WMS.Server/appsettings.json
new file mode 100644
index 0000000..a09cdb5
--- /dev/null
+++ b/KH.WMS/KH.WMS.Server/appsettings.json
@@ -0,0 +1,125 @@
+{
+ "urls": "http://*:9291",
+ // ==================== 鏁版嵁搴撹繛鎺ラ厤缃� ====================
+ "DbConnection": {
+ // 鏁版嵁搴撹繛鎺ュ瓧绗︿覆
+ "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_TEST_Log;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
+ // 鏁版嵁搴撶被鍨�: SqlServer, MySql, SQLite, PostgreSQL
+ "DbType": "SqlServer",
+ // 鏄惁鍚敤 SQL 鏃ュ織
+ "EnableSqlLog": false,
+ // 鍛戒护瓒呮椂鏃堕棿锛堢锛�
+ "CommandTimeout": 30
+ },
+
+ // ==================== CORS 璺ㄥ煙閰嶇疆 ====================
+ "Cors": {
+ // 鏄惁鍏佽浠讳綍鏉ユ簮锛坱rue=鍏佽鎵�鏈夛紝false=浣跨敤 AllowedOrigins 鍒楄〃锛�
+ "AllowAnyOrigin": false,
+ // 鍏佽鐨勬潵婧愬垪琛紙褰� AllowAnyOrigin 涓� false 鏃剁敓鏁堬級
+ "AllowedOrigins": [
+ "http://localhost:3000",
+ "http://localhost:8080",
+ "https://localhost:3000",
+ "https://localhost:8080"
+ ],
+ // 鏄惁鍏佽浠讳綍 HTTP 鏂规硶锛圙ET, POST, PUT, DELETE 绛夛級
+ "AllowAnyMethod": true,
+ // 鏄惁鍏佽浠讳綍璇锋眰澶�
+ "AllowAnyHeader": true,
+ // 鏆撮湶缁欏鎴风鐨勫搷搴斿ご
+ "ExposedHeaders": [
+ "X-Correlation-ID",
+ "X-Request-ID"
+ ],
+ // 鏄惁璁剧疆棰勬璇锋眰锛圤PTIONS锛夌殑缂撳瓨鏃堕棿
+ "SetPreflightMaxAge": true,
+ // 棰勬璇锋眰鐨勬渶澶х紦瀛樻椂闂达紙绉掞級
+ "PreflightMaxAgeSeconds": 600
+ },
+
+ // ==================== Swagger API 鏂囨。閰嶇疆 ====================
+ "Swagger": {
+ // API 鏂囨。鏍囬
+ "Title": "KH.WMS API",
+ // API 鐗堟湰
+ "Version": "v1",
+ // API 鎻忚堪
+ "Description": "KH.WMS API 鎺ュ彛鏂囨。",
+ // 鑱旂郴浜哄悕绉�
+ "ContactName": "",
+ // 鑱旂郴浜洪偖绠�
+ "ContactEmail": "",
+ // 鑱旂郴浜� URL
+ "ContactUrl": "",
+ // 璁稿彲璇佸悕绉�
+ "LicenseName": "",
+ // 璁稿彲璇� URL
+ "LicenseUrl": "",
+ // Swagger UI 璁块棶璺緞鍓嶇紑锛堢┖瀛楃涓茶〃绀烘牴璺緞锛�
+ "RoutePrefix": "swagger",
+ // 鏄惁鍚敤 JWT 璁よ瘉
+ "EnableJwt": true
+ },
+
+ // ==================== MiniProfiler 鎬ц兘鍒嗘瀽閰嶇疆 ====================
+ "MiniProfiler": {
+ // MiniProfiler 璺敱鍩虹璺緞
+ "RouteBasePath": "/profiler",
+ // 鏄惁鍦ㄧ敓浜х幆澧冨惎鐢�
+ "EnableInProduction": false,
+ // 鏄惁璺熻釜鏁版嵁搴撹繛鎺ョ殑鎵撳紑/鍏抽棴
+ "TrackConnectionOpenClose": true,
+ // 鍫嗘爤璺熻釜闀垮害
+ "StackTraceLength": 5
+ },
+
+ // ==================== RateLimit 闄愭祦閰嶇疆 ====================
+ "RateLimit": {
+ // 鏃堕棿绐楀彛鍐呭厑璁哥殑璇锋眰鏁�
+ "RequestLimit": 100,
+ // 鏃堕棿绐楀彛锛堢锛�
+ "WindowSeconds": 60,
+ // 缂撳瓨閿墠缂�
+ "KeyPrefix": "ratelimit"
+ },
+
+ // ==================== 搴旂敤閰嶇疆 ====================
+ "App": {
+ // 搴旂敤鍚嶇О
+ "AppName": "KH.WMS"
+ },
+
+ // ==================== Serilog 鏃ュ織閰嶇疆 ====================
+ "Serilog": {
+ // 鏈�浣庢棩蹇楃骇鍒�
+ "MinimumLevel": {
+ // 榛樿绾у埆: Debug, Information, Warning, Error, Fatal
+ "Default": "Debug",
+ // 瑕嗙洊鐗瑰畾鍛藉悕绌洪棿鐨勬棩蹇楃骇鍒�
+ "Override": {
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information",
+ "Microsoft.EntityFrameworkCore": "Warning",
+ "System": "Warning"
+ }
+ },
+ // 鏃ュ織鏂囦欢瀛樺偍璺緞
+ "LogPath": "Logs",
+ // 鏃ュ織淇濈暀澶╂暟
+ "RetentionDays": 30,
+ // 鍗曚釜鏃ュ織鏂囦欢鏈�澶уぇ灏忥紙MB锛�
+ "MaxFileSizeMB": 5,
+ // 鏄惁杈撳嚭鍒版帶鍒跺彴
+ "WriteToConsole": true,
+ // 鏃ュ織鏂囦欢鍚嶉厤缃�
+ "FileNames": {
+ // 鏅�氭棩蹇楁枃浠跺悕
+ "Log": "log",
+ // 閿欒鏃ュ織鏂囦欢鍚�
+ "Error": "error",
+ // 璀﹀憡鏃ュ織鏂囦欢鍚�
+ "Warning": "warning"
+ }
+ }
+}
diff --git a/KH.WMS/KH.WMS.sln b/KH.WMS/KH.WMS.sln
new file mode 100644
index 0000000..17ec4db
--- /dev/null
+++ b/KH.WMS/KH.WMS.sln
@@ -0,0 +1,77 @@
+锘�
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36915.13
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KH.WMS.Core", "KH.WMS.Core\KH.WMS.Core.csproj", "{5CFD11CC-9659-88FD-E2AE-7BA35901BF99}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KH.WMS.Model", "KH.WMS.Model\KH.WMS.Model.csproj", "{C45B4DD7-40D4-C442-2392-8568CE6151A5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KH.WMS.Server", "KH.WMS.Server\KH.WMS.Server.csproj", "{30290226-69D6-B736-0678-A3950D90BAA9}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Commons", "Commons", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Entities", "Entities", "{BDB666C0-1EC8-4111-A97F-D034F4582B4E}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{BFD4B6A7-B20C-4C5B-9760-F628FF39FDA4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KH.WMS.Common", "Common\KH.WMS.Common\KH.WMS.Common.csproj", "{FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KH.WMS.Extensions", "Extensions\KH.WMS.Extensions\KH.WMS.Extensions.csproj", "{E2D70705-05DB-5D0E-169D-82766317D467}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{3E8E4AE3-8A9A-4012-853B-82C16A74DE6C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KH.WMS.Tools", "Tools\KH.WMS.Tools\KH.WMS.Tools.csproj", "{F51A470B-FC5D-43A3-A721-23007FD3416B}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{D992C823-A45A-4F9D-98DB-D799429DC8A1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KH.WMS.TestProj", "Test\KH.WMS.TestProj\KH.WMS.TestProj.csproj", "{8A41DD65-BD5A-4842-BEED-46BACCBA52C1}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5CFD11CC-9659-88FD-E2AE-7BA35901BF99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5CFD11CC-9659-88FD-E2AE-7BA35901BF99}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5CFD11CC-9659-88FD-E2AE-7BA35901BF99}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5CFD11CC-9659-88FD-E2AE-7BA35901BF99}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C45B4DD7-40D4-C442-2392-8568CE6151A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C45B4DD7-40D4-C442-2392-8568CE6151A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C45B4DD7-40D4-C442-2392-8568CE6151A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C45B4DD7-40D4-C442-2392-8568CE6151A5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {30290226-69D6-B736-0678-A3950D90BAA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {30290226-69D6-B736-0678-A3950D90BAA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {30290226-69D6-B736-0678-A3950D90BAA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {30290226-69D6-B736-0678-A3950D90BAA9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2D70705-05DB-5D0E-169D-82766317D467}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2D70705-05DB-5D0E-169D-82766317D467}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2D70705-05DB-5D0E-169D-82766317D467}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2D70705-05DB-5D0E-169D-82766317D467}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F51A470B-FC5D-43A3-A721-23007FD3416B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F51A470B-FC5D-43A3-A721-23007FD3416B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F51A470B-FC5D-43A3-A721-23007FD3416B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F51A470B-FC5D-43A3-A721-23007FD3416B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8A41DD65-BD5A-4842-BEED-46BACCBA52C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8A41DD65-BD5A-4842-BEED-46BACCBA52C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8A41DD65-BD5A-4842-BEED-46BACCBA52C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8A41DD65-BD5A-4842-BEED-46BACCBA52C1}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {FAAC50D0-A5C3-9EAF-DB00-7CE5583285B4} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
+ {E2D70705-05DB-5D0E-169D-82766317D467} = {BFD4B6A7-B20C-4C5B-9760-F628FF39FDA4}
+ {F51A470B-FC5D-43A3-A721-23007FD3416B} = {3E8E4AE3-8A9A-4012-853B-82C16A74DE6C}
+ {8A41DD65-BD5A-4842-BEED-46BACCBA52C1} = {D992C823-A45A-4F9D-98DB-D799429DC8A1}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {15E47327-2943-49D3-BD74-0F9CFCCC8E1C}
+ EndGlobalSection
+EndGlobal
diff --git a/KH.WMS/Test/KH.WMS.TestProj/CallTraceDemoService.cs b/KH.WMS/Test/KH.WMS.TestProj/CallTraceDemoService.cs
new file mode 100644
index 0000000..a23f7fa
--- /dev/null
+++ b/KH.WMS/Test/KH.WMS.TestProj/CallTraceDemoService.cs
@@ -0,0 +1,67 @@
+using KH.WMS.Core.Attributes;
+
+namespace KH.WMS.TestProj;
+
+/// <summary>
+/// 璋冪敤閾捐拷韪紨绀烘湇鍔★紙鎺ュ彛妯″紡 - 鏀寔瀹屾暣鐨勬柟娉曢摼杩借釜锛�
+/// </summary>
+[LogInterceptor(LogParameters = true, LogReturnValue = true)]
+public class CallTraceDemoService : ICallTraceDemoService
+{
+ private readonly ICallTraceDemoService _self;
+
+ /// <summary>
+ /// 鏋勯�犲嚱鏁� - 娉ㄥ叆鑷繁锛堜唬鐞嗗璞★級
+ /// </summary>
+ public CallTraceDemoService(ICallTraceDemoService self)
+ {
+ _self = self; // 杩欓噷鐨� self 鏄唬鐞嗗璞★紝涓嶆槸 this
+ }
+
+ public string ProcessOrder()
+ {
+ // 閫氳繃浠g悊璋冪敤锛屽唴閮ㄦ柟娉曚篃浼氳鎷︽埅 鉁�
+ _self.ValidateOrder();
+ _self.CalculatePrice();
+ _self.SaveOrder();
+ return "Order processed successfully";
+ }
+
+ public void ValidateOrder()
+ {
+ // 閫氳繃浠g悊璋冪敤锛屽瓙鏂规硶涔熶細琚嫤鎴� 鉁�
+ _self.CheckInventory();
+ _self.CheckCustomer();
+ }
+
+ public bool CheckInventory()
+ {
+ return true;
+ }
+
+ public bool CheckCustomer()
+ {
+ return true;
+ }
+
+ public decimal CalculatePrice()
+ {
+ _self.ApplyDiscount();
+ return 100.50m;
+ }
+
+ public void ApplyDiscount()
+ {
+ // 鎶樻墸閫昏緫
+ }
+
+ public void SaveOrder()
+ {
+ _self.NotifyCustomer();
+ }
+
+ public void NotifyCustomer()
+ {
+ // 鍙戦�侀�氱煡
+ }
+}
diff --git a/KH.WMS/Test/KH.WMS.TestProj/ICallTraceDemoService.cs b/KH.WMS/Test/KH.WMS.TestProj/ICallTraceDemoService.cs
new file mode 100644
index 0000000..6392bf2
--- /dev/null
+++ b/KH.WMS/Test/KH.WMS.TestProj/ICallTraceDemoService.cs
@@ -0,0 +1,47 @@
+namespace KH.WMS.TestProj;
+
+/// <summary>
+/// 璋冪敤閾捐拷韪紨绀烘湇鍔℃帴鍙�
+/// </summary>
+public interface ICallTraceDemoService
+{
+ /// <summary>
+ /// 澶勭悊璁㈠崟
+ /// </summary>
+ string ProcessOrder();
+
+ /// <summary>
+ /// 楠岃瘉璁㈠崟
+ /// </summary>
+ void ValidateOrder();
+
+ /// <summary>
+ /// 妫�鏌ュ簱瀛�
+ /// </summary>
+ bool CheckInventory();
+
+ /// <summary>
+ /// 妫�鏌ュ鎴�
+ /// </summary>
+ bool CheckCustomer();
+
+ /// <summary>
+ /// 璁$畻浠锋牸
+ /// </summary>
+ decimal CalculatePrice();
+
+ /// <summary>
+ /// 搴旂敤鎶樻墸
+ /// </summary>
+ void ApplyDiscount();
+
+ /// <summary>
+ /// 淇濆瓨璁㈠崟
+ /// </summary>
+ void SaveOrder();
+
+ /// <summary>
+ /// 閫氱煡瀹㈡埛
+ /// </summary>
+ void NotifyCustomer();
+}
diff --git a/KH.WMS/Test/KH.WMS.TestProj/ITestService.cs b/KH.WMS/Test/KH.WMS.TestProj/ITestService.cs
new file mode 100644
index 0000000..807b97d
--- /dev/null
+++ b/KH.WMS/Test/KH.WMS.TestProj/ITestService.cs
@@ -0,0 +1,13 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace KH.WMS.TestProj
+{
+ public interface ITestService
+ {
+ public object GetTestObject();
+ }
+}
diff --git a/KH.WMS/Test/KH.WMS.TestProj/KH.WMS.TestProj.csproj b/KH.WMS/Test/KH.WMS.TestProj/KH.WMS.TestProj.csproj
new file mode 100644
index 0000000..5c37574
--- /dev/null
+++ b/KH.WMS/Test/KH.WMS.TestProj/KH.WMS.TestProj.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>net8.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\..\KH.WMS.Core\KH.WMS.Core.csproj" />
+ </ItemGroup>
+
+</Project>
diff --git a/KH.WMS/Test/KH.WMS.TestProj/TestOneService.cs b/KH.WMS/Test/KH.WMS.TestProj/TestOneService.cs
new file mode 100644
index 0000000..a791ebf
--- /dev/null
+++ b/KH.WMS/Test/KH.WMS.TestProj/TestOneService.cs
@@ -0,0 +1,22 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using KH.WMS.Core.Attributes;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.TestProj
+{
+ [SelfRegisteredService(Lifetime = ServiceLifetime.Scoped)]
+ public class TestOneService
+ {
+ [LogInterceptor(LogParameters = true, LogReturnValue = true, LogLevel = Microsoft.Extensions.Logging.LogLevel.Information)]
+ public virtual object GetTestObject()
+ {
+ Thread.Sleep(1000 * 2);
+ return GetType().FullName ?? string.Empty;
+ }
+ }
+}
diff --git a/KH.WMS/Test/KH.WMS.TestProj/TestService.cs b/KH.WMS/Test/KH.WMS.TestProj/TestService.cs
new file mode 100644
index 0000000..bac9ce5
--- /dev/null
+++ b/KH.WMS/Test/KH.WMS.TestProj/TestService.cs
@@ -0,0 +1,38 @@
+using KH.WMS.Core.Attributes;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.TestProj;
+
+/// <summary>
+/// 娴嬭瘯鏈嶅姟锛堝甫鏃ュ織鎷︽埅鍣級
+/// </summary>
+
+[RegisteredService(Lifetime = ServiceLifetime.Scoped)]
+public class TestService : ITestService
+{
+ private readonly TestOneService _testOneService;
+ private readonly TestTwoService _testTwoService;
+
+ public TestService(TestOneService testOneService, TestTwoService testTwoService)
+ {
+ _testOneService = testOneService;
+ _testTwoService = testTwoService;
+ }
+
+ [LogInterceptor(LogParameters = true, LogReturnValue = true, LogLevel = Microsoft.Extensions.Logging.LogLevel.Information)]
+ public object GetTestObject()
+ {
+ string message = "Executing TestService.GetTestObject";
+
+ message += _testOneService.GetTestObject();
+
+ message += _testTwoService.GetTestObject();
+
+ message += GetType().FullName ?? string.Empty;
+
+ message += " Finished TestService.GetTestObject";
+
+ return message;
+ }
+}
diff --git a/KH.WMS/Test/KH.WMS.TestProj/TestTwoService.cs b/KH.WMS/Test/KH.WMS.TestProj/TestTwoService.cs
new file mode 100644
index 0000000..de3c31b
--- /dev/null
+++ b/KH.WMS/Test/KH.WMS.TestProj/TestTwoService.cs
@@ -0,0 +1,21 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using KH.WMS.Core.Attributes;
+using KH.WMS.Core.DependencyInjection.ServiceLifetimes;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace KH.WMS.TestProj
+{
+ [SelfRegisteredService(Lifetime = ServiceLifetime.Scoped)]
+ public class TestTwoService
+ {
+ [LogInterceptor(LogParameters = true, LogReturnValue = true, LogLevel = Microsoft.Extensions.Logging.LogLevel.Information)]
+ public virtual object GetTestObject()
+ {
+ return GetType().FullName ?? string.Empty;
+ }
+ }
+}
diff --git a/KH.WMS/Tools/KH.WMS.Tools/KH.WMS.Tools.csproj b/KH.WMS/Tools/KH.WMS.Tools/KH.WMS.Tools.csproj
new file mode 100644
index 0000000..93efe25
--- /dev/null
+++ b/KH.WMS/Tools/KH.WMS.Tools/KH.WMS.Tools.csproj
@@ -0,0 +1,16 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <TargetFramework>net8.0</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Autofac" Version="8.0.0" />
+ <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
+ <PackageReference Include="SqlSugarCore" Version="5.1.4.152" />
+ </ItemGroup>
+
+</Project>
diff --git a/KH.WMS/Tools/KH.WMS.Tools/Program.cs b/KH.WMS/Tools/KH.WMS.Tools/Program.cs
new file mode 100644
index 0000000..3751555
--- /dev/null
+++ b/KH.WMS/Tools/KH.WMS.Tools/Program.cs
@@ -0,0 +1,2 @@
+锘�// See https://aka.ms/new-console-template for more information
+Console.WriteLine("Hello, World!");
--
Gitblit v1.9.3