Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
performance
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zry
performance
Commits
ca1ba2c9
Commit
ca1ba2c9
authored
Jan 08, 2025
by
wyc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
简单查询(微调)
parent
66d9c138
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
127 additions
and
32 deletions
+127
-32
performance/Performance.Api/Controllers/LowProcController.cs
+8
-7
performance/Performance.Api/wwwroot/Performance.DtoModels.xml
+21
-0
performance/Performance.DtoModels/ApiResponse.cs
+2
-1
performance/Performance.DtoModels/Response/ColumnResponse.cs
+27
-3
performance/Performance.Infrastructure/Tools/ToolExport.cs
+2
-2
performance/Performance.Infrastructure/Tools/Tools.cs
+2
-1
performance/Performance.Services/LowProcService.cs
+65
-18
No files found.
performance/Performance.Api/Controllers/LowProcController.cs
View file @
ca1ba2c9
...
...
@@ -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
))
...
...
performance/Performance.Api/wwwroot/Performance.DtoModels.xml
View file @
ca1ba2c9
...
...
@@ -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>
列排序
...
...
performance/Performance.DtoModels/ApiResponse.cs
View file @
ca1ba2c9
using
System
;
using
Performance.Infrastructure.Models
;
using
System
;
namespace
Performance.DtoModels
{
...
...
performance/Performance.DtoModels/Response/ColumnResponse.cs
View file @
ca1ba2c9
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
performance/Performance.Infrastructure/Tools/ToolExport.cs
View file @
ca1ba2c9
...
...
@@ -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
;
...
...
performance/Performance.Infrastructure/Tools/Tools.cs
View file @
ca1ba2c9
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
();
}
}
}
performance/Performance.Services/LowProcService.cs
View file @
ca1ba2c9
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
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment