From 5888684c15d3b60d058982e87d4721623ffa3fd2 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Fri, 19 Apr 2024 17:06:51 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E6=B6=88=E8=B4=B9=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/BalanceSummaryController.cs | 37 ++ .../Order/Controllers/BalancesController.cs | 50 +-- .../Request/BalanceRecordAnalysisRequest.cs | 26 +- .../Response/BalanceRecordAnalysisRespones.cs | 34 -- .../Response/BalanceRecordAnalysisResponse.cs | 22 + .../BalanceRecordDetailPageResponse.cs | 19 + .../{Implements => }/BaseOrderService.cs | 2 +- .../Order/Services/IBalanceService.cs | 15 +- .../Order/Services/IBalanceSummaryService.cs | 12 + .../Services/Implements/BalanceService.cs | 405 +++--------------- .../Implements/BalanceSummaryService.cs | 52 +++ .../Order/Services/Implements/OrderService.cs | 23 +- .../Canteen/Enums/ShiftEnumType.cs | 10 +- 13 files changed, 262 insertions(+), 445 deletions(-) create mode 100644 Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs delete mode 100644 Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs create mode 100644 Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisResponse.cs rename Src/Dlhis.Canteen/Order/Services/{Implements => }/BaseOrderService.cs (98%) create mode 100644 Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs create mode 100644 Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs new file mode 100644 index 00000000..65c7555a --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Controllers/BalanceSummaryController.cs @@ -0,0 +1,37 @@ +using Dlhis.Canteen.Dishes.Request; +using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Response; +using Dlhis.Canteen.Order.Services; +using Kurisu.Core.DataAccess.Dto; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Canteen.Order.Controllers; + +/// +/// 消费统计 +/// +[Authorize] +[Route("api/[controller]")] +[ApiController] +public class BalanceSummaryController : ControllerBase +{ + private readonly IBalanceSummaryService _balanceSummaryService; + + public BalanceSummaryController(IBalanceSummaryService balanceSummaryService) + { + _balanceSummaryService = balanceSummaryService; + } + + /// + /// 用餐分析 + /// + /// + /// + [HttpGet("analysis")] + public async Task> BalanceRecordAnalysisAsync([FromQuery] BalanceRecordAnalysisRequest request) + { + return await _balanceSummaryService.BalanceRecordAnalysisAsync(request); + } +} diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index 84e5bd40..56341e2a 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -51,12 +51,12 @@ public class BalancesController : ControllerBase /// - /// 消费明细 + /// 营业点消费明细 /// /// /// [HttpGet("recordPageDetails")] - public async Task> RecordPageDetailsAsync([FromQuery] BalanceRecordPageDetailRequest request) + public async Task RecordPageDetailsAsync([FromQuery] BalanceRecordPageDetailRequest request) { return await _balanceService.RecordPageDetailsAsync(request); } @@ -97,52 +97,6 @@ public class BalancesController : ControllerBase return await _balanceService.GetPageByUserAsync(request); } - /// - /// 根据成本中心 - /// - /// - /// - [HttpGet("recordByCostId")] - public async Task> RecordByCostIdAsync([FromQuery] BalanceRecordPageByCostIdRequest request) - { - return await _balanceService.RecordByCostIdAsync(request); - } - - - /// - /// 消费汇总 根据部门号 - /// - /// - /// - [HttpGet("recordSummaryByNo")] - public async Task> BalanceRecordSummaryByNoAsync([FromQuery] BalanceRecordSummaryRequest request) - { - return await _balanceService.BalanceRecordSummaryByNoAsync(request); - } - - /// - /// 消费汇总 根据人事范围 - /// - /// - /// - [HttpGet("recordSummaryByTid")] - public async Task> BalanceRecordSummaryByTidAsync([FromQuery] BalanceRecordSummaryRequest request) - { - return await _balanceService.BalanceRecordSummaryByTidAsync(request); - } - - - /// - /// 用餐分析 - /// - /// - /// - [HttpGet("BalanceRecordSummaryAsync")] - public async Task> BalanceRecordAnalysisAsync([FromQuery] BalanceRecordAnalysisRequest request) - { - return await _balanceService.BalanceRecordAnalysisAsync(request); - } - /// /// 获取消费机总数、离线设备数量、营业点数量、可消费人数、人均日消费额 /// diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs index 9fe8e693..01177303 100644 --- a/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs @@ -1,22 +1,26 @@ -using Kurisu.Core.DataAccess.Dto; +using System.ComponentModel.DataAnnotations; +using Kurisu.Core.CustomClass; +using Kurisu.Core.DataAccess.Dto; namespace Dlhis.Canteen.Order.Request { - public class BalanceRecordAnalysisRequest : PageDto + public class BalanceRecordAnalysisRequest : PageDto, IValidatableObject { - /// - /// 开始日期 - /// - public DateTime? StartDatetime { get; set; } - - /// - /// 结束日期 - /// - public DateTime? EndDatetime { get; set; } + public DateTimePeriod SearchDateTimePeriod { get; set; } /// /// 营业点 /// public Guid? BusinessPlaceCode { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + if (SearchDateTimePeriod != null && SearchDateTimePeriod.End.HasValue) + { + SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1); + } + + yield break; + } } } diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs deleted file mode 100644 index f938e46e..00000000 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace Dlhis.Canteen.Order.Response; - -public class BalanceRecordAnalysisRespones -{ - /// - /// 消费日期 - /// - public DateOnly CostDate { get; set; } - - /// - /// 早餐人数 - /// - public int BreakfastNumberOfPeople { get; set; } - - /// - /// 午餐人数 - /// - public int LunchNumberOfPeople { get; set; } - - /// - /// 晚餐人数 - /// - public int DinnerNumberOfPeople { get; set; } - - /// - /// 宵夜人数 - /// - public int LateNightNumberOfPeople { get; set; } - - /// - /// 总人数 - /// - public int TotalNumberOfPeople { get; set; } -} diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisResponse.cs new file mode 100644 index 00000000..e0a5bd63 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisResponse.cs @@ -0,0 +1,22 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.Core.CustomClass; + +namespace Dlhis.Canteen.Order.Response; + +public class BalanceRecordAnalysisResponse +{ + /// + /// 消费日期 + /// + public DateOnly Date { get; set; } + + /// + /// 餐次消费数据 + /// + public List> Items { get; set; } + + /// + /// 总人数 + /// + public int Total { get; set; } +} diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordDetailPageResponse.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordDetailPageResponse.cs index cf665408..22f3ebe2 100644 --- a/Src/Dlhis.Canteen/Order/Response/BalanceRecordDetailPageResponse.cs +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordDetailPageResponse.cs @@ -1,9 +1,28 @@ using Dlhis.Entity.Canteen.Enums; using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.Core.DataAccess.Dto; using Newtonsoft.Json; namespace Dlhis.Canteen.Order.Response; +public class BalanceRecordByBusinessPlaceResponse +{ + /// + /// 消费总金额 + /// + public decimal Amount { get; set; } + + /// + /// 消费人数 + /// + public int Total { get; set; } + + /// + /// 分页数据 + /// + public Pagination Pagination { get; set; } +} + public class BalanceRecordDetailPageResponse { public long Id { get; set; } diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BaseOrderService.cs b/Src/Dlhis.Canteen/Order/Services/BaseOrderService.cs similarity index 98% rename from Src/Dlhis.Canteen/Order/Services/Implements/BaseOrderService.cs rename to Src/Dlhis.Canteen/Order/Services/BaseOrderService.cs index b92f47de..04074c8d 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BaseOrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/BaseOrderService.cs @@ -7,7 +7,7 @@ using Kurisu.Core.User.Abstractions; using Kurisu.SqlSugar.Services; using Mapster; -namespace Dlhis.Canteen.Order.Services.Implements; +namespace Dlhis.Canteen.Order.Services; public abstract class BaseOrderService { diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs index 25b5e6a8..5acebbdf 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs @@ -15,15 +15,12 @@ public interface IBalanceService : IScopeDependency Task SupplementBalanceAsync(BalanceSupplementRequest request); - Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request); - - Task> RecordPageDetailsAsync(BalanceRecordPageDetailRequest request); - - Task> BalanceRecordSummaryByNoAsync(BalanceRecordSummaryRequest request); - - Task> BalanceRecordSummaryByTidAsync(BalanceRecordSummaryRequest request); - - Task> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request); + /// + /// 营业点消费明细 + /// + /// + /// + Task RecordPageDetailsAsync(BalanceRecordPageDetailRequest request); Task GetConsumeNumberAsync(); diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs new file mode 100644 index 00000000..41a9dd3e --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceSummaryService.cs @@ -0,0 +1,12 @@ +using Dlhis.Canteen.Dishes.Request; +using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Response; +using Kurisu.Core.DataAccess.Dto; +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Canteen.Order.Services; + +public interface IBalanceSummaryService : IScopeDependency +{ + Task> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request); +} diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs index dac5dba0..47268f89 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -160,6 +160,74 @@ public class BalanceService : IBalanceService } + public async Task RecordPageDetailsAsync(BalanceRecordPageDetailRequest request) + { + var myCodes = (await _businessPlacePermissionsApi.GetMyAsync()).Data.Select(x => (Guid?)x.Code).ToList(); + if (request.BusinessplaceCodes.IsPresent()) + { + myCodes = myCodes.Where(x => request.BusinessplaceCodes.Contains(x)).ToList(); + } + + var queryable = _dbContext.Queryable() + .LeftJoin((record, department) => record.DepartmentNo == department.No) + .LeftJoin((record, department, bplace) => record.BusinessPlaceCode == bplace.Code) + .LeftJoin((record, department, bplace, gainfo) => record.UserNo == gainfo.No) + .Where((record) => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) + .Where(record => myCodes.Contains(record.BusinessPlaceCode)) + .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CostDateTime >= request.SearchDateTimePeriod.Start) + .WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CostDateTime <= request.SearchDateTimePeriod.End) + .WhereIF(request.ShiftType.HasValue, record => record.ShiftType == request.ShiftType) + .WhereIF(request.Search.IsPresent(), record => record.UserCode == request.Search || record.Name == request.Search); + + var page = await queryable + .OrderBy(record => record.CostDateTime, OrderByType.Desc) + .Select((record, department, bplace, gainfo) => new BalanceRecordDetailPageResponse + { + Id = record.Id, + No = record.No, + CurrentAmount = SqlFunc.Abs(record.Amount), + CostDate = record.CostDate, + UserNo = record.UserNo, + UserCode = record.UserCode, + Source = record.Source, + UserName = record.Name, + DepartmentName = department.Name, + BusinessPlaceName = bplace.Name, + CostDateTime = record.CostDateTime, + ShiftType = record.ShiftType, + Werks = gainfo.Werks, + Factory = record.TenantId, + Remark = record.Remark, + }) + .ToPageListAsync(request); + + try + { + var tenantResult = await _tenantApi.GetTenantsInternalAsync(); + var tenants = tenantResult.Data; + + page.Data.ForEach(item => + { + item.Factory = tenants.FirstOrDefault(x => x.Code == item.Factory)?.Name; + }); + } + catch (Exception) + { + } + + + var amount = await queryable.SumAsync(record => SqlFunc.Abs(record.Amount)); + var total = await queryable.GroupBy(record => record.UserNo).Select(record => record.UserNo).CountAsync(); + + return new BalanceRecordByBusinessPlaceResponse + { + Amount = amount, + Total = total, + Pagination = page, + }; + } + + public async Task SupplementBalanceAsync(BalanceSupplementRequest request) { var balanceInfo = await _dbContext.Queryable().Where(x => x.No == request.No).SingleAsync(); @@ -208,342 +276,6 @@ public class BalanceService : IBalanceService }, 10); } - - /// - /// 根据成本中心 - /// - /// - /// - public async Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request) - { - var paeginfos = await _dbContext.Queryable() - .WhereIF(!request.UserCode.IsEmpty(), record => record.UserCode == request.UserCode) - .WhereIF(!request.DepartmentNo.IsEmpty(), record => record.DepartmentNo == request.DepartmentNo) - .WhereIF(!request.OriginTenantId.IsEmpty(), record => record.OriginTenantId == request.OriginTenantId) - .WhereIF(!request.CostId.IsEmpty(), record => record.CostId == request.CostId) - .WhereIF(request.StartDatetime.HasValue, record => record.CostDateTime >= request.StartDatetime) - .WhereIF(request.EndDatetime.HasValue, record => record.CostDateTime <= request.EndDatetime) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out) - .OrderBy(record => record.CreateTime, OrderByType.Desc) - .ToListAsync(); - - var lst = new List(); - foreach (var costIdGroup in paeginfos.GroupBy(record => record.CostId)) - { - //每个costID - var obj = new BalanceRecordCostIdResponse - { - CostId = costIdGroup.Key - }; - - // 所有人次 - var BreakfastNumberOfPeople = costIdGroup.Count(x => x.ShiftType == ShiftEnumType.Breakfast); - - var LunchNumberOfPeople = costIdGroup.Count(x => x.ShiftType == ShiftEnumType.Lunch); - - var DinnerNumberOfPeople = costIdGroup.Count(x => x.ShiftType == ShiftEnumType.Dinner); - - var LateNightNumberOfPeople = costIdGroup.Count(x => x.ShiftType == ShiftEnumType.Nightsnack); - // 每个餐次人数 - obj.BreakfastNumberOfPeople = costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Breakfast).Select(x => x.UserNo).Distinct().Count(); - obj.LunchNumberOfPeople = costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Lunch).Select(x => x.UserNo).Distinct().Count(); - obj.DinnerNumberOfPeople = costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Dinner).Select(x => x.UserNo).Distinct().Count(); - obj.LateNightNumberOfPeople = costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Nightsnack).Select(x => x.UserNo).Distinct().Count(); - - //餐次金额 - obj.BreakfastAmount = Math.Abs(costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Breakfast).Sum(x => x.Amount)); - obj.LunchAmount = Math.Abs(costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Lunch).Sum(x => x.Amount)); - obj.DinnerAmount = Math.Abs(costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Dinner).Sum(x => x.Amount)); - obj.LateNightAmount = Math.Abs(costIdGroup.Where(x => x.ShiftType == ShiftEnumType.Nightsnack).Sum(x => x.Amount)); - - - // 每个餐次单价 - obj.BreakfastPrice = BreakfastNumberOfPeople == 0 ? 0 : Math.Round(obj.BreakfastAmount / BreakfastNumberOfPeople, 2); - obj.LunchPrice = LunchNumberOfPeople == 0 ? 0 : Math.Round(obj.LunchAmount / LunchNumberOfPeople, 2); - obj.DinnerPrice = DinnerNumberOfPeople == 0 ? 0 : Math.Round(obj.DinnerAmount / DinnerNumberOfPeople, 2); - obj.LateNightPrice = LateNightNumberOfPeople == 0 ? 0 : Math.Round(obj.LateNightAmount / LateNightNumberOfPeople, 2); - - // 总人数 总金额 - obj.TotalNumberOfPeople = costIdGroup.Select(x => x.UserNo).Distinct().Count(); - obj.TotalAmount = obj.BreakfastAmount + obj.LunchAmount + obj.DinnerAmount + obj.LateNightAmount; - - lst.Add(obj); - } - - // 分页操作 - var startIndex = (request.PageIndex - 1) * request.PageSize; - var pagedData = lst.Skip(startIndex).Take(request.PageSize).ToList(); - - var pagination = new Pagination - { - PageIndex = request.PageIndex, - PageSize = request.PageSize, - Total = lst.Count, // 使用原始列表的总数进行分页 - Data = pagedData - }; - - return pagination; - } - - /// - /// 消费明细 - /// - /// - /// - public async Task> RecordPageDetailsAsync(BalanceRecordPageDetailRequest request) - { - var myCodes = (await _businessPlacePermissionsApi.GetMyAsync()).Data.Select(x => (Guid?)x.Code).ToList(); - - var page = await _dbContext.Queryable() - .LeftJoin((record, department) => record.DepartmentNo == department.No) - .LeftJoin((record, department, bplace) => record.BusinessPlaceCode == bplace.Code) - .LeftJoin((record, department, bplace, gainfo) => record.UserNo == gainfo.No) - .Where((record) => myCodes.Contains(record.BusinessPlaceCode)) - .Where((record) => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) - .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CostDateTime >= request.SearchDateTimePeriod.Start) - .WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CostDateTime <= request.SearchDateTimePeriod.End) - .WhereIF(request.ShiftType.HasValue, record => record.ShiftType == request.ShiftType) - .WhereIF(request.Search.IsPresent(), record => record.UserCode == request.Search || record.Name == request.Search) - .WhereIF(request.BusinessplaceCodes.IsPresent(), record => request.BusinessplaceCodes.Contains(record.BusinessPlaceCode)) - .OrderBy(record => record.CostDateTime, OrderByType.Desc) - .Select((record, department, bplace, gainfo) => new BalanceRecordDetailPageResponse - { - Id = record.Id, - No = record.No, - CurrentAmount = SqlFunc.Abs(record.Amount), - CostDate = record.CostDate, - UserNo = record.UserNo, - UserCode = record.UserCode, - Source = record.Source, - UserName = record.Name, - DepartmentName = department.Name, - BusinessPlaceName = bplace.Name, - CostDateTime = record.CostDateTime, - ShiftType = record.ShiftType, - Werks = gainfo.Werks, - Factory = record.TenantId, - Remark = record.Remark, - }) - .ToPageListAsync(request); - - try - { - var tenantResult = await _tenantApi.GetTenantsInternalAsync(); - var tenants = tenantResult.Data; - - page.Data.ForEach(item => - { - item.Factory = tenants.FirstOrDefault(x => x.Code == item.Factory)?.Name; - }); - } - catch (Exception) - { - } - - return page; - } - /// - /// 消费汇总 根据部门号 - /// - /// - /// - public async Task> BalanceRecordSummaryByNoAsync(BalanceRecordSummaryRequest request) - { - var paeginfos = await _dbContext.Queryable() - .WhereIF(!request.DepartmentNo.IsEmpty(), record => record.DepartmentNo == request.DepartmentNo) - .WhereIF(!request.UserCode.IsEmpty(), record => record.UserCode == request.UserCode) - .WhereIF(!request.OriginTenantId.IsEmpty(), record => record.TenantId == request.OriginTenantId) - .WhereIF(request.StartDatetime.HasValue, record => record.CostDateTime >= request.StartDatetime) - .WhereIF(request.EndDatetime.HasValue, record => record.CostDateTime <= request.EndDatetime) - .WhereIF(!request.CostId.IsEmpty(), record => record.CostId == request.CostId) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out) - .OrderBy(record => record.CreateTime, OrderByType.Desc) - .ToListAsync(); - - var lst = new List(); - - foreach (var departmentGroup in paeginfos.GroupBy(record => record.DepartmentNo)) - { - // 每个部门 - var obj = new BalanceRecordSummaryRespones - { - DepartmentNo = departmentGroup.Key, - CostId = request.CostId, - OriginTenantId = "" - }; - // 所有人次 - var BreakfastNumberOfPeople = departmentGroup.Count(x => x.ShiftType == ShiftEnumType.Breakfast); - - var LunchNumberOfPeople = departmentGroup.Count(x => x.ShiftType == ShiftEnumType.Lunch); - - var DinnerNumberOfPeople = departmentGroup.Count(x => x.ShiftType == ShiftEnumType.Dinner); - - var LateNightNumberOfPeople = departmentGroup.Count(x => x.ShiftType == ShiftEnumType.Nightsnack); - //每个餐次人数 - obj.BreakfastNumberOfPeople = departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Breakfast).Select(x => x.UserNo).Distinct().Count(); - obj.LunchNumberOfPeople = departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Lunch).Select(x => x.UserNo).Distinct().Count(); - obj.DinnerNumberOfPeople = departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Dinner).Select(x => x.UserNo).Distinct().Count(); - obj.LateNightNumberOfPeople = departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Nightsnack).Select(x => x.UserNo).Distinct().Count(); - - //餐次金额 - obj.BreakfastAmount = Math.Abs(departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Breakfast).Sum(x => x.Amount)); - obj.LunchAmount = Math.Abs(departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Lunch).Sum(x => x.Amount)); - obj.DinnerAmount = Math.Abs(departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Dinner).Sum(x => x.Amount)); - obj.LateNightAmount = Math.Abs(departmentGroup.Where(x => x.ShiftType == ShiftEnumType.Nightsnack).Sum(x => x.Amount)); - - // 每个餐次单价 - obj.BreakfastPrice = BreakfastNumberOfPeople == 0 ? 0 : Math.Round(obj.BreakfastAmount / BreakfastNumberOfPeople, 2); - obj.LunchPrice = LunchNumberOfPeople == 0 ? 0 : Math.Round(obj.LunchAmount / LunchNumberOfPeople, 2); - obj.DinnerPrice = DinnerNumberOfPeople == 0 ? 0 : Math.Round(obj.DinnerAmount / DinnerNumberOfPeople, 2); - obj.LateNightPrice = LateNightNumberOfPeople == 0 ? 0 : Math.Round(obj.LateNightAmount / LateNightNumberOfPeople, 2); - - // 总人数 总金额 - obj.TotalNumberOfPeople = departmentGroup.Select(x => x.UserNo).Distinct().Count(); - obj.TotalAmount = obj.BreakfastAmount + obj.LunchAmount + obj.DinnerAmount + obj.LateNightAmount; - lst.Add(obj); - } - - var departments = await _dbContext.Queryable().ToListAsync(); - lst.ForEach(x => - { - x.DepartmentName = departments.Where(d => d.No == x.DepartmentNo).Select(d => d.Name).First(); - }); - - // 分页操作 - var startIndex = (request.PageIndex - 1) * request.PageSize; - var pagedData = lst.Skip(startIndex).Take(request.PageSize).ToList(); - - var pagination = new Pagination - { - PageIndex = request.PageIndex, - PageSize = request.PageSize, - Total = lst.Count, // 使用原始列表的总数进行分页 - Data = pagedData - }; - - return pagination; - } - - /// - /// 消费汇总 根据人事范围 - /// - /// - /// - public async Task> BalanceRecordSummaryByTidAsync(BalanceRecordSummaryRequest request) - { - var paeginfos = await _dbContext.Queryable() - .WhereIF(!request.DepartmentNo.IsEmpty(), record => record.DepartmentNo == request.DepartmentNo) - .WhereIF(!request.UserCode.IsEmpty(), record => record.UserCode == request.UserCode) - .WhereIF(!request.OriginTenantId.IsEmpty(), record => record.TenantId == request.OriginTenantId) - .WhereIF(request.StartDatetime.HasValue, record => record.CostDateTime >= request.StartDatetime) - .WhereIF(request.EndDatetime.HasValue, record => record.CostDateTime <= request.EndDatetime) - .WhereIF(!request.CostId.IsEmpty(), record => record.CostId == request.CostId) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out) - .OrderBy(record => record.CreateTime, OrderByType.Desc) - .ToListAsync(); - - var lst = new List(); - - foreach (var originTenantIdGroup in paeginfos.GroupBy(record => record.OriginTenantId)) - { - // 每个人事范围 - var obj = new BalanceRecordSummaryRespones - { - OriginTenantId = originTenantIdGroup.Key, - CostId = request.CostId, - DepartmentNo = "" - }; - - // 所有人次 - var BreakfastNumberOfPeople = originTenantIdGroup.Count(x => x.ShiftType == ShiftEnumType.Breakfast); - var LunchNumberOfPeople = originTenantIdGroup.Count(x => x.ShiftType == ShiftEnumType.Lunch); - var DinnerNumberOfPeople = originTenantIdGroup.Count(x => x.ShiftType == ShiftEnumType.Dinner); - var LateNightNumberOfPeople = originTenantIdGroup.Count(x => x.ShiftType == ShiftEnumType.Nightsnack); - //每个餐次人数 - obj.BreakfastNumberOfPeople = originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Breakfast).Select(x => x.UserNo).Distinct().Count(); - obj.LunchNumberOfPeople = originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Lunch).Select(x => x.UserNo).Distinct().Count(); - obj.DinnerNumberOfPeople = originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Dinner).Select(x => x.UserNo).Distinct().Count(); - obj.LateNightNumberOfPeople = originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Nightsnack).Select(x => x.UserNo).Distinct().Count(); - - //餐次金额 - obj.BreakfastAmount = Math.Abs(originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Breakfast).Sum(x => x.Amount)); - obj.LunchAmount = Math.Abs(originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Lunch).Sum(x => x.Amount)); - obj.DinnerAmount = Math.Abs(originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Dinner).Sum(x => x.Amount)); - obj.LateNightAmount = Math.Abs(originTenantIdGroup.Where(x => x.ShiftType == ShiftEnumType.Nightsnack).Sum(x => x.Amount)); - - - // 每个餐次单价 - obj.BreakfastPrice = BreakfastNumberOfPeople == 0 ? 0 : Math.Round(obj.BreakfastAmount / BreakfastNumberOfPeople, 2); - obj.LunchPrice = LunchNumberOfPeople == 0 ? 0 : Math.Round(obj.LunchAmount / LunchNumberOfPeople, 2); - obj.DinnerPrice = DinnerNumberOfPeople == 0 ? 0 : Math.Round(obj.DinnerAmount / DinnerNumberOfPeople, 2); - obj.LateNightPrice = LateNightNumberOfPeople == 0 ? 0 : Math.Round(obj.LateNightAmount / LateNightNumberOfPeople, 2); - - // 总人数 总金额 - obj.TotalNumberOfPeople = originTenantIdGroup.Select(x => x.UserNo).Distinct().Count(); - obj.TotalAmount = obj.BreakfastAmount + obj.LunchAmount + obj.DinnerAmount + obj.LateNightAmount; - lst.Add(obj); - } - // 分页操作 - var startIndex = (request.PageIndex - 1) * request.PageSize; - var pagedData = lst.Skip(startIndex).Take(request.PageSize).ToList(); - - var pagination = new Pagination - { - PageIndex = request.PageIndex, - PageSize = request.PageSize, - Total = lst.Count, // 使用原始列表的总数进行分页 - Data = pagedData - }; - - return pagination; - } - - /// - /// 用餐分析 - /// - /// - /// - public async Task> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request) - { - var pageinfo = await _dbContext.Queryable() - .WhereIF(request.StartDatetime.HasValue, record => record.CostDateTime >= request.StartDatetime) - .WhereIF(request.EndDatetime.HasValue, record => record.CostDateTime <= request.EndDatetime) - .WhereIF(request.BusinessPlaceCode.HasValue, record => record.BusinessPlaceCode == request.BusinessPlaceCode) - .Where(record => record.Type == BalanceRecordTypeEnumType.Out) - .ToListAsync(); - - var lst = new List(); - foreach (var first in pageinfo.GroupBy(record => record.CostDateTime.ToString("yyyy-MM-dd"))) - { - var obj = new BalanceRecordAnalysisRespones - { - CostDate = DateOnly.FromDateTime(Convert.ToDateTime(first.Key)), - //每个餐次人数 - BreakfastNumberOfPeople = first.Where(x => x.ShiftType == ShiftEnumType.Breakfast).Select(x => x.UserNo).Distinct().Count(), - LunchNumberOfPeople = first.Where(x => x.ShiftType == ShiftEnumType.Lunch).Select(x => x.UserNo).Distinct().Count(), - DinnerNumberOfPeople = first.Where(x => x.ShiftType == ShiftEnumType.Dinner).Select(x => x.UserNo).Distinct().Count(), - LateNightNumberOfPeople = first.Where(x => x.ShiftType == ShiftEnumType.Nightsnack).Select(x => x.UserNo).Distinct().Count(), - - TotalNumberOfPeople = first.Where(x => x.CostDate.ToString("yyyy-MM-dd") == first.Key).Select(x => x.UserNo).Distinct().Count() - }; - - lst.Add(obj); - } - // 分页操作 - var startIndex = (request.PageIndex - 1) * request.PageSize; - var pagedData = lst.Skip(startIndex).Take(request.PageSize).ToList(); - - var pagination = new Pagination - { - PageIndex = request.PageIndex, - PageSize = request.PageSize, - Total = lst.Count, // 使用原始列表的总数进行分页 - Data = pagedData - }; - - return pagination; - } - public async Task GetPageByUserAsync(BalanceRecordUserPageRequest request) { var jinkoCode = _currentUser.GetUserClaim("jinko-code") ?? string.Empty; @@ -631,6 +363,7 @@ public class BalanceService : IBalanceService return res; } + /// /// 获取单日消费数据 /// diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs new file mode 100644 index 00000000..e5b4b1cf --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceSummaryService.cs @@ -0,0 +1,52 @@ +using Dlhis.Canteen.Order.Request; +using Dlhis.Canteen.Order.Response; +using Dlhis.Entity.Canteen.Entities; +using Dlhis.Entity.Canteen.Enums; +using Kurisu.Core.CustomClass; +using Kurisu.Core.DataAccess.Dto; +using Kurisu.Core.DataAccess.Extensions; +using Kurisu.SqlSugar.Services; + +namespace Dlhis.Canteen.Order.Services.Implements; + +public class BalanceSummaryService : IBalanceSummaryService +{ + private readonly IDbContext _dbContext; + + public BalanceSummaryService(IDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request) + { + var list = await _dbContext.Queryable() + .WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true && request.SearchDateTimePeriod?.End.HasValue == true, + record => record.CostDate >= request.SearchDateTimePeriod.Start && record.CostDate <= request.SearchDateTimePeriod.End) + .WhereIF(request.BusinessPlaceCode.HasValue, record => record.BusinessPlaceCode == request.BusinessPlaceCode) + .Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid) + .ToListAsync(); + + var shifts = Enum.GetValues().ToList(); + + var page = list.GroupBy(record => record.CostDate).Select(grp => + { + return new BalanceRecordAnalysisResponse + { + Date = DateOnly.FromDateTime(grp.Key), + Items = shifts.Select(shift => + { + return new KeyValueDto + { + Key = shift, + Value = grp.Where(x => x.ShiftType == ShiftEnumType.Breakfast).DistinctBy(x => x.UserNo).Count() + }; + }).ToList(), + Total = grp.Where(x => x.CostDate == grp.Key).DistinctBy(x => x.UserNo).Count() + }; + }) + .ToPage(request); + + return page; + } +} diff --git a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs index de376b0f..c5deb241 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/OrderService.cs @@ -18,6 +18,7 @@ using Dlhis.Canteen.Order.Response; using Dlhis.Canteen.Dishes; using Dlhis.Canteen.Order.Request; using Kurisu.Core.Result; +using Org.BouncyCastle.Asn1.Ocsp; namespace Dlhis.Canteen.Order.Services.Implements; @@ -61,7 +62,7 @@ public class OrderService : BaseOrderService, IOrderService { if (handler.Acquired) { - if (!await DbContext.Queryable().Where(x => x.ThirdNo == request.ThirdNo).AnyAsync()) + if (!await ToCheckAsync(request.ThirdNo)) { try { @@ -128,6 +129,26 @@ public class OrderService : BaseOrderService, IOrderService }; } + private async Task ToCheckAsync(string thirdNo) + { + var order = await DbContext.Queryable() + .Where(x => x.ThirdNo == thirdNo) + .OrderBy(x => x.CreateTime, OrderByType.Desc) + .FirstAsync(); + + if (order == null) + { + return false; + } + + if (!order.IsOffline && order.OrderStatus == CanteenOrderStatusEnumType.Success) + { + return true; + } + + return false; + } + private async Task HandleOfflineAsync(ConsumeRequest request, GainfoEntity gainfo) { diff --git a/Src/Dlhis.Entity/Canteen/Enums/ShiftEnumType.cs b/Src/Dlhis.Entity/Canteen/Enums/ShiftEnumType.cs index 410b9f27..ca0c2e72 100644 --- a/Src/Dlhis.Entity/Canteen/Enums/ShiftEnumType.cs +++ b/Src/Dlhis.Entity/Canteen/Enums/ShiftEnumType.cs @@ -12,29 +12,29 @@ public enum ShiftEnumType /// 早餐 /// [Description("早餐")] - Breakfast = 1, + Breakfast = 10, /// /// 午餐 /// [Description("午餐")] - Lunch = 2, + Lunch = 20, /// /// 晚餐 /// [Description("晚餐")] - Dinner = 3, + Dinner = 30, /// /// 宵夜 /// [Description("宵夜")] - Nightsnack = 4, + Nightsnack = 40, /// /// 凌晨餐 /// [Description("凌晨餐")] - Midnightsnack = 5, + Midnightsnack = 50, } \ No newline at end of file