From 7b11018a55db597df5410e41852e21e082dacbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B4=BE=E8=8D=A3=E5=9B=BDHome?= Date: Fri, 8 Apr 2022 16:39:24 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=E4=BD=BF=E7=94=A8=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E5=9C=B0=E7=82=B9?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=BD=BF=E7=94=A8=E4=B8=8D=E5=90=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RouteConsts.cs | 16 +- .../Parts/PartAppService.cs | 25 ++- .../Validator.cs | 1 + .../Asns/Shipments/MEA.cs | 6 +- .../MultiTenantConnectionStringResolver.cs | 183 ++++++++++++++++++ .../WebApiHttpApiHostModule.cs | 50 ++++- .../appsettings.json | 25 ++- .../Win_in.Sfs.Scp.v1.Domain/Parts/TA_PART.cs | 9 +- .../PurchaseOrders/TB_PO.cs | 4 +- .../PurchaseOrders/TB_PO_DETAIL.cs | 6 +- .../Receipts/TB_RECEIVE_DETAIL_QAD.cs | 4 +- .../Receipts/TB_RECEIVE_QAD.cs | 6 +- .../Suppliers/TA_VENDER.cs | 7 +- .../DbContext/IV1ScpDbContext.cs | 3 +- 14 files changed, 313 insertions(+), 32 deletions(-) create mode 100644 WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/MultiTenantConnectionStringResolver.cs diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application.Contracts/RouteConsts.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application.Contracts/RouteConsts.cs index 103ceb0..e098574 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application.Contracts/RouteConsts.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application.Contracts/RouteConsts.cs @@ -1,4 +1,7 @@ -namespace Win_in.Sfs.Scp.WebApi +using System; +using System.Collections.Generic; + +namespace Win_in.Sfs.Scp.WebApi { public class RouteConsts { @@ -8,4 +11,15 @@ public const string Supplier = "api/scp/supplier"; public const string UnplannedReceipt = "api/scp/unplanned-receipt"; } + + public class SiteConsts + { + public static readonly Dictionary SiteDict = new Dictionary + { + {"T8",Guid.Parse("446a5211-3d72-4339-9adc-845151f8ada0")}, + {"T9",Guid.Parse("25388015-ef1c-4355-9c18-f6b6ddbaf89d")} + }; + + + } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Parts/PartAppService.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Parts/PartAppService.cs index ab5e506..75f5197 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Parts/PartAppService.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Parts/PartAppService.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks.Dataflow; using AutoMapper; using AutoMapper.Configuration; using FluentValidation; +using Microsoft.EntityFrameworkCore; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; @@ -27,7 +28,7 @@ namespace Win_in.Sfs.Scp.WebApi [Route(RouteConsts.Part)] [ApiExplorerSettings(GroupName = SwaggerGroupConsts.ScpWebApi)] - public class PartAppService :ReadOnlyAppService, IPartAppService + public class PartAppService : ReadOnlyAppService, IPartAppService { private readonly IPartRepository _partRepository; private readonly ITaPartRepository _taPartRepository; @@ -35,8 +36,8 @@ namespace Win_in.Sfs.Scp.WebApi public PartAppService( IPartRepository repository - ,ITaPartRepository taPartRepository - ,IConfiguration configuration + , ITaPartRepository taPartRepository + , IConfiguration configuration ) : base(repository) { _partRepository = repository; @@ -49,7 +50,7 @@ namespace Win_in.Sfs.Scp.WebApi /// /// 唯一ID(unique ID) /// - + [HttpGet] [Route("{id}")] public override async Task GetAsync(Guid id) @@ -78,13 +79,13 @@ namespace Win_in.Sfs.Scp.WebApi [Route("")] public virtual async Task> CreateAsync(PartCreateDto partCreateDTO) { - + var entity = ObjectMapper.Map(partCreateDTO); try { - Validator.CheckSite(_validSites,entity.Site); - Validator.CheckSite(_validSites,entity.Company); + Validator.CheckSite(_validSites, entity.Site); + Validator.CheckSite(_validSites, entity.Company); await UpsertTaPartAsync(entity); await CurrentUnitOfWork.SaveChangesAsync(); } @@ -116,8 +117,14 @@ namespace Win_in.Sfs.Scp.WebApi { //使用AutoMapper执行类型转换 var taPart = ObjectMapper.Map(entity); - //根据传入数据新增或修改SCP数据 - await _taPartRepository.UpsertAsync(taPart); + + var tenantId = SiteConsts.SiteDict.GetValueOrDefault(taPart.Site); + using (CurrentTenant.Change(tenantId,taPart.Site)) + { + taPart.TenantId = tenantId; + //根据传入数据新增或修改SCP数据 + await _taPartRepository.UpsertAsync(taPart); + } } } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Validator.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Validator.cs index 07857d3..bee371a 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Validator.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Application/Validator.cs @@ -26,3 +26,4 @@ public static class Validator } } } + diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain/Asns/Shipments/MEA.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain/Asns/Shipments/MEA.cs index 934b147..9a226a1 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain/Asns/Shipments/MEA.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.Domain/Asns/Shipments/MEA.cs @@ -32,14 +32,14 @@ public class MEA /// 计量值 /// [StringLength(10, MinimumLength = 1)] - public string MEA03 { get; set; } + public string MEA03 { get; set; } = "0"; /// /// Unit Of Measurement /// 计量单位 /// [StringLength(2, MinimumLength = 2)] - public string MEA04 { get; set; } + public string MEA04 { get; set; } = "KG"; public string MEA05 { get;} @@ -49,7 +49,7 @@ public class MEA public string MEA09 { get;} public string MEA10 { get;} - public MEA(MeaType meaType,decimal meaValue,string uom) + public MEA(MeaType meaType,decimal meaValue =0,string uom="KG") { MEA02 = meaType.ToString(); MEA03 = meaValue.ToString(); diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/MultiTenantConnectionStringResolver.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/MultiTenantConnectionStringResolver.cs new file mode 100644 index 0000000..0328b52 --- /dev/null +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/MultiTenantConnectionStringResolver.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace Win_in.Sfs.Scp.WebApi; + +public class AAA:DefaultConnectionStringResolver +{ + public AAA(IOptionsSnapshot options) : base(options) + { + + } + + public override Task ResolveAsync(string connectionStringName = null) + { + return base.ResolveAsync(connectionStringName); + } +} + +[Dependency(ReplaceServices = true)] +public class MultiTenantConnectionStringResolver : DefaultConnectionStringResolver +{ + private readonly ICurrentTenant _currentTenant; + private readonly IServiceProvider _serviceProvider; + + public MultiTenantConnectionStringResolver( + IOptionsSnapshot options, + ICurrentTenant currentTenant, + IServiceProvider serviceProvider) + : base(options) + { + _currentTenant = currentTenant; + _serviceProvider = serviceProvider; + } + + public override async Task ResolveAsync(string connectionStringName = null) + { + if (_currentTenant.Id == null) + { + //No current tenant, fallback to default logic + return await base.ResolveAsync(connectionStringName); + } + + var tenant = await FindTenantConfigurationAsync(_currentTenant.Id.Value); + + if (tenant == null || tenant.ConnectionStrings.IsNullOrEmpty()) + { + //Tenant has not defined any connection string, fallback to default logic + return await base.ResolveAsync(connectionStringName); + } + + var tenantDefaultConnectionString = tenant.ConnectionStrings.Default; + + //Requesting default connection string... + if (connectionStringName == null || + connectionStringName == ConnectionStrings.DefaultConnectionStringName) + { + //Return tenant's default or global default + return !tenantDefaultConnectionString.IsNullOrWhiteSpace() + ? tenantDefaultConnectionString + : Options.ConnectionStrings.Default; + } + + //Requesting specific connection string... + var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName); + if (!connString.IsNullOrWhiteSpace()) + { + //Found for the tenant + return connString; + } + + //Fallback to the mapped database for the specific connection string + var database = Options.Databases.GetMappedDatabaseOrNull(connectionStringName); + if (database != null && database.IsUsedByTenants) + { + connString = tenant.ConnectionStrings.GetOrDefault(database.DatabaseName); + if (!connString.IsNullOrWhiteSpace()) + { + //Found for the tenant + return connString; + } + } + + //Fallback to tenant's default connection string if available + if (!tenantDefaultConnectionString.IsNullOrWhiteSpace()) + { + return tenantDefaultConnectionString; + } + + return await base.ResolveAsync(connectionStringName); + } + + [Obsolete("Use ResolveAsync method.")] + public override string Resolve(string connectionStringName = null) + { + if (_currentTenant.Id == null) + { + //No current tenant, fallback to default logic + return base.Resolve(connectionStringName); + } + + var tenant = FindTenantConfiguration(_currentTenant.Id.Value); + + if (tenant == null || tenant.ConnectionStrings.IsNullOrEmpty()) + { + //Tenant has not defined any connection string, fallback to default logic + return base.Resolve(connectionStringName); + } + + var tenantDefaultConnectionString = tenant.ConnectionStrings.Default; + + //Requesting default connection string... + if (connectionStringName == null || + connectionStringName == ConnectionStrings.DefaultConnectionStringName) + { + //Return tenant's default or global default + return !tenantDefaultConnectionString.IsNullOrWhiteSpace() + ? tenantDefaultConnectionString + : Options.ConnectionStrings.Default; + } + + //Requesting specific connection string... + var connString = tenant.ConnectionStrings.GetOrDefault(connectionStringName); + if (!connString.IsNullOrWhiteSpace()) + { + //Found for the tenant + return connString; + } + + //Fallback to tenant's default connection string if available + if (!tenantDefaultConnectionString.IsNullOrWhiteSpace()) + { + return tenantDefaultConnectionString; + } + + //Try to find the specific connection string for given name + var connStringInOptions = Options.ConnectionStrings.GetOrDefault(connectionStringName); + if (!connStringInOptions.IsNullOrWhiteSpace()) + { + return connStringInOptions; + } + + //Fallback to the global default connection string + var defaultConnectionString = Options.ConnectionStrings.Default; + if (!defaultConnectionString.IsNullOrWhiteSpace()) + { + return defaultConnectionString; + } + + throw new AbpException("No connection string defined!"); + } + + protected virtual async Task FindTenantConfigurationAsync(Guid tenantId) + { + using (var serviceScope = _serviceProvider.CreateScope()) + { + var tenantStore = serviceScope + .ServiceProvider + .GetRequiredService(); + + return await tenantStore.FindAsync(tenantId); + } + } + + [Obsolete("Use FindTenantConfigurationAsync method.")] + protected virtual TenantConfiguration FindTenantConfiguration(Guid tenantId) + { + using (var serviceScope = _serviceProvider.CreateScope()) + { + var tenantStore = serviceScope + .ServiceProvider + .GetRequiredService(); + + return tenantStore.Find(tenantId); + } + } +} diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/WebApiHttpApiHostModule.cs b/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/WebApiHttpApiHostModule.cs index cc24f33..085086b 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/WebApiHttpApiHostModule.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/WebApiHttpApiHostModule.cs @@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.Formatters; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Win_in.Sfs.Scp.WebApi.EntityFrameworkCore; using Win_in.Sfs.Scp.WebApi.MultiTenancy; @@ -35,6 +36,9 @@ using Volo.Abp.Swashbuckle; using Volo.Abp.UI.Navigation.Urls; using Volo.Abp.VirtualFileSystem; using Win_in.Sfs.Scp.v1.EntityFrameworkCore; +using Volo.Abp.MultiTenancy; +using Volo.Abp.MultiTenancy.ConfigurationStore; +using Volo.Abp.Data; namespace Win_in.Sfs.Scp.WebApi { @@ -48,7 +52,8 @@ namespace Win_in.Sfs.Scp.WebApi typeof(AbpAspNetCoreAuthenticationJwtBearerModule), typeof(AbpAccountWebIdentityServerModule), typeof(AbpAspNetCoreSerilogModule), - typeof(AbpSwashbuckleModule) + typeof(AbpSwashbuckleModule), + typeof(AbpMultiTenancyModule) )] [DependsOn( typeof(V1ScpEntityFrameworkCoreModule))] @@ -59,7 +64,6 @@ namespace Win_in.Sfs.Scp.WebApi var configuration = context.Services.GetConfiguration(); var hostingEnvironment = context.Services.GetHostingEnvironment(); - ConfigureBundles(); ConfigureUrls(configuration); @@ -69,8 +73,46 @@ namespace Win_in.Sfs.Scp.WebApi ConfigureVirtualFileSystem(context); ConfigureCors(context, configuration); ConfigureSwaggerServices(context, configuration); - + ConfigureMultiTenancy(configuration); ConfigureAuthorization(context,configuration); + context.Services.AddScoped(); + } + + private void ConfigureMultiTenancy(IConfiguration configuration) + { + Configure(options => { options.IsEnabled = true; }); + // Configure(configuration); + + // Configure(options => + // { + // options.Tenants = new[] + // { + // new TenantConfiguration( + // Guid.Parse("446a5211-3d72-4339-9adc-845151f8ada0"), //Id + // "T8" //Name + // ) + // { + // //tenant1 有单独的数据库连接字符串 + // ConnectionStrings = + // { + // {V1ScpConsts.ConnectionStringName, "Server=127.0.0.1;Database=SCP_HZ;User ID=sa;Password=Microsoft2008;connection timeout=600;"} + // } + // } + // , + // new TenantConfiguration( + // Guid.Parse("25388015-ef1c-4355-9c18-f6b6ddbaf89d"), //Id + // "T9" //Name + // ) + // { + // //tenant2 有单独的数据库连接字符串 + // ConnectionStrings = + // { + // {V1ScpConsts.ConnectionStringName, "Server=127.0.0.1;Database=SCP_TJ;User ID=sa;Password=Microsoft2008;connection timeout=600;"} + // } + // } + // }; + // }); + } private static void ConfigureAuthorization(ServiceConfigurationContext context, IConfiguration configuration) @@ -334,4 +376,6 @@ namespace Win_in.Sfs.Scp.WebApi app.UseConfiguredEndpoints(); } } + + } diff --git a/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/appsettings.json b/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/appsettings.json index 58446fd..c649e19 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/appsettings.json +++ b/WebApiService/src/Win_in.Sfs.Scp.WebApi.HttpApi.Host/appsettings.json @@ -5,9 +5,9 @@ "RedirectAllowedUrls": "https://localhost:9977,,https://localhost:9988" }, "ConnectionStrings": { - "Default": "Server=127.0.0.1;Database=Scp_WebApi;User ID=sa;Password=Microsoft2008;connection timeout=600;", - //"V1Scp": "Server=127.0.0.1;Database=Scp_V1;User ID=sa;Password=Microsoft2008;connection timeout=600;", - "V1Scp": "Server=121.36.30.37,13317;Database=SCP_JZJH;User ID=sa;Password=Microsoft2008;connection timeout=600;" + "Default": "Server=127.0.0.1;Database=Scp_WebApi;User ID=sa;Password=Microsoft2008;connection timeout=600;" + //"V1Scp": "Server=127.0.0.1;Database=SCP_HZ;User ID=sa;Password=Microsoft2008;connection timeout=600;" + }, "AuthServer": { "Authority": "https://localhost:9988", @@ -34,6 +34,23 @@ } } }, + "Tenants": [ + { + "Id": "446a5211-3d72-4339-9adc-845151f8ada0", + "Name": "T8", + "ConnectionStrings": { + "V1Scp": "Server=127.0.0.1;Database=SCP_HZ;User ID=sa;Password=Microsoft2008;connection timeout=600;" + } + }, + { + "Id": "25388015-ef1c-4355-9c18-f6b6ddbaf89d", + "Name": "T9", + "ConnectionStrings": { + "V1Scp": "Server=127.0.0.1;Database=SCP_TJ;User ID=sa;Password=Microsoft2008;connection timeout=600;" + } + } + ], + "AlwaysAllowAuthorization": true, - "ValidSites": "T8,JZ1" + "ValidSites": "T8,T9" } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Parts/TA_PART.cs b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Parts/TA_PART.cs index e065bfc..f56b823 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Parts/TA_PART.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Parts/TA_PART.cs @@ -1,10 +1,12 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Win_in.Sfs.Scp.v1.Domain { - public class TA_PART:Entity + public class TA_PART:Entity,IMultiTenant { public string PartCode { get; set; } @@ -39,6 +41,7 @@ namespace Win_in.Sfs.Scp.v1.Domain public bool? Ischeck { get; set; } - + + public Guid? TenantId { get; set; } } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO.cs b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO.cs index dc66fa1..06e9c56 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO.cs @@ -2,10 +2,11 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Win_in.Sfs.Scp.v1.Domain { - public class TB_PO : Entity + public class TB_PO : Entity,IMultiTenant { public string PoBillNum { get; set; } public string ErpBillNum { get; set; } @@ -31,5 +32,6 @@ namespace Win_in.Sfs.Scp.v1.Domain public bool IsDeleted { get; set; } public Guid GUID { get; set; } + public Guid? TenantId { get; } } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO_DETAIL.cs b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO_DETAIL.cs index 4d5049e..a5e0aad 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO_DETAIL.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/PurchaseOrders/TB_PO_DETAIL.cs @@ -2,10 +2,11 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Win_in.Sfs.Scp.v1.Domain { - public class TB_PO_DETAIL : Entity + public class TB_PO_DETAIL : Entity,IMultiTenant { public string PoBillNum { get; set; } @@ -40,6 +41,7 @@ namespace Win_in.Sfs.Scp.v1.Domain public bool IsDeleted { get; set; } public Guid GUID { get; set; } - + + public Guid? TenantId { get; } } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_DETAIL_QAD.cs b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_DETAIL_QAD.cs index 4d2ef81..10b7a5a 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_DETAIL_QAD.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_DETAIL_QAD.cs @@ -2,10 +2,11 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Win_in.Sfs.Scp.v1.Domain { - public class TB_RECEIVE_DETAIL_QAD:Entity + public class TB_RECEIVE_DETAIL_QAD:Entity,IMultiTenant { public string RecvBillNum { get; set; } public string PoBillNum { get; set; } @@ -42,5 +43,6 @@ namespace Win_in.Sfs.Scp.v1.Domain public string Extend2 { get; set; } public string Extend3 { get; set; } public string SubSite { get; set; } + public Guid? TenantId { get; } } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_QAD.cs b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_QAD.cs index 91b08ee..02c773d 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_QAD.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Receipts/TB_RECEIVE_QAD.cs @@ -2,10 +2,11 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Win_in.Sfs.Scp.v1.Domain { - public class TB_RECEIVE_QAD:Entity + public class TB_RECEIVE_QAD:Entity,IMultiTenant { public string RecvBillNum { get; set; } @@ -29,6 +30,7 @@ namespace Win_in.Sfs.Scp.v1.Domain public string Extend3 { get; set; } public string SubSite { get; set; } - + + public Guid? TenantId { get; } } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Suppliers/TA_VENDER.cs b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Suppliers/TA_VENDER.cs index 3c96431..e075e3e 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Suppliers/TA_VENDER.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.v1.Domain/Suppliers/TA_VENDER.cs @@ -1,10 +1,12 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; namespace Win_in.Sfs.Scp.v1.Domain { - public class TA_VENDER:Entity + public class TA_VENDER:Entity,IMultiTenant { public string VendId { get; set; } @@ -45,5 +47,6 @@ namespace Win_in.Sfs.Scp.v1.Domain public decimal? Quota { set; get; } + public Guid? TenantId { get; } } } \ No newline at end of file diff --git a/WebApiService/src/Win_in.Sfs.Scp.v1.EntityFrameworkCore/DbContext/IV1ScpDbContext.cs b/WebApiService/src/Win_in.Sfs.Scp.v1.EntityFrameworkCore/DbContext/IV1ScpDbContext.cs index 6429f2a..fae7a59 100644 --- a/WebApiService/src/Win_in.Sfs.Scp.v1.EntityFrameworkCore/DbContext/IV1ScpDbContext.cs +++ b/WebApiService/src/Win_in.Sfs.Scp.v1.EntityFrameworkCore/DbContext/IV1ScpDbContext.cs @@ -1,9 +1,10 @@ using Microsoft.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; using Win_in.Sfs.Scp.v1.Domain; namespace Win_in.Sfs.Scp.v1.EntityFrameworkCore { - public interface IV1ScpDbContext + public interface IV1ScpDbContext:IEfCoreDbContext { DbSet Parts { get; set; } DbSet Suppliers { get; set; }