diff --git a/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs b/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs index b4ba0d7..985c0e4 100644 --- a/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs +++ b/CloudBuilder/CloudBuilder.Master.Service/FamilyTreeService.auto.cs @@ -1,4 +1,4 @@ - + using CloudBuilder.Core.DatabaseAccessor; using CloudBuilder.Core.DatabaseAccessor.Entity; using CloudBuilder.Core.Service; @@ -6,7 +6,13 @@ using CloudBuilder.Master.Data; using CloudBuilder.Master.Entity; using CloudBuilder.Master.Policy; using CloudBuilder.Master.SearchCriteria; +using CloudBuilder.Security.Data; +using CloudBuilder.Security.Entity; +using CloudBuilder.Security.Service; +using CloudBuilder.Security.Utility; using Microsoft.AspNetCore.Authorization; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; +using Microsoft.Extensions.DependencyInjection; namespace CloudBuilder.Master.Service { public class FamilyTreeService : IFamilyTreeService @@ -19,19 +25,62 @@ namespace CloudBuilder.Master.Service this.service = service; repository = service.GetRepository>(); } - [PermissionOperate(name: MasterPermissionPolicy.FamilyTree, operate: Operate.Find)] public FamilyTreeData FindByKey(string key) + { + return FindByCurrentPerson(key, null); + } + + [PermissionOperate(name: MasterPermissionPolicy.FamilyTree, operate: Operate.Find)] + public FamilyTreeData FindByCurrentPerson(string key, string personId) { FamilyTreeData data = new FamilyTreeData(); - return data;// repository.DetachedEntities.Where(x => x.TreeId == key).FirstOrDefault()!; + if (string.IsNullOrEmpty(key)) return data; + + FamilyTreeEntity d = repository.DetachedEntities.Where(x => x.TreeId == key).FirstOrDefault(); + + if (d == null) return data; + + data.FamilyTree = new FamilyTreeDisplayData(d); + data.CurrentPerson = new FamilyPersonData(); + + IRepository repositoryFamilyPerson = repository.GetRepository>(); + + var currentPerson = personId; + if (string.IsNullOrEmpty(personId)) + { + currentPerson = d.AncestorPersonId; + + data.CurrentPerson.FamilyPerson = new FamilyPersonDisplayData(repositoryFamilyPerson.DetachedEntities.Where(x => x.PersonId == currentPerson).FirstOrDefault()!); + + data.FamilyTree.AncestorPersonGenealogyName = data.CurrentPerson.FamilyPerson.GenealogyName; + } + else + { + data.CurrentPerson.FamilyPerson = new FamilyPersonDisplayData(repositoryFamilyPerson.DetachedEntities.Where(x => x.PersonId == d.AncestorPersonId).FirstOrDefault()!); + + data.FamilyTree.AncestorPersonGenealogyName = data.CurrentPerson.FamilyPerson.GenealogyName; + + data.CurrentPerson.FamilyPerson = new FamilyPersonDisplayData(repositoryFamilyPerson.DetachedEntities.Where(x => x.PersonId == personId).FirstOrDefault()!); + } + + IRepository repositoryChildrenMap = repository.GetRepository>(); + + IRepository repositorySpouseMap = repository.GetRepository>(); + + data.CurrentPerson.FamilyTreeSpouseMaps = repositorySpouseMap.GetRepository>().DetachedEntities.Where(x => x.PersonId == currentPerson).OrderBy(x => x.Orderby).ToArray(); + + //data.CurrentPerson.FamilyTreeParentMaps = repositoryChildrenMap.GetRepository>().DetachedEntities.Where(x => x.ChildrenId == key).OrderBy(x => x.Orderby).ToArray(); + data.CurrentPerson.FamilyTreeChildrenMaps = repositoryChildrenMap.GetRepository>().DetachedEntities.Where(x => x.PersonId == currentPerson).OrderBy(x => x.Orderby).ToArray(); + + return data; } [PermissionOperate(name: MasterPermissionPolicy.FamilyTree, operate: Operate.Find)] public FamilyTreeResultData FindBySearchCriteria(FamilyTreeSearchCriteria criteria) { FamilyTreeResultData data = new FamilyTreeResultData(); - FamilyTreeEntity[] list = null; + FamilyTreeViewEntity[] list = null; int count = 0; @@ -42,13 +91,15 @@ namespace CloudBuilder.Master.Service sqlWhere = SearchFilter.ComposeWhereClause(criteria.Filter); } - FamilyTreeEntity entity = FamilyTreeEntity.GetInstance(repository.GetDbContext().Database.ProviderName); + FamilyTreeViewEntity entity = FamilyTreeViewEntity.GetInstance(repository.GetDbContext().Database.ProviderName); string sql = entity.GetSelectTopFrom(criteria.limit, criteria.page, criteria.orderby.StringToDbField(), criteria.orderbytag, sqlWhere); + IRepository repositoryView = repository.GetRepository>(); + string err = null; try { - list = repository.FromSql(sql).ToArray(); + list = repositoryView.FromSql(sql).ToArray(); } catch (System.Exception ex) { @@ -81,14 +132,192 @@ namespace CloudBuilder.Master.Service [UnitOfWork] public FamilyTreeData Insert(FamilyTreeData data) { - throw new NotImplementedException(); + FamilyTreeEntity d = repository.DetachedEntities.Where(x => x.TreeName == data.FamilyTree.TreeName).FirstOrDefault(); + if (d != null) + { + throw new ValidatedException("家族名称已存在."); + } + + Validate(data.FamilyTree); + + d = new FamilyTreeEntity(); + ObjectCopyHelper.Copy(data.FamilyTree, d); + + + ISecurityGeneratorNumberService securityGeneratorNumberService = service.ServiceProvider.GetService()!; + + d.TreeId = securityGeneratorNumberService.GetNo(MasterPrefixPolicy.FAMILY_TREE, MasterPrefixPolicy.FAMILY_TREE_TREE_ID, MasterPrefixPolicy.FAMILY_TREE_PREFIX, YesNoPolicy.NO, MasterPrefixPolicy.FAMILY_TREE_FORMAT); + + repository.InsertNow(d); + + var currentPerson = d.AncestorPersonId; + + if (data.CurrentPerson != null && data.CurrentPerson.FamilyPerson != null && !string.IsNullOrEmpty(data.CurrentPerson.FamilyPerson.PersonId)) + { + currentPerson = data.CurrentPerson.FamilyPerson.PersonId; + } + + if (data.CurrentPerson != null && data.CurrentPerson.FamilyTreeSpouseMaps != null && data.CurrentPerson.FamilyTreeSpouseMaps.Length > 0) + data.CurrentPerson.FamilyTreeSpouseMaps.ToLookup(x => x.TreeId = d.TreeId); + + if (data.CurrentPerson != null && data.CurrentPerson.FamilyTreeChildrenMaps != null && data.CurrentPerson.FamilyTreeChildrenMaps.Length > 0) + data.CurrentPerson.FamilyTreeChildrenMaps.ToLookup(x => x.TreeId = d.TreeId); + + SaveSpouseMaps(currentPerson, data.CurrentPerson.FamilyTreeSpouseMaps); + //SaveParentMaps(data.CurrentPerson.FamilyPerson.PersonId, data.CurrentPerson.FamilyTreeParentMaps); + SaveSonMaps(currentPerson, data.CurrentPerson.FamilyTreeChildrenMaps); + + return FindByCurrentPerson(d.TreeId, currentPerson); } + private void SaveSpouseMaps(string personId, FamilyTreeSpouseMapViewEntity[] maps) + { + IRepository repositoryMapView = repository.GetRepository>(); + IRepository repositoryMap = repository.GetRepository>(); + + FamilyTreeSpouseMapViewEntity[] olds = repositoryMapView.Entities.Where(x => x.PersonId == personId).ToArray(); + if (olds != null && olds.Length > 0) + { + foreach (FamilyTreeSpouseMapViewEntity old in olds) + { + repositoryMap.DeleteNow(new FamilyTreeSpouseMapEntity() + { + TreeId = old.TreeId, + PersonId = personId, + SpouseId = old.SpouseId + }); + } + } + + if (maps == null || maps.Length == 0) return; + int i = 1; + foreach (FamilyTreeSpouseMapViewEntity map in maps.OrderBy(x => x.Orderby).ToArray()) + { + repositoryMap.InsertNow(new FamilyTreeSpouseMapEntity() + { + TreeId = map.TreeId, + PersonId = personId, + SpouseId = map.SpouseId, + + MarryDateText = map.MarryDateText, + MarryDate = map.MarryDate, + DivorceDateText = map.DivorceDateText, + DivorceDate = map.DivorceDate, + MarryType = map.MarryType, + IsCurrent = map.IsCurrent, + Remark = map.Remark, + Orderby = i++ + }); + } + } + + private void SaveParentMaps(string personId, FamilyTreeChildrenMapViewEntity[] maps) + { + IRepository repositoryMapView = repository.GetRepository>(); + IRepository repositoryMap = repository.GetRepository>(); + FamilyTreeChildrenMapViewEntity[] olds = repositoryMapView.Entities.Where(x => x.ChildrenId == personId).ToArray(); + if (olds != null && olds.Length > 0) + { + foreach (FamilyTreeChildrenMapViewEntity old in olds) + { + repositoryMap.DeleteNow(new FamilyTreeChildrenMapEntity() + { + TreeId = old.TreeId, + ChildrenId = personId, + PersonId = old.PersonId + }); + } + } + + if (maps == null || maps.Length == 0) return; + + int maxOrderBy = 0; + foreach (FamilyTreeChildrenMapViewEntity map in maps) + { + FamilyTreeChildrenMapViewEntity[] oldMaps = repositoryMapView.Entities.Where(x => x.PersonId == map.PersonId).ToArray(); + + if (oldMaps != null && oldMaps.Count() > 0) maxOrderBy = oldMaps.Max(x => x.Orderby); + + repositoryMap.InsertNow(new FamilyTreeChildrenMapEntity() + { + TreeId = map.TreeId, + ChildrenId = personId, + PersonId = map.PersonId, + Orderby = oldMaps == null ? 1 : maxOrderBy + 1 + }); + } + + } + + + private void SaveSonMaps(string personId, FamilyTreeChildrenMapViewEntity[] maps) + { + IRepository repositoryMapView = repository.GetRepository>(); + IRepository repositoryMap = repository.GetRepository>(); + + FamilyTreeChildrenMapViewEntity[] olds = repositoryMapView.Entities.Where(x => x.PersonId == personId).ToArray(); + if (olds != null && olds.Length > 0) + { + foreach (FamilyTreeChildrenMapViewEntity old in olds) + { + repositoryMap.DeleteNow(new FamilyTreeChildrenMapEntity() + { + TreeId = old.TreeId, + PersonId = personId, + ChildrenId = old.ChildrenId + }); + } + } + + if (maps == null || maps.Length == 0) return; + int i = 1; + foreach (FamilyTreeChildrenMapViewEntity map in maps.OrderBy(x => x.Orderby).ToArray()) + { + repositoryMap.InsertNow(new FamilyTreeChildrenMapEntity() + { + TreeId = map.TreeId, + PersonId = personId, + SpouseId = map.SpouseId, + + ChildrenId = map.ChildrenId, + RelationType = map.RelationType, + Remark = map.Remark, + Orderby = i++ + }); + } + } + + private void Validate(FamilyTreeEntity d) + { + List sysTableSchemas = service.ServiceProvider.GetRequiredService().FindByTableName(FamilyTreeEntity.DB_NAME_FAMILY_TREE); + ValidateHelper.ValidateString(d, sysTableSchemas.ToArray()); + } + + [PermissionOperate(name: MasterPermissionPolicy.FamilyTree, operate: Operate.Update)] [UnitOfWork] public FamilyTreeData Update(FamilyTreeData data) { - throw new NotImplementedException(); + FamilyTreeEntity d = repository.DetachedEntities.Where(x => x.TreeName == data.FamilyTree.TreeName).FirstOrDefault(); + if (d == null) + { + throw new ValidatedException("家族名称不存在."); + } + + Validate(data.FamilyTree); + + ObjectCopyHelper.Copy(data.FamilyTree, d); + + repository.UpdateNow(d); + + var currentPerson = data.CurrentPerson != null ? data.CurrentPerson.FamilyPerson.PersonId : null; + if (string.IsNullOrEmpty(currentPerson)) currentPerson = d.AncestorPersonId; + + SaveSpouseMaps(data.CurrentPerson.FamilyPerson.PersonId, data.CurrentPerson.FamilyTreeSpouseMaps); + //SaveParentMaps(data.CurrentPerson.FamilyPerson.PersonId, data.CurrentPerson.FamilyTreeParentMaps); + SaveSonMaps(data.CurrentPerson.FamilyPerson.PersonId, data.CurrentPerson.FamilyTreeChildrenMaps); + + return FindByCurrentPerson(data.FamilyTree.TreeId, currentPerson); } @@ -96,8 +325,43 @@ namespace CloudBuilder.Master.Service [UnitOfWork] public void Delete(string key) { - var ent= repository.DetachedEntities.Where(x => x.TreeId == key).FirstOrDefault()!; - if (ent != null) { repository.DeleteNow(ent); } + var ent = repository.DetachedEntities.Where(x => x.TreeId == key).FirstOrDefault()!; + if (ent == null) return; + repository.DeleteNow(ent); + + DeleteSpouses(ent.AncestorPersonId); + DeleteChildrens(ent.AncestorPersonId); + } + + private void DeleteSpouses(string personId) + { + IRepository repositoryMap = repository.GetRepository>(); + + FamilyTreeSpouseMapEntity[] olds = repositoryMap.Entities.Where(x => x.PersonId == personId).ToArray(); + + if (olds != null && olds.Length > 0) + { + repositoryMap.DeleteNow(olds); + } + } + + private void DeleteChildrens(string personId) + { + IRepository repositoryMap = repository.GetRepository>(); + + FamilyTreeChildrenMapEntity[] olds = repositoryMap.Entities.Where(x => x.PersonId == personId).ToArray(); + + if (olds != null && olds.Length > 0) + { + repositoryMap.DeleteNow(olds); + } + + foreach (FamilyTreeChildrenMapEntity old in olds) + { + DeleteChildrens(old.ChildrenId); + + DeleteSpouses(old.ChildrenId); + } } [PermissionOperate(name: MasterPermissionPolicy.FamilyTree, operate: Operate.Delete)] diff --git a/CloudBuilder/CloudBuilder.Master/Data/FamilyPersonData.cs b/CloudBuilder/CloudBuilder.Master/Data/FamilyPersonData.cs index 901a3ee..713ffe0 100644 --- a/CloudBuilder/CloudBuilder.Master/Data/FamilyPersonData.cs +++ b/CloudBuilder/CloudBuilder.Master/Data/FamilyPersonData.cs @@ -1,4 +1,5 @@ using CloudBuilder.Core.Authorization; +using CloudBuilder.Master.Entity; using System; using System.Collections.Generic; using System.Linq; @@ -11,5 +12,11 @@ namespace CloudBuilder.Master.Data public class FamilyPersonData { public FamilyPersonDisplayData? FamilyPerson { get; set; } + + public FamilyTreeSpouseMapViewEntity[]? FamilyTreeSpouseMaps { get; set; } + + public FamilyTreeChildrenMapViewEntity[]? FamilyTreeParentMaps { get; set; } + + public FamilyTreeChildrenMapViewEntity[]? FamilyTreeChildrenMaps { get; set; } } } diff --git a/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeData.cs b/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeData.cs index 5792854..fbaa388 100644 --- a/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeData.cs +++ b/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeData.cs @@ -1,4 +1,5 @@ using CloudBuilder.Core.Authorization; +using CloudBuilder.Master.Entity; using System; using System.Collections.Generic; using System.Linq; @@ -12,5 +13,8 @@ namespace CloudBuilder.Master.Data public class FamilyTreeData { public FamilyTreeDisplayData? FamilyTree { get; set; } + + public FamilyPersonData? CurrentPerson { get; set; } + } } diff --git a/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeDisplayData.cs b/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeDisplayData.cs index a233786..67150fa 100644 --- a/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeDisplayData.cs +++ b/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeDisplayData.cs @@ -14,14 +14,17 @@ namespace CloudBuilder.Master.Data /// [NotMapped] [TypeScript] - public class FamilyTreeDisplayData : FamilyPersonEntity + public class FamilyTreeDisplayData : FamilyTreeEntity { public FamilyTreeDisplayData() { } - public FamilyTreeDisplayData(FamilyPersonEntity entity) + public FamilyTreeDisplayData(FamilyTreeEntity entity) { CopyFrom(entity); } + + public string? AncestorPersonGenealogyName { get; set; } + } } diff --git a/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeResultData.cs b/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeResultData.cs index 43e1639..3cd9140 100644 --- a/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeResultData.cs +++ b/CloudBuilder/CloudBuilder.Master/Data/FamilyTreeResultData.cs @@ -12,6 +12,6 @@ namespace CloudBuilder.Master.Data [TypeScript] public class FamilyTreeResultData : SearchCriteriaResultData { - public FamilyTreeEntity[]? Datas { get; set; } + public FamilyTreeViewEntity[]? Datas { get; set; } } } diff --git a/CloudBuilder/CloudBuilder.Master/Entity/CloudBuilderMasterRegistEntity.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/CloudBuilderMasterRegistEntity.auto.cs index fcbca47..60e53d6 100644 --- a/CloudBuilder/CloudBuilder.Master/Entity/CloudBuilderMasterRegistEntity.auto.cs +++ b/CloudBuilder/CloudBuilder.Master/Entity/CloudBuilderMasterRegistEntity.auto.cs @@ -41,7 +41,17 @@ builder.Entity().HasKey(c => new {c.TreeId,c.PersonId -//***END*** + +builder.Entity(eb => { eb.HasNoKey(); }); + +builder.Entity(eb => { eb.HasNoKey(); }); + +builder.Entity(eb => { eb.HasNoKey(); }); + +builder.Entity(eb => { eb.HasNoKey(); }); + +builder.Entity(eb => { eb.HasNoKey(); }); + //***END*** } } } diff --git a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntity.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntity.auto.cs index b33f50a..5c0f02d 100644 --- a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntity.auto.cs +++ b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntity.auto.cs @@ -14,51 +14,55 @@ namespace CloudBuilder.Master.Entity { } - [Column("created_datetime")] - public DateTime CreatedDatetime { get; set; } - [Column("created_by")] - public string CreatedBy { get; set; } - [Column("updated_datetime")] - public DateTime UpdatedDatetime { get; set; } - [Column("updated_by")] - public string UpdatedBy { get; set; } - [Column("tree_id")] - public string TreeId { get; set; } - [Column("person_id")] - public string PersonId { get; set; } - [Column("spouse_id")] - public string SpouseId { get; set; } [Column("children_id")] public string ChildrenId { get; set; } + [Column("created_by")] + public string CreatedBy { get; set; } + [Column("created_datetime")] + public DateTime CreatedDatetime { get; set; } + [Column("orderby")] + public int Orderby { get; set; } + [Column("person_id")] + public string PersonId { get; set; } [Column("relation_type")] public string? RelationType { get; set; } [Column("remark")] public string? Remark { get; set; } + [Column("spouse_id")] + public string? SpouseId { get; set; } + [Column("tree_id")] + public string TreeId { get; set; } + [Column("updated_by")] + public string UpdatedBy { get; set; } + [Column("updated_datetime")] + public DateTime UpdatedDatetime { get; set; } - public const string CREATED_DATETIME = "CreatedDatetime"; - public const string CREATED_BY = "CreatedBy"; - public const string UPDATED_DATETIME = "UpdatedDatetime"; - public const string UPDATED_BY = "UpdatedBy"; - public const string TREE_ID = "TreeId"; - public const string PERSON_ID = "PersonId"; - public const string SPOUSE_ID = "SpouseId"; public const string CHILDREN_ID = "ChildrenId"; + public const string CREATED_BY = "CreatedBy"; + public const string CREATED_DATETIME = "CreatedDatetime"; + public const string ORDERBY = "Orderby"; + public const string PERSON_ID = "PersonId"; public const string RELATION_TYPE = "RelationType"; public const string REMARK = "Remark"; + public const string SPOUSE_ID = "SpouseId"; + public const string TREE_ID = "TreeId"; + public const string UPDATED_BY = "UpdatedBy"; + public const string UPDATED_DATETIME = "UpdatedDatetime"; public const string DB_NAME_FAMILY_TREE_CHILDREN_MAP = "family_tree_children_map"; - public const string DB_NAME_FIELDS="created_datetime,created_by,updated_datetime,updated_by,tree_id,person_id,spouse_id,children_id,relation_type,remark"; + public const string DB_NAME_FIELDS="children_id,created_by,created_datetime,orderby,person_id,relation_type,remark,spouse_id,tree_id,updated_by,updated_datetime"; - public const string DB_CREATED_DATETIME = "created_datetime"; - public const string DB_CREATED_BY = "created_by"; - public const string DB_UPDATED_DATETIME = "updated_datetime"; - public const string DB_UPDATED_BY = "updated_by"; - public const string DB_TREE_ID = "tree_id"; - public const string DB_PERSON_ID = "person_id"; - public const string DB_SPOUSE_ID = "spouse_id"; public const string DB_CHILDREN_ID = "children_id"; + public const string DB_CREATED_BY = "created_by"; + public const string DB_CREATED_DATETIME = "created_datetime"; + public const string DB_ORDERBY = "orderby"; + public const string DB_PERSON_ID = "person_id"; public const string DB_RELATION_TYPE = "relation_type"; public const string DB_REMARK = "remark"; + public const string DB_SPOUSE_ID = "spouse_id"; + public const string DB_TREE_ID = "tree_id"; + public const string DB_UPDATED_BY = "updated_by"; + public const string DB_UPDATED_DATETIME = "updated_datetime"; private string ProviderName { get; set; } @@ -79,23 +83,24 @@ namespace CloudBuilder.Master.Entity throw new NullReferenceException("Source entity is null."); } - this.CreatedDatetime = source.CreatedDatetime; - this.CreatedBy = source.CreatedBy; - this.UpdatedDatetime = source.UpdatedDatetime; - this.UpdatedBy = source.UpdatedBy; - this.TreeId = source.TreeId; - this.PersonId = source.PersonId; - this.SpouseId = source.SpouseId; this.ChildrenId = source.ChildrenId; + this.CreatedBy = source.CreatedBy; + this.CreatedDatetime = source.CreatedDatetime; + this.Orderby = source.Orderby; + this.PersonId = source.PersonId; this.RelationType = source.RelationType; this.Remark = source.Remark; + this.SpouseId = source.SpouseId; + this.TreeId = source.TreeId; + this.UpdatedBy = source.UpdatedBy; + this.UpdatedDatetime = source.UpdatedDatetime; if (includeSystemFields) { - this.CreatedDatetime = source.CreatedDatetime; this.CreatedBy = source.CreatedBy; - this.UpdatedDatetime = source.UpdatedDatetime; + this.CreatedDatetime = source.CreatedDatetime; this.UpdatedBy = source.UpdatedBy; + this.UpdatedDatetime = source.UpdatedDatetime; } } @@ -167,7 +172,7 @@ namespace CloudBuilder.Master.Entity public string GetSelectTopFromByMySql(int limit, int start,string orderby,string orderbytag, string sqlWhere) { if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; - if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_TREE_ID ; + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_CHILDREN_ID ; int offset = limit * (start - 1); return $" select {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_CHILDREN_MAP} where 1=1 {sqlWhere} ) a where num> {offset} LIMIT {limit} "; } @@ -175,7 +180,7 @@ namespace CloudBuilder.Master.Entity public string GetSelectTopFromBySqlServer(int limit, int start,string orderby,string orderbytag, string sqlWhere) { if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; - if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_TREE_ID ; + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_CHILDREN_ID ; string top = limit > 0 ? $"top {limit}" : ""; return $" select {top} {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_CHILDREN_MAP} with(nolock) where 1=1 {sqlWhere} ) a where num> {limit * (start - 1)}"; } diff --git a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntityKey.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntityKey.auto.cs index a6de04f..63a854f 100644 --- a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntityKey.auto.cs +++ b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapEntityKey.auto.cs @@ -5,9 +5,9 @@ namespace CloudBuilder.Master [TypeScript] public class FamilyTreeChildrenMapEntityKey { - public string TreeId { get; set; } - public string PersonId { get; set; } public string ChildrenId { get; set; } + public string PersonId { get; set; } + public string TreeId { get; set; } public override bool Equals(object obj) { @@ -16,9 +16,9 @@ namespace CloudBuilder.Master FamilyTreeChildrenMapEntityKey pkey = obj as FamilyTreeChildrenMapEntityKey; if (pkey == null) return false; - if (TreeId != pkey.TreeId) return false; - if (PersonId != pkey.PersonId) return false; if (ChildrenId != pkey.ChildrenId) return false; + if (PersonId != pkey.PersonId) return false; + if (TreeId != pkey.TreeId) return false; return true; } @@ -27,9 +27,9 @@ namespace CloudBuilder.Master public override string ToString() { string declareSql=""; - declareSql=declareSql+$"declare @__tkey_TreeId_0 varchar(50) select @__tkey_TreeId_0 ='{TreeId}'; " ; declareSql=declareSql+$"declare @__tkey_PersonId_1 varchar(50) select @__tkey_PersonId_1 ='{PersonId}'; " ; declareSql=declareSql+$"declare @__tkey_ChildrenId_2 varchar(50) select @__tkey_ChildrenId_2 ='{ChildrenId}'; " ; + declareSql=declareSql+$"declare @__tkey_ChildrenId_0 varchar(50) select @__tkey_ChildrenId_0 ='{ChildrenId}'; " ; declareSql=declareSql+$"declare @__tkey_PersonId_1 varchar(50) select @__tkey_PersonId_1 ='{PersonId}'; " ; declareSql=declareSql+$"declare @__tkey_TreeId_2 varchar(50) select @__tkey_TreeId_2 ='{TreeId}'; " ; return declareSql; } } } - /* builder.Entity().HasKey(c => new { c.TreeId, c.PersonId, c.ChildrenId}); */ + /* builder.Entity().HasKey(c => new { c.ChildrenId, c.PersonId, c.TreeId}); */ diff --git a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapViewEntity.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapViewEntity.auto.cs new file mode 100644 index 0000000..10dc533 --- /dev/null +++ b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeChildrenMapViewEntity.auto.cs @@ -0,0 +1,208 @@ + +using CloudBuilder.Core.Authorization; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +namespace CloudBuilder.Master.Entity + { + [TypeScript] + [Table("family_tree_children_map_view")] + public class FamilyTreeChildrenMapViewEntity : ViewEntityBase + { + + public FamilyTreeChildrenMapViewEntity() + { + } + + [Column("children_common_name")] + public string? ChildrenCommonName { get; set; } + [Column("children_genealogy_name")] + public string? ChildrenGenealogyName { get; set; } + [Column("children_id")] + public string ChildrenId { get; set; } + [Column("children_surname")] + public string ChildrenSurname { get; set; } + [Column("common_name")] + public string? CommonName { get; set; } + [Column("gender")] + public string? Gender { get; set; } + [Column("genealogy_name")] + public string? GenealogyName { get; set; } + [Column("orderby")] + public int Orderby { get; set; } + [Column("person_id")] + public string PersonId { get; set; } + [Column("relation_type")] + public string? RelationType { get; set; } + [Column("remark")] + public string? Remark { get; set; } + [Column("spouse_id")] + public string? SpouseId { get; set; } + [Column("surname")] + public string Surname { get; set; } + [Column("tree_id")] + public string TreeId { get; set; } + + public const string CHILDREN_COMMON_NAME = "ChildrenCommonName"; + public const string CHILDREN_GENEALOGY_NAME = "ChildrenGenealogyName"; + public const string CHILDREN_ID = "ChildrenId"; + public const string CHILDREN_SURNAME = "ChildrenSurname"; + public const string COMMON_NAME = "CommonName"; + public const string GENDER = "Gender"; + public const string GENEALOGY_NAME = "GenealogyName"; + public const string ORDERBY = "Orderby"; + public const string PERSON_ID = "PersonId"; + public const string RELATION_TYPE = "RelationType"; + public const string REMARK = "Remark"; + public const string SPOUSE_ID = "SpouseId"; + public const string SURNAME = "Surname"; + public const string TREE_ID = "TreeId"; + + public const string DB_NAME_FAMILY_TREE_CHILDREN_MAP_VIEW = "family_tree_children_map_view"; + public const string DB_NAME_FIELDS="children_common_name,children_genealogy_name,children_id,children_surname,common_name,gender,genealogy_name,orderby,person_id,relation_type,remark,spouse_id,surname,tree_id"; + + public const string DB_CHILDREN_COMMON_NAME = "children_common_name"; + public const string DB_CHILDREN_GENEALOGY_NAME = "children_genealogy_name"; + public const string DB_CHILDREN_ID = "children_id"; + public const string DB_CHILDREN_SURNAME = "children_surname"; + public const string DB_COMMON_NAME = "common_name"; + public const string DB_GENDER = "gender"; + public const string DB_GENEALOGY_NAME = "genealogy_name"; + public const string DB_ORDERBY = "orderby"; + public const string DB_PERSON_ID = "person_id"; + public const string DB_RELATION_TYPE = "relation_type"; + public const string DB_REMARK = "remark"; + public const string DB_SPOUSE_ID = "spouse_id"; + public const string DB_SURNAME = "surname"; + public const string DB_TREE_ID = "tree_id"; + + private string ProviderName { get; set; } + + public static FamilyTreeChildrenMapViewEntity GetInstance(string providerName) + { + return new FamilyTreeChildrenMapViewEntity() { ProviderName = providerName }; + } + + public virtual void CopyFrom(FamilyTreeChildrenMapViewEntity source) + { + CopyFrom(source, true); + } + + public virtual void CopyFrom(FamilyTreeChildrenMapViewEntity source, bool includeSystemFields) + { + if (source == null) + { + throw new NullReferenceException("Source entity is null."); + } + + this.ChildrenCommonName = source.ChildrenCommonName; + this.ChildrenGenealogyName = source.ChildrenGenealogyName; + this.ChildrenId = source.ChildrenId; + this.ChildrenSurname = source.ChildrenSurname; + this.CommonName = source.CommonName; + this.Gender = source.Gender; + this.GenealogyName = source.GenealogyName; + this.Orderby = source.Orderby; + this.PersonId = source.PersonId; + this.RelationType = source.RelationType; + this.Remark = source.Remark; + this.SpouseId = source.SpouseId; + this.Surname = source.Surname; + this.TreeId = source.TreeId; + + if (includeSystemFields) + { + } + } + + public override string GetSelectFrom() + { + if (ProviderName.Contains("MySql")) + { + return GetSelectFromByMySql(); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectFromByBySqlServer(); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + public string GetSelectFromByMySql() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_FAMILY_TREE_CHILDREN_MAP_VIEW} with(nolock) "; + } + public string GetSelectFromByBySqlServer() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_FAMILY_TREE_CHILDREN_MAP_VIEW} "; + } + + public override string GetSelectCountFrom(string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectCountFromByMySql(sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectCountFromBySqlServer(sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectCountFromByMySql(string sqlWhere) + { + return $" select count(*) from { DB_NAME_FAMILY_TREE_CHILDREN_MAP_VIEW} where 1=1 {sqlWhere}"; + } + public string GetSelectCountFromBySqlServer(string sqlWhere) + { + return $" select count(*) from { DB_NAME_FAMILY_TREE_CHILDREN_MAP_VIEW} with(nolock) where 1=1 {sqlWhere}"; + } + + public override string GetSelectTopFrom(int limit, int start, string orderby, string orderbytag, string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectTopFromByMySql(limit, start, orderby, orderbytag, sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectTopFromBySqlServer(limit, start, orderby, orderbytag, sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectTopFromByMySql(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_CHILDREN_COMMON_NAME ; int offset = limit * (start - 1); + return $" select {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_CHILDREN_MAP_VIEW} where 1=1 {sqlWhere} ) a where num> {offset} LIMIT {limit} "; + } + + public string GetSelectTopFromBySqlServer(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_CHILDREN_COMMON_NAME ; string top = limit > 0 ? $"top {limit}" : ""; + return $" select {top} {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_CHILDREN_MAP_VIEW} with(nolock) where 1=1 {sqlWhere} ) a where num> {limit * (start - 1)}"; + } + + public FamilyTreeChildrenMapViewEntity Clone() + { + FamilyTreeChildrenMapViewEntity result = new FamilyTreeChildrenMapViewEntity(); + result.CopyFrom(this); + + return result; + } + + } +} diff --git a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntity.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntity.auto.cs index 878d0ab..6f923ec 100644 --- a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntity.auto.cs +++ b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntity.auto.cs @@ -14,67 +14,71 @@ namespace CloudBuilder.Master.Entity { } - [Column("created_datetime")] - public DateTime CreatedDatetime { get; set; } [Column("created_by")] public string CreatedBy { get; set; } - [Column("updated_datetime")] - public DateTime UpdatedDatetime { get; set; } - [Column("updated_by")] - public string UpdatedBy { get; set; } - [Column("tree_id")] - public string TreeId { get; set; } - [Column("person_id")] - public string PersonId { get; set; } - [Column("spouse_id")] - public string SpouseId { get; set; } - [Column("marry_date_text")] - public string? MarryDateText { get; set; } - [Column("marry_date")] - public Nullable MarryDate { get; set; } - [Column("divorce_date_text")] - public string? DivorceDateText { get; set; } + [Column("created_datetime")] + public DateTime CreatedDatetime { get; set; } [Column("divorce_date")] public Nullable DivorceDate { get; set; } - [Column("marry_type")] - public string? MarryType { get; set; } + [Column("divorce_date_text")] + public string? DivorceDateText { get; set; } [Column("is_current")] public string? IsCurrent { get; set; } + [Column("marry_date")] + public Nullable MarryDate { get; set; } + [Column("marry_date_text")] + public string? MarryDateText { get; set; } + [Column("marry_type")] + public string? MarryType { get; set; } + [Column("orderby")] + public int Orderby { get; set; } + [Column("person_id")] + public string PersonId { get; set; } [Column("remark")] public string? Remark { get; set; } + [Column("spouse_id")] + public string SpouseId { get; set; } + [Column("tree_id")] + public string TreeId { get; set; } + [Column("updated_by")] + public string UpdatedBy { get; set; } + [Column("updated_datetime")] + public DateTime UpdatedDatetime { get; set; } - public const string CREATED_DATETIME = "CreatedDatetime"; public const string CREATED_BY = "CreatedBy"; - public const string UPDATED_DATETIME = "UpdatedDatetime"; - public const string UPDATED_BY = "UpdatedBy"; - public const string TREE_ID = "TreeId"; - public const string PERSON_ID = "PersonId"; - public const string SPOUSE_ID = "SpouseId"; - public const string MARRY_DATE_TEXT = "MarryDateText"; - public const string MARRY_DATE = "MarryDate"; - public const string DIVORCE_DATE_TEXT = "DivorceDateText"; + public const string CREATED_DATETIME = "CreatedDatetime"; public const string DIVORCE_DATE = "DivorceDate"; - public const string MARRY_TYPE = "MarryType"; + public const string DIVORCE_DATE_TEXT = "DivorceDateText"; public const string IS_CURRENT = "IsCurrent"; + public const string MARRY_DATE = "MarryDate"; + public const string MARRY_DATE_TEXT = "MarryDateText"; + public const string MARRY_TYPE = "MarryType"; + public const string ORDERBY = "Orderby"; + public const string PERSON_ID = "PersonId"; public const string REMARK = "Remark"; + public const string SPOUSE_ID = "SpouseId"; + public const string TREE_ID = "TreeId"; + public const string UPDATED_BY = "UpdatedBy"; + public const string UPDATED_DATETIME = "UpdatedDatetime"; public const string DB_NAME_FAMILY_TREE_SPOUSE_MAP = "family_tree_spouse_map"; - public const string DB_NAME_FIELDS="created_datetime,created_by,updated_datetime,updated_by,tree_id,person_id,spouse_id,marry_date_text,marry_date,divorce_date_text,divorce_date,marry_type,is_current,remark"; + public const string DB_NAME_FIELDS="created_by,created_datetime,divorce_date,divorce_date_text,is_current,marry_date,marry_date_text,marry_type,orderby,person_id,remark,spouse_id,tree_id,updated_by,updated_datetime"; - public const string DB_CREATED_DATETIME = "created_datetime"; public const string DB_CREATED_BY = "created_by"; - public const string DB_UPDATED_DATETIME = "updated_datetime"; - public const string DB_UPDATED_BY = "updated_by"; - public const string DB_TREE_ID = "tree_id"; - public const string DB_PERSON_ID = "person_id"; - public const string DB_SPOUSE_ID = "spouse_id"; - public const string DB_MARRY_DATE_TEXT = "marry_date_text"; - public const string DB_MARRY_DATE = "marry_date"; - public const string DB_DIVORCE_DATE_TEXT = "divorce_date_text"; + public const string DB_CREATED_DATETIME = "created_datetime"; public const string DB_DIVORCE_DATE = "divorce_date"; - public const string DB_MARRY_TYPE = "marry_type"; + public const string DB_DIVORCE_DATE_TEXT = "divorce_date_text"; public const string DB_IS_CURRENT = "is_current"; + public const string DB_MARRY_DATE = "marry_date"; + public const string DB_MARRY_DATE_TEXT = "marry_date_text"; + public const string DB_MARRY_TYPE = "marry_type"; + public const string DB_ORDERBY = "orderby"; + public const string DB_PERSON_ID = "person_id"; public const string DB_REMARK = "remark"; + public const string DB_SPOUSE_ID = "spouse_id"; + public const string DB_TREE_ID = "tree_id"; + public const string DB_UPDATED_BY = "updated_by"; + public const string DB_UPDATED_DATETIME = "updated_datetime"; private string ProviderName { get; set; } @@ -95,27 +99,28 @@ namespace CloudBuilder.Master.Entity throw new NullReferenceException("Source entity is null."); } - this.CreatedDatetime = source.CreatedDatetime; this.CreatedBy = source.CreatedBy; - this.UpdatedDatetime = source.UpdatedDatetime; - this.UpdatedBy = source.UpdatedBy; - this.TreeId = source.TreeId; - this.PersonId = source.PersonId; - this.SpouseId = source.SpouseId; - this.MarryDateText = source.MarryDateText; - this.MarryDate = source.MarryDate; - this.DivorceDateText = source.DivorceDateText; + this.CreatedDatetime = source.CreatedDatetime; this.DivorceDate = source.DivorceDate; - this.MarryType = source.MarryType; + this.DivorceDateText = source.DivorceDateText; this.IsCurrent = source.IsCurrent; + this.MarryDate = source.MarryDate; + this.MarryDateText = source.MarryDateText; + this.MarryType = source.MarryType; + this.Orderby = source.Orderby; + this.PersonId = source.PersonId; this.Remark = source.Remark; + this.SpouseId = source.SpouseId; + this.TreeId = source.TreeId; + this.UpdatedBy = source.UpdatedBy; + this.UpdatedDatetime = source.UpdatedDatetime; if (includeSystemFields) { - this.CreatedDatetime = source.CreatedDatetime; this.CreatedBy = source.CreatedBy; - this.UpdatedDatetime = source.UpdatedDatetime; + this.CreatedDatetime = source.CreatedDatetime; this.UpdatedBy = source.UpdatedBy; + this.UpdatedDatetime = source.UpdatedDatetime; } } @@ -187,7 +192,7 @@ namespace CloudBuilder.Master.Entity public string GetSelectTopFromByMySql(int limit, int start,string orderby,string orderbytag, string sqlWhere) { if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; - if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_TREE_ID ; + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_PERSON_ID ; int offset = limit * (start - 1); return $" select {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_SPOUSE_MAP} where 1=1 {sqlWhere} ) a where num> {offset} LIMIT {limit} "; } @@ -195,7 +200,7 @@ namespace CloudBuilder.Master.Entity public string GetSelectTopFromBySqlServer(int limit, int start,string orderby,string orderbytag, string sqlWhere) { if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; - if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_TREE_ID ; + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_PERSON_ID ; string top = limit > 0 ? $"top {limit}" : ""; return $" select {top} {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_SPOUSE_MAP} with(nolock) where 1=1 {sqlWhere} ) a where num> {limit * (start - 1)}"; } diff --git a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntityKey.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntityKey.auto.cs index eb76a80..e96cd64 100644 --- a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntityKey.auto.cs +++ b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapEntityKey.auto.cs @@ -5,9 +5,9 @@ namespace CloudBuilder.Master [TypeScript] public class FamilyTreeSpouseMapEntityKey { - public string TreeId { get; set; } public string PersonId { get; set; } public string SpouseId { get; set; } + public string TreeId { get; set; } public override bool Equals(object obj) { @@ -16,9 +16,9 @@ namespace CloudBuilder.Master FamilyTreeSpouseMapEntityKey pkey = obj as FamilyTreeSpouseMapEntityKey; if (pkey == null) return false; - if (TreeId != pkey.TreeId) return false; if (PersonId != pkey.PersonId) return false; if (SpouseId != pkey.SpouseId) return false; + if (TreeId != pkey.TreeId) return false; return true; } @@ -27,9 +27,9 @@ namespace CloudBuilder.Master public override string ToString() { string declareSql=""; - declareSql=declareSql+$"declare @__tkey_TreeId_0 varchar(50) select @__tkey_TreeId_0 ='{TreeId}'; " ; declareSql=declareSql+$"declare @__tkey_PersonId_1 varchar(50) select @__tkey_PersonId_1 ='{PersonId}'; " ; declareSql=declareSql+$"declare @__tkey_SpouseId_2 varchar(50) select @__tkey_SpouseId_2 ='{SpouseId}'; " ; + declareSql=declareSql+$"declare @__tkey_PersonId_0 varchar(50) select @__tkey_PersonId_0 ='{PersonId}'; " ; declareSql=declareSql+$"declare @__tkey_SpouseId_1 varchar(50) select @__tkey_SpouseId_1 ='{SpouseId}'; " ; declareSql=declareSql+$"declare @__tkey_TreeId_2 varchar(50) select @__tkey_TreeId_2 ='{TreeId}'; " ; return declareSql; } } } - /* builder.Entity().HasKey(c => new { c.TreeId, c.PersonId, c.SpouseId}); */ + /* builder.Entity().HasKey(c => new { c.PersonId, c.SpouseId, c.TreeId}); */ diff --git a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapViewEntity.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapViewEntity.auto.cs new file mode 100644 index 0000000..5849d12 --- /dev/null +++ b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeSpouseMapViewEntity.auto.cs @@ -0,0 +1,228 @@ + +using CloudBuilder.Core.Authorization; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +namespace CloudBuilder.Master.Entity + { + [TypeScript] + [Table("family_tree_spouse_map_view")] + public class FamilyTreeSpouseMapViewEntity : ViewEntityBase + { + + public FamilyTreeSpouseMapViewEntity() + { + } + + [Column("common_name")] + public string? CommonName { get; set; } + [Column("divorce_date")] + public Nullable DivorceDate { get; set; } + [Column("divorce_date_text")] + public string? DivorceDateText { get; set; } + [Column("gender")] + public string? Gender { get; set; } + [Column("genealogy_name")] + public string? GenealogyName { get; set; } + [Column("is_current")] + public string? IsCurrent { get; set; } + [Column("marry_date")] + public Nullable MarryDate { get; set; } + [Column("marry_date_text")] + public string? MarryDateText { get; set; } + [Column("marry_type")] + public string? MarryType { get; set; } + [Column("orderby")] + public int Orderby { get; set; } + [Column("person_id")] + public string PersonId { get; set; } + [Column("remark")] + public string? Remark { get; set; } + [Column("spouse_common_name")] + public string? SpouseCommonName { get; set; } + [Column("spouse_genealogy_name")] + public string? SpouseGenealogyName { get; set; } + [Column("spouse_id")] + public string SpouseId { get; set; } + [Column("spouse_surname")] + public string SpouseSurname { get; set; } + [Column("surname")] + public string Surname { get; set; } + [Column("tree_id")] + public string TreeId { get; set; } + + public const string COMMON_NAME = "CommonName"; + public const string DIVORCE_DATE = "DivorceDate"; + public const string DIVORCE_DATE_TEXT = "DivorceDateText"; + public const string GENDER = "Gender"; + public const string GENEALOGY_NAME = "GenealogyName"; + public const string IS_CURRENT = "IsCurrent"; + public const string MARRY_DATE = "MarryDate"; + public const string MARRY_DATE_TEXT = "MarryDateText"; + public const string MARRY_TYPE = "MarryType"; + public const string ORDERBY = "Orderby"; + public const string PERSON_ID = "PersonId"; + public const string REMARK = "Remark"; + public const string SPOUSE_COMMON_NAME = "SpouseCommonName"; + public const string SPOUSE_GENEALOGY_NAME = "SpouseGenealogyName"; + public const string SPOUSE_ID = "SpouseId"; + public const string SPOUSE_SURNAME = "SpouseSurname"; + public const string SURNAME = "Surname"; + public const string TREE_ID = "TreeId"; + + public const string DB_NAME_FAMILY_TREE_SPOUSE_MAP_VIEW = "family_tree_spouse_map_view"; + public const string DB_NAME_FIELDS="common_name,divorce_date,divorce_date_text,gender,genealogy_name,is_current,marry_date,marry_date_text,marry_type,orderby,person_id,remark,spouse_common_name,spouse_genealogy_name,spouse_id,spouse_surname,surname,tree_id"; + + public const string DB_COMMON_NAME = "common_name"; + public const string DB_DIVORCE_DATE = "divorce_date"; + public const string DB_DIVORCE_DATE_TEXT = "divorce_date_text"; + public const string DB_GENDER = "gender"; + public const string DB_GENEALOGY_NAME = "genealogy_name"; + public const string DB_IS_CURRENT = "is_current"; + public const string DB_MARRY_DATE = "marry_date"; + public const string DB_MARRY_DATE_TEXT = "marry_date_text"; + public const string DB_MARRY_TYPE = "marry_type"; + public const string DB_ORDERBY = "orderby"; + public const string DB_PERSON_ID = "person_id"; + public const string DB_REMARK = "remark"; + public const string DB_SPOUSE_COMMON_NAME = "spouse_common_name"; + public const string DB_SPOUSE_GENEALOGY_NAME = "spouse_genealogy_name"; + public const string DB_SPOUSE_ID = "spouse_id"; + public const string DB_SPOUSE_SURNAME = "spouse_surname"; + public const string DB_SURNAME = "surname"; + public const string DB_TREE_ID = "tree_id"; + + private string ProviderName { get; set; } + + public static FamilyTreeSpouseMapViewEntity GetInstance(string providerName) + { + return new FamilyTreeSpouseMapViewEntity() { ProviderName = providerName }; + } + + public virtual void CopyFrom(FamilyTreeSpouseMapViewEntity source) + { + CopyFrom(source, true); + } + + public virtual void CopyFrom(FamilyTreeSpouseMapViewEntity source, bool includeSystemFields) + { + if (source == null) + { + throw new NullReferenceException("Source entity is null."); + } + + this.CommonName = source.CommonName; + this.DivorceDate = source.DivorceDate; + this.DivorceDateText = source.DivorceDateText; + this.Gender = source.Gender; + this.GenealogyName = source.GenealogyName; + this.IsCurrent = source.IsCurrent; + this.MarryDate = source.MarryDate; + this.MarryDateText = source.MarryDateText; + this.MarryType = source.MarryType; + this.Orderby = source.Orderby; + this.PersonId = source.PersonId; + this.Remark = source.Remark; + this.SpouseCommonName = source.SpouseCommonName; + this.SpouseGenealogyName = source.SpouseGenealogyName; + this.SpouseId = source.SpouseId; + this.SpouseSurname = source.SpouseSurname; + this.Surname = source.Surname; + this.TreeId = source.TreeId; + + if (includeSystemFields) + { + } + } + + public override string GetSelectFrom() + { + if (ProviderName.Contains("MySql")) + { + return GetSelectFromByMySql(); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectFromByBySqlServer(); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + public string GetSelectFromByMySql() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_FAMILY_TREE_SPOUSE_MAP_VIEW} with(nolock) "; + } + public string GetSelectFromByBySqlServer() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_FAMILY_TREE_SPOUSE_MAP_VIEW} "; + } + + public override string GetSelectCountFrom(string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectCountFromByMySql(sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectCountFromBySqlServer(sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectCountFromByMySql(string sqlWhere) + { + return $" select count(*) from { DB_NAME_FAMILY_TREE_SPOUSE_MAP_VIEW} where 1=1 {sqlWhere}"; + } + public string GetSelectCountFromBySqlServer(string sqlWhere) + { + return $" select count(*) from { DB_NAME_FAMILY_TREE_SPOUSE_MAP_VIEW} with(nolock) where 1=1 {sqlWhere}"; + } + + public override string GetSelectTopFrom(int limit, int start, string orderby, string orderbytag, string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectTopFromByMySql(limit, start, orderby, orderbytag, sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectTopFromBySqlServer(limit, start, orderby, orderbytag, sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectTopFromByMySql(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_COMMON_NAME ; int offset = limit * (start - 1); + return $" select {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_SPOUSE_MAP_VIEW} where 1=1 {sqlWhere} ) a where num> {offset} LIMIT {limit} "; + } + + public string GetSelectTopFromBySqlServer(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_COMMON_NAME ; string top = limit > 0 ? $"top {limit}" : ""; + return $" select {top} {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_SPOUSE_MAP_VIEW} with(nolock) where 1=1 {sqlWhere} ) a where num> {limit * (start - 1)}"; + } + + public FamilyTreeSpouseMapViewEntity Clone() + { + FamilyTreeSpouseMapViewEntity result = new FamilyTreeSpouseMapViewEntity(); + result.CopyFrom(this); + + return result; + } + + } +} diff --git a/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeViewEntity.auto.cs b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeViewEntity.auto.cs new file mode 100644 index 0000000..6632a95 --- /dev/null +++ b/CloudBuilder/CloudBuilder.Master/Entity/FamilyTreeViewEntity.auto.cs @@ -0,0 +1,178 @@ + +using CloudBuilder.Core.Authorization; +using CloudBuilder.Core.DatabaseAccessor.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +namespace CloudBuilder.Master.Entity + { + [TypeScript] + [Table("family_tree_view")] + public class FamilyTreeViewEntity : ViewEntityBase + { + + public FamilyTreeViewEntity() + { + } + + [Column("ancestor_person_id")] + public string AncestorPersonId { get; set; } + [Column("brief")] + public string? Brief { get; set; } + [Column("common_name")] + public string? CommonName { get; set; } + [Column("genealogy_name")] + public string? GenealogyName { get; set; } + [Column("public_indc")] + public string PublicIndc { get; set; } + [Column("surname")] + public string Surname { get; set; } + [Column("tree_id")] + public string TreeId { get; set; } + [Column("tree_name")] + public string TreeName { get; set; } + + public const string ANCESTOR_PERSON_ID = "AncestorPersonId"; + public const string BRIEF = "Brief"; + public const string COMMON_NAME = "CommonName"; + public const string GENEALOGY_NAME = "GenealogyName"; + public const string PUBLIC_INDC = "PublicIndc"; + public const string SURNAME = "Surname"; + public const string TREE_ID = "TreeId"; + public const string TREE_NAME = "TreeName"; + + public const string DB_NAME_FAMILY_TREE_VIEW = "family_tree_view"; + public const string DB_NAME_FIELDS="ancestor_person_id,brief,common_name,genealogy_name,public_indc,surname,tree_id,tree_name"; + + public const string DB_ANCESTOR_PERSON_ID = "ancestor_person_id"; + public const string DB_BRIEF = "brief"; + public const string DB_COMMON_NAME = "common_name"; + public const string DB_GENEALOGY_NAME = "genealogy_name"; + public const string DB_PUBLIC_INDC = "public_indc"; + public const string DB_SURNAME = "surname"; + public const string DB_TREE_ID = "tree_id"; + public const string DB_TREE_NAME = "tree_name"; + + private string ProviderName { get; set; } + + public static FamilyTreeViewEntity GetInstance(string providerName) + { + return new FamilyTreeViewEntity() { ProviderName = providerName }; + } + + public virtual void CopyFrom(FamilyTreeViewEntity source) + { + CopyFrom(source, true); + } + + public virtual void CopyFrom(FamilyTreeViewEntity source, bool includeSystemFields) + { + if (source == null) + { + throw new NullReferenceException("Source entity is null."); + } + + this.AncestorPersonId = source.AncestorPersonId; + this.Brief = source.Brief; + this.CommonName = source.CommonName; + this.GenealogyName = source.GenealogyName; + this.PublicIndc = source.PublicIndc; + this.Surname = source.Surname; + this.TreeId = source.TreeId; + this.TreeName = source.TreeName; + + if (includeSystemFields) + { + } + } + + public override string GetSelectFrom() + { + if (ProviderName.Contains("MySql")) + { + return GetSelectFromByMySql(); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectFromByBySqlServer(); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + public string GetSelectFromByMySql() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_FAMILY_TREE_VIEW} with(nolock) "; + } + public string GetSelectFromByBySqlServer() + { + return $" select {DB_NAME_FIELDS} from { DB_NAME_FAMILY_TREE_VIEW} "; + } + + public override string GetSelectCountFrom(string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectCountFromByMySql(sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectCountFromBySqlServer(sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectCountFromByMySql(string sqlWhere) + { + return $" select count(*) from { DB_NAME_FAMILY_TREE_VIEW} where 1=1 {sqlWhere}"; + } + public string GetSelectCountFromBySqlServer(string sqlWhere) + { + return $" select count(*) from { DB_NAME_FAMILY_TREE_VIEW} with(nolock) where 1=1 {sqlWhere}"; + } + + public override string GetSelectTopFrom(int limit, int start, string orderby, string orderbytag, string sqlWhere) + { + if (ProviderName.Contains("MySql")) + { + return GetSelectTopFromByMySql(limit, start, orderby, orderbytag, sqlWhere); + } + else if (ProviderName.Contains("SqlServer")) + { + return GetSelectTopFromBySqlServer(limit, start, orderby, orderbytag, sqlWhere); + } + else + { + throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}"); + } + } + + public string GetSelectTopFromByMySql(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_ANCESTOR_PERSON_ID ; int offset = limit * (start - 1); + return $" select {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_VIEW} where 1=1 {sqlWhere} ) a where num> {offset} LIMIT {limit} "; + } + + public string GetSelectTopFromBySqlServer(int limit, int start,string orderby,string orderbytag, string sqlWhere) + { + if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc"; + + if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_ANCESTOR_PERSON_ID ; string top = limit > 0 ? $"top {limit}" : ""; + return $" select {top} {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_FAMILY_TREE_VIEW} with(nolock) where 1=1 {sqlWhere} ) a where num> {limit * (start - 1)}"; + } + + public FamilyTreeViewEntity Clone() + { + FamilyTreeViewEntity result = new FamilyTreeViewEntity(); + result.CopyFrom(this); + + return result; + } + + } +} diff --git a/CloudBuilder/CloudBuilder.Master/Policy/MasterPrefixPolicy.cs b/CloudBuilder/CloudBuilder.Master/Policy/MasterPrefixPolicy.cs index 04bcea3..095ab6a 100644 --- a/CloudBuilder/CloudBuilder.Master/Policy/MasterPrefixPolicy.cs +++ b/CloudBuilder/CloudBuilder.Master/Policy/MasterPrefixPolicy.cs @@ -13,5 +13,11 @@ namespace CloudBuilder.Master.Policy public const string FAMILY_PERSON_PREFIX = "P"; public const string FAMILY_PERSON_FORMAT = "0000000"; + public const string FAMILY_TREE = "FAMILY_TREE"; + public const string FAMILY_TREE_TREE_ID = "TREE_ID"; + public const string FAMILY_TREE_PREFIX = "T"; + public const string FAMILY_TREE_FORMAT = "0000000"; + + } } diff --git a/CloudBuilder/CloudBuilder.Master/Service/IFamilyTreeService.auto.cs b/CloudBuilder/CloudBuilder.Master/Service/IFamilyTreeService.auto.cs index 3bc7a7b..aae8e9d 100644 --- a/CloudBuilder/CloudBuilder.Master/Service/IFamilyTreeService.auto.cs +++ b/CloudBuilder/CloudBuilder.Master/Service/IFamilyTreeService.auto.cs @@ -7,8 +7,9 @@ using CloudBuilder.Master.SearchCriteria; namespace CloudBuilder.Master.Service { - public interface IFamilyTreeService :IServiceBase + public interface IFamilyTreeService : IServiceBase { + FamilyTreeData FindByCurrentPerson(string key, string personId); FamilyTreeResultData FindBySearchCriteria(FamilyTreeSearchCriteria tc); dynamic PrintBySearchCriteria(FamilyTreeSearchCriteria tc); void Deletes(string[] keys); diff --git a/CloudBuilder/CloudBuilder.Request/Master/FamilyTreeRequest.auto.cs b/CloudBuilder/CloudBuilder.Request/Master/FamilyTreeRequest.auto.cs index 73b8118..f846825 100644 --- a/CloudBuilder/CloudBuilder.Request/Master/FamilyTreeRequest.auto.cs +++ b/CloudBuilder/CloudBuilder.Request/Master/FamilyTreeRequest.auto.cs @@ -1,51 +1,61 @@ -using CloudBuilder.Core.DependencyInjection.Request; -using CloudBuilder.Core.Request; -using CloudBuilder.Core.Service; -using Microsoft.Extensions.DependencyInjection; -using CloudBuilder.Master.Service; - using CloudBuilder.Core.DatabaseAccessor.Entity; - using CloudBuilder.Master.Entity; - using CloudBuilder.Master.Data; - using System; - using CloudBuilder.Master.SearchCriteria; - -namespace CloudBuilder.Request.Master -{ - -public class FamilyTreeRequest : IRequest -{ - -private readonly IServiceRequest serviceRequest; -public FamilyTreeRequest(IServiceRequest serviceRequest) -{ -this.serviceRequest = serviceRequest; -} - - public FamilyTreeData FindByKey(string key) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/FindByKey?key=" + key.ToString())).GetAwaiter().GetResult(); } - - public FamilyTreeResultData FindBySearchCriteria(FamilyTreeSearchCriteria criteria) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/FindBySearchCriteria" , criteria)).GetAwaiter().GetResult(); } - - public FamilyTreeData Insert(FamilyTreeData data) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/Insert" , data)).GetAwaiter().GetResult(); } - - public FamilyTreeData Update(FamilyTreeData data) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/Update" , data)).GetAwaiter().GetResult(); } - - public void Delete(string key) - { - Task.Run(() => serviceRequest.PostAsync("/FamilyTree/Delete?key=" + key.ToString())).GetAwaiter().GetResult(); } - - public void Deletes(string[] keys) - { - Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/Deletes" , keys)).GetAwaiter().GetResult(); } - - -} +using CloudBuilder.Core.DependencyInjection.Request; +using CloudBuilder.Core.Request; +using CloudBuilder.Core.Service; +using Microsoft.Extensions.DependencyInjection; +using CloudBuilder.Master.Service; + using CloudBuilder.Core.DatabaseAccessor.Entity; + using CloudBuilder.Master.Entity; + using CloudBuilder.Master.Data; + using System; + using CloudBuilder.Master.SearchCriteria; + +namespace CloudBuilder.Request.Master +{ + +public class FamilyTreeRequest : IRequest +{ + +private readonly IServiceRequest serviceRequest; +public FamilyTreeRequest(IServiceRequest serviceRequest) +{ +this.serviceRequest = serviceRequest; +} + + public FamilyTreeData FindByKey(string key) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/FindByKey?key=" + key.ToString())).GetAwaiter().GetResult(); } + + + public class FindByCurrentPersonCompositionData2 { + public string key { get; set; } + public string personId { get; set; } + + } + public FamilyTreeData FindByCurrentPerson(string key, string personId) + { +var compositionData = new FindByCurrentPersonCompositionData2{ key = key, personId = personId }; return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/FindByCurrentPerson", compositionData)).GetAwaiter().GetResult(); } + + public FamilyTreeResultData FindBySearchCriteria(FamilyTreeSearchCriteria criteria) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/FindBySearchCriteria" , criteria)).GetAwaiter().GetResult(); } + + public FamilyTreeData Insert(FamilyTreeData data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/Insert" , data)).GetAwaiter().GetResult(); } + + public FamilyTreeData Update(FamilyTreeData data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/Update" , data)).GetAwaiter().GetResult(); } + + public void Delete(string key) + { + Task.Run(() => serviceRequest.PostAsync("/FamilyTree/Delete?key=" + key.ToString())).GetAwaiter().GetResult(); } + + public void Deletes(string[] keys) + { + Task.Run(() => serviceRequest.PostAsJsonAsync("/FamilyTree/Deletes" , keys)).GetAwaiter().GetResult(); } + + +} } \ No newline at end of file diff --git a/CloudBuilder/CloudBuilder.Request/Security/LocaleRequest.auto.cs b/CloudBuilder/CloudBuilder.Request/Security/LocaleRequest.auto.cs index fac21cf..17821f0 100644 --- a/CloudBuilder/CloudBuilder.Request/Security/LocaleRequest.auto.cs +++ b/CloudBuilder/CloudBuilder.Request/Security/LocaleRequest.auto.cs @@ -1,60 +1,70 @@ -using CloudBuilder.Core.DependencyInjection.Request; -using CloudBuilder.Core.Request; -using CloudBuilder.Core.Service; -using Microsoft.Extensions.DependencyInjection; -using CloudBuilder.Security.Service; - using CloudBuilder.Core.DatabaseAccessor.Entity; - using Microsoft.AspNetCore.Http; - using CloudBuilder.Core.Policy; - using CloudBuilder.Core.DependencyInjection.Request; - using CloudBuilder.Security.Data; - using CloudBuilder.Core.Authorization; - using System; - using CloudBuilder.Security.Entity; - using CloudBuilder.Security.SearchCriteria; - using CloudBuilder.Security; - -namespace CloudBuilder.Request.Security -{ - -public class LocaleRequest : IRequest -{ - -private readonly IServiceRequest serviceRequest; -public LocaleRequest(IServiceRequest serviceRequest) -{ -this.serviceRequest = serviceRequest; -} - - public LocaleEntity[] FindAll() - { -return Task.Run(() => serviceRequest.GetAsync("/Locale/FindAll")).GetAwaiter().GetResult(); } - - public LocaleResultData FindBySearchCriteria(LocaleSearchCriteria criteria) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/FindBySearchCriteria" , criteria)).GetAwaiter().GetResult(); } - - public LocaleEntity FindByKey(LocaleEntityKey key) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/FindByKey" , key)).GetAwaiter().GetResult(); } - - public LocaleEntity Insert(LocaleEntity data) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/Insert" , data)).GetAwaiter().GetResult(); } - - public LocaleEntity Update(LocaleEntity data) - { -return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/Update" , data)).GetAwaiter().GetResult(); } - - public void UpdateLocaleData(LocaleData data) - { - Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/UpdateLocaleData" , data)).GetAwaiter().GetResult(); } - - public void Delete(LocaleEntityKey key) - { - Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/Delete" , key)).GetAwaiter().GetResult(); } - - -} +using CloudBuilder.Core.DependencyInjection.Request; +using CloudBuilder.Core.Request; +using CloudBuilder.Core.Service; +using Microsoft.Extensions.DependencyInjection; +using CloudBuilder.Security.Service; + using CloudBuilder.Core.DatabaseAccessor.Entity; + using Microsoft.AspNetCore.Http; + using CloudBuilder.Core.Policy; + using CloudBuilder.Core.DependencyInjection.Request; + using CloudBuilder.Security.Data; + using CloudBuilder.Core.Authorization; + using System; + using CloudBuilder.Security.Entity; + using CloudBuilder.Security.SearchCriteria; + using CloudBuilder.Security; + +namespace CloudBuilder.Request.Security +{ + +public class LocaleRequest : IRequest +{ + +private readonly IServiceRequest serviceRequest; +public LocaleRequest(IServiceRequest serviceRequest) +{ +this.serviceRequest = serviceRequest; +} + + public LocaleEntity[] FindAll() + { +return Task.Run(() => serviceRequest.GetAsync("/Locale/FindAll")).GetAwaiter().GetResult(); } + + + public class FindSelectOptionCompositionData2 { + public string groupName { get; set; } + public bool blank { get; set; } + + } + public SelectOption[] FindSelectOption(string groupName, bool blank) + { +var compositionData = new FindSelectOptionCompositionData2{ groupName = groupName, blank = blank }; return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/FindSelectOption", compositionData)).GetAwaiter().GetResult(); } + + public LocaleResultData FindBySearchCriteria(LocaleSearchCriteria criteria) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/FindBySearchCriteria" , criteria)).GetAwaiter().GetResult(); } + + public LocaleEntity FindByKey(LocaleEntityKey key) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/FindByKey" , key)).GetAwaiter().GetResult(); } + + public LocaleEntity Insert(LocaleEntity data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/Insert" , data)).GetAwaiter().GetResult(); } + + public LocaleEntity Update(LocaleEntity data) + { +return Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/Update" , data)).GetAwaiter().GetResult(); } + + public void UpdateLocaleData(LocaleData data) + { + Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/UpdateLocaleData" , data)).GetAwaiter().GetResult(); } + + public void Delete(LocaleEntityKey key) + { + Task.Run(() => serviceRequest.PostAsJsonAsync("/Locale/Delete" , key)).GetAwaiter().GetResult(); } + + +} } \ No newline at end of file diff --git a/CloudBuilder/CloudBuilder.Security.Service/LocaleService.cs b/CloudBuilder/CloudBuilder.Security.Service/LocaleService.cs index 12c549e..d47c538 100644 --- a/CloudBuilder/CloudBuilder.Security.Service/LocaleService.cs +++ b/CloudBuilder/CloudBuilder.Security.Service/LocaleService.cs @@ -7,6 +7,7 @@ using CloudBuilder.Security.Policy; using CloudBuilder.Security.SearchCriteria; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; namespace CloudBuilder.Security.Service { public class LocaleService : ILocaleService @@ -27,6 +28,31 @@ namespace CloudBuilder.Security.Service return repository.DetachedEntities.ToArray(); } + [AllowAnonymous] + [HttpPost] + public SelectOption[] FindSelectOption(string groupName, bool blank = true) + { + LocaleEntity[] ents = repository.DetachedEntities.Where(x => x.GroupName == groupName && x.Lang == service.Locale).OrderBy(x => x.OrderBy).ToArray(); + + List l = new List(); + + SelectOption selectOption; + if (blank) + { + selectOption = new SelectOption(); + l.Add(selectOption); + } + + foreach (var ent in ents) + { + selectOption = new SelectOption(); + selectOption.BindValue = ent.Name; + selectOption.DisplayName = ent.Value; + l.Add(selectOption); + } + return l.ToArray(); + } + [AllowAnonymous] public LocaleResultData FindBySearchCriteria(LocaleSearchCriteria criteria) { diff --git a/CloudBuilder/CloudBuilder.Security/Service/ILocaleService.auto.cs b/CloudBuilder/CloudBuilder.Security/Service/ILocaleService.auto.cs index 29fe052..9d563e6 100644 --- a/CloudBuilder/CloudBuilder.Security/Service/ILocaleService.auto.cs +++ b/CloudBuilder/CloudBuilder.Security/Service/ILocaleService.auto.cs @@ -9,6 +9,7 @@ namespace CloudBuilder.Security.Service { public interface ILocaleService : IServiceBase { + SelectOption[] FindSelectOption(string groupName, bool blank); LocaleEntity[] FindAll(); LocaleResultData FindBySearchCriteria(LocaleSearchCriteria tc); diff --git a/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Master/FamilyTreeController.auto.cs b/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Master/FamilyTreeController.auto.cs index ba71c08..1b6ae4c 100644 --- a/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Master/FamilyTreeController.auto.cs +++ b/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Master/FamilyTreeController.auto.cs @@ -48,6 +48,33 @@ this.familyTreeService= familyTreeService; } } + + public class FindByCurrentPersonCompositionData + { + public string key { get; set; } + public string personId { get; set; } + + } + [PermissionOperate(name: "FamilyTree", operate: "Find")] + [HttpPost] + public dynamic FindByCurrentPerson(FindByCurrentPersonCompositionData compositionData) + { + try + { + + var result = familyTreeService.FindByCurrentPerson(compositionData.key,compositionData.personId); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + [PermissionOperate(name: "FamilyTree", operate: "Find")] [HttpPost] public dynamic FindBySearchCriteria(FamilyTreeSearchCriteria criteria) diff --git a/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/LocaleController.auto.cs b/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/LocaleController.auto.cs index 1dca1d1..e221849 100644 --- a/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/LocaleController.auto.cs +++ b/CloudBuilder/CloudBuilder.Web.Entry/Controllers/Security/LocaleController.auto.cs @@ -53,6 +53,33 @@ this.localeService= localeService; } } + + public class FindSelectOptionCompositionData + { + public string groupName { get; set; } + public bool blank { get; set; } + + } + [AllowAnonymous] + [HttpPost] + public dynamic FindSelectOption(FindSelectOptionCompositionData compositionData) + { + try + { + + var result = localeService.FindSelectOption(compositionData.groupName,compositionData.blank); + return result; + } + catch (ValidatedException vex) + { + return vex; + } + catch (Exception ex) + { + return new ServiceErrorException(ex); + } + } + [AllowAnonymous] [HttpPost] public dynamic FindBySearchCriteria(LocaleSearchCriteria criteria) diff --git a/CloudBuilder/Data/insert_locale.sql b/CloudBuilder/Data/insert_locale.sql new file mode 100644 index 0000000..22dab4f --- /dev/null +++ b/CloudBuilder/Data/insert_locale.sql @@ -0,0 +1,22 @@ +INSERT INTO locale ( + created_datetime, + created_by, + updated_datetime, + updated_by, + group_name, + lang, + name, + value, + order_by +) +VALUES +(GETDATE(), 'system', GETDATE(), 'system', 'GenderPolicy', 'zh-cn', 'M', N'¨k', 1), +(GETDATE(), 'system', GETDATE(), 'system', 'GenderPolicy', 'zh-cn', 'W', N'¤k', 2), +(GETDATE(), 'system', GETDATE(), 'system', 'GenderPolicy', 'en', 'M', N'¨k', 1), +(GETDATE(), 'system', GETDATE(), 'system', 'GenderPolicy', 'en', 'W', N'¤k', 2) + +select * from locale +where group_name='RelationTypePolicy' and name in ('M','W') + +delete from locale +where group_name='RelationTypePolicy' and name in ('M','W') \ No newline at end of file diff --git a/CodeGenerator/CloudBuilder.CodeGenerator.exe.lnk b/CodeGenerator/CloudBuilder.CodeGenerator.exe.lnk index 83aea00..64905ee 100644 Binary files a/CodeGenerator/CloudBuilder.CodeGenerator.exe.lnk and b/CodeGenerator/CloudBuilder.CodeGenerator.exe.lnk differ diff --git a/CodeGenerator/CloudBuilder.CodeGenerator/Program.cs b/CodeGenerator/CloudBuilder.CodeGenerator/Program.cs index 2039e70..e9d6ed4 100644 --- a/CodeGenerator/CloudBuilder.CodeGenerator/Program.cs +++ b/CodeGenerator/CloudBuilder.CodeGenerator/Program.cs @@ -17,13 +17,20 @@ namespace WinFormsApp var services = new ServiceCollection(); - services.Initialize(); + try + { + services.Initialize(); - var serviceProvider = services.BuildServiceProvider(); + var serviceProvider = services.BuildServiceProvider(); - MainFunctionView mainFunctionView = serviceProvider.GetRequiredKeyedService(typeof(MainFunctionView).Name); + MainFunctionView mainFunctionView = serviceProvider.GetRequiredKeyedService(typeof(MainFunctionView).Name); - Application.Run(mainFunctionView); + Application.Run(mainFunctionView); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } } } } \ No newline at end of file diff --git a/CodeGenerator/Lib/CloudBuilder.Core.dll b/CodeGenerator/Lib/CloudBuilder.Core.dll index 9c58616..747bd52 100644 Binary files a/CodeGenerator/Lib/CloudBuilder.Core.dll and b/CodeGenerator/Lib/CloudBuilder.Core.dll differ diff --git a/WebVue/src/hooks/useLocalePolicy.ts b/WebVue/src/hooks/useLocalePolicy.ts new file mode 100644 index 0000000..d918d70 --- /dev/null +++ b/WebVue/src/hooks/useLocalePolicy.ts @@ -0,0 +1,58 @@ +import { computed } from "vue"; +import type { ComputedRef } from "vue"; +import i18n from "@/locales"; +import { SelectOption } from "@/data/auto/selectOption"; + +/** + * 基于应用启动时已合并到 i18n 的 locale 数据(main.ts -> mergeDbLocaleMessages), + * 提供策略组下拉选项,避免再次调用服务器。 + * 映射规则与后端 LocaleService.FindSelectOption 保持一致: + * BindValue = Name, DisplayName = Value + * 顺序为 i18n 中 locale 表的合并顺序(对应 locale 表 order_by 的插入顺序)。 + */ +export const useLocalePolicy = () => { + const getPolicyOptions = (groupName: string, blank = true): SelectOption[] => { + const locale = ((i18n.global.locale as any)?.value ?? "zh-cn") as string; + const messages = (i18n.global.messages as any)?.value ?? {}; + const group: Record = messages[locale]?.[groupName] ?? {}; + + const options: SelectOption[] = []; + if (blank) options.push(new SelectOption()); + + Object.entries(group).forEach(([key, value]) => { + const option = new SelectOption(); + option.BindValue = key; + option.DisplayName = String(value); + options.push(option); + }); + return options; + }; + + const getPolicyOptionsComputed = ( + groupName: string, + blank = true + ): ComputedRef => computed(() => getPolicyOptions(groupName, blank)); + + /** + * 可直接绑定 的选项结构(label/value) + */ + const getPolicySelectOptions = (groupName: string, blank = true): { label: string; value: string }[] => { + return getPolicyOptions(groupName, blank).map((o) => ({ + label: o.DisplayName, + value: o.BindValue, + })); + }; + + const getPolicySelectOptionsComputed = ( + groupName: string, + blank = true + ): ComputedRef<{ label: string; value: string }[]> => + computed(() => getPolicySelectOptions(groupName, blank)); + + return { + getPolicyOptions, + getPolicyOptionsComputed, + getPolicySelectOptions, + getPolicySelectOptionsComputed, + }; +}; diff --git a/WebVue/src/injections/security/operation-to-enquiry.ts b/WebVue/src/injections/security/operation-to-enquiry.ts index d8b1ba2..6d3eb9a 100644 --- a/WebVue/src/injections/security/operation-to-enquiry.ts +++ b/WebVue/src/injections/security/operation-to-enquiry.ts @@ -9,6 +9,8 @@ export class OperationToEnquiryModelOption { public isModalPermissionDependent?: boolean = false; public isModalMaster?: boolean = false; public isModalFunction?: boolean = false; + public isModalTree?: boolean = false; //家谱树查询 + public isModalPerson?: boolean = false; //族员人员查询 public initBindOptionsUser?: BindOption[] = []; //初始化查询条件的值 public initBindOptionsGroup?: BindOption[] = []; public initBindOptionsActor?: BindOption[] = []; @@ -16,6 +18,8 @@ export class OperationToEnquiryModelOption { public initBindOptionsPermission?: BindOption[] = []; public initBindOptionsMaster?: BindOption[] = []; public initBindOptionsFunction?: BindOption[] = []; + public initBindOptionsTree?: BindOption[] = []; + public initBindOptionsPerson?: BindOption[] = []; public selectionTypeGroup?: string = "radio"; //记录单选还是多选 public selectionTypeUser?: string = "radio"; public selectionTypeActor?: string = "radio"; @@ -23,6 +27,8 @@ export class OperationToEnquiryModelOption { public selectionTypePermission?: string = "radio"; public selectionTypeMaster?: string = "radio"; public selectionTypeFunction?: string = "radio"; + public selectionTypeTree?: string = "radio"; + public selectionTypePerson?: string = "radio"; } //子组件调用父组件的方法================== diff --git a/WebVue/src/service/master/familyTreeService.ts b/WebVue/src/service/master/familyTreeService.ts index 751f9aa..a190e0f 100644 --- a/WebVue/src/service/master/familyTreeService.ts +++ b/WebVue/src/service/master/familyTreeService.ts @@ -16,6 +16,16 @@ class FamilyTreeService{ ) }; + async FindByCurrentPerson(data: any) { + return request( + { + url: "/FamilyTree/FindByCurrentPerson", + method: "post", + data, + } + ) + }; + async FindBySearchCriteria(data: FamilyTreeSearchCriteria) { return request( { diff --git a/WebVue/src/service/security/localeService.ts b/WebVue/src/service/security/localeService.ts index f41a48d..272d089 100644 --- a/WebVue/src/service/security/localeService.ts +++ b/WebVue/src/service/security/localeService.ts @@ -1,6 +1,7 @@ import { request } from "@/utils/request"; import type { LocaleEntity } from "@/data/auto/localeEntity"; + import type { SelectOption } from "@/data/auto/selectOption"; import type { LocaleSearchCriteria } from "@/data/auto/localeSearchCriteria"; import type { LocaleResultData } from "@/data/auto/localeResultData"; import type { LocaleEntityKey } from "@/data/auto/localeEntityKey"; @@ -17,6 +18,16 @@ class LocaleService{ ) }; + async FindSelectOption(data: any) { + return request( + { + url: "/Locale/FindSelectOption", + method: "post", + data, + } + ) + }; + async FindBySearchCriteria(data: LocaleSearchCriteria) { return request( { diff --git a/WebVue/src/views/master/FamilyPersonEnquiry.vue b/WebVue/src/views/master/FamilyPersonEnquiry.vue index ce7f04d..d724476 100644 --- a/WebVue/src/views/master/FamilyPersonEnquiry.vue +++ b/WebVue/src/views/master/FamilyPersonEnquiry.vue @@ -63,9 +63,9 @@ import { enquiryMethodKey, searchCriteriaManagerKey, operationToEnquiryMethodKey const actorOperationMethod = inject(operationToEnquiryMethodKey); const modelOption = actorOperationMethod?.getOperationToEnquiryModelOption() as OperationToEnquiryModelOption; -const isModal = ref(modelOption ? modelOption.isModalPermission : false); -const selectionType = ref(modelOption ? modelOption.selectionTypePermission : 'checkbox'); -const initBindOptions = ref((modelOption ? modelOption.initBindOptionsPermission : []) as BindOption[]); +const isModal = ref(modelOption ? modelOption.isModalPerson : false); +const selectionType = ref(modelOption ? modelOption.selectionTypePerson : 'checkbox'); +const initBindOptions = ref((modelOption ? modelOption.initBindOptionsPerson : []) as BindOption[]); //报表名称(layout) const layoutProviderMethod = inject(layoutProviderMethodKey); diff --git a/WebVue/src/views/master/FamilyPersonOperation.vue b/WebVue/src/views/master/FamilyPersonOperation.vue index 316aef3..ce5ad13 100644 --- a/WebVue/src/views/master/FamilyPersonOperation.vue +++ b/WebVue/src/views/master/FamilyPersonOperation.vue @@ -105,12 +105,8 @@ v-model:value="data.FamilyPerson.Gender" :disabled="!isEdit" style="width: 100%" + :options="genderSelectOptions" > - {{ o.DisplayName }} @@ -594,7 +590,7 @@ (new FamilyPersonData()); const hasData = ref(false); const yesNoPolicy = ref([]); +const { getPolicySelectOptionsComputed } = useLocalePolicy(); +const genderSelectOptions = getPolicySelectOptionsComputed('GenderPolicy'); const birthDate = ref(null); const deathDate = ref(null); const resultH = ref(""); @@ -688,9 +687,9 @@ const enquiry = ref(null); const modelOption = ref( new OperationToEnquiryModelOption(), ); -modelOption.value.isModalPermission = false; -modelOption.value.selectionTypePermission = "radio"; -modelOption.value.initBindOptionsPermission = []; +modelOption.value.isModalPerson = false; +modelOption.value.selectionTypePerson = "radio"; +modelOption.value.initBindOptionsPerson = []; const getOperationToEnquiryModelOption = () => { return modelOption.value; @@ -732,8 +731,8 @@ const computResultTableHeight = () => { }; const onModalSearch = () => { - modelOption.value.isModalPermission = true; - modelOption.value.selectionTypePermission = "radio"; + modelOption.value.isModalPerson = true; + modelOption.value.selectionTypePerson = "radio"; showModalType.value = 0; }; @@ -848,7 +847,7 @@ const handleSelect = async () => { onSearch(); } - modelOption.value.isModalPermission = false; + modelOption.value.isModalPerson = false; } else { notification.info({ message: "系统提示:", diff --git a/WebVue/src/views/master/FamilyTreeEnquiry.vue b/WebVue/src/views/master/FamilyTreeEnquiry.vue new file mode 100644 index 0000000..32af36d --- /dev/null +++ b/WebVue/src/views/master/FamilyTreeEnquiry.vue @@ -0,0 +1,345 @@ + + diff --git a/WebVue/src/views/master/FamilyTreeOperation.vue b/WebVue/src/views/master/FamilyTreeOperation.vue new file mode 100644 index 0000000..39083b6 --- /dev/null +++ b/WebVue/src/views/master/FamilyTreeOperation.vue @@ -0,0 +1,984 @@ + + + \ No newline at end of file