z8018
2026-02-11 b8fb68b44c29e4667f6ea5746119413809a60a9e
添加 WMS 初始项目

添加初始 WMS 解决方案和项目结构。包含多个项目(API、Core、Model、Common、Extensions、Tools),依赖注入/服务注册,日志记录(Serilog),监控,Swagger/API 文档,API 响应/分页模型,数据库集成(SqlSugar DbContext、仓库、工作单元)。
已添加61个文件
6562 ■■■■■ 文件已修改
KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/CodeChunks.db 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/SemanticSymbols.db 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/.vs/KH.WMS/config/applicationhost.config 1021 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/.vs/KH.WMS/v17/DocumentLayout.backup.json 854 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/.vs/KH.WMS/v17/DocumentLayout.json 855 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/.vs/KH.WMS/v17/HierarchyCache.v1.txt 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Common/KH.WMS.Common/KH.WMS.Common.csproj 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Extensions/KH.WMS.Extensions/KH.WMS.Extensions.csproj 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/AOP/LoggingInterceptor.cs 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Api/Documentation/Swagger/SwaggerSetup.cs 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Api/Responses/ApiResponse.cs 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Api/Responses/Pagination.cs 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Attributes/LogInterceptorAttribute.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Constants/AppSettingsConstants.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/IDbContext.cs 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/Repositories/IRepository.cs 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/Repositories/RepositoryBase.cs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarDbContext.cs 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/SqlSugar/SqlSugarSetup.cs 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/UnitOfWorks/IUnitOfWork.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWork.cs 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Database/UnitOfWorks/UnitOfWorkExtensions.cs 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/DependencyInjection/IServiceRegistrar.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceExtensions.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/RegisteredServiceAttribute.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/SelfRegisteredServiceAttribute.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceRegistrar.cs 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/KH.WMS.Core.csproj 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/ILoggerService.cs 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/LogContext.cs 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogLevelType.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogModule.cs 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogType.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/LogModuleDetector.cs 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/Serilog/LoggerService.cs 283 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogOptions.cs 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogSetup.cs 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Monitoring/MiniProfiler/MiniProfilerSetup.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Setup/ApiDocumentationSetup.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Setup/DatabaseSetup.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Setup/LoggingSetup.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Setup/MiddlewareSetup.cs 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Setup/MonitoringSetup.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Core/Setup/ServiceCollectionSetup.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Model/KH.WMS.Model.csproj 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Server/Controllers/TestController.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Server/KH.WMS.Server.csproj 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Server/Program.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Server/Properties/launchSettings.json 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Server/appsettings.Development.json 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.Server/appsettings.json 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/KH.WMS.sln 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Test/KH.WMS.TestProj/CallTraceDemoService.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Test/KH.WMS.TestProj/ICallTraceDemoService.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Test/KH.WMS.TestProj/ITestService.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Test/KH.WMS.TestProj/KH.WMS.TestProj.csproj 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Test/KH.WMS.TestProj/TestOneService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Test/KH.WMS.TestProj/TestService.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Test/KH.WMS.TestProj/TestTwoService.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Tools/KH.WMS.Tools/KH.WMS.Tools.csproj 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/Tools/KH.WMS.Tools/Program.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/CodeChunks.db
Binary files differ
KH.WMS/.vs/KH.WMS/CopilotIndices/17.14.1577.30250/SemanticSymbols.db
Binary files differ
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>
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"
            }
          ]
        }
      ]
    }
  ]
}
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"
            }
          ]
        }
      ]
    }
  ]
}
KH.WMS/.vs/KH.WMS/v17/HierarchyCache.v1.txt
Binary files differ
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>
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>
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)
    {
    }
}
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>
    /// è”系人URL
    /// </summary>
    public string ContactUrl { get; set; } = "";
    /// <summary>
    /// è®¸å¯è¯åç§°
    /// </summary>
    public string LicenseName { get; set; } = "";
    /// <summary>
    /// è®¸å¯è¯URL
    /// </summary>
    public string LicenseUrl { get; set; } = "";
    /// <summary>
    /// è·¯ç”±å‰ç¼€
    /// </summary>
    public string RoutePrefix { get; set; } = "swagger";
    /// <summary>
    /// æ˜¯å¦å¯ç”¨ JWT è®¤è¯
    /// </summary>
    public bool EnableJwt { get; set; } = true;
}
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
        };
    }
}
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>
    /// æŽ’序方向(asc/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)
        };
    }
}
KH.WMS/KH.WMS.Core/Attributes/LogInterceptorAttribute.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
using 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;
    }
}
KH.WMS/KH.WMS.Core/Constants/AppSettingsConstants.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
using 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";
    }
}
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;
}
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);
}
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();
    }
}
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;
        }
    }
}
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 æ­£åœ¨åˆå§‹åŒ–数据库连接...");
        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 + "【SQL语句】:" + sql);
                        });
                        // ä½¿ç”¨ Verbose çº§åˆ«è®°å½•每一行 SQL æ‰§è¡Œ
                        if (options.EnableSqlLog && logger != null)
                        {
                            logger.LogTrace("[SQL执行] {Sql} | å‚æ•°: {Params}", sql, paramStr);
                        }
                        // å¼€å‘环境同时输出到控制台
                        if (options.EnableSqlLog)
                        {
                            Console.WriteLine($"SQL: {sql}\nPARAMS: {paramStr}");
                        }
                    }
                },
            };
            // å¼€å‘环境打印SQL
            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;
}
KH.WMS/KH.WMS.Core/Database/UnitOfWorks/IUnitOfWork.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
using 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;
    }
}
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>
/// å·¥ä½œå•元实现(面向接口,支持事务嵌套)
/// </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>();
    }
}
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;
        }
    }
}
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);
}
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;
    }
}
KH.WMS/KH.WMS.Core/DependencyInjection/ServiceLifetimes/RegisteredServiceAttribute.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using 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;
    }
}
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;
}
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,但未实现任何接口,建议使用 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;
        }
    }
}
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>
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>
    /// è®°å½•详细跟踪日志 - æ¯ä¸€è¡ŒSQL执行、详细流程跟踪
    /// </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);
}
KH.WMS/KH.WMS.Core/Logging/LogContext.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
using 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>
        /// å®¢æˆ·ç«¯IP
        /// </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();
    }
}
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogLevelType.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
using 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>
        /// è¯¦ç»†è·Ÿè¸ª - æ¯ä¸€è¡ŒSQL执行、详细流程跟踪
        /// </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
    }
}
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogModule.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
using 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>
        /// æ‹£è´§ç®¡ç†
        /// </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
    }
}
KH.WMS/KH.WMS.Core/Logging/LogEnums/LogType.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
using 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
    }
}
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;
        }
    }
}
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();
    }
}
KH.WMS/KH.WMS.Core/Logging/Serilog/SerilogOptions.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
using 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; }
    }
}
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
        };
    }
}
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;
}
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);
    }
}
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);
    }
}
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;
    }
}
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;
    }
}
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);
    }
}
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;
    }
}
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>
KH.WMS/KH.WMS.Server/Controllers/TestController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
using 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();
        }
    }
}
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>
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();
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"
      }
    }
  }
}
KH.WMS/KH.WMS.Server/appsettings.Development.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}
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": {
        // æ˜¯å¦å…è®¸ä»»ä½•来源(true=允许所有,false=使用 AllowedOrigins åˆ—表)
        "AllowAnyOrigin": false,
        // å…è®¸çš„æ¥æºåˆ—表(当 AllowAnyOrigin ä¸º false æ—¶ç”Ÿæ•ˆï¼‰
        "AllowedOrigins": [
            "http://localhost:3000",
            "http://localhost:8080",
            "https://localhost:3000",
            "https://localhost:8080"
        ],
        // æ˜¯å¦å…è®¸ä»»ä½• HTTP æ–¹æ³•(GET, POST, PUT, DELETE ç­‰ï¼‰
        "AllowAnyMethod": true,
        // æ˜¯å¦å…è®¸ä»»ä½•请求头
        "AllowAnyHeader": true,
        // æš´éœ²ç»™å®¢æˆ·ç«¯çš„响应头
        "ExposedHeaders": [
            "X-Correlation-ID",
            "X-Request-ID"
        ],
        // æ˜¯å¦è®¾ç½®é¢„检请求(OPTIONS)的缓存时间
        "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"
        }
    }
}
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
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()
    {
        // é€šè¿‡ä»£ç†è°ƒç”¨ï¼Œå†…部方法也会被拦截 âœ…
        _self.ValidateOrder();
        _self.CalculatePrice();
        _self.SaveOrder();
        return "Order processed successfully";
    }
    public void ValidateOrder()
    {
        // é€šè¿‡ä»£ç†è°ƒç”¨ï¼Œå­æ–¹æ³•也会被拦截 âœ…
        _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()
    {
        // å‘送通知
    }
}
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();
}
KH.WMS/Test/KH.WMS.TestProj/ITestService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
using 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();
    }
}
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>
KH.WMS/Test/KH.WMS.TestProj/TestOneService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
using 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;
        }
    }
}
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;
    }
}
KH.WMS/Test/KH.WMS.TestProj/TestTwoService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
using 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;
        }
    }
}
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>
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!");