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.
 
 
 
 

160 lines
6.6 KiB

using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
namespace ReZero.SuperAPI
{
public partial class MethodApi
{
public object ImportEntities(long databasdeId, List<string> tableNames)
{
var db = App.GetDbById(databasdeId)!;
List<ZeroEntityInfo> entityInfos = new List<ZeroEntityInfo>();
var tableInfos = db.DbMaintenance.GetTableInfoList(false);
foreach (var tableName in tableNames)
{
ZeroEntityInfo entityInfo = CreateEntityInfo(db, tableName,tableInfos);
entityInfo.DataBaseId = databasdeId;
entityInfo.ColumnCount = entityInfo.ZeroEntityColumnInfos?.Count??0;
entityInfos.Add(entityInfo);
}
var dbTableNames = entityInfos.Select(it => it.DbTableName).ToList();
var deleteTables=App.Db.Queryable<ZeroEntityInfo>()
.ClearFilter()
.Where(it => it.DataBaseId == databasdeId)
.Where(it=>it.IsDeleted==true)
.Where(it => dbTableNames.Contains(it.DbTableName))
.ToList();
var deleteTableNames = deleteTables.Select(it => it.DbTableName).ToList();
var inserObj = entityInfos.Where(it => !deleteTableNames.Contains(it.DbTableName)).ToList();
var updateObj = entityInfos.Where(it => deleteTableNames.Contains(it.DbTableName)).ToList();
App.Db.InsertNav(inserObj).Include(it => it.ZeroEntityColumnInfos).ExecuteCommand();
foreach (var item in updateObj)
{
item.Id = deleteTables.OrderByDescending(it => it.Id).FirstOrDefault(it => it.DbTableName == item.DbTableName)?.Id??0;
}
App.Db.UpdateNav(updateObj).Include(it => it.ZeroEntityColumnInfos).ExecuteCommand();
CacheManager<ZeroEntityInfo>.Instance.ClearCache();
return true;
}
private ZeroEntityInfo CreateEntityInfo(SqlSugarClient db, string tableName, List<SqlSugar.DbTableInfo> tableInfos)
{
ZeroEntityInfo entityInfo = new ZeroEntityInfo();
var setting = App.Db.Queryable<ZeroSysSetting>().First(it => it.TypeId == PubConst.Setting_EntityType && it.ChildTypeId == PubConst.Setting_ImportUnunderlineType);
entityInfo.ClassName = CapitalizeFirstLetter(tableName,setting.BoolValue);
entityInfo.DbTableName = tableName;
entityInfo.Description = tableInfos.FirstOrDefault(it => it.Name == tableName)?.Description;
entityInfo.CreateTime = DateTime.Now;
var columns = db.DbMaintenance.GetColumnInfosByTableName(tableName, false);
var dataTable = db.Queryable<object>().AS(tableName).Where(GetWhereFalse()).ToDataTable();
var dtColumns = dataTable.Columns.Cast<DataColumn>().ToList();
var joinedColumns = columns.
Join(dtColumns, c =>
c.DbColumnName.ToLower(),
dtc => (dtc.ColumnName?.ToLower()), (c, dtc) =>
new ZeroEntityColumnInfo
{
DbColumnName = c.DbColumnName,
DataType = GetDataType(db.CurrentConnectionConfig.DbType,c),
PropertyName = CapitalizeFirstLetter(c.DbColumnName, setting.BoolValue),
PropertyType = EntityGeneratorManager.GetNativeTypeByType(GetType(c, dtc)),
IsNullable = c.IsNullable,
IsPrimarykey = c.IsPrimarykey,
IsIdentity = c.IsIdentity,
Description = c.ColumnDescription,
Length=c.Length,
Scale=c.Scale,
DecimalDigits=c.DecimalDigits,
CreateTime = DateTime.Now
}).ToList();
entityInfo.ZeroEntityColumnInfos = joinedColumns;
return entityInfo;
}
private string GetDataType(SqlSugar.DbType dbType, SqlSugar.DbColumnInfo c)
{
if (dbType==SqlSugar.DbType.Oracle&&!string.IsNullOrEmpty(c.OracleDataType))
{
return c.OracleDataType;
}
else if (dbType == SqlSugar.DbType.Dm && !string.IsNullOrEmpty(c.OracleDataType))
{
return c.OracleDataType;
}
return c.DataType;
}
private static Type GetType(SqlSugar.DbColumnInfo c, DataColumn dtc)
{
if (dtc.DataType == typeof(string))
{
return dtc.DataType;
}
if (dtc.DataType == typeof(byte[]))
{
return dtc.DataType;
}
return c.IsNullable ? typeof(Nullable<>).MakeGenericType(dtc.DataType) : dtc.DataType;
}
#region Helper
private static string GetWhereFalse()
{
return "0=" + PubConst.Common_Random.Next(1, 9999999);
}
public string CapitalizeFirstLetter(string input, bool boolValue)
{
if (string.IsNullOrEmpty(input))
{
return input;
}
if (boolValue)
{
return GetCsharpName(input);
}
else
{
return char.ToUpper(input[0]) + input.Substring(1);
}
}
public static string GetCsharpName(string dbColumnName)
{
if (dbColumnName.Contains("_"))
{
dbColumnName = dbColumnName.TrimEnd('_');
dbColumnName = dbColumnName.TrimStart('_');
var array = dbColumnName.Split('_').Select(it => GetFirstUpper(it, true)).ToArray();
return string.Join("", array);
}
else
{
return GetFirstUpper(dbColumnName);
}
}
private static string GetFirstUpper(string dbColumnName, bool islower = false)
{
if (dbColumnName == null)
return null;
if (islower)
{
return dbColumnName.Substring(0, 1).ToUpper() + dbColumnName.Substring(1).ToLower();
}
else
{
if (dbColumnName.ToUpper() == dbColumnName)
{
return dbColumnName.Substring(0, 1).ToUpper() + dbColumnName.Substring(1).ToLower();
}
else
{
return dbColumnName.Substring(0, 1).ToUpper() + dbColumnName.Substring(1);
}
}
}
#endregion
}
}