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.
209 lines
9.7 KiB
209 lines
9.7 KiB
3 weeks ago
|
using SqlSugar;
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace ReZero.SuperAPI
|
||
|
{
|
||
|
public class EntityMappingService
|
||
|
{
|
||
|
public Action<ZeroEntityInfo>? TableInfoConvertFunc { get; set; }
|
||
|
|
||
|
public Action<ZeroEntityColumnInfo>? TableColumnInfoConvertFunc { get; set; }
|
||
|
|
||
|
internal static bool IsAnyDefaultValue(DataModel dataModel)
|
||
|
{
|
||
|
return dataModel.DefaultValueColumns?.Any() == true;
|
||
|
}
|
||
|
internal static object? GetDataByDefaultValueParameters(Type type,ISqlSugarClient db, DataModel dataModel)
|
||
|
{
|
||
|
if (dataModel.Data == null)
|
||
|
return dataModel.Data;
|
||
|
var entityInfo=db.EntityMaintenance.GetEntityInfo(type);
|
||
|
var now = DateTime.Now;
|
||
|
if (dataModel.DefaultValueColumns.Any(it => it.Type == DefaultValueType.CurrentTime))
|
||
|
{
|
||
|
now = db.GetDate();
|
||
|
}
|
||
|
if (dataModel.Data is IList list)
|
||
|
{
|
||
|
foreach (var item in list)
|
||
|
{
|
||
|
SetDatefaultValue(item, entityInfo, db, dataModel, now.AddMilliseconds(1));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetDatefaultValue(dataModel.Data, entityInfo, db, dataModel, now);
|
||
|
}
|
||
|
return dataModel.Data;
|
||
|
}
|
||
|
|
||
|
private static void SetDatefaultValue(object item, EntityInfo entityInfo, ISqlSugarClient db, DataModel dataModel, DateTime now)
|
||
|
{
|
||
|
foreach (var DefaultValue in dataModel.DefaultValueColumns??new List<DataModelDefaultValueColumnParameter>())
|
||
|
{
|
||
|
var columnInfo = entityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualsCase(DefaultValue.PropertyName!));
|
||
|
var value = columnInfo.PropertyInfo.GetValue(item);
|
||
|
var defauleValue = UtilMethods.GetDefaultValue(columnInfo.UnderType);
|
||
|
if (columnInfo != null&& (value == null||value.Equals(defauleValue) || (value is string && value?.ToString()=="")))
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
switch (DefaultValue.Type!)
|
||
|
{
|
||
|
case DefaultValueType.None:
|
||
|
break;
|
||
|
case DefaultValueType.FixedValue:
|
||
|
columnInfo.PropertyInfo.SetValue(item, UtilMethods.ChangeType2(DefaultValue.Value, columnInfo.UnderType));
|
||
|
break;
|
||
|
case DefaultValueType.DefaultValue:
|
||
|
columnInfo.PropertyInfo.SetValue(item, defauleValue);
|
||
|
break;
|
||
|
case DefaultValueType.CurrentTime:
|
||
|
if (columnInfo.UnderType == typeof(DateTime))
|
||
|
{
|
||
|
columnInfo.PropertyInfo.SetValue(item, now);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText(PubConst.ErrorCode_001 + columnInfo.PropertyName + "默认值配置错,只能在时间类型配置:当前时间", PubConst.ErrorCode_001 + columnInfo.PropertyName + " The default value is incorrectly configured and can only be configured for the time type: current time"));
|
||
|
}
|
||
|
break;
|
||
|
case DefaultValueType.ClaimKey:
|
||
|
var claim = dataModel.ClaimList.FirstOrDefault(it => it.Key.EqualsCase(DefaultValue.Value!));
|
||
|
if (claim.Key != null)
|
||
|
{
|
||
|
columnInfo.PropertyInfo.SetValue(item, claim.Value);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
throw new Exception(TextHandler.GetCommonText(PubConst.ErrorCode_001+"默认值赋值失败,没有找到 Claim key" + DefaultValue.Value, PubConst.ErrorCode_001+"Default assignment failed, claim key not found " + DefaultValue.Value));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
if (!ex.Message.Contains(PubConst.ErrorCode_001))
|
||
|
throw new Exception(TextHandler.GetCommonText(columnInfo.PropertyName + "默认值赋值失败 " + ex.Message, columnInfo.PropertyName + "Default assignment failed " + ex.Message));
|
||
|
else
|
||
|
throw ex;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public ZeroEntityInfo ConvertDbToEntityInfo(Type type)
|
||
|
{
|
||
|
var db = App.PreStartupDb;
|
||
|
var entityInfo = db!.EntityMaintenance.GetEntityInfo(type);
|
||
|
ZeroEntityInfo result = new ZeroEntityInfo()
|
||
|
{
|
||
|
DbTableName = entityInfo.DbTableName,
|
||
|
ClassName=entityInfo.EntityName,
|
||
|
Description = entityInfo.TableDescription,
|
||
|
};
|
||
|
var columnInfos = db.DbMaintenance.GetColumnInfosByTableName(entityInfo.DbTableName,false);
|
||
|
result.ZeroEntityColumnInfos = columnInfos.Select(it => {
|
||
|
|
||
|
var propertyInfo = entityInfo.Columns.Where(it=>it.IsIgnore==false).FirstOrDefault(x => x.DbColumnName?.ToLower()==it.DbColumnName?.ToLower());
|
||
|
if (propertyInfo == null)
|
||
|
{
|
||
|
return new ZeroEntityColumnInfo() { };
|
||
|
}
|
||
|
var data = new ZeroEntityColumnInfo()
|
||
|
{
|
||
|
Description = propertyInfo.ColumnDescription??"",
|
||
|
DataType = it.DataType,
|
||
|
DbColumnName = propertyInfo.DbColumnName,
|
||
|
DecimalDigits = propertyInfo.DecimalDigits,
|
||
|
IsIdentity = propertyInfo.IsIdentity,
|
||
|
Length = propertyInfo.Length,
|
||
|
IsPrimarykey = propertyInfo.IsPrimarykey,
|
||
|
IsArray = propertyInfo.IsArray,
|
||
|
IsJson = propertyInfo.IsJson,
|
||
|
IsNullable = propertyInfo.IsNullable,
|
||
|
IsUnsigned = it.IsUnsigned??false,
|
||
|
PropertyName = propertyInfo?.PropertyName,
|
||
|
PropertyType = EntityGeneratorManager.GetNativeTypeByType(propertyInfo!.PropertyInfo.PropertyType),
|
||
|
TableId = it.TableId,
|
||
|
IsInitialized=true
|
||
|
};
|
||
|
return data;
|
||
|
}).ToList();
|
||
|
var expColumns=entityInfo.Columns.Where(it =>it.IsIgnore==true&&it.ExtendedAttribute != null).ToList();
|
||
|
foreach(var item in expColumns)
|
||
|
{
|
||
|
var data = new ZeroEntityColumnInfo()
|
||
|
{
|
||
|
Description = item.ColumnDescription ?? "",
|
||
|
DataType = item.DataType??"",
|
||
|
DbColumnName = item.DbColumnName?? item?.PropertyName,
|
||
|
DecimalDigits = item!.DecimalDigits,
|
||
|
IsIdentity = item.IsIdentity,
|
||
|
Length = item.Length,
|
||
|
IsPrimarykey = item.IsPrimarykey,
|
||
|
IsArray = item.IsArray,
|
||
|
IsJson = item.IsJson,
|
||
|
IsNullable = item.IsNullable,
|
||
|
PropertyName = item?.PropertyName,
|
||
|
ExtendedAttribute = item?.ExtendedAttribute+"",
|
||
|
IsInitialized=true,
|
||
|
IsUnsigned=false
|
||
|
};
|
||
|
result.ZeroEntityColumnInfos.Add(data);
|
||
|
}
|
||
|
result.ZeroEntityColumnInfos = result.ZeroEntityColumnInfos.Where(it => it.PropertyName != null).ToList();
|
||
|
// 实现转换逻辑
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
public DbTableInfo ConvertEntityToDbTableInfo(Type type)
|
||
|
{
|
||
|
var db = App.PreStartupDb;
|
||
|
var entityInfo = db!.EntityMaintenance.GetEntityInfo(type);
|
||
|
DbTableInfo result = new DbTableInfo()
|
||
|
{
|
||
|
Name = entityInfo.DbTableName,
|
||
|
Description = entityInfo.TableDescription,
|
||
|
};
|
||
|
var columnInfos = db.DbMaintenance.GetColumnInfosByTableName(entityInfo.DbTableName);
|
||
|
result.ColumnInfos = columnInfos.Select(it => new DbColumnInfo()
|
||
|
{
|
||
|
ColumnDescription = it.ColumnDescription,
|
||
|
CreateTableFieldSort = it.CreateTableFieldSort,
|
||
|
DataType = it.DataType,
|
||
|
DbColumnName = it.DbColumnName,
|
||
|
DecimalDigits = it.DecimalDigits,
|
||
|
DefaultValue = it.ColumnDescription,
|
||
|
InsertServerTime = it.UpdateServerTime,
|
||
|
UpdateServerTime = it.UpdateServerTime,
|
||
|
InsertSql = it.InsertSql,
|
||
|
TableName = it.TableName,
|
||
|
IsIdentity = it.IsIdentity,
|
||
|
Length = it.Length,
|
||
|
IsPrimarykey = it.IsPrimarykey,
|
||
|
IsArray = it.IsArray,
|
||
|
IsJson = it.IsJson,
|
||
|
IsNullable = it.IsJson,
|
||
|
Scale = it.Scale,
|
||
|
Value = it.Value,
|
||
|
IsUnsigned = it.IsUnsigned,
|
||
|
UpdateSql = it.UpdateSql,
|
||
|
OracleDataType = it.DataType,
|
||
|
PropertyName = it.PropertyName,
|
||
|
PropertyType = it.PropertyType,
|
||
|
SqlParameterDbType = it.SqlParameterDbType,
|
||
|
TableId = it.TableId
|
||
|
}).ToList();
|
||
|
// 实现转换逻辑
|
||
|
return result;
|
||
|
}
|
||
|
}
|
||
|
}
|