diff --git a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs index e8934f50..4e0f7964 100644 --- a/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs +++ b/Src/Dlhis.Canteen/Order/Controllers/BalancesController.cs @@ -2,6 +2,7 @@ using Dlhis.Canteen.Order.Response; using Dlhis.Canteen.Order.Services; using Kurisu.Core.DataAccess.Dto; +using Kurisu.RemoteCall.Attributes; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -76,4 +77,60 @@ public class BalancesController : ControllerBase { await _balanceService.ObsoluteAsync(request); } + + /// + /// 根据成本中心 + /// + /// + /// + [HttpGet("recordByCostI")] + public async Task> RecordByCostIdAsync([FromQuery] BalanceRecordPageByCostIdRequest request) + { + return await _balanceService.RecordByCostIdAsync(request); + } + + /// + /// 消费明细 + /// + /// + /// + [HttpGet("recordPageDetails")] + public async Task> RecordPageDetailsAsync([FromQuery] BalanceRecordPageDetailsRequest request) + { + return await _balanceService.RecordPageDetailsAsync(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 new file mode 100644 index 00000000..93ee0d3f --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs @@ -0,0 +1,22 @@ +using SqlSugar; + +namespace Dlhis.Canteen.Order.Request +{ + public class BalanceRecordAnalysisRequest + { + /// + /// 开始日期 + /// + public DateTime? StartDatetime { get; set; } + + /// + /// 结束日期 + /// + public DateTime? EndDatetime { get; set; } + + /// + /// 营业点 + /// + public Guid? BusinessPlaceCode { get; set; } + } +} diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs new file mode 100644 index 00000000..37124c20 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs @@ -0,0 +1,14 @@ +using Kurisu.Core.DataAccess.Dto; +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Canteen.Order.Request +{ + public class BalanceRecordPageByCostIdRequest : PageDto + { + /// + /// 成本中心 + /// + [Required(ErrorMessage = "成本中心号不能为空")] + public string CostId { get; set; } + } +} diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageDetailsRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageDetailsRequest.cs new file mode 100644 index 00000000..781776a5 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordPageDetailsRequest.cs @@ -0,0 +1,52 @@ +using Dlhis.Entity.Canteen.Enums; +using Kurisu.Core.DataAccess.Dto; +using SqlSugar; +using SqlSugar.DbConvert; +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Canteen.Order.Request +{ + public class BalanceRecordPageDetailsRequest : PageDto + { + /// + /// 姓名 + /// + public string Name { get; set; } + + /// + /// 部门号 + /// + public string DepartmentNo { get; set; } + + /// + /// 学工号 + /// + public string UserCode { get; set; } + + /// + /// 收入/支出 + /// + [EnumDataType(typeof(BalanceRecordTypeEnumType))] + public BalanceRecordTypeEnumType? Type { get; set; } + + /// + /// 餐次 + /// + public Guid? BusinessShiftCode { get; set; } + + /// + /// 营业点 + /// + public Guid? BusinessPlaceCode { get; set; } + + /// + /// 开始日期 + /// + public DateTime? StartDatetime { get; set; } + + /// + /// 结束日期 + /// + public DateTime? EndDatetime { get; set; } + } +} diff --git a/Src/Dlhis.Canteen/Order/Request/BalanceRecordSummaryRequest.cs b/Src/Dlhis.Canteen/Order/Request/BalanceRecordSummaryRequest.cs new file mode 100644 index 00000000..b208c8bd --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Request/BalanceRecordSummaryRequest.cs @@ -0,0 +1,39 @@ +using Kurisu.Core.DataAccess.Dto; +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Canteen.Order.Request +{ + public class BalanceRecordSummaryRequest : PageDto + { + /// + /// 成本中心 + /// + [Required(ErrorMessage = "成本中心号不能为空")] + public string CostId { get; set; } + + /// + /// 开始日期 + /// + public DateTime? StartDatetime { get; set; } + + /// + /// 结束日期 + /// + public DateTime? EndDatetime { get; set; } + + /// + /// 部门号 + /// + public string DepartmentNo { get; set; } + + /// + /// 学工号 + /// + public string UserCode { get; set; } + + /// + /// 人事范围 + /// + public string OriginTenantId { get; set; } + } +} diff --git a/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs new file mode 100644 index 00000000..885c9684 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs @@ -0,0 +1,37 @@ +using SqlSugar; + +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/BalanceRecordSummaryRespones.cs b/Src/Dlhis.Canteen/Order/Response/BalanceRecordSummaryRespones.cs new file mode 100644 index 00000000..4be9a731 --- /dev/null +++ b/Src/Dlhis.Canteen/Order/Response/BalanceRecordSummaryRespones.cs @@ -0,0 +1,108 @@ +using SqlSugar; + +namespace Dlhis.Canteen.Order.Response +{ + public class BalanceRecordSummaryRespones + { + /// + /// 部门号 + /// + public string DepartmentNo { get; set; } + + /// + /// 成本中心 + /// + public string CostId { get; set; } + + /// + /// 消费者所在基地 + /// + public string OriginTenantId { get; set; } + + /// + /// 早餐人数 + /// + + public int BreakfastNumberOfPeople { get; set; } + + /// + /// 早餐单价price + /// + + public decimal BreakfastPrice { get; set; } + + /// + /// 早餐金额 + /// + + public decimal BreakfastAmount { get; set; } + + /// + /// 午餐人数 + /// + + public int LunchNumberOfPeople { get; set; } + + /// + /// 午餐单价price + /// + + public decimal LunchPrice { get; set; } + + /// + /// 午餐金额 + /// + + public decimal LunchAmount { get; set; } + + /// + /// 晚餐人数 + /// + + public int DinnerNumberOfPeople { get; set; } + + /// + /// 晚餐单价price + /// + + public decimal DinnerPrice { get; set; } + + /// + /// 晚餐金额 + /// + + public decimal DinnerAmount { get; set; } + + /// + /// 宵夜人数 + /// + + public int LateNightNumberOfPeople { get; set; } + + /// + /// 宵夜单价price + /// + + public decimal LateNightPrice { get; set; } + + /// + /// 宵夜金额 + /// + + public decimal LateNightAmount { get; set; } + + /// + /// 总金额 + /// + + public decimal TotalAmount { get; set; } + + /// + /// 总人数 + /// + + public int TotalNumberOfPeople { get; set; } + + + } +} diff --git a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs index f629d00b..4c3bd021 100644 --- a/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/IBalanceService.cs @@ -1,6 +1,7 @@ using Dlhis.Canteen.Order.Request; using Dlhis.Canteen.Order.Response; using Kurisu.Core.DataAccess.Dto; +using Microsoft.AspNetCore.Mvc; namespace Dlhis.Canteen.Order.Services; @@ -13,4 +14,14 @@ public interface IBalanceService : IScopeDependency Task> GetPageByUserAsync(BalanceRecordUserPageRequest request); Task ObsoluteAsync(BalanceRecordObsoluteRequest request); + + Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request); + + Task> RecordPageDetailsAsync(BalanceRecordPageDetailsRequest request); + + Task> BalanceRecordSummaryByNoAsync(BalanceRecordSummaryRequest request); + + Task> BalanceRecordSummaryByTidAsync(BalanceRecordSummaryRequest request); + + 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 7348a454..5da6da22 100644 --- a/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs +++ b/Src/Dlhis.Canteen/Order/Services/Implements/BalanceService.cs @@ -10,7 +10,11 @@ using Kurisu.Core.User.Abstractions; using Kurisu.SqlSugar.Attributes; using Kurisu.SqlSugar.Extensions; using Kurisu.SqlSugar.Services; +using Mapster; +using Microsoft.AspNetCore.Mvc; using SqlSugar; +using System.Linq; +using System.Numerics; namespace Dlhis.Canteen.Order.Services.Implements; @@ -67,6 +71,304 @@ public class BalanceService : IBalanceService return page; } + /// + /// 根据成本中心 + /// + /// + /// + public async Task> RecordByCostIdAsync(BalanceRecordPageByCostIdRequest request) + { + var pageinfo = await _dbContext.Queryable() + .LeftJoin((record, department) => record.DepartmentNo == department.No) + .LeftJoin((record, department, bplace) => record.BusinessPlaceCode == bplace.Code) + .LeftJoin((record, department, bplace, bshift) => record.BusinessShiftCode == bshift.Code) + .Where(record => record.CostId == request.CostId) + .OrderBy(record => record.CreateTime, OrderByType.Desc) + .Select((record, department, bplace, bshift) => new BalanceRecordResponse + { + Id = record.Id, + Amount = record.Amount, + BusinessPlaceCode = record.BusinessPlaceCode, + BusinessShiftCode = record.BusinessShiftCode, + CostDate = record.CostDate, + CostId = record.CostId, + DepartmentNo = record.DepartmentNo, + DeviceInfo = record.DeviceInfo, + IP = record.IP, + UserNo = record.UserNo, + UserCode = record.UserCode, + Type = record.Type, + SubsidiesFromMonth = record.SubsidiesFromMonth, + Status = record.Status, + Source = record.Source, + No = record.No, + IsCostCrossTenant = record.IsCostCrossTenant, + OriginTenantId = record.OriginTenantId, + Name = record.Name, + DepartmentName = department.Name, + BusinessPlaceName = bplace.Name, + BusinessShiftName = bshift.Name, + CostDateTime = record.CreateTime // todo + }) + .ToPageListAsync(request); + + return pageinfo; + } + /// + /// 消费明细 + /// + /// + /// + public async Task> RecordPageDetailsAsync(BalanceRecordPageDetailsRequest request) + { + var paeginfo = await _dbContext.Queryable() + .LeftJoin((record, department) => record.DepartmentNo == department.No) + .LeftJoin((record, department, bplace) => record.BusinessPlaceCode == bplace.Code) + .LeftJoin((record, department, bplace, bshift) => record.BusinessShiftCode == bshift.Code) + .WhereIF(!request.Name.IsEmpty(), record => record.Name == request.Name) + .WhereIF(!request.DepartmentNo.IsEmpty(), record => record.DepartmentNo == request.DepartmentNo) + .WhereIF(!request.UserCode.IsEmpty(), record => record.UserCode == request.UserCode) + .WhereIF(request.Type.HasValue, record => record.Type == request.Type) + .WhereIF(request.BusinessShiftCode.HasValue, record => record.BusinessShiftCode == request.BusinessShiftCode) + .WhereIF(request.BusinessPlaceCode.HasValue, record => record.BusinessPlaceCode == request.BusinessPlaceCode) + .WhereIF(request.StartDatetime.HasValue, record => record.CostDateTime >= request.StartDatetime) + .WhereIF(request.EndDatetime.HasValue, record => record.CostDateTime <= request.EndDatetime) + .OrderBy(record => record.CreateTime, OrderByType.Desc) + .Select((record, department, bplace, bshift) => new BalanceRecordResponse + { + Id = record.Id, + Amount = record.Amount, + BusinessPlaceCode = record.BusinessPlaceCode, + BusinessShiftCode = record.BusinessShiftCode, + CostDate = record.CostDate, + CostId = record.CostId, + DepartmentNo = record.DepartmentNo, + DeviceInfo = record.DeviceInfo, + IP = record.IP, + UserNo = record.UserNo, + UserCode = record.UserCode, + Type = record.Type, + SubsidiesFromMonth = record.SubsidiesFromMonth, + Status = record.Status, + Source = record.Source, + No = record.No, + IsCostCrossTenant = record.IsCostCrossTenant, + OriginTenantId = record.OriginTenantId, + Name = record.Name, + DepartmentName = department.Name, + BusinessPlaceName = bplace.Name, + BusinessShiftName = bshift.Name, + CostDateTime = record.CreateTime // todo + }) + .ToPageListAsync(request); + + return paeginfo; + } + /// + /// 消费汇总 根据部门号 + /// + /// + /// + public async Task> BalanceRecordSummaryByNoAsync(BalanceRecordSummaryRequest request) + { + + var shiftCodeDict = await GetShiftCode(); + + 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) + .Where(record => record.CostId == request.CostId) + .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 + }; + + // 在部门内部再次按照餐次分组 + foreach (var businessShiftGroup in departmentGroup.GroupBy(x => x.BusinessShiftCode)) + { + // 每个餐次人数 + obj.BreakfastNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Breakfast"]); + + obj.LunchNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Lunch"]); + + obj.DinnerNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Dinner"]); + + obj.LateNightNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["LateNight"]); + + // 每个餐次单价 + obj.BreakfastPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Breakfast"]).FirstOrDefault()?.Amount ?? 0; + obj.LunchPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Lunch"]).FirstOrDefault()?.Amount ?? 0; + obj.DinnerPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Dinner"]).FirstOrDefault()?.Amount ?? 0; + obj.LateNightPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["LateNight"]).FirstOrDefault()?.Amount ?? 0; + + // 每个餐次金额 + obj.BreakfastAmount = obj.BreakfastPrice * obj.BreakfastNumberOfPeople; + obj.LunchAmount = obj.LunchNumberOfPeople * obj.LunchPrice; + obj.DinnerAmount = obj.DinnerNumberOfPeople * obj.DinnerPrice; + obj.LateNightAmount = obj.LateNightPrice * obj.LateNightNumberOfPeople; + //obj.BreakfastAmount = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Breakfast"]).Sum(x => x.Amount); + + //obj.LunchAmount = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Lunch"]).Sum(x => x.Amount); + + //obj.DinnerAmount = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Dinner"]).Sum(x => x.Amount); + + //obj.LateNightAmount = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["LateNight"]).Sum(x => x.Amount); + + + + // 每个部门餐次中的 OriginTenantId + obj.OriginTenantId = businessShiftGroup.FirstOrDefault()?.OriginTenantId; + } + + // 总人数 总金额 + obj.TotalNumberOfPeople = obj.BreakfastNumberOfPeople + obj.LunchNumberOfPeople + obj.DinnerNumberOfPeople + obj.LateNightNumberOfPeople; + obj.TotalAmount = obj.BreakfastAmount + obj.LunchAmount + obj.DinnerAmount + obj.LateNightAmount; + lst.Add(obj); + } + + return lst; + } + + /// + /// 消费汇总 根据人事范围 + /// + /// + /// + public async Task> BalanceRecordSummaryByTidAsync(BalanceRecordSummaryRequest request) + { + var shiftCodeDict = await GetShiftCode(); + + 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) + .Where(record => record.CostId == request.CostId) + .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 = originTenantIdGroup.First().DepartmentNo + }; + + // 在人事范围内部再次按照餐次分组 + foreach (var businessShiftGroup in originTenantIdGroup.GroupBy(x => x.BusinessShiftCode)) + { + // 每个餐次人数 + obj.BreakfastNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Breakfast"]); + + obj.LunchNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Lunch"]); + + obj.DinnerNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Dinner"]); + + obj.LateNightNumberOfPeople = businessShiftGroup.Count(x => x.BusinessShiftCode.ToString() == shiftCodeDict["LateNight"]); + + // 每个餐次单价 + obj.BreakfastPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Breakfast"]).FirstOrDefault()?.Amount ?? 0; + obj.LunchPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Lunch"]).FirstOrDefault()?.Amount ?? 0; + obj.DinnerPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["Dinner"]).FirstOrDefault()?.Amount ?? 0; + obj.LateNightPrice = businessShiftGroup.Where(x => x.BusinessShiftCode.ToString() == shiftCodeDict["LateNight"]).FirstOrDefault()?.Amount ?? 0; + + // 每个餐次金额 + obj.BreakfastAmount = obj.BreakfastPrice * obj.BreakfastNumberOfPeople; + obj.LunchAmount = obj.LunchNumberOfPeople * obj.LunchPrice; + obj.DinnerAmount = obj.DinnerNumberOfPeople * obj.DinnerPrice; + obj.LateNightAmount = obj.LateNightPrice * obj.LateNightNumberOfPeople; + + } + + // 总人数 总金额 + obj.TotalNumberOfPeople = obj.BreakfastNumberOfPeople + obj.LunchNumberOfPeople + obj.DinnerNumberOfPeople + obj.LateNightNumberOfPeople; + obj.TotalAmount = obj.BreakfastAmount + obj.LunchAmount + obj.DinnerAmount + obj.LateNightAmount; + lst.Add(obj); + } + + return lst; + } + + private async Task> GetShiftCode() + { + var list = await _dbContext.Queryable().ToListAsync(); + + var shiftCodeDict = new Dictionary(); + + var breakfastCode = list.FirstOrDefault(x => x.Name == "早餐")?.Code.ToString(); + var lunchCode = list.FirstOrDefault(x => x.Name == "午餐")?.Code.ToString(); + var dinnerCode = list.FirstOrDefault(x => x.Name == "晚餐")?.Code.ToString(); + var lateNightCode = list.FirstOrDefault(x => x.Name == "宵夜")?.Code.ToString(); + + shiftCodeDict.Add("Breakfast", breakfastCode); + shiftCodeDict.Add("Lunch", lunchCode); + shiftCodeDict.Add("Dinner", dinnerCode); + shiftCodeDict.Add("LateNight", lateNightCode); + + return shiftCodeDict; + } + + + /// + /// 用餐分析 + /// + /// + /// + public async Task> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request) + { + var shiftCodeDict = await GetShiftCode(); + + + 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).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)), + }; + foreach (var second in first.GroupBy(x=>x.BusinessShiftCode)) + { + + obj.BreakfastNumberOfPeople=second.Count(x=>second.Key.ToString() == shiftCodeDict["Breakfast"]); + + obj.LunchNumberOfPeople = second.Count(x => second.Key.ToString() == shiftCodeDict["Lunch"]); + + obj.DinnerNumberOfPeople = second.Count(x => second.Key.ToString() == shiftCodeDict["Dinner"]); + + obj.LateNightNumberOfPeople = second.Count(x => second.Key.ToString() == shiftCodeDict["LateNight"]); + + } + obj.TotalNumberOfPeople = obj.BreakfastNumberOfPeople + obj.LunchNumberOfPeople + obj.DinnerNumberOfPeople + obj.LateNightNumberOfPeople; + lst.Add(obj); + } + return lst; + } + + + [IgnoreTenant] public async Task> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request)