From 4eb09a79fc52aa9f29b525757e5466bdf96dd672 Mon Sep 17 00:00:00 2001 From: yxw <17074267@qq.com> Date: Mon, 5 Jan 2026 19:09:54 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E7=9C=81=E5=B8=82=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Atomx.Admin.Client/Models/AreaSearch.cs | 2 + .../Pages/Settings/AreaEdit.razor | 23 +- .../Pages/Settings/AreaList.razor | 39 +- .../Pages/Settings/StateProvinceList.razor | 1 + Atomx.Admin/Atomx.Admin/Atomx.Admin.csproj | 2 +- .../Atomx.Admin/Controllers/AreaController.cs | 96 +- Atomx.Common/Entities/Area.cs | 5 + Atomx.Common/Models/KeyValueTree.cs | 2 +- Atomx.Data/CacheServices/AreaCacheService.cs | 10 +- .../Migrations/20260105102643_0.2.Designer.cs | 1528 +++++++++++++++++ Atomx.Data/Migrations/20260105102643_0.2.cs | 29 + .../Migrations/DataContextModelSnapshot.cs | 3 + 12 files changed, 1704 insertions(+), 36 deletions(-) create mode 100644 Atomx.Data/Migrations/20260105102643_0.2.Designer.cs create mode 100644 Atomx.Data/Migrations/20260105102643_0.2.cs diff --git a/Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs b/Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs index 0bde799..1f0d4a1 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs +++ b/Atomx.Admin/Atomx.Admin.Client/Models/AreaSearch.cs @@ -6,6 +6,8 @@ namespace Atomx.Admin.Client.Models { [IgnoreDataMember] public long? CountryId { get; set; } + + [IgnoreDataMember] public long StateProvinceId { get; set; } public string Name { get; set; } = string.Empty; } diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor index e39322e..ace9708 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaEdit.razor @@ -27,7 +27,7 @@ - + @@ -81,9 +81,10 @@ { model.CountryId = CountryId; + _ = LoadStateProvinceAndCities(); _ = LoadLanguage(); _ = LoadCountry(); - _ = LoadStateProvinceAndCities(); + if (Id > 0) { LoadData(); @@ -164,14 +165,14 @@ { area = apiResult.Data; model = apiResult.Data.Adapt(); - // if (model.ParentId > 0) - // { - // cities = $"{model.StateProvinceId},{model.ParentId}"; - // } - // else if (model.StateProvinceId > 0) - // { - // cities = $"{model.StateProvinceId}"; - // } + if (model.ParentId > 0) + { + cities = $"{model.ParentId}"; + } + else if (model.StateProvinceId > 0) + { + cities = $"{model.StateProvinceId}"; + } } } else @@ -203,7 +204,7 @@ { saving = false; await ModalService.InfoAsync(new ConfirmOptions() { Title = "提示", Content = "数据提交成功!" }); - Navigation.NavigateTo($"/area/list/{CountryId}"); + Navigation.NavigateTo($"/area/list/{CountryId}/{StateProvinceId}"); } else { diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor index 3857ef4..a1f23f6 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/AreaList.razor @@ -48,6 +48,7 @@ + @if (context.Enabled) { @@ -172,22 +173,52 @@ { if (page > 1) { - Navigation.NavigateTo($"/area/list/{CountryId}?page={page}"); + if (StateProvinceId > 0) + { + Navigation.NavigateTo($"/area/list/{CountryId}/{StateProvinceId}?page={page}"); + } + else + { + Navigation.NavigateTo($"/area/list/{CountryId}?page={page}"); + } } else { - Navigation.NavigateTo($"/area/list/{CountryId}"); + if (StateProvinceId > 0) + { + Navigation.NavigateTo($"/area/list/{CountryId}/{StateProvinceId}"); + } + else + { + Navigation.NavigateTo($"/area/list/{CountryId}"); + } } } else { if (page > 1) { - Navigation.NavigateTo($"/area/list/{CountryId}?page={page}&{queryString}"); + if (StateProvinceId > 0) + { + Navigation.NavigateTo($"/area/list/{CountryId}/{StateProvinceId}?page={page}&{queryString}"); + } + else + { + Navigation.NavigateTo($"/area/list/{CountryId}?page={page}&{queryString}"); + } + } else { - Navigation.NavigateTo($"/area/list/{CountryId}?{queryString}"); + if (StateProvinceId > 0) + { + Navigation.NavigateTo($"/area/list/{CountryId}/{StateProvinceId}?{queryString}"); + } + else + { + Navigation.NavigateTo($"/area/list/{CountryId}?{queryString}"); + } + } } } diff --git a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor index 24fde39..124ba95 100644 --- a/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor +++ b/Atomx.Admin/Atomx.Admin.Client/Pages/Settings/StateProvinceList.razor @@ -47,6 +47,7 @@ + @if (context.Enabled) { diff --git a/Atomx.Admin/Atomx.Admin/Atomx.Admin.csproj b/Atomx.Admin/Atomx.Admin/Atomx.Admin.csproj index cd3393c..2582382 100644 --- a/Atomx.Admin/Atomx.Admin/Atomx.Admin.csproj +++ b/Atomx.Admin/Atomx.Admin/Atomx.Admin.csproj @@ -32,7 +32,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs b/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs index 7a4ab3a..0a7edd1 100644 --- a/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs +++ b/Atomx.Admin/Atomx.Admin/Controllers/AreaController.cs @@ -188,7 +188,7 @@ namespace Atomx.Admin.Controllers if (search.StateProvinceId > 0) { query = from p in query - where p.ParentId == search.StateProvinceId + where p.StateProvinceId == search.StateProvinceId select p; } list.Count = query.Count(); @@ -299,32 +299,79 @@ namespace Atomx.Admin.Controllers { return new JsonResult(new ApiResult().IsFail("数据不存在", null)); } + bool stateProvinceChanged = data.StateProvinceId != model.StateProvinceId; + bool parentChanged = data.ParentId != model.ParentId; + long oldStateProvinceId = data.StateProvinceId; + long oldParentId = data.ParentId; data = _mapper.Map(model, data); - var parent = _dbContext.Areas.Where(p => p.Id == model.ParentId).SingleOrDefault(); - if (parent == null) + if (stateProvinceChanged || parentChanged) { - data.Depth = 0; - data.Path = model.Id.ToString(); - } - else - { - if (parent.StateProvinceId == 0) + var parent = _dbContext.Areas.Where(p => p.Id == model.ParentId).SingleOrDefault(); + if (parent == null) { - data.StateProvinceId = parent.Id; + data.Depth = 0; + data.Path = model.Id.ToString(); } else { - data.StateProvinceId = parent.StateProvinceId; - } + if (parent.StateProvinceId == 0) + { + data.StateProvinceId = parent.Id; + } + else + { + data.StateProvinceId = parent.StateProvinceId; + } - data.Depth = parent.Depth + 1; - data.Path = $"{parent.Path},{data.Id}"; + data.Depth = parent.Depth + 1; + data.Path = $"{parent.Path},{data.Id}"; + } } _dbContext.SaveChanges(); + if (stateProvinceChanged || parentChanged) + { + //更新数量 + if (parentChanged) + { + if (oldParentId > 0) + { + var oldParent = _dbContext.Areas.SingleOrDefault(p => p.Id == oldParentId); + if (oldParent != null) + { + oldParent.Count = _dbContext.Areas.Count(p => p.ParentId == oldParent.Id); + _dbContext.SaveChanges(); + } + } + var Parent = _dbContext.Areas.SingleOrDefault(p => p.Id == data.ParentId); + if (Parent != null) + { + Parent.Count = _dbContext.Areas.Count(p => p.ParentId == Parent.Id); + _dbContext.SaveChanges(); + } + } + if (stateProvinceChanged) + { + if (oldStateProvinceId > 0) + { + var oldState = _dbContext.Areas.SingleOrDefault(p => p.Id == oldStateProvinceId); + if (oldState != null) + { + oldState.Count = _dbContext.Areas.Count(p => p.StateProvinceId == oldState.Id); + _dbContext.SaveChanges(); + } + } + var state = _dbContext.Areas.SingleOrDefault(p => p.Id == data.StateProvinceId); + if (state != null) + { + state.Count = _dbContext.Areas.Count(p => p.StateProvinceId == state.Id); + _dbContext.SaveChanges(); + } + } + } } else { @@ -346,6 +393,7 @@ namespace Atomx.Admin.Controllers else { data.StateProvinceId = parent.StateProvinceId; + } data.Depth = parent.Depth + 1; data.Path = $"{parent.Path},{data.Id}"; @@ -353,6 +401,26 @@ namespace Atomx.Admin.Controllers _dbContext.Areas.Add(data); _dbContext.SaveChanges(); + + if (data.ParentId > 0) + { + + //更新省份的数量 + var state = _dbContext.Areas.SingleOrDefault(p => p.Id == data.StateProvinceId); + if (state != null) + { + state.Count = _dbContext.Areas.Count(p => p.StateProvinceId == state.Id); + _dbContext.SaveChanges(); + } + + //更新城市的数量 + var city = _dbContext.Areas.SingleOrDefault(p => p.Id == data.ParentId); + if (city != null) + { + city.Count = _dbContext.Areas.Count(p => p.ParentId == city.Id); + _dbContext.SaveChanges(); + } + } } _backgroundService.ResetStateProvinceAndAreaTree(model.CountryId); diff --git a/Atomx.Common/Entities/Area.cs b/Atomx.Common/Entities/Area.cs index f61b3d6..4d6c8dc 100644 --- a/Atomx.Common/Entities/Area.cs +++ b/Atomx.Common/Entities/Area.cs @@ -50,6 +50,11 @@ namespace Atomx.Common.Entities [Column(TypeName = "varchar(32)")] public string Abbreviation { get; set; } = string.Empty; + /// + /// 下级地区数量 + /// + public int Count { get; set; } + /// /// 地区深度 /// diff --git a/Atomx.Common/Models/KeyValueTree.cs b/Atomx.Common/Models/KeyValueTree.cs index 12212a7..829b041 100644 --- a/Atomx.Common/Models/KeyValueTree.cs +++ b/Atomx.Common/Models/KeyValueTree.cs @@ -4,6 +4,6 @@ { public string Label { get; set; } = string.Empty; public string Value { get; set; } = string.Empty; - public List Children { get; set; } = new List(); + public IList Children { get; set; } = new List(); } } diff --git a/Atomx.Data/CacheServices/AreaCacheService.cs b/Atomx.Data/CacheServices/AreaCacheService.cs index 2990a35..94d8743 100644 --- a/Atomx.Data/CacheServices/AreaCacheService.cs +++ b/Atomx.Data/CacheServices/AreaCacheService.cs @@ -91,13 +91,13 @@ namespace Atomx.Data.CacheServices Value = state.Id.ToString() }; - var citysInState = cities.Where(p => p.StateProvinceId == state.Id).ToList(); + var citysInState = cities.Where(p => p.ParentId == state.Id).ToList(); foreach (var city in citysInState) { var cityItem = new KeyValueTree { - Label = state.Name, - Value = state.Id.ToString() + Label = city.Name, + Value = city.Id.ToString() }; cityItem.Children = BuildAreaTree(city.Id, cities, new List()); @@ -250,7 +250,7 @@ namespace Atomx.Data.CacheServices private List BuildAreaTree(long parentId, List areas, List result) { var data = areas.Where(p => p.ParentId == parentId).ToList(); - foreach (var area in areas) + foreach (var area in data) { var item = new KeyValueTree { @@ -261,7 +261,7 @@ namespace Atomx.Data.CacheServices if (childs.Count > 0) { var childrenTrees = BuildAreaTree(area.Id, areas, result); - item.Children.AddRange(childrenTrees); + item.Children = childrenTrees; } result.Add(item); } diff --git a/Atomx.Data/Migrations/20260105102643_0.2.Designer.cs b/Atomx.Data/Migrations/20260105102643_0.2.Designer.cs new file mode 100644 index 0000000..0083716 --- /dev/null +++ b/Atomx.Data/Migrations/20260105102643_0.2.Designer.cs @@ -0,0 +1,1528 @@ +// +using System; +using Atomx.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Atomx.Data.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20260105102643_0.2")] + partial class _02 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Atomx.Common.Entities.Address", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("AddressDetails") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("City") + .IsRequired() + .HasColumnType("varchar(100)"); + + b.Property("CityId") + .HasColumnType("bigint"); + + b.Property("Company") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("Country") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("CountryId") + .HasColumnType("bigint"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Email") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("FullAddress") + .IsRequired() + .HasColumnType("varchar(1024)"); + + b.Property("IsDelete") + .HasColumnType("boolean"); + + b.Property("IsVirtual") + .HasColumnType("boolean"); + + b.Property("Latitude") + .HasColumnType("decimal(10,6)"); + + b.Property("Longitude") + .HasColumnType("decimal(10,6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("Phone") + .IsRequired() + .HasColumnType("varchar(20)"); + + b.Property("PostalCode") + .IsRequired() + .HasColumnType("varchar(15)"); + + b.Property("Province") + .IsRequired() + .HasColumnType("varchar(100)"); + + b.Property("ProvinceId") + .HasColumnType("bigint"); + + b.Property("Region") + .IsRequired() + .HasColumnType("varchar(100)"); + + b.Property("RegionId") + .HasColumnType("bigint"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("Addresses"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Admin", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Avatar") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Email") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("LastIp") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("LastLogin") + .HasColumnType("timestamptz"); + + b.Property("LockoutEndTime") + .HasColumnType("timestamptz"); + + b.Property("LoginCount") + .HasColumnType("integer"); + + b.Property("Mobile") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("RoleId") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TimeOffset") + .IsRequired() + .HasColumnType("varchar(4)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Username") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.HasKey("Id"); + + b.ToTable("Admins"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.AppVersion", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("AppName") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Platform") + .HasColumnType("integer"); + + b.Property("SiteId") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Version") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("VersionDate") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("VersionState") + .HasColumnType("integer"); + + b.Property("VersionX") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("VersionY") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("VersionZ") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.HasKey("Id"); + + b.ToTable("AppVersions"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Area", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Abbreviation") + .IsRequired() + .HasColumnType("varchar(32)"); + + b.Property("AllowShipping") + .HasColumnType("boolean"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CountryId") + .HasColumnType("bigint"); + + b.Property("Depth") + .HasColumnType("integer"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("Initial") + .IsRequired() + .HasColumnType("varchar(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("ParentId") + .HasColumnType("bigint"); + + b.Property("Path") + .IsRequired() + .HasColumnType("varchar(100)"); + + b.Property("StateProvinceId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("Areas"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Category", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Banner") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Depth") + .HasColumnType("integer"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("FilterAttributes") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Image") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("IsNode") + .HasColumnType("boolean"); + + b.Property("MetaDescription") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("MetaKeywords") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(25)"); + + b.Property("ParentId") + .HasColumnType("bigint"); + + b.Property("Path") + .IsRequired() + .HasColumnType("varchar(100)"); + + b.Property("SiteId") + .HasColumnType("integer"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Channel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Config") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Description") + .IsRequired() + .HasColumnType("varchar(512)"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(20)"); + + b.Property("Network") + .HasColumnType("integer"); + + b.Property("SiteId") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(20)"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("Channels"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Country", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("AllowShipping") + .HasColumnType("boolean"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("Initial") + .IsRequired() + .HasColumnType("varchar(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("NumericISOCode") + .HasColumnType("integer"); + + b.Property("ThreeLetterISOCode") + .IsRequired() + .HasColumnType("varchar(3)"); + + b.Property("TwoLetterISOCode") + .IsRequired() + .HasColumnType("varchar(2)"); + + b.HasKey("Id"); + + b.ToTable("Countries"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Currency", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("CurrencyCode") + .IsRequired() + .HasColumnType("varchar(10)"); + + b.Property("CustomFormatting") + .IsRequired() + .HasColumnType("varchar(20)"); + + b.Property("DisplayLocale") + .IsRequired() + .HasColumnType("varchar(15)"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("EnableDisplay") + .HasColumnType("boolean"); + + b.Property("EnablePay") + .HasColumnType("boolean"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("Rate") + .HasColumnType("decimal(16, 4)"); + + b.Property("SiteId") + .HasColumnType("integer"); + + b.Property("Symbolic") + .IsRequired() + .HasColumnType("varchar(8)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("Currencies"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.CurrencyChannelRelation", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("ChannelId") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("CurrencyId") + .HasColumnType("integer"); + + b.Property("EndTime") + .HasColumnType("integer"); + + b.Property("Extended") + .IsRequired() + .HasColumnType("text"); + + b.Property("Rate") + .HasColumnType("numeric"); + + b.Property("StartTime") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("TimeZone") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("CurrencyChannelRelations"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Culture") + .IsRequired() + .HasColumnType("varchar(25)"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("FlagImage") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("ResourceVersion") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("Languages"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.LocaleResource", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("LanguageId") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Value") + .IsRequired() + .HasColumnType("varchar(1000)"); + + b.HasKey("Id"); + + b.ToTable("LocaleResources"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.LocalizedProperty", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("EntityId") + .HasColumnType("bigint"); + + b.Property("Key") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("LanguageId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("LocalizedProperties"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Menu", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Code") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Depth") + .HasColumnType("integer"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("Icon") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("IsLink") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("ParentId") + .HasColumnType("bigint"); + + b.Property("Path") + .IsRequired() + .HasColumnType("varchar(100)"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Url") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.ToTable("Menus"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.MessageTemplate", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Attachments") + .IsRequired() + .HasColumnType("varchar(1024)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("text"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("Key") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("LanguageId") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("SiteId") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("MessageTemplates"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Permission", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Category") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("Description") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("Permissions"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Product", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("CategoryId") + .HasColumnType("bigint"); + + b.Property("CategoryPath") + .HasColumnType("varchar(200)"); + + b.Property("CorporationId") + .HasColumnType("bigint"); + + b.Property("CorporationStaffId") + .HasColumnType("bigint"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Deleted") + .HasColumnType("boolean"); + + b.Property("DeletedTime") + .HasColumnType("timestamptz"); + + b.Property("Description") + .HasColumnType("varchar(256)"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Extended") + .IsRequired() + .HasColumnType("text"); + + b.Property("Feature") + .HasColumnType("varchar(256)"); + + b.Property("Image") + .HasColumnType("varchar(256)"); + + b.Property("InventoryMethod") + .HasColumnType("integer"); + + b.Property("ManufacturerId") + .HasColumnType("bigint"); + + b.Property("MarketPrice") + .HasColumnType("decimal(18,4)"); + + b.Property("MaxWeight") + .HasColumnType("decimal(6,2)"); + + b.Property("MinWeight") + .HasColumnType("decimal(6,2)"); + + b.Property("Photos") + .HasColumnType("text"); + + b.Property("PictureCount") + .HasColumnType("integer"); + + b.Property("Price") + .HasColumnType("decimal(18,4)"); + + b.Property("ProductTypeId") + .HasColumnType("bigint"); + + b.Property("ReviewStatus") + .HasColumnType("integer"); + + b.Property("SIN") + .HasColumnType("varchar(20)"); + + b.Property("SalesQuantity") + .HasColumnType("integer"); + + b.Property("SkuPrices") + .HasColumnType("text"); + + b.Property("SpecificationJson") + .HasColumnType("text"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StockQuantity") + .HasColumnType("integer"); + + b.Property("StoreId") + .HasColumnType("bigint"); + + b.Property("Title") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Weight") + .HasColumnType("decimal(6,2)"); + + b.HasKey("Id"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.ProductAttribute", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("CategoryId") + .HasColumnType("bigint"); + + b.Property("ControlType") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("IsRequired") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("ParentId") + .HasColumnType("bigint"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("WeightIsRequired") + .HasColumnType("boolean"); + + b.Property("WeightUnit") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ProductAttributes"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.ProductAttributeCombination", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("AttributesJson") + .IsRequired() + .HasColumnType("text"); + + b.Property("CorporationId") + .HasColumnType("bigint"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("ManufacturerId") + .HasColumnType("bigint"); + + b.Property("Mark") + .HasColumnType("integer"); + + b.Property("MarketPrice") + .HasColumnType("decimal(18,4)"); + + b.Property("Note") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Price") + .HasColumnType("decimal(18,4)"); + + b.Property("ProcessCharge") + .HasColumnType("decimal(18,4)"); + + b.Property("ProcessCost") + .HasColumnType("decimal(18,4)"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.Property("SalesQuantity") + .HasColumnType("integer"); + + b.Property("SkuNumber") + .IsRequired() + .HasColumnType("varchar(20)"); + + b.Property("StockQuantity") + .HasColumnType("integer"); + + b.Property("Surcharge") + .HasColumnType("decimal(18,4)"); + + b.Property("SurchargeCost") + .HasColumnType("decimal(18,4)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Weight") + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ProductAttributeCombinations"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.ProductAttributeOption", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("AttributeId") + .HasColumnType("bigint"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Standard") + .HasColumnType("boolean"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Value") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.HasKey("Id"); + + b.ToTable("ProductAttributeOptions"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.ProductAttributeRelation", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("AttributeId") + .HasColumnType("bigint"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Image") + .HasColumnType("boolean"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("ProductAttributeRelations"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.ProductAttributeValue", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Image") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("IsAddWeight") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("OptionId") + .HasColumnType("bigint"); + + b.Property("ProductAttributeRelationId") + .HasColumnType("bigint"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.Property("Weight") + .HasColumnType("decimal(18,4)"); + + b.Property("WeightUnit") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("ProductAttributeValues"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.ProductInventory", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("CorporationId") + .HasColumnType("bigint"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("ProductAttributeCombinationId") + .HasColumnType("bigint"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.Property("StockQuantity") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("WarehouseId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("ProductInventories"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.ProductInventoryLog", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("AfterStock") + .HasColumnType("integer"); + + b.Property("BeforeStock") + .HasColumnType("integer"); + + b.Property("ChangeAmount") + .HasColumnType("integer"); + + b.Property("CorporationId") + .HasColumnType("bigint"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("ManufacturerId") + .HasColumnType("bigint"); + + b.Property("Note") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Operator") + .HasColumnType("bigint"); + + b.Property("OrderId") + .HasColumnType("bigint"); + + b.Property("ProductAttributeCombinationId") + .HasColumnType("bigint"); + + b.Property("ProductId") + .HasColumnType("bigint"); + + b.Property("StoreId") + .HasColumnType("bigint"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("WarehouseId") + .HasColumnType("bigint"); + + b.Property("Weight") + .HasColumnType("decimal(18,4)"); + + b.HasKey("Id"); + + b.ToTable("ProductInventoryLogs"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.RefreshToken", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("ExpiresTime") + .HasColumnType("timestamp with time zone"); + + b.Property("Ip") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("IsRevoked") + .HasColumnType("boolean"); + + b.Property("IssuedTime") + .HasColumnType("timestamp with time zone"); + + b.Property("RevokedTime") + .HasColumnType("timestamptz"); + + b.Property("Token") + .IsRequired() + .HasColumnType("varchar(500)"); + + b.Property("UserAgent") + .IsRequired() + .HasColumnType("varchar(500)"); + + b.Property("UserId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.ToTable("RefreshTokens"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Description") + .IsRequired() + .HasColumnType("varchar(256)"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("IsSystemRole") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Permission") + .IsRequired() + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("Roles"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Setting", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("Key") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("SiteId") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Settings"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.SiteApp", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Enabled") + .HasColumnType("boolean"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("SiteApps"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.SpecificationAttribute", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("CategoryId") + .HasColumnType("bigint"); + + b.Property("ControlType") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.Property("ParentId") + .HasColumnType("bigint"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("SpecificationAttributes"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.SpecificationAttributeOption", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("DisplayOrder") + .HasColumnType("integer"); + + b.Property("SpecificationId") + .HasColumnType("bigint"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.Property("Value") + .IsRequired() + .HasColumnType("varchar(50)"); + + b.HasKey("Id"); + + b.ToTable("SpecificationAttributeOptions"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.Tag", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Color") + .IsRequired() + .HasColumnType("varchar(12)"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Enabled") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.UploadFile", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("ContentType") + .IsRequired() + .HasColumnType("varchar(32)"); + + b.Property("CreateBy") + .IsRequired() + .HasColumnType("varchar(32)"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("CreateUid") + .HasColumnType("bigint"); + + b.Property("Extension") + .IsRequired() + .HasColumnType("varchar(12)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("Path") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("SHA256Hash") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("SiteId") + .HasColumnType("integer"); + + b.Property("Size") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("integer"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("UploadFiles"); + }); + + modelBuilder.Entity("Atomx.Common.Entities.User", b => + { + b.Property("Id") + .HasColumnType("bigint"); + + b.Property("Avatar") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("CreateTime") + .HasColumnType("timestamptz"); + + b.Property("Email") + .IsRequired() + .HasColumnType("varchar(128)"); + + b.Property("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property("FailedLoginAttempts") + .HasColumnType("integer"); + + b.Property("IsActive") + .HasColumnType("boolean"); + + b.Property("LockoutEndTime") + .HasColumnType("timestamptz"); + + b.Property("Mobile") + .IsRequired() + .HasColumnType("varchar(32)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("varchar(64)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("varchar(32)"); + + b.Property("UpdateTime") + .HasColumnType("timestamptz"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Atomx.Data/Migrations/20260105102643_0.2.cs b/Atomx.Data/Migrations/20260105102643_0.2.cs new file mode 100644 index 0000000..df9cefb --- /dev/null +++ b/Atomx.Data/Migrations/20260105102643_0.2.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Atomx.Data.Migrations +{ + /// + public partial class _02 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Count", + table: "Areas", + type: "integer", + nullable: false, + defaultValue: 0); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Count", + table: "Areas"); + } + } +} diff --git a/Atomx.Data/Migrations/DataContextModelSnapshot.cs b/Atomx.Data/Migrations/DataContextModelSnapshot.cs index f665dee..86818b9 100644 --- a/Atomx.Data/Migrations/DataContextModelSnapshot.cs +++ b/Atomx.Data/Migrations/DataContextModelSnapshot.cs @@ -243,6 +243,9 @@ namespace Atomx.Data.Migrations b.Property("AllowShipping") .HasColumnType("boolean"); + b.Property("Count") + .HasColumnType("integer"); + b.Property("CountryId") .HasColumnType("bigint");