using MiaoYu.Repository.Admin.Entities.LowCode;
using CoreIDatabaseTableService = MiaoYu.Core.CodeGenerator.Services.IDatabaseTableService;
using CoreITableMetaConfigService = MiaoYu.Core.CodeGenerator.Services.ITableMetaConfigService;
using CoreGenDbTableDto = MiaoYu.Core.CodeGenerator.Models.GenDbTableDto;
using CoreTableMetaConfig = MiaoYu.Core.CodeGenerator.Models.TableMetaConfig;
using CoreColumnMetaConfig = MiaoYu.Core.CodeGenerator.Models.ColumnMetaConfig;
namespace MiaoYu.Api.Admin.ApplicationServices.DevelopmentTools.LowCode.Impl;
///
/// 服务 Low_Code_Table_InfoService
///
public class LowCodeTableInfoService : ApplicationService>
{
private readonly CoreIDatabaseTableService _databaseTableService;
private readonly IRepository _lowCodeTableRepository;
private readonly CoreITableMetaConfigService _tableMetaConfigService;
public LowCodeTableInfoService(
CoreIDatabaseTableService databaseTableService,
IRepository defaultRepository,
IRepository lowCodeTableRepository,
CoreITableMetaConfigService tableMetaConfigService) : base(defaultRepository)
{
_databaseTableService = databaseTableService;
_lowCodeTableRepository = lowCodeTableRepository;
_tableMetaConfigService = tableMetaConfigService;
}
///
/// 获取列表数据(从 Core 层查询表结构并合并配置)
///
///
///
public async Task FindListAsync(PagingSearchInput pagingSearchInput)
{
// ✅ 从 Core 层获取所有表信息(已包含配置合并)
var allTables = _databaseTableService.GetAllTables();
// 根据 Low_Code_TableId 查找对应的表名和数据库
string? targetTableName = null;
string? targetDatabase = null;
if (pagingSearchInput.Search.Low_Code_TableId != Guid.Empty)
{
var lowCodeTable = await _lowCodeTableRepository.FindAsync(w => w.Id == pagingSearchInput.Search.Low_Code_TableId);
if (lowCodeTable != null)
{
targetTableName = lowCodeTable.TableName;
targetDatabase = lowCodeTable.DataBase;
}
}
// 筛选目标表
var targetTable = allTables.FirstOrDefault(t =>
t.TableName == targetTableName && t.DataBase == targetDatabase);
if (targetTable == null || targetTable.TableInfos == null)
{
return new PagingView(pagingSearchInput.Page, pagingSearchInput.Size);
}
// 应用筛选条件
var columns = targetTable.TableInfos.AsEnumerable();
if (!string.IsNullOrWhiteSpace(pagingSearchInput.Search.ColumnName))
{
columns = columns.Where(w => w.ColumnName != null && w.ColumnName.Contains(pagingSearchInput.Search.ColumnName));
}
if (!string.IsNullOrWhiteSpace(pagingSearchInput.Search.Describe))
{
columns = columns.Where(w => w.Describe != null && w.Describe.Contains(pagingSearchInput.Search.Describe));
}
// 排序和分页
var orderedColumns = columns
.OrderBy(w => w.Position)
.Skip((pagingSearchInput.Page - 1) * pagingSearchInput.Size)
.Take(pagingSearchInput.Size)
.Select(w => new Dictionary
{
["id"] = Guid.NewGuid(), // 临时 ID,因为是从内存查询
["isPrimary"] = w.IsPrimary,
["isIdentity"] = w.IsIdentity,
["isNullable"] = w.IsNullable,
["position"] = w.Position,
["columnName"] = w.ColumnName,
["describe"] = w.Describe,
["databaseColumnType"] = w.DatabaseColumnType,
["csType"] = w.CsType,
["csField"] = w.CsField,
["displayName"] = w.DisplayName,
["low_Code_TableId"] = pagingSearchInput.Search.Low_Code_TableId,
["lastModificationTime"] = DateTime.Now.ToString("yyyy-MM-dd"),
["creationTime"] = DateTime.Now.ToString("yyyy-MM-dd"),
["isTableColumnShow"] = w.IsTableColumnShow ?? true,
["isTableSelect"] = w.IsTableSelect,
["isImageId"] = w.IsImageId,
["orderById"] = w.OrderById ?? 10,
["maxLength"] = w.MaxLength
})
.ToList();
return new PagingView(pagingSearchInput.Page, pagingSearchInput.Size)
{
Total = columns.Count(),
DataSource = orderedColumns,
PageCount = (columns.Count() + pagingSearchInput.Size - 1) / pagingSearchInput.Size
};
}
///
/// 根据id数组删除
///
///
///
public Task DeleteListAsync(List ids)
{
_databaseTableService.ClearAllTablesByCache();
return _defaultRepository.DeleteByIdsAsync(ids);
}
///
/// 根据表名同步列数据
///
///
/// 是否来自表格同步
///
public async Task SynchronizationColumnByTableIdAsync(Guid tableId, bool isTableSync = false)
{
var allTables = _databaseTableService.GetAllTableInfos();
var table = await _lowCodeTableRepository.FindAsync(w => w.Id == tableId);
// 修复:同时匹配表名和数据库标识
var tableInfo = allTables.Find(w =>
w.Name == table.TableName && w.DataBase == table.DataBase);
//查询出当前表所有的字段
var tableColumns = await _defaultRepository.ToListAsync(w => w.Low_Code_TableId == table.Id);
//操作集合
var list = new List();
if (isTableSync)
{
if (tableColumns != null && tableColumns.Count == 0)
{
foreach (var item in tableInfo.Columns)
{
// if (tableColumns.Any(w => w.ColumnName == item.Name)) continue;
var model = new LowCodeTableInfo();
model.IsPrimary = item.IsPrimary;
model.IsIdentity = item.IsIdentity;
model.IsNullable = item.IsNullable;
model.Position = item.Position;
model.Low_Code_TableId = table.Id;
model.ColumnName = item.Name;
model.DatabaseColumnType = item.DbType;
model.CsType = item.CsType;
model.CsField = item.Name;
model.MaxLength = item.MaxLength;
//model.IsImageId = item.IsImageId;
//model.IsImageId = item.IsImageId;
//model.IsImageId = item.IsImageId;
if (!string.IsNullOrWhiteSpace(item.Comment))
{
model.Describe = item.Comment;
model.DisplayName = item.Comment;
}
list.Add(model);
}
}
}
else
{
foreach (var item in tableInfo.Columns)
{
// if (tableColumns.Any(w => w.ColumnName == item.Name)) continue;
var model = new LowCodeTableInfo();
model.IsPrimary = item.IsPrimary;
model.IsIdentity = item.IsIdentity;
model.IsNullable = item.IsNullable;
model.Position = item.Position;
model.Low_Code_TableId = table.Id;
model.ColumnName = item.Name;
model.DatabaseColumnType = item.DbType;
model.CsType = item.CsType;
model.CsField = item.Name;
model.MaxLength = item.MaxLength;
if (!string.IsNullOrWhiteSpace(item.Comment))
{
model.Describe = item.Comment;
model.DisplayName = item.Comment;
}
var oldColumns = tableColumns.FirstOrDefault(w => w.ColumnName == item.Name);
if (oldColumns!=null)
{
model.OrderById = oldColumns.OrderById;
model.Describe = oldColumns.Describe;
model.IsImageId = oldColumns.IsImageId;
model.IsTableColumnShow = oldColumns.IsTableColumnShow;
model.IsTableSelect = oldColumns.IsTableSelect;
model.Width = oldColumns.Width;
};
list.Add(model);
}
}
await _defaultRepository.DeleteAsync(w => w.Low_Code_TableId == table.Id);
await _defaultRepository.InsertRangeAsync(list);
_databaseTableService.ClearAllTablesByCache();
}
///
/// 变更数据(保存到配置文件)
///
///
///
public async Task ChangeAsync(List lowCodeTableInfos)
{
// 清除缓存
_databaseTableService.ClearAllTablesByCache();
// 按表分组保存
var groupedByTable = lowCodeTableInfos.GroupBy(c => c.Low_Code_TableId);
foreach (var group in groupedByTable)
{
var tableId = group.Key;
var lowCodeTable = await _lowCodeTableRepository.FindAsync(w => w.Id == tableId);
if (lowCodeTable == null || string.IsNullOrEmpty(lowCodeTable.DataBase) || string.IsNullOrEmpty(lowCodeTable.TableName))
continue;
// 获取完整的表信息(包含所有列)
var allTables = _databaseTableService.GetAllTables();
var targetTable = allTables.FirstOrDefault(t =>
t.TableName == lowCodeTable.TableName &&
t.DataBase == lowCodeTable.DataBase);
if (targetTable == null)
continue;
// 更新用户修改的列配置
foreach (var changedColumn in group)
{
var existingColumn = targetTable.TableInfos?.FirstOrDefault(c => c.ColumnName == changedColumn.ColumnName);
if (existingColumn != null)
{
existingColumn.DisplayName = changedColumn.DisplayName;
existingColumn.Describe = changedColumn.Describe;
existingColumn.CsField = changedColumn.CsField;
existingColumn.IsTableSelect = changedColumn.IsTableSelect;
existingColumn.IsImageId = changedColumn.IsImageId;
existingColumn.IsTableColumnShow = changedColumn.IsTableColumnShow;
existingColumn.OrderById = changedColumn.OrderById;
existingColumn.Width = changedColumn.Width;
}
}
// 保存到配置文件
await SaveTableMetaConfigAsync(targetTable);
}
// 注意:不再更新数据库表,改为更新配置文件
// await _defaultRepository.UpdateRangeAsync(lowCodeTableInfos);
}
///
/// 保存表元信息到配置文件
///
private async Task SaveTableMetaConfigAsync(CoreGenDbTableDto tableDto)
{
if (string.IsNullOrEmpty(tableDto.DataBase) || string.IsNullOrEmpty(tableDto.TableName))
return;
var config = new CoreTableMetaConfig
{
DisplayName = tableDto.DisplayName,
EntityName = tableDto.EntityName,
Remark = tableDto.Remark,
ModelPath = tableDto.ModelPath,
ServicePath = tableDto.ServicePath,
ControllerPath = tableDto.ControllerPath,
ClientIndexPath = tableDto.ClientIndexPath,
ClientInfoPath = tableDto.ClientInfoPath,
ClientServicePath = tableDto.ClientServicePath,
IsCover = tableDto.IsCover ?? false,
Columns = new Dictionary()
};
// 保存列配置
if (tableDto.TableInfos != null)
{
foreach (var column in tableDto.TableInfos)
{
if (!string.IsNullOrEmpty(column.ColumnName))
{
config.Columns[column.ColumnName] = new CoreColumnMetaConfig
{
DisplayName = column.DisplayName,
Describe = column.Describe,
CsField = column.CsField,
IsTableSelect = column.IsTableSelect,
IsImageId = column.IsImageId,
IsTableColumnShow = column.IsTableColumnShow
};
}
}
}
await _tableMetaConfigService.SaveConfigAsync(tableDto.DataBase!, tableDto.TableName!, config);
}
}