Commit ca1ba2c9 by wyc

简单查询(微调)

parent 66d9c138
......@@ -9,6 +9,7 @@
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Infrastructure;
using Performance.Infrastructure.Models;
using Performance.Services;
using System;
using System.Collections.Generic;
......@@ -112,12 +113,7 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds)
{
long allotIdValue = long.TryParse(allotId, out var result) ? result : 0;
var args = Args(allotIdValue, paged?.Page ?? 1, paged?.Size ?? 20);
var res = await _services.GetDatumAsync(procId, filters, paged?.Page ?? 1, paged?.Size ?? 20, args);
foreach (var item in res.Columns)
{
item.Field = item.Field.ToLower();
}
return new ApiResponse<object>(ResponseType.OK, res);
}
......@@ -140,6 +136,7 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds)
var userInfo = JsonConvert.SerializeObject(args, Tools.GetJsonSerializerSettings()) ?? "{}";
args.AddOrUpdate("userinfo", userInfo, userInfo);
args.AddOrUpdate("page", page, page);
args.AddOrUpdate("skipSize", (page - 1) * size, (page - 1) * size);
args.AddOrUpdate("size", size, size);
return args;
......@@ -159,11 +156,15 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds)
var lowProc = await _services.GetAsync(procId)
?? throw new PerformanceException("查询配置信息不存在");
var args = Args(allotIdValue, 1, int.MaxValue);
var res = await _services.GetDatumAsync(procId, filters, 1, int.MaxValue, args);
var apiResponse = await _services.GetDatumAsync(procId, filters, 1, int.MaxValue, args);
var res = apiResponse.Data as PagedList<dynamic, ColumnResponse, object>;
var filePath = Path.Combine(Tools.Path.Download, $"{lowProc.Title}.{Guid.NewGuid():N}.xlsx");
var rows = Tools.MapDictionary(res.Data);
var columns = res.Columns?.Select(w => new ExcelColumn(w.Title, w.Field)).ToList() ?? new List<ExcelColumn>();
var columns = res.Columns?.Where(w => w.Visible == true).Select(w => new ExcelColumn(w.Title, w.Field)).ToList() ?? new List<ExcelColumn>();
if (!columns.Any() || columns.Count == 0)
throw new PerformanceException("下载取消,当前列头为空");
Tools.Export(filePath, new ExcelExportOption() { Name = lowProc.Title, Rows = rows, Columns = columns, Aggregate = true });
var memoryStream = new MemoryStream();
using (var stream = new FileStream(filePath, FileMode.Open))
......
......@@ -4339,6 +4339,12 @@
<member name="T:Performance.DtoModels.ColumnResponse">
<inheritdoc/>
</member>
<member name="M:Performance.DtoModels.ColumnResponse.#ctor">
ctor
</member>
<member name="M:Performance.DtoModels.ColumnResponse.#ctor(System.String,System.String)">
ctor
</member>
<member name="P:Performance.DtoModels.ColumnResponse.ColId">
<inheritdoc/>
</member>
......@@ -4372,6 +4378,11 @@
宽度
</summary>
</member>
<member name="P:Performance.DtoModels.ColumnResponse.MinWidth">
<summary>
最小宽度
</summary>
</member>
<member name="P:Performance.DtoModels.ColumnResponse.Resizable">
<summary>
拖动列宽(1 允许 0 禁止)
......@@ -4402,6 +4413,16 @@
格式化
</summary>
</member>
<member name="P:Performance.DtoModels.ColumnResponse.Link">
<summary>
链接
</summary>
</member>
<member name="P:Performance.DtoModels.ColumnResponse.LinkParams">
<summary>
链接参数
</summary>
</member>
<member name="P:Performance.DtoModels.ColumnResponse.Sort">
<summary>
列排序
......
using System;
using Performance.Infrastructure.Models;
using System;
namespace Performance.DtoModels
{
......
using System;
using System.Collections.Generic;
using System.Collections.Generic;
namespace Performance.DtoModels
{
/// <inheritdoc/>
public class ColumnResponse : IChildren<ColumnResponse>
{
/// ctor
public ColumnResponse()
{
}
/// ctor
public ColumnResponse(string field, string title)
{
Field = field;
Title = title;
}
/// <inheritdoc/>
public long ColId { get; set; }
/// <summary>
......@@ -33,6 +43,10 @@ public class ColumnResponse : IChildren<ColumnResponse>
/// </summary>
public double? Width { get; set; }
/// <summary>
/// 最小宽度
/// </summary>
public double? MinWidth { get; set; }
/// <summary>
/// 拖动列宽(1 允许 0 禁止)
/// </summary>
public bool? Resizable { get; set; }
......@@ -57,6 +71,14 @@ public class ColumnResponse : IChildren<ColumnResponse>
/// </summary>
public string? Formatter { get; set; }
/// <summary>
/// 链接
/// </summary>
public string? Link { get; set; }
/// <summary>
/// 链接参数
/// </summary>
public bool? LinkParams { get; set; }
/// <summary>
/// 列排序
/// </summary>
public int? Sort { get; set; }
......@@ -91,6 +113,7 @@ public class ColumnResponse : IChildren<ColumnResponse>
/// <summary>
/// 子集
/// </summary>
public IEnumerable<ColumnResponse> Children { get; set; } = new HashSet<ColumnResponse>();
public IEnumerable<ColumnResponse> Children { get; set; } = new HashSet<ColumnResponse>();
}
}
\ No newline at end of file
......@@ -26,7 +26,7 @@ public static partial class Tools
/// <exception cref="ArgumentNullException"></exception>
public static DataTable Read(this ExcelPackage package, string name, int startRow = 1, int startCol = 1)
{
if (package is null)
throw new ArgumentNullException(nameof(package));
......@@ -229,7 +229,7 @@ public static void CreateWorksheet(ExcelWorksheet worksheet, ExcelExportOption e
}
}
if (exportOptions.Aggregate)
if (exportOptions.Aggregate && exportOptions.Rows.Any())
{
var sRow = headRow + 1;
var eRow = exportOptions.Rows.Count + headRow;
......
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
......@@ -42,7 +43,7 @@ public static void GetJsonSerializerSettings(JsonSerializerSettings options)
/// <returns>哈希表数组</returns>
public static List<Dictionary<string, object>> MapDictionary(this List<dynamic> dynamics)
{
return dynamics.Select(expandoDict => new Dictionary<string, object>(expandoDict)).ToList();
return dynamics.Select(expandoDict => new Dictionary<string, object>(expandoDict, StringComparer.OrdinalIgnoreCase)).ToList();
}
}
}
using AngleSharp.Dom;
using AutoMapper;
using Dapper;
using Masuit.Tools;
......@@ -5,6 +6,7 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using Performance.DtoModels;
using Performance.DtoModels.AppSettings;
using Performance.EntityModels;
......@@ -20,6 +22,7 @@
using System.Threading.Tasks;
using Yitter.IdGenerator;
using static Performance.DtoModels.ManagementDept;
using static Performance.Services.AssessNewService;
namespace Performance.Services
{
......@@ -132,7 +135,7 @@ public void DeleteAsync(params long[] procIds)
/// <param name="queries"></param>
/// <param name="page"></param>
/// <param name="size"></param>
public async Task<PagedList<dynamic, ColumnResponse, object>> GetDatumAsync(long procId, List<DynamicQuery> queries, int page, int size, Dictionary<string, object> args)
public async Task<ApiResponse> GetDatumAsync(long procId, List<DynamicQuery> queries, int page, int size, Dictionary<string, object> args)
{
var proc = await _lowProcRepository.GetEntityAsync(x => x.ProcId == procId)
?? throw new PerformanceException("当前查询数据信息错误,请检查配置信息");
......@@ -156,20 +159,50 @@ public void DeleteAsync(params long[] procIds)
throw new PerformanceException("当前查询尚未配置脚本,请配置后重试");
(IQueryable<dynamic> data, List<ColumnResponse> columns) = await GetExtensionDatumAsync(proc.Script, args);
var totalCount = 0;
var total = new Dictionary<string, object?>();
if (data.Any())
{
var dict = (IDictionary<string, object>)data.First();
var keys = dict.Select(w => w.Key).ToList();
//if (!keys.Any(key => string.Equals(key, "TreeId", StringComparison.OrdinalIgnoreCase)))
//{
//}
foreach (var key in keys)
// 获取总页数
var totalCountKey = keys.FirstOrDefault(key => key.Equals("TotalCount", StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrEmpty(totalCountKey) && dict[totalCountKey] != null)
_ = int.TryParse(dict[totalCountKey].ToString(), out totalCount);
var error = new Tables("列名", "原因");
foreach (var item in columns.Where(col => col.Visible == true).Select(s => s.Field))
{
var col = columns.FirstOrDefault(w => w.Field.Equals(key, StringComparison.OrdinalIgnoreCase));
if (col != null)
col.Field = key;
var orig = keys.FirstOrDefault(col => col == item);
if (string.IsNullOrEmpty(orig))
error.Add(item, "列信息未在数据发现,检查列名大小写");
}
if (error.Any())
return new ApiResponse(ResponseType.WarningTable, "操作被拒绝,详细请看更多信息", error);
foreach (var item in columns)
{
var field = keys.FirstOrDefault(col => col.Equals(item.Field, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrEmpty(field) && item.Filter == true)
{
try
{
var els = data.Select(field).ToDynamicList().Cast<object?>().Select(v => v?.ToString())
.Where(v => !string.IsNullOrEmpty(v))
.Distinct().Take(50)
.ToList();
item.AttachParams = JsonConvert.SerializeObject(els);
}
catch (Exception ex)
{
_logger.LogError(ex, "处理列时失败: {Field}", field);
}
}
}
foreach (var item in queries.Where(w => !string.IsNullOrEmpty(w.Value)))
{
var field = keys.FirstOrDefault(col => col.Equals(item.Field, StringComparison.OrdinalIgnoreCase));
......@@ -179,24 +212,38 @@ public void DeleteAsync(params long[] procIds)
data = data.Where(exp, item.Value);
}
}
foreach (var item in columns)
{
object? sumValue = null;
if (item.Formatter == Formatter.numeric.ToString())
var field = keys.FirstOrDefault(col => col.Equals(item.Field, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrEmpty(field) && item.Formatter == Formatter.numeric.ToString())
{
var field = keys.FirstOrDefault(col => col.Equals(item.Field, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrEmpty(field))
sumValue = data.Select(field).ToDynamicList().Cast<decimal?>().Sum();
try
{
var sumValue = data.Select(field).ToDynamicList().Cast<decimal?>().Sum();
total.AddOrUpdate(item.Field, sumValue, sumValue);
}
catch (Exception ex)
{
_logger.LogError(ex, "计算字段 {Field} 的总和时失败", field);
}
}
total.AddOrUpdate(item.Field, sumValue, sumValue);
}
}
page = data.Count() <= size ? 1 : page;
foreach (var item in columns)
{
item.Field = item.Field.ToLower();
}
columns = columns.OrderBy(w => w.Sort).ToList();
if ((data?.Any()) != true)
{
var res = new PagedList<dynamic, ColumnResponse, object>(new List<dynamic>(), page, size, totalCount, columns, new List<object> { total });
return new ApiResponse(ResponseType.OK, res);
}
totalCount = totalCount == 0 ? data.Count() : totalCount;
page = totalCount <= size ? 1 : page;
var paged = data.ToPagedList(page, size);
return new PagedList<dynamic, ColumnResponse, object>(paged, columns, new List<object> { total });
var vms = new PagedList<dynamic, ColumnResponse, object>(paged, columns, new List<object> { total });
return new ApiResponse(ResponseType.OK, vms);
}
/// <summary>
......@@ -210,7 +257,7 @@ public async Task<(IQueryable<dynamic> data, List<ColumnResponse> columns)> GetE
using (var conn = new MySqlConnection(_options.Value.PerformanceConnectionString))
{
if (conn.State != ConnectionState.Open) conn.Open();
_logger.LogInformation($"存储过程:【{script}】;参数:{string.Join(", ", args.Select(kv => $"{kv.Key}={kv.Value}"))}");
_logger.LogInformation("存储过程:【{Script}】;参数:{Args}", script, string.Join(", ", args.Select(kv => $"{kv.Key}={kv.Value}")));
var multi = await conn.QueryMultipleAsync(script, args, commandTimeout: _commandTimeout);
var data = (await multi.ReadAsync()).AsQueryable();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment