From c8653075386b02f79f656cfc6340283ad9b29277 Mon Sep 17 00:00:00 2001 From: df123 Date: Wed, 25 Feb 2026 22:59:55 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=94=AF=E5=87=BA=E8=AF=B7=E6=B1=82DTO=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E6=9C=8D=E5=8A=A1=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=96=B0=E8=AF=B7=E6=B1=82=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Expenditure/GetExpendituresRequestDto.cs | 11 ++++++++ .../IBookkeepingExpenditureService.cs | 2 +- .../BookkeepingExpenditureService.cs | 26 +++++++++++++------ 3 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 src/DFApp.Application.Contracts/Bookkeeping/Expenditure/GetExpendituresRequestDto.cs diff --git a/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/GetExpendituresRequestDto.cs b/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/GetExpendituresRequestDto.cs new file mode 100644 index 00000000..0085d15d --- /dev/null +++ b/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/GetExpendituresRequestDto.cs @@ -0,0 +1,11 @@ +using DFApp.CommonDtos; + +namespace DFApp.Bookkeeping.Expenditure +{ + public class GetExpendituresRequestDto : FilterAndPagedAndSortedResultRequestDto + { + public long? CategoryId { get; set; } + + public bool? IsBelongToSelf { get; set; } + } +} diff --git a/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs b/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs index 757d94b4..53f20308 100644 --- a/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs +++ b/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs @@ -11,7 +11,7 @@ namespace DFApp.Bookkeeping.Expenditure public interface IBookkeepingExpenditureService : ICrudAppService< BookkeepingExpenditureDto , long - , FilterAndPagedAndSortedResultRequestDto + , GetExpendituresRequestDto , CreateUpdateBookkeepingExpenditureDto> { Task> GetCategoryLookupDto(); diff --git a/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs b/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs index c5c25962..bcfe5870 100644 --- a/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs +++ b/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs @@ -18,7 +18,7 @@ public class BookkeepingExpenditureService : CrudAppService< BookkeepingExpenditure , BookkeepingExpenditureDto , long - , FilterAndPagedAndSortedResultRequestDto + , GetExpendituresRequestDto , CreateUpdateBookkeepingExpenditureDto>, IBookkeepingExpenditureService { private readonly IRepository _categoryRepository; @@ -34,18 +34,28 @@ public BookkeepingExpenditureService(IRepository cate DeletePolicyName = DFAppPermissions.BookkeepingExpenditure.Delete; } - protected override async Task> CreateFilteredQueryAsync(FilterAndPagedAndSortedResultRequestDto input) + protected override async Task> CreateFilteredQueryAsync(GetExpendituresRequestDto input) { - if(!string.IsNullOrWhiteSpace(input.Filter)){ - var query = await Repository.WithDetailsAsync(); - return query.Where(x => x.Category!.Category.Contains(input.Filter) + var query = await Repository.WithDetailsAsync(); + + if (!string.IsNullOrWhiteSpace(input.Filter)) + { + query = query.Where(x => x.Category!.Category.Contains(input.Filter) || x.Remark!.Contains(input.Filter) || x.Expenditure.ToString().Contains(input.Filter)); } - else{ - return await Repository.WithDetailsAsync(); + + if (input.CategoryId.HasValue) + { + query = query.Where(x => x.CategoryId == input.CategoryId.Value); } - + + if (input.IsBelongToSelf.HasValue) + { + query = query.Where(x => x.IsBelongToSelf == input.IsBelongToSelf.Value); + } + + return query; } public async Task> GetCategoryLookupDto() From a590f21f8058507bc9024715a937d45db2c23d25 Mon Sep 17 00:00:00 2001 From: df123 Date: Wed, 25 Feb 2026 23:05:18 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=80=BB=E6=94=AF=E5=87=BA=E7=9A=84=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E8=BF=87=E6=BB=A4=E5=92=8C=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IBookkeepingExpenditureService.cs | 2 ++ .../BookkeepingExpenditureService.cs | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs b/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs index 53f20308..fec31d42 100644 --- a/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs +++ b/src/DFApp.Application.Contracts/Bookkeeping/Expenditure/IBookkeepingExpenditureService.cs @@ -16,6 +16,8 @@ public interface IBookkeepingExpenditureService : ICrudAppService< { Task> GetCategoryLookupDto(); + Task GetTotalExpenditureAsync(string? filter = null, long? categoryId = null, bool? isBelongToSelf = null); + Task GetChartJSDto(DateTime start , DateTime end , CompareType compareType diff --git a/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs b/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs index bcfe5870..f970eab2 100644 --- a/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs +++ b/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs @@ -67,6 +67,31 @@ public async Task> GetCategoryLookupDto() return result; } + public async Task GetTotalExpenditureAsync(string? filter = null, long? categoryId = null, bool? isBelongToSelf = null) + { + var query = await ReadOnlyRepository.GetQueryableAsync(); + + if (!string.IsNullOrWhiteSpace(filter)) + { + query = query.Where(x => x.Category!.Category.Contains(filter) + || x.Remark!.Contains(filter) + || x.Expenditure.ToString().Contains(filter)); + } + + if (categoryId.HasValue) + { + query = query.Where(x => x.CategoryId == categoryId.Value); + } + + if (isBelongToSelf.HasValue) + { + query = query.Where(x => x.IsBelongToSelf == isBelongToSelf.Value); + } + + var total = await AsyncExecuter.SumAsync(query, x => x.Expenditure); + return total; + } + [Authorize(DFAppPermissions.BookkeepingExpenditure.Analysis)] public async Task GetChartJSDto(DateTime start, DateTime end , CompareType compareType, NumberType numberType, bool? isBelongToSelf) From 3a2b709cc4c764ffcf322a6d44ea2eb88ecaa7e0 Mon Sep 17 00:00:00 2001 From: df123 Date: Wed, 25 Feb 2026 23:10:55 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=94=AF?= =?UTF-8?q?=E5=87=BA=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=8C=89=E6=94=AF=E5=87=BA=E6=97=A5=E6=9C=9F=E9=99=8D?= =?UTF-8?q?=E5=BA=8F=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Expenditure/BookkeepingExpenditureService.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs b/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs index f970eab2..6da549a9 100644 --- a/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs +++ b/src/DFApp.Application/Bookkeeping/Expenditure/BookkeepingExpenditureService.cs @@ -41,8 +41,8 @@ protected override async Task> CreateFiltered if (!string.IsNullOrWhiteSpace(input.Filter)) { query = query.Where(x => x.Category!.Category.Contains(input.Filter) - || x.Remark!.Contains(input.Filter) - || x.Expenditure.ToString().Contains(input.Filter)); + || x.Remark!.Contains(input.Filter) + || x.Expenditure.ToString().Contains(input.Filter)); } if (input.CategoryId.HasValue) @@ -55,6 +55,11 @@ protected override async Task> CreateFiltered query = query.Where(x => x.IsBelongToSelf == input.IsBelongToSelf.Value); } + if (string.IsNullOrWhiteSpace(input.Sorting)) + { + query = query.OrderByDescending(x => x.ExpenditureDate); + } + return query; }