using Infrastructure; using Infrastructure.Extensions; using Infrastructure.Utilities; using Microsoft.Extensions.Configuration; using NUnit.Framework; using OpenAuth.App.Base; using OpenAuth.App.FormScheme.FormHelpers; using OpenAuth.Repository; using OpenAuth.Repository.Domain; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenAuth.App.BaseApp.Base; using static Microsoft.Extensions.Logging.EventSource.LoggingEventSource; namespace OpenAuth.App.CodeTable { public class CodeTableApp : SqlSugarBaseApp { CodeColumnsApp _codeColumnsApp; private IConfiguration _configuration; public CodeTableApp(ISugarUnitOfWork unitWork, ISimpleClient repository, CodeColumnsApp codeColumnsApp, IConfiguration configuration) : base(unitWork, repository, null) { _codeColumnsApp = codeColumnsApp; _configuration = configuration; } /// /// 获取CodeTable的分页数据 /// /// 查询关键字 /// 数据库编码 /// /// /// public async Task>>> LoadCodeTablePage(string keyWord, string dbCode, int page, int limit) { RefAsync totalCount = 0; var info = await base.Repository.AsQueryable() .WhereIF(!string.IsNullOrEmpty(keyWord), t => t.ClassName.Contains(keyWord) || t.TableName.Contains(keyWord) || t.Description.Contains(keyWord)) .WhereIF(!string.IsNullOrEmpty(dbCode), t => t.DbId == dbCode) .ToPageListAsync(page, limit, totalCount); return new Response>> { Result = new PageInfo> { Items = info, Total = totalCount } }; } /// /// 获取实体集合 /// /// 数据库编码 /// 数据库表名 /// public async Task> GetEntitys(string dbCode, List tableNames) { var list = await base.Repository.AsQueryable() .Where(t => t.DbId == dbCode && tableNames.Contains(t.TableName)) .ToListAsync(); return list; } /// /// 获取列表数据 /// /// 数据库编码 /// public Task> GetList(string dbCode) { return base.Repository.AsQueryable().Where(t => t.DbId == dbCode).ToListAsync(); } /// /// 跨服务器获取表单字段 /// /// /// /// public List GetTableColumnList(string code, string tableName) { using (var db = this.CodeClient(code, _configuration)) { //var list= this.Repository.AsSugarClient().DbMaintenance.GetTableInfoList(isCache); var list = db.DbMaintenance.GetColumnInfosByTableName(tableName,false); return list; } } /// /// 导入表信息 /// /// 数据库编码 /// 数据表信息 /// public async Task ImportTable(string dbcode, List tableList) { using (SugarDbContext db = base.UnitWork.CreateContext()) { var oldTables = await GetList(dbcode); List updateList = new List(); List addList = new List(); List deleteList = new List(); foreach (var tableItem in tableList) { //排除中间表 if (tableItem.Name.ToLower() == "db_codecolumns" || tableItem.Name.ToLower() == "db_codetable" || tableItem.Name.ToLower() == "db_history") { continue; } DbCodeTable entity = oldTables.FirstOrDefault(t => t.TableName == tableItem.Name); //var dbColumns = db.Db.DbMaintenance.GetColumnInfosByTableName(tableItem.Name, false); var dbColumns = GetTableColumnList(dbcode, tableItem.Name); foreach (var item in dbColumns) { item.PropertyName = FormHelper.GetCsType(SqlSugar.DbType.Kdbndp, item.DataType); } int columnSort = 1; if (entity == null) { // 新增 entity = new DbCodeTable(); entity.DbId = dbcode; entity.ClassName = StringExtension.CsharpName(tableItem.Name); entity.TableName = tableItem.Name; entity.Description = tableItem.Description; entity.IsLock = 0; entity.DeleteMark = 0; entity.State = 1; await SaveEntity(null, entity); // 新增列 foreach (var dbColumnItem in dbColumns) { var codeColumnsEntity = CreateColumn(dbColumnItem); codeColumnsEntity.CodeTableId = entity.Id; codeColumnsEntity.Id = Guid.NewGuid().ToString(); codeColumnsEntity.Sort = columnSort; columnSort++; addList.Add(codeColumnsEntity); } } else { // 编辑 if (entity.Description != tableItem.Description || entity.State != 1 || entity.IsLock != 0 || entity.DeleteMark != 0 ) { entity.State = 1; entity.Description = tableItem.Description; entity.IsLock = 0; entity.DeleteMark = 0; await SaveEntity(entity.Id, entity); } var oldColumns = await _codeColumnsApp.GetList(new DbCodeColumns { CodeTableId = entity.Id }); foreach (var dbColumnItem in dbColumns) { var codeColumnsEntity = CreateColumn(dbColumnItem); codeColumnsEntity.CodeTableId = entity.Id; codeColumnsEntity.Sort = columnSort; columnSort++; var oldColumn = oldColumns.Find(t => t.DbColumnName == dbColumnItem.DbColumnName); if (oldColumn == null) { codeColumnsEntity.Id = Guid.NewGuid().ToString(); addList.Add(codeColumnsEntity); } else { codeColumnsEntity.Id = oldColumn.Id; updateList.Add(codeColumnsEntity); } } // 获取需要删除的列 var deleteColumns = oldColumns.FindAll(t => updateList.FindIndex(t2 => t2.Id == t.Id) == -1); deleteList.AddRange(deleteColumns); } } //await _codeColumnsApp.Add(addList); //await _codeColumnsApp.Update(updateList); //await _codeColumnsApp.Deletes(deleteList); await db.DbCodeColumns.InsertRangeAsync(addList); await db.DbCodeColumns.UpdateRangeAsync(updateList); await db.DbCodeColumns.DeleteAsync(deleteList); db.Commit(); } } #region 操作方法 /// /// 保存(新增,更新) /// /// 唯一标识码(GUID) /// 数据库表信息db_codetable实体数据 public async Task SaveEntity(string Id, DbCodeTable dbCodeTable) { if (!string.IsNullOrEmpty(Id)) // 更新 { dbCodeTable.Id = Id; await base.Repository.UpdateAsync(dbCodeTable); } else // 新增 { if (string.IsNullOrEmpty(dbCodeTable.Id)) { dbCodeTable.Id = Guid.NewGuid().ToString(); } await base.Repository.InsertAsync(dbCodeTable); } } /// /// 获取类字段信息 /// /// 数据库字段信息 /// private DbCodeColumns CreateColumn(DbColumnInfo dbColumnInfo) { var codeColumns = new DbCodeColumns(); codeColumns.DbColumnName = dbColumnInfo.DbColumnName; codeColumns.IsNullable = dbColumnInfo.IsNullable == true ? 1 : 0; codeColumns.IsIdentity = dbColumnInfo.IsIdentity == true ? 1 : 0; codeColumns.IsPrimaryKey = dbColumnInfo.IsPrimarykey == true ? 1 : 0; codeColumns.Description = dbColumnInfo.ColumnDescription; codeColumns.CsType = dbColumnInfo.PropertyName; codeColumns.DbType = dbColumnInfo.DataType; codeColumns.Length = dbColumnInfo.Length; codeColumns.DecimalDigits = dbColumnInfo.DecimalDigits; return codeColumns; } #endregion #region 获取表及视图字段 /// /// 获取表及视图字段 /// /// /// public List GetTableAndViewColumnList(string dbCode, string tableName) { using (var db = this.CodeClient(dbCode, _configuration)) { string query = $@" SELECT c.column_name, d.description FROM information_schema.columns c LEFT JOIN pg_catalog.pg_class t ON t.relname = c.table_name LEFT JOIN pg_catalog.pg_attribute a ON a.attnum > 0 AND a.attrelid = t.oid AND a.attname = c.column_name LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace LEFT JOIN pg_catalog.pg_description d ON d.objoid = a.attrelid AND d.objsubid = a.attnum WHERE c.table_name = @tableName AND c.table_schema = 'public';"; // 执行查询并获取结果 var viewColumns = db.Ado.SqlQuery(query, new { tableName = tableName }); return viewColumns; } } #endregion } }