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.
 
 
 
 

208 lines
9.7 KiB

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;
}
}
}