using Microsoft.AspNetCore.Http;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using VolPro.Core.DBManager;
using VolPro.Core.Enums;
using VolPro.Core.Extensions;
using VolPro.Core.Services;
using VolPro.Core.Tenancy;
using VolPro.Core.UserManager;
using VolPro.Core.Utilities;
using VolPro.Entity.DomainModels;
namespace VolPro.Core.Generic
{
///
/// 通用数据库 CRUD 抽象基类,封装三种数据库公共逻辑
///
public abstract class GenericDbProviderBase : GenericBaseService, IGenericDbProvider
{
///
/// 不同数据库的左右引号符号(MySql: ``, PgSql: "", SqlServer: [])
///
protected abstract string LeftQuote { get; }
protected abstract string RightQuote { get; }
protected GenericDbProviderBase() : base()
{
}
public virtual async Task> GetPageDataAsync(PageDataOptions options, bool isDetail = false)
{
//租户过滤
options = options ?? new PageDataOptions();
if (!string.IsNullOrEmpty(options.Wheres) && (options.Filter == null || options.Filter.Count == 0))
{
options.Filter = options.Wheres.DeserializeObject>();
}
//获取逻辑删除过滤
string logicDelField = this.GetLogicDelField(Columns);
if (logicDelField != null)
{
options.Filter.Add(new SearchParameters() { Name = logicDelField, Value = "0" });
}
string dbTableName = string.IsNullOrEmpty(TableInfo.TableTrueName)
? TableInfo.TableName
: TableInfo.TableTrueName;
string selectColumns = string.Join(",", Columns.Select(c => $"{LeftQuote}{c.ColumnName}{RightQuote}"));
string baseSql = string.IsNullOrEmpty(TableInfo.DbSql)
? $"SELECT {selectColumns} FROM {LeftQuote}{dbTableName}{RightQuote}"
: $"SELECT * from ({TableInfo.DbSql}) TDbSQL ";
var whereList = new List();
// SqlSugar 参数集合
var parameters = new List();
//执行自定义sql
baseSql = dbTableName.GetSearchSqlQuery(baseSql, options.Filter, parameters) ?? baseSql;
//过滤租户数据权限
baseSql = dbTableName.CreateTenancySqlFilter(baseSql, options.Filter, parameters);
this.BuildWhere(options.Filter, Columns, whereList, parameters, LeftQuote, RightQuote);
var baseWithWhere = new StringBuilder();
baseWithWhere.Append(baseSql);
if (whereList.Count > 0)
{
baseWithWhere.Append(" WHERE ").Append(string.Join(" AND ", whereList));
}
string sortField = options.Sort;
string sortOrder = string.IsNullOrEmpty(options.Order) ? "DESC" : options.Order.ToUpper();
if (string.IsNullOrEmpty(sortField))
{
sortField = Columns.FirstOrDefault(c => c.IsKey == 1)?.ColumnName
?? Columns.First().ColumnName;
}
string orderBy = $"ORDER BY {LeftQuote}{sortField}{RightQuote} {(sortOrder == "ASC" ? "ASC" : "DESC")}";
string countSql = $"SELECT COUNT(1) FROM ({baseWithWhere}) T";
//导出
if (options.Export)
{
options.Rows = 200000;
}
int page = options.Page <= 0 ? 1 : options.Page;
int rows = options.Rows <= 0 ? 30 : options.Rows;
string pageSql = BuildPageSql(baseWithWhere.ToString(), selectColumns, orderBy, page, rows);
return new PageGridData