This commit is contained in:
PZ688 2025-02-27 15:04:47 +08:00
commit 4b26bdddd4
6 changed files with 44 additions and 30 deletions

View File

@ -5,6 +5,7 @@
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
global using Admin.NET.Core; global using Admin.NET.Core;
global using Admin.NET.Core.Utils;
global using Furion; global using Furion;
global using Furion.DependencyInjection; global using Furion.DependencyInjection;
global using Furion.DynamicApiController; global using Furion.DynamicApiController;

View File

@ -5,6 +5,7 @@
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
global using Admin.NET.Core.Service; global using Admin.NET.Core.Service;
global using Admin.NET.Core.Utils;
global using Furion; global using Furion;
global using Furion.ConfigurableOptions; global using Furion.ConfigurableOptions;
global using Furion.DatabaseAccessor; global using Furion.DatabaseAccessor;

View File

@ -91,16 +91,16 @@ public class AggregationBuilder
/// <summary> /// <summary>
/// 验证字段有效性 /// 验证字段有效性
/// </summary> /// </summary>
public static List<string> ValidateFields(string[] fields, Type targetType) public static List<string> ValidateFields<T>(string[] fields, Type targetType)
{ {
if (fields == null || fields.Length == 0) return new List<string>(); if (fields == null || fields.Length == 0) return new List<string>();
return fields return fields
.Where(f => !string.IsNullOrWhiteSpace(f)) .Where(f => !string.IsNullOrWhiteSpace(f))
.Select(f => f.Trim()) .Select(f => f.Trim())
// .Where(f => targetType.GetProperty( .Where(f => targetType.GetProperty(
// targetType == typeof(UsagetokenOutput) ? targetType == typeof(T) ?
// $"{f}Sum" : f) != null) $"{f}Sum" : f) != null)
.ToList(); .ToList();
} }
} }

View File

@ -26,7 +26,6 @@ using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
} }
} }
} }
using @(@Model.NameSpace).Entity;
namespace @Model.NameSpace; namespace @Model.NameSpace;
@ -36,18 +35,28 @@ namespace @Model.NameSpace;
[ApiDescriptionSettings(@(@Model.ProjectLastName)Const.GroupName, Name = "@(@Model.LowerClassName)", Order = 100)] [ApiDescriptionSettings(@(@Model.ProjectLastName)Const.GroupName, Name = "@(@Model.LowerClassName)", Order = 100)]
public partial class @(@Model.ClassName)Service : IDynamicApiController, ITransient public partial class @(@Model.ClassName)Service : IDynamicApiController, ITransient
{ {
private readonly SysCacheService _sysCacheService;//默认CacheService
private readonly UserManager _userManager;//默认用户管理
private readonly IEventPublisher _eventPublisher;//默认事件总线
private readonly SqlSugarRepository<@(@Model.ClassName)> _@(@Model.LowerClassName)Rep; private readonly SqlSugarRepository<@(@Model.ClassName)> _@(@Model.LowerClassName)Rep;
@foreach (var column in Model.TableField){ @foreach (var column in Model.TableField){
if(@column.EffectType == "ForeignKey"||@column.EffectType == "ApiTreeSelector"){ if(@column.EffectType == "ForeignKey"||@column.EffectType == "ApiTreeSelector"){
if(@column.FkEntityName != @Model.ClassName){
@:private readonly SqlSugarRepository<@(@column.FkEntityName)> _@(@column.LowerFkEntityName)Rep; @:private readonly SqlSugarRepository<@(@column.FkEntityName)> _@(@column.LowerFkEntityName)Rep;
}
} }
} }
private TypeAdapterConfig _typeAdapterConfig = TypeAdapterConfig.GlobalSettings; private TypeAdapterConfig _typeAdapterConfig = TypeAdapterConfig.GlobalSettings;
public @(@Model.ClassName)Service(SqlSugarRepository<@(@Model.ClassName)> @(@Model.LowerClassName)Rep public @(@Model.ClassName)Service(SqlSugarRepository<@(@Model.ClassName)> @(@Model.LowerClassName)Rep
,SysCacheService sysCacheService
, UserManager userManager
,IEventPublisher eventPublisher
@foreach (var column in Model.TableField){ @foreach (var column in Model.TableField){
if(@column.EffectType == "ForeignKey"||@column.EffectType == "ApiTreeSelector"){ if(@column.EffectType == "ForeignKey"||@column.EffectType == "ApiTreeSelector"){
if(@column.FkEntityName != @Model.ClassName){
@:,SqlSugarRepository<@(@column.FkEntityName)> @(@column.LowerFkEntityName)Rep @:,SqlSugarRepository<@(@column.FkEntityName)> @(@column.LowerFkEntityName)Rep
}
} }
} }
@ -56,10 +65,15 @@ public partial class @(@Model.ClassName)Service : IDynamicApiController, ITransi
_@(@Model.LowerClassName)Rep = @(@Model.LowerClassName)Rep; _@(@Model.LowerClassName)Rep = @(@Model.LowerClassName)Rep;
@foreach (var column in Model.TableField){ @foreach (var column in Model.TableField){
if(@column.EffectType == "ForeignKey"||@column.EffectType == "ApiTreeSelector"){ if(@column.EffectType == "ForeignKey"||@column.EffectType == "ApiTreeSelector"){
if(@column.FkEntityName != @Model.ClassName){
@:_@(@column.LowerFkEntityName)Rep = @(@column.LowerFkEntityName)Rep; @:_@(@column.LowerFkEntityName)Rep = @(@column.LowerFkEntityName)Rep;
}
} }
} }
_typeAdapterConfig.ForType<T, @(@Model.ClassName)>().IgnoreNullValues(true); _typeAdapterConfig.ForType<T, @(@Model.ClassName)>().IgnoreNullValues(true);
_sysCacheService = sysCacheService;
_eventPublisher = eventPublisher;
_userManager = userManager;
} }
/// <summary> /// <summary>
@ -168,28 +182,28 @@ if (@column.ColumnKey == "True"){
return await @(@Model.ClassName)Mid.GetQuery(_@(@Model.LowerClassName)Rep, input).OrderBuilder(input).ToListAsync(); return await @(@Model.ClassName)Mid.GetQuery(_@(@Model.LowerClassName)Rep, input).OrderBuilder(input).ToListAsync();
} }
@if(@Model.TableField.Any(x=>x.Statistical == "Y")){ /// <summary>
@:/// <summary> /// 获取@(@Model.BusName)
@:/// 获取@(@Model.BusName) /// </summary>
@:/// </summary> /// <param name="input"></param>
@:/// <param name="input"></param> /// <returns></returns>
@:/// <returns></returns> [ApiDescriptionSettings(Name = "GetTotalSum", Description = "获取@(@Model.BusName)统计", Order = 960), HttpPost]
@:[ApiDescriptionSettings(Name = "GetTotalSum", Description = "获取@(@Model.BusName)统计", Order = 960), HttpPost] [DisplayName("获取@(@Model.BusName)统计")]
@:[DisplayName("获取@(@Model.BusName)统计")] public async Task<List<@(@Model.ClassName)Output>> GetTotalSum(Page@(@Model.ClassName)Input input)
@:public async Task<List<@(@Model.ClassName)Output>> GetTotalSum(Page@(@Model.ClassName)Input input) {
@:{ // 单次查询同时获取统计值
@:// 单次查询同时获取统计值 var querystats = @(@Model.ClassName)Mid.GetQuery(_@(@Model.LowerClassName)Rep, input)
@:var querystats = @(@Model.ClassName)Mid.GetQuery(_@(@Model.LowerClassName)Rep, input) @if(@Model.TableField.Any(x=>x.IsGroupBy == "Y")){
@foreach (var column in Model.TableField){ @foreach (var column in Model.TableField){
if (@column.IsGroupBy == "Y"){ if (@column.IsGroupBy == "Y"){
@: .GroupByIF(input.GroupBy.Contains("@column.PropertyName"), u => u.@column.PropertyName) @: .GroupByIF(input.GroupBy.Contains("@column.PropertyName"), u => u.@column.PropertyName)
} }
} }
@: //.Having(it => SqlFunc.AggregateCount(it.Id) > 0)//聚合函数过滤 @: //.Having(it => SqlFunc.AggregateCount(it.Id) > 0)//聚合函数过滤
@: .Select(it => new @(@Model.ClassName)Output }
@: { .Select(it => new @(@Model.ClassName)Output
@: count = SqlFunc.AggregateCount(it.Id), {
count = SqlFunc.AggregateCount(it.Id),
@foreach (var column in Model.TableField){ @foreach (var column in Model.TableField){
if (@column.IsGroupBy == "Y"){ if (@column.IsGroupBy == "Y"){
@: @(@column.PropertyName) = it.@(@column.PropertyName), @: @(@column.PropertyName) = it.@(@column.PropertyName),
@ -198,10 +212,9 @@ if (@column.ColumnKey == "True"){
@: @(@column.PropertyName) = SqlFunc.AggregateSum(it.@(@column.PropertyName)) ?? 0, @: @(@column.PropertyName) = SqlFunc.AggregateSum(it.@(@column.PropertyName)) ?? 0,
} }
} }
@: }); });
@:return await querystats.ToListAsync(); return await querystats.ToListAsync();
@:} }
}
/// <summary> /// <summary>
/// 根据输入参数获取@(@Model.BusName)统计 /// 根据输入参数获取@(@Model.BusName)统计
@ -220,7 +233,7 @@ if (@column.ColumnKey == "True"){
public async Task<List<@(@Model.ClassName)Output>> GetAggregTotalSum(Page@(@Model.ClassName)Input input) public async Task<List<@(@Model.ClassName)Output>> GetAggregTotalSum(Page@(@Model.ClassName)Input input)
{ {
@:var query = @(@Model.ClassName)Mid.GetQuery(_@(@Model.LowerClassName)Rep, input) var query = @(@Model.ClassName)Mid.GetQuery(_@(@Model.LowerClassName)Rep, input);
// 输入参数示例 // 输入参数示例
//input = new Page@(@Model.ClassName)Input //input = new Page@(@Model.ClassName)Input
//{ //{
@ -253,7 +266,7 @@ if (@column.ColumnKey == "True"){
// HAVING(SUM(cost) > 10000) AND(AVG(CAST(response_time AS FLOAT)) < 500) // HAVING(SUM(cost) > 10000) AND(AVG(CAST(response_time AS FLOAT)) < 500)
// 处理分组字段 // 处理分组字段
var groupFields = AggregationBuilder.ValidateFields(input.GroupBy, typeof(@(@Model.ClassName)Output)); var groupFields = AggregationBuilder.ValidateFields<@(@Model.ClassName)Output>(input.GroupBy, typeof(@(@Model.ClassName)Output));
if (groupFields.Count > 0) if (groupFields.Count > 0)
{ {
query = query.GroupBy(string.Join(",", groupFields)); query = query.GroupBy(string.Join(",", groupFields));

View File

@ -401,7 +401,6 @@ const handleQuery = async (reset = false) => {
@if(@Model.TableField.Any(x=>x.Statistical == "Y")){ @if(@Model.TableField.Any(x=>x.Statistical == "Y")){
@if (@Model.IsApiService) { @if (@Model.IsApiService) {
@:state.totalSum =getAPI(@(@Model.ClassName)Api).api@(@Model.ClassName)GetTotalSumPost(params).data.result; @:state.totalSum =getAPI(@(@Model.ClassName)Api).api@(@Model.ClassName)GetTotalSumPost(params).data.result;
}
} else { } else {
@:state.totalSum =(await get@(@Model.ClassName)TotalSum(state.queryParams)).data.result; @:state.totalSum =(await get@(@Model.ClassName)TotalSum(state.queryParams)).data.result;
} }

View File

@ -91,7 +91,7 @@
@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
@:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)"> @:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
@:<el-select clearable v-model="state.ruleForm.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)"> @:<el-select clearable v-model="state.ruleForm.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)">
@:<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="@(@column.NetType.StartsWith("string") ? "item.code" : "Number(item.value)")" :label="`${item.name||''} [${item.code}] ${item.value}`"></el-option> @:<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="@(@column.NetType.StartsWith("string") ? "item.code" : "Number(item.value)")" :label="`${item.label||''} [${item.code}] ${item.value}`"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -142,7 +142,7 @@
@:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> @:<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
@:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)"> @:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
@:<el-select clearable v-model="state.ruleForm.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)"> @:<el-select clearable v-model="state.ruleForm.@(@column.LowerPropertyName)" placeholder="请选择@(@column.ColumnComment)">
@:<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="@(@column.NetType.StartsWith("string") ? "item.value" : "Number(item.value)")" :label="`${item.name||''} (${item.code}) [${item.value}]`"></el-option> @:<el-option v-for="(item,index) in dl('@(@column.DictTypeCode)')" :key="index" :value="@(@column.NetType.StartsWith("string") ? "item.value" : "Number(item.value)")" :label="`${item.label||''} (${item.code}) [${item.value}]`"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>