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.
86 lines
4.1 KiB
86 lines
4.1 KiB
3 weeks ago
|
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"));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|