You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
4.1 KiB
85 lines
4.1 KiB
using SqlSugar; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Threading.Tasks; |
|
|
|
namespace ReZero.SuperAPI |
|
{ |
|
internal class QueryTree : CommonDataService, IDataService |
|
{ |
|
public async Task<object> ExecuteAction(DataModel dataModel) |
|
{ |
|
var db = App.GetDbTableId(dataModel.TableId) ?? App.Db; |
|
RefAsync<int> count = 0; |
|
var parameter = dataModel.TreeParameter; |
|
var type = await EntityGeneratorManager.GetTypeAsync(dataModel.TableId); |
|
base.InitDb(type, db); |
|
var entity = db.EntityMaintenance.GetEntityInfo(type); |
|
var pkColumnInfo = entity.Columns.FirstOrDefault(it => it.IsPrimarykey); |
|
CheckEntityInfo(pkColumnInfo); |
|
var pkValue = UtilMethods.ChangeType2(dataModel.DefaultParameters.First().Value, pkColumnInfo.PropertyInfo.PropertyType); |
|
var data = await db.QueryableByObject(type) |
|
.InSingleAsync(pkValue); |
|
var typeBuilder = GetTypeBuilder(db, parameter, type, entity); |
|
var parentCodeName = entity.Columns.FirstOrDefault(it => it.PropertyName.EqualsCase(parameter?.ParentCodePropertyName?.Trim() ?? "")); |
|
var codeName = entity.Columns.FirstOrDefault(it => it.PropertyName.EqualsCase(parameter?.CodePropertyName ?? "")); |
|
CheckPars(parentCodeName, codeName); |
|
object? parentId = new object(); |
|
var treeType = typeBuilder.WithCache().BuilderType(); |
|
if (data != null) |
|
parentId = data.GetType()?.GetProperty(parentCodeName.PropertyName)?.GetValue(data) ?? 1; |
|
|
|
if (dataModel.DefaultParameters.Count() > 1) |
|
{ |
|
var queryable = db.QueryableByObject(treeType, PubConst.Orm_TableDefaultMasterTableShortName); |
|
var queryCommon = new QueryCommon(); |
|
queryCommon._sqlSugarClient = db; |
|
dataModel.DefaultParameters=dataModel.DefaultParameters.Skip(1).ToList(); |
|
queryable = queryCommon.Where(treeType, dataModel, queryable); |
|
return await queryable.ToTreeAsync(parameter?.ChildPropertyName, parentCodeName.PropertyName, parentId, codeName.PropertyName); |
|
} |
|
else |
|
{ |
|
var result = await db.QueryableByObject(treeType) |
|
.ToTreeAsync(parameter?.ChildPropertyName, parentCodeName.PropertyName, parentId, codeName.PropertyName); |
|
return result; |
|
} |
|
} |
|
|
|
private static void CheckEntityInfo(EntityColumnInfo pkColumnInfo) |
|
{ |
|
if (pkColumnInfo == null) |
|
{ |
|
throw new Exception(TextHandler.GetCommonText("实体没有配置主键", "The entity is not configured with a primary key")); |
|
} |
|
} |
|
private static DynamicProperyBuilder GetTypeBuilder(ISqlSugarClient db, DataModelTreeParameter? parameter, Type type, EntityInfo entity) |
|
{ |
|
var typeBuilder = db.DynamicBuilder().CreateClass("Tree" + type.Name, new SugarTable() { TableName = entity.DbTableName } |
|
) |
|
.CreateProperty(parameter?.ChildPropertyName, typeof(DynamicOneselfTypeList), new SugarColumn() { IsIgnore = true }); |
|
foreach (var item in entity.Columns) |
|
{ |
|
typeBuilder.CreateProperty(item.PropertyName, item.PropertyInfo.PropertyType, new SugarColumn() |
|
{ |
|
ColumnName = item.DbColumnName |
|
}); |
|
} |
|
|
|
return typeBuilder; |
|
} |
|
private static void CheckPars(EntityColumnInfo parentCodeName, EntityColumnInfo codeName) |
|
{ |
|
if (parentCodeName == null) |
|
{ |
|
throw new Exception(TextHandler.GetCommonText("实体没有配置父级编码", "The entity is not configured with a parent code")); |
|
} |
|
if (codeName == null) |
|
{ |
|
throw new Exception(TextHandler.GetCommonText("实体没有配置编码", "The entity is not configured with a code")); |
|
} |
|
} |
|
} |
|
}
|
|
|