Commit ca1ba2c9 by wyc

简单查询(微调)

parent 66d9c138
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
using Performance.DtoModels; using Performance.DtoModels;
using Performance.EntityModels; using Performance.EntityModels;
using Performance.Infrastructure; using Performance.Infrastructure;
using Performance.Infrastructure.Models;
using Performance.Services; using Performance.Services;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
...@@ -112,12 +113,7 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds) ...@@ -112,12 +113,7 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds)
{ {
long allotIdValue = long.TryParse(allotId, out var result) ? result : 0; long allotIdValue = long.TryParse(allotId, out var result) ? result : 0;
var args = Args(allotIdValue, paged?.Page ?? 1, paged?.Size ?? 20); var args = Args(allotIdValue, paged?.Page ?? 1, paged?.Size ?? 20);
var res = await _services.GetDatumAsync(procId, filters, paged?.Page ?? 1, paged?.Size ?? 20, args); 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); return new ApiResponse<object>(ResponseType.OK, res);
} }
...@@ -140,6 +136,7 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds) ...@@ -140,6 +136,7 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds)
var userInfo = JsonConvert.SerializeObject(args, Tools.GetJsonSerializerSettings()) ?? "{}"; var userInfo = JsonConvert.SerializeObject(args, Tools.GetJsonSerializerSettings()) ?? "{}";
args.AddOrUpdate("userinfo", userInfo, userInfo); args.AddOrUpdate("userinfo", userInfo, userInfo);
args.AddOrUpdate("page", page, page); args.AddOrUpdate("page", page, page);
args.AddOrUpdate("skipSize", (page - 1) * size, (page - 1) * size);
args.AddOrUpdate("size", size, size); args.AddOrUpdate("size", size, size);
return args; return args;
...@@ -159,11 +156,15 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds) ...@@ -159,11 +156,15 @@ public ApiResponse DeleteAsync([FromBody] long[] procIds)
var lowProc = await _services.GetAsync(procId) var lowProc = await _services.GetAsync(procId)
?? throw new PerformanceException("查询配置信息不存在"); ?? throw new PerformanceException("查询配置信息不存在");
var args = Args(allotIdValue, 1, int.MaxValue); 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 filePath = Path.Combine(Tools.Path.Download, $"{lowProc.Title}.{Guid.NewGuid():N}.xlsx");
var rows = Tools.MapDictionary(res.Data); 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 }); Tools.Export(filePath, new ExcelExportOption() { Name = lowProc.Title, Rows = rows, Columns = columns, Aggregate = true });
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();
using (var stream = new FileStream(filePath, FileMode.Open)) using (var stream = new FileStream(filePath, FileMode.Open))
......
...@@ -4339,6 +4339,12 @@ ...@@ -4339,6 +4339,12 @@
<member name="T:Performance.DtoModels.ColumnResponse"> <member name="T:Performance.DtoModels.ColumnResponse">
<inheritdoc/> <inheritdoc/>
</member> </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"> <member name="P:Performance.DtoModels.ColumnResponse.ColId">
<inheritdoc/> <inheritdoc/>
</member> </member>
...@@ -4372,6 +4378,11 @@ ...@@ -4372,6 +4378,11 @@
宽度 宽度
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.ColumnResponse.MinWidth">
<summary>
最小宽度
</summary>
</member>
<member name="P:Performance.DtoModels.ColumnResponse.Resizable"> <member name="P:Performance.DtoModels.ColumnResponse.Resizable">
<summary> <summary>
拖动列宽(1 允许 0 禁止) 拖动列宽(1 允许 0 禁止)
...@@ -4402,6 +4413,16 @@ ...@@ -4402,6 +4413,16 @@
格式化 格式化
</summary> </summary>
</member> </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"> <member name="P:Performance.DtoModels.ColumnResponse.Sort">
<summary> <summary>
列排序 列排序
......
using System; using Performance.Infrastructure.Models;
using System;
namespace Performance.DtoModels namespace Performance.DtoModels
{ {
......
using System; using System.Collections.Generic;
using System.Collections.Generic;
namespace Performance.DtoModels namespace Performance.DtoModels
{ {
/// <inheritdoc/> /// <inheritdoc/>
public class ColumnResponse : IChildren<ColumnResponse> public class ColumnResponse : IChildren<ColumnResponse>
{ {
/// ctor
public ColumnResponse()
{
}
/// ctor
public ColumnResponse(string field, string title)
{
Field = field;
Title = title;
}
/// <inheritdoc/> /// <inheritdoc/>
public long ColId { get; set; } public long ColId { get; set; }
/// <summary> /// <summary>
...@@ -33,6 +43,10 @@ public class ColumnResponse : IChildren<ColumnResponse> ...@@ -33,6 +43,10 @@ public class ColumnResponse : IChildren<ColumnResponse>
/// </summary> /// </summary>
public double? Width { get; set; } public double? Width { get; set; }
/// <summary> /// <summary>
/// 最小宽度
/// </summary>
public double? MinWidth { get; set; }
/// <summary>
/// 拖动列宽(1 允许 0 禁止) /// 拖动列宽(1 允许 0 禁止)
/// </summary> /// </summary>
public bool? Resizable { get; set; } public bool? Resizable { get; set; }
...@@ -57,6 +71,14 @@ public class ColumnResponse : IChildren<ColumnResponse> ...@@ -57,6 +71,14 @@ public class ColumnResponse : IChildren<ColumnResponse>
/// </summary> /// </summary>
public string? Formatter { get; set; } public string? Formatter { get; set; }
/// <summary> /// <summary>
/// 链接
/// </summary>
public string? Link { get; set; }
/// <summary>
/// 链接参数
/// </summary>
public bool? LinkParams { get; set; }
/// <summary>
/// 列排序 /// 列排序
/// </summary> /// </summary>
public int? Sort { get; set; } public int? Sort { get; set; }
...@@ -92,5 +114,6 @@ public class ColumnResponse : IChildren<ColumnResponse> ...@@ -92,5 +114,6 @@ 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
...@@ -229,7 +229,7 @@ public static void CreateWorksheet(ExcelWorksheet worksheet, ExcelExportOption e ...@@ -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 sRow = headRow + 1;
var eRow = exportOptions.Rows.Count + headRow; var eRow = exportOptions.Rows.Count + headRow;
......
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
...@@ -42,7 +43,7 @@ public static void GetJsonSerializerSettings(JsonSerializerSettings options) ...@@ -42,7 +43,7 @@ public static void GetJsonSerializerSettings(JsonSerializerSettings options)
/// <returns>哈希表数组</returns> /// <returns>哈希表数组</returns>
public static List<Dictionary<string, object>> MapDictionary(this List<dynamic> dynamics) 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 AutoMapper;
using Dapper; using Dapper;
using Masuit.Tools; using Masuit.Tools;
...@@ -5,6 +6,7 @@ ...@@ -5,6 +6,7 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using Performance.DtoModels; using Performance.DtoModels;
using Performance.DtoModels.AppSettings; using Performance.DtoModels.AppSettings;
using Performance.EntityModels; using Performance.EntityModels;
...@@ -20,6 +22,7 @@ ...@@ -20,6 +22,7 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Yitter.IdGenerator; using Yitter.IdGenerator;
using static Performance.DtoModels.ManagementDept; using static Performance.DtoModels.ManagementDept;
using static Performance.Services.AssessNewService;
namespace Performance.Services namespace Performance.Services
{ {
...@@ -132,7 +135,7 @@ public void DeleteAsync(params long[] procIds) ...@@ -132,7 +135,7 @@ public void DeleteAsync(params long[] procIds)
/// <param name="queries"></param> /// <param name="queries"></param>
/// <param name="page"></param> /// <param name="page"></param>
/// <param name="size"></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) var proc = await _lowProcRepository.GetEntityAsync(x => x.ProcId == procId)
?? throw new PerformanceException("当前查询数据信息错误,请检查配置信息"); ?? throw new PerformanceException("当前查询数据信息错误,请检查配置信息");
...@@ -156,20 +159,50 @@ public void DeleteAsync(params long[] procIds) ...@@ -156,20 +159,50 @@ public void DeleteAsync(params long[] procIds)
throw new PerformanceException("当前查询尚未配置脚本,请配置后重试"); throw new PerformanceException("当前查询尚未配置脚本,请配置后重试");
(IQueryable<dynamic> data, List<ColumnResponse> columns) = await GetExtensionDatumAsync(proc.Script, args); (IQueryable<dynamic> data, List<ColumnResponse> columns) = await GetExtensionDatumAsync(proc.Script, args);
var totalCount = 0;
var total = new Dictionary<string, object?>(); var total = new Dictionary<string, object?>();
if (data.Any()) if (data.Any())
{ {
var dict = (IDictionary<string, object>)data.First(); var dict = (IDictionary<string, object>)data.First();
var keys = dict.Select(w => w.Key).ToList(); 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)); var orig = keys.FirstOrDefault(col => col == item);
if (col != null) if (string.IsNullOrEmpty(orig))
col.Field = key; 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))) foreach (var item in queries.Where(w => !string.IsNullOrEmpty(w.Value)))
{ {
var field = keys.FirstOrDefault(col => col.Equals(item.Field, StringComparison.OrdinalIgnoreCase)); var field = keys.FirstOrDefault(col => col.Equals(item.Field, StringComparison.OrdinalIgnoreCase));
...@@ -179,24 +212,38 @@ public void DeleteAsync(params long[] procIds) ...@@ -179,24 +212,38 @@ public void DeleteAsync(params long[] procIds)
data = data.Where(exp, item.Value); data = data.Where(exp, item.Value);
} }
} }
foreach (var item in columns) 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)); var field = keys.FirstOrDefault(col => col.Equals(item.Field, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrEmpty(field)) if (!string.IsNullOrEmpty(field) && item.Formatter == Formatter.numeric.ToString())
sumValue = data.Select(field).ToDynamicList().Cast<decimal?>().Sum(); {
} try
{
var sumValue = data.Select(field).ToDynamicList().Cast<decimal?>().Sum();
total.AddOrUpdate(item.Field, sumValue, sumValue); total.AddOrUpdate(item.Field, sumValue, sumValue);
} }
catch (Exception ex)
{
_logger.LogError(ex, "计算字段 {Field} 的总和时失败", field);
}
}
} }
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); var paged = data.ToPagedList(page, size);
var vms = new PagedList<dynamic, ColumnResponse, object>(paged, columns, new List<object> { total });
return new ApiResponse(ResponseType.OK, vms);
return new PagedList<dynamic, ColumnResponse, object>(paged, columns, new List<object> { total });
} }
/// <summary> /// <summary>
...@@ -210,7 +257,7 @@ public async Task<(IQueryable<dynamic> data, List<ColumnResponse> columns)> GetE ...@@ -210,7 +257,7 @@ public async Task<(IQueryable<dynamic> data, List<ColumnResponse> columns)> GetE
using (var conn = new MySqlConnection(_options.Value.PerformanceConnectionString)) using (var conn = new MySqlConnection(_options.Value.PerformanceConnectionString))
{ {
if (conn.State != ConnectionState.Open) conn.Open(); 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 multi = await conn.QueryMultipleAsync(script, args, commandTimeout: _commandTimeout);
var data = (await multi.ReadAsync()).AsQueryable(); 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