From e7e186b9a1dec0af0ee2b54747fc0ad3b323f9f9 Mon Sep 17 00:00:00 2001
From: cheche <717840555@qq.com>
Date: Tue, 16 Jan 2024 14:04:03 +0800
Subject: [PATCH] =?UTF-8?q?feat=20=E6=B6=88=E8=B4=B9=E8=AE=B0=E5=BD=95?=
=?UTF-8?q?=E6=9F=A5=E8=AF=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Order/Controllers/BalancesController.cs | 57 ++++
.../Request/BalanceRecordAnalysisRequest.cs | 22 ++
.../BalanceRecordPageByCostIdRequest.cs | 14 +
.../BalanceRecordPageDetailsRequest.cs | 52 +++
.../Request/BalanceRecordSummaryRequest.cs | 39 +++
.../Response/BalanceRecordAnalysisRespones.cs | 37 +++
.../Response/BalanceRecordSummaryRespones.cs | 108 +++++++
.../Order/Services/IBalanceService.cs | 11 +
.../Services/Implements/BalanceService.cs | 302 ++++++++++++++++++
9 files changed, 642 insertions(+)
create mode 100644 Src/Dlhis.Canteen/Order/Request/BalanceRecordAnalysisRequest.cs
create mode 100644 Src/Dlhis.Canteen/Order/Request/BalanceRecordPageByCostIdRequest.cs
create mode 100644 Src/Dlhis.Canteen/Order/Request/BalanceRecordPageDetailsRequest.cs
create mode 100644 Src/Dlhis.Canteen/Order/Request/BalanceRecordSummaryRequest.cs
create mode 100644 Src/Dlhis.Canteen/Order/Response/BalanceRecordAnalysisRespones.cs
create mode 100644 Src/Dlhis.Canteen/Order/Response/BalanceRecordSummaryRespones.cs
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)