using System.Text.RegularExpressions;
namespace MiaoYu.Shared.Admin.Models.PagingViews;
///
/// 分页视图模型
///
public class PagingView
{
///
/// 列信息
///
public List Columns { get; set; } = new List();
///
/// 转换后数据
///
public List> DataSource { get; set; } = new List>();
///
/// 总数
///
public long Total { get; set; }
///
/// 总页数
///
public long PageCount { get; set; }
///
/// 一页显示多少条
///
public int Size { get; set; }
///
/// 页码
///
public int Page { get; set; }
///
/// 初始化
///
///
///
public PagingView(int page, int size)
{
Page = page;
Size = size;
}
///
/// 创建 PagingView 对象
///
///
///
///
public static PagingView Create(int page, int size)
{
var pagingView = new PagingView(page, size);
return pagingView;
}
///
/// 仓储主表实体类型
///
private Type? _mainTableEntityType;
///
/// 主表实体类型
///
[JsonIgnore]
public Type? MainTableEntityType => _mainTableEntityType;
///
/// 创建数据源
///
///
///
///
public void BuilderDataSource(List data, Type mainTableEntityType)
{
_mainTableEntityType = mainTableEntityType;
var propertyInfos = typeof(TEntity).GetProperties();
var fieldNames = propertyInfos.Select(item => item.Name).ToList();
var result = new List>();
foreach (var item in data)
{
var type = item!.GetType();
var dictionary = new Dictionary();
foreach (var fieldName in fieldNames)
{
dictionary[fieldName] = type?.GetProperty(fieldName)?.GetValue(item);
}
result.Add(dictionary);
}
DataSource = result;
foreach (var item in fieldNames)
{
if (item.StartsWith("_")) continue;
Columns.Add(new TableColumnView(item.ToFirstCharConvertLower(), item));
}
}
///
/// 创建数据源 根据 datatable
///
///
///
public void BuilderDataSourceByDataTable(DataTable data, Type mainTableEntityType)
{
_mainTableEntityType = mainTableEntityType;
var fieldNames = (from DataColumn dc in data.Columns select dc.ColumnName).ToList();
var result = new List>();
foreach (DataRow dr in data.Rows)
{
var dictionary = new Dictionary();
foreach (DataColumn dc in data.Columns)
{
dictionary.Add(dc.ColumnName, dr[dc.ColumnName]);
}
result.Add(dictionary);
}
DataSource = result;
foreach (var item in fieldNames)
{
if (item.StartsWith("_")) continue;
Columns.Add(new TableColumnView(item.ToFirstCharConvertLower(), item));
}
}
///
/// 获取指定列
///
///
///
///
///
public TableColumnView GetColumn(IQueryable query, Expression> queryField)
{
var nameQuery = Tools.GetNameByExpression(queryField);
var TableColumnView = Columns
.Where(w => w.FieldName.ToLower() == nameQuery.ToLower())
.FirstOrDefault();
return TableColumnView!;
}
///
/// 格式化值
///
///
///
///
///
///
public PagingView FormatValue(IQueryable query, Expression> queryField, Func funcValue)
{
var nameQuery = Tools.GetNameByExpression(queryField);
foreach (var item in DataSource.Where(w => w.ContainsKey(nameQuery)))
{
var value = item[nameQuery];
item[nameQuery] = funcValue?.Invoke(value == null ? default : (TValue)value ?? default);
}
return this;
}
///
/// 设置列显示名称
///
///
public PagingView SetColumnDisplayName()
{
// 设置列显示名称
using var scope = App.CreateScope();
var databaseTableService = scope.ServiceProvider.GetService();
if (databaseTableService == null) return this;
var genDbTableDtos = databaseTableService!.GetAllTablesByCache();
if (genDbTableDtos == null) return this;
if (genDbTableDtos.Count == 0) return this;
var table = genDbTableDtos?
.Where(w => w.EntityName.ToLower() == MainTableEntityType.Name.ToLower())
.FirstOrDefault();
if (table == null)
{
table = genDbTableDtos?
.Where(w => w.TableName.ToLower() == MainTableEntityType.Name.ToLower())
.FirstOrDefault();
}
if (table == null) return this;
//Columns.OrderBy(it=>it.w)
foreach (var column in Columns)
{
var fieldName = column.FieldName.ToLower();
var tableInfo = table?.TableInfos?.FirstOrDefault(w => w.ColumnName.ToLower() == fieldName);
//tableInfo.OrderById
column.OrderById = tableInfo?.OrderById ?? 10;
//column.Width
column.Title = string.IsNullOrWhiteSpace(tableInfo?.DisplayName) ? fieldName : tableInfo.DisplayName;
if (string.IsNullOrEmpty(tableInfo?.Width))
{
var widthx = 100;
if (tableInfo != null && tableInfo.CsType == "String")
{
widthx = ExtractNumberFromBrackets(tableInfo.DatabaseColumnType) ?? 0;
}
else
{
widthx = column.Title.Length * 20;
}
if (widthx < 100)
{
widthx = 100;
}
if (widthx > 300)
{
widthx = 300;
}
column.Width = widthx + "px";
}
else
{
column.Width = tableInfo.Width;
}
column.Show = tableInfo?.IsTableColumnShow ?? true;
}
Columns = Columns.OrderBy(it => it.OrderById).ToList();
return this;
}
///
///
///
///
///
private int? ExtractNumberFromBrackets(string input)
{
string pattern = @"\((\d+)\)";
// 使用正则表达式匹配
Match match = Regex.Match(input, pattern);
if (match.Success)
{
// 提取括号中的内容
string numberStr = match.Groups[1].Value;
// 判断是否为数字
if (int.TryParse(numberStr, out int number))
{
return number;
}
}
// 返回null表示未找到有效的数字
return 0;
}
}