fix 统计,消费明细
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
using Dlhis.Canteen.EMealVoucher.Request;
|
||||
using Dlhis.Canteen.EMealVoucher.Response;
|
||||
using Dlhis.Canteen.EMealVoucher.Services;
|
||||
using Dlhis.Canteen.Order.Request;
|
||||
using Dlhis.Canteen.Order.Response;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
using Kurisu.AspNetCore.DataAccess.SqlSugar.Aop;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
@@ -73,4 +76,16 @@ public class EMealVoucherController : ControllerBase
|
||||
{
|
||||
return await _eMealVoucherService.GetQrCodeAsync(signature);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 餐券消费分页
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("balance/page")]
|
||||
[IgnoreTenant]
|
||||
public async Task<Pagination<BalanceRecordEMealVoucherResponse>> GetEMealVoucherPageAsync([FromQuery] BalanceRecordEMealVoucherPageRequest request)
|
||||
{
|
||||
return await _eMealVoucherService.GetEMealVoucherPageAsync(request);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
using Dlhis.Canteen.EMealVoucher.Request;
|
||||
using Dlhis.Canteen.EMealVoucher.Response;
|
||||
using Dlhis.Canteen.Order.Request;
|
||||
using Dlhis.Canteen.Order.Response;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Dlhis.Canteen.EMealVoucher.Services;
|
||||
|
||||
@@ -15,4 +18,6 @@ public interface IEMealVoucherService : IScopeDependency
|
||||
Task RefreshSignatureAsync(long detailId);
|
||||
|
||||
Task<string> GetQrCodeAsync(string signature);
|
||||
|
||||
Task<Pagination<BalanceRecordEMealVoucherResponse>> GetEMealVoucherPageAsync([FromQuery] BalanceRecordEMealVoucherPageRequest request);
|
||||
}
|
||||
@@ -1,8 +1,13 @@
|
||||
using System.Text;
|
||||
using Dlhis.Canteen.EMealVoucher.Request;
|
||||
using Dlhis.Canteen.EMealVoucher.Response;
|
||||
using Dlhis.Canteen.Order.Request;
|
||||
using Dlhis.Canteen.Order.Response;
|
||||
using Dlhis.Entity.Basic.Entity;
|
||||
using Dlhis.Entity.Canteen.Entities;
|
||||
using Dlhis.Entity.Canteen.Enums;
|
||||
using Kurisu.AspNetCore.Authentication.Abstractions;
|
||||
using Kurisu.AspNetCore.CustomClass;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
|
||||
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
|
||||
@@ -103,4 +108,42 @@ public class EMealVoucherService : IEMealVoucherService
|
||||
|
||||
return qrCode;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<Pagination<BalanceRecordEMealVoucherResponse>> GetEMealVoucherPageAsync(BalanceRecordEMealVoucherPageRequest request)
|
||||
{
|
||||
var tenantId = _currentUser.GetStringTenantId();
|
||||
|
||||
return await _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.LeftJoin<BusinessPlaceEntity>((x, bPlace) => x.BusinessPlaceCode == bPlace.Code)
|
||||
.LeftJoin<DepartmentEntity>((x, bPlace, department) => x.DepartmentNo == department.No)
|
||||
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out) //有效,消费数据
|
||||
.WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End) //成本日期
|
||||
.Where(x => x.Source == BalanceRecordSourceEnumType.EMealVoucher)
|
||||
.Where(x => SqlFunc.Subqueryable<EMealVoucherEntity>().Where(p => p.Factory == tenantId).Where(p => p.Code == x.UserCode).Any() || x.TenantId == tenantId)
|
||||
.Select((x, bPlace, department) => new BalanceRecordEMealVoucherResponse
|
||||
{
|
||||
No = x.No,
|
||||
UserNo = x.UserNo,
|
||||
Name = x.Name,
|
||||
UserCode = x.UserCode,
|
||||
DepartmentNo = x.DepartmentNo,
|
||||
DepartmentName = department.Name,
|
||||
CostDate = x.CostDate,
|
||||
Remark = x.Remark,
|
||||
Source = x.Source,
|
||||
Type = x.Type,
|
||||
Amount = SqlFunc.Abs(x.Amount),
|
||||
BusinessPlaceName = bPlace.Name,
|
||||
ShiftType = x.ShiftType,
|
||||
DeviceInfo = x.DeviceUniqueNo,
|
||||
CostId = x.CostId,
|
||||
OriginTenantId = x.OriginTenantId,
|
||||
Status = x.Status,
|
||||
CostDateTime = x.CostDateTime,
|
||||
Factory = x.TenantId,
|
||||
Werks = x.Werks
|
||||
})
|
||||
.ToPageListAsync(request);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using Dlhis.Canteen.Order.Request;
|
||||
using Dlhis.Canteen.Order.Request.Common;
|
||||
using Dlhis.Canteen.Order.Response;
|
||||
using Dlhis.Canteen.Order.Services;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
@@ -34,12 +35,12 @@ public class BalanceSummaryController : ControllerBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用餐分析(成本中心)
|
||||
/// 餐次用餐分析,统计部门成本中心金额
|
||||
/// </summary>
|
||||
[HttpGet("analysis/cost")]
|
||||
public async Task<Pagination<BalanceRecordAnalysisByCostResponse>> BalanceRecordAnalysisByCostIdAsync()
|
||||
[HttpGet("department/analysis/amount")]
|
||||
public async Task<Pagination<BalanceRecordAnalysisDepartmentResponse>> BalanceRecordAnalysisByCostIdAsync(SummaryCommonDto request)
|
||||
{
|
||||
return await _balanceSummaryService.BalanceRecordAnalysisByCostIdAsync();
|
||||
return await _balanceSummaryService.BalanceRecordAnalysisByCostIdAsync(request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Data;
|
||||
using Dlhis.Canteen.EMealVoucher.Services;
|
||||
using Dlhis.Canteen.Order.Request;
|
||||
using Dlhis.Canteen.Order.Response;
|
||||
using Dlhis.Canteen.Order.Services;
|
||||
|
||||
@@ -1,29 +1,7 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Kurisu.AspNetCore.CustomClass;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
using Dlhis.Canteen.Order.Request.Common;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Request;
|
||||
|
||||
public class BalanceRecordAnalysisByShiftRequest : PageDto, IValidatableObject
|
||||
public class BalanceRecordAnalysisByShiftRequest : SummaryCommonDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 营业点
|
||||
/// </summary>
|
||||
public List<Guid> BusinessPlaceCodes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public DateTimePeriod SearchDateTimePeriod { get; set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
{
|
||||
if (SearchDateTimePeriod is { End: not null })
|
||||
{
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1);
|
||||
}
|
||||
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
@@ -1,25 +1,11 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Kurisu.AspNetCore.CustomClass;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
using Dlhis.Canteen.Order.Request.Common;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Request;
|
||||
|
||||
public class BalanceRecordAnalysisRequest : PageDto, IValidatableObject
|
||||
public class BalanceRecordAnalysisRequest : SummaryCommonDto
|
||||
{
|
||||
public DateTimePeriod SearchDateTimePeriod { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 营业点
|
||||
/// </summary>
|
||||
public Guid? BusinessPlaceCode { get; set; }
|
||||
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
{
|
||||
if (SearchDateTimePeriod is { End: not null })
|
||||
{
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1);
|
||||
}
|
||||
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using Kurisu.AspNetCore.CustomClass;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Request;
|
||||
|
||||
public class BalanceRecordEMealVoucherPageRequest : PageDto
|
||||
{
|
||||
public DateTimePeriod SearchDateTimePeriod { get; set; }
|
||||
}
|
||||
28
Src/Dlhis.Canteen/Order/Request/Common/SummaryCommonDto.cs
Normal file
28
Src/Dlhis.Canteen/Order/Request/Common/SummaryCommonDto.cs
Normal file
@@ -0,0 +1,28 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Kurisu.AspNetCore.CustomClass;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Request.Common;
|
||||
|
||||
public class SummaryCommonDto : PageDto, IValidatableObject
|
||||
{
|
||||
/// <summary>
|
||||
/// 营业点
|
||||
/// </summary>
|
||||
public List<Guid> BusinessPlaceCodes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 日期范围
|
||||
/// </summary>
|
||||
public DateTimePeriod SearchDateTimePeriod { get; set; }
|
||||
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
{
|
||||
if (SearchDateTimePeriod is { End: not null })
|
||||
{
|
||||
SearchDateTimePeriod.End = SearchDateTimePeriod.End.Value.AddDays(1).AddSeconds(-1);
|
||||
}
|
||||
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
namespace Dlhis.Canteen.Order.Response;
|
||||
|
||||
public class BalanceRecordAnalysisByCostResponse
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
namespace Dlhis.Canteen.Order.Response;
|
||||
|
||||
public class BalanceRecordAnalysisDepartmentResponse
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
using Dlhis.Entity.Canteen.Enums;
|
||||
using Kurisu.AspNetCore.Utils.Converters;
|
||||
using Kurisu.AspNetCore.Utils.Extensions;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Dlhis.Canteen.Order.Response;
|
||||
|
||||
public class BalanceRecordEMealVoucherResponse
|
||||
{
|
||||
public long Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 流水号
|
||||
/// </summary>
|
||||
public string No { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 档案号/QRCode
|
||||
/// </summary>
|
||||
public string UserNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 姓名
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 学工号
|
||||
/// </summary>
|
||||
public string UserCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门号
|
||||
/// </summary>
|
||||
public string DepartmentNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 部门
|
||||
/// </summary>
|
||||
public string DepartmentName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 所属成本日期
|
||||
/// </summary>
|
||||
[JsonConverter(typeof(ToDateJsonConverter))]
|
||||
public DateTime CostDate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 来源
|
||||
/// </summary>
|
||||
public BalanceRecordSourceEnumType Source { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消费识别来源
|
||||
/// </summary>
|
||||
public string SourceDesc => Source.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
/// 收入/支出
|
||||
/// </summary>
|
||||
public BalanceRecordTypeEnumType Type { get; set; }
|
||||
|
||||
public string TypeDesc => Type.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
/// 金额
|
||||
/// </summary>
|
||||
public decimal Amount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 营业点
|
||||
/// </summary>
|
||||
public string BusinessPlaceName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 餐次
|
||||
/// </summary>
|
||||
public ShiftEnumType? ShiftType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 餐次
|
||||
/// </summary>
|
||||
public string ShiftTypeDesc => ShiftType?.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
/// 消费机器唯一信息
|
||||
/// </summary>
|
||||
public string DeviceInfo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 成本中心
|
||||
/// </summary>
|
||||
public string CostId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消费者所在基地
|
||||
/// </summary>
|
||||
public string OriginTenantId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据状态
|
||||
/// </summary>
|
||||
public BalanceRecordStatusEnumType Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 数据状态描述
|
||||
/// </summary>
|
||||
public string StatusDesc => Status.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
/// 记录产生时间
|
||||
/// </summary>
|
||||
public DateTime CostDateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 厂区
|
||||
/// </summary>
|
||||
public string Factory { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 人事范围
|
||||
/// </summary>
|
||||
public string Werks { get; set; }
|
||||
}
|
||||
@@ -61,6 +61,9 @@ public class BalanceRecordResponse
|
||||
/// </summary>
|
||||
public BalanceRecordSourceEnumType Source { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消费识别来源
|
||||
/// </summary>
|
||||
public string SourceDesc => Source.GetDescription();
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Dlhis.Canteen.Order.Request;
|
||||
using Dlhis.Canteen.Order.Request.Common;
|
||||
using Dlhis.Canteen.Order.Response;
|
||||
using Kurisu.AspNetCore.DataAccess.Dto;
|
||||
|
||||
@@ -8,7 +9,7 @@ public interface IBalanceSummaryService : IScopeDependency
|
||||
{
|
||||
Task<BalanceRecordAnalysisSummaryResponse> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request);
|
||||
|
||||
Task<Pagination<BalanceRecordAnalysisByCostResponse>> BalanceRecordAnalysisByCostIdAsync();
|
||||
Task<Pagination<BalanceRecordAnalysisDepartmentResponse>> BalanceRecordAnalysisByCostIdAsync(SummaryCommonDto request);
|
||||
|
||||
Task<BalanceRecordAnalysisShiftAmountResponse> BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request);
|
||||
|
||||
|
||||
@@ -52,12 +52,11 @@ public class BalanceService : IBalanceService
|
||||
.LeftJoin<DepartmentEntity>((record, ga, department) => ga.DepartmentNo == department.No)
|
||||
.LeftJoin<BusinessPlaceEntity>((record, ga, department, bPlace) => record.BusinessPlaceCode == bPlace.Code)
|
||||
.LeftJoin<CanteenOrderEntity>((record, ga, department, bPlace, order) => record.No == order.No)
|
||||
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CostDate >= request.SearchDateTimePeriod.Start)
|
||||
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CostDate <= request.SearchDateTimePeriod.End)
|
||||
.WhereIF(request.ShiftTypes.IsPresent(), record => request.ShiftTypes.Contains(record.ShiftType))
|
||||
.WhereIF(request.Type.HasValue, record => record.Type == request.Type)
|
||||
.WhereIF(request.Factory.IsPresent(), record => record.TenantId == request.Factory)
|
||||
.WhereIF(request.Search.IsPresent(), (record, ga) => ga.Code == request.Search)
|
||||
.WhereIF(request.Type.HasValue, record => record.Type == request.Type)
|
||||
.WhereIF(request.SearchDateTimePeriod.HasValue(), record => record.CostDate >= request.SearchDateTimePeriod.Start && record.CostDate <= request.SearchDateTimePeriod.End)
|
||||
.WhereIF(request.ShiftTypes.IsPresent(), record => request.ShiftTypes.Contains(record.ShiftType))
|
||||
.WhereIF(request.Search.IsPresent(), (record, ga) => ga.Code == request.Search || ga.Name == request.Search)
|
||||
.OrderBy(record => record.CreateTime, OrderByType.Desc)
|
||||
.Select((record, ga, department, bPlace, order) => new BalanceRecordResponse
|
||||
{
|
||||
@@ -82,7 +81,7 @@ public class BalanceService : IBalanceService
|
||||
Factory = record.TenantId,
|
||||
ShiftType = record.ShiftType,
|
||||
Remark = record.Remark,
|
||||
Werks = ga.Werks
|
||||
Werks = record.Werks
|
||||
})
|
||||
.ToPageListAsync(request);
|
||||
|
||||
@@ -346,12 +345,11 @@ public class BalanceService : IBalanceService
|
||||
.LeftJoin<GainfoEntity>((record, ga) => record.UserNo == ga.No)
|
||||
.LeftJoin<DepartmentEntity>((record, ga, department) => ga.DepartmentNo == department.No)
|
||||
.LeftJoin<BusinessPlaceEntity>((record, ga, department, bPlace) => record.BusinessPlaceCode == bPlace.Code)
|
||||
.Where(record => record.Type == BalanceRecordTypeEnumType.Out)
|
||||
.Where(record => record.Status == BalanceRecordStatusEnumType.Valid)
|
||||
.WhereIF(request.SearchDateTimePeriod?.Start.HasValue == true, record => record.CostDate >= request.SearchDateTimePeriod.Start)
|
||||
.WhereIF(request.SearchDateTimePeriod?.End.HasValue == true, record => record.CostDate <= request.SearchDateTimePeriod.End)
|
||||
.Where((record, ga) => record.UserCode == jinkoCode)
|
||||
.Where(record => record.Status == BalanceRecordStatusEnumType.Valid && record.Type == BalanceRecordTypeEnumType.Out)
|
||||
.Where(record => record.Source != BalanceRecordSourceEnumType.EMealVoucher) //不展示电子餐券信息
|
||||
.WhereIF(request.SearchDateTimePeriod.HasValue(), record => record.CostDate >= request.SearchDateTimePeriod.Start && record.CostDate <= request.SearchDateTimePeriod.End)
|
||||
.WhereIF(request.ApplicationType.HasValue, record => record.ApplicationType == request.ApplicationType)
|
||||
.Where((record, ga) => ga.Code == jinkoCode)
|
||||
.OrderBy(record => record.CostDateTime)
|
||||
.Select((record, ga, department, bPlace) => new BalanceRecordUserPageResponse
|
||||
{
|
||||
@@ -372,8 +370,8 @@ public class BalanceService : IBalanceService
|
||||
|
||||
var monthSum = await _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.Where(x => x.CostDateTime >= monthStart && x.CostDateTime <= monthEnd)
|
||||
.Where(x => x.Type == BalanceRecordTypeEnumType.Out)
|
||||
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid)
|
||||
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out)
|
||||
.Where(x => x.Source != BalanceRecordSourceEnumType.EMealVoucher)
|
||||
.Where(x => x.UserCode == jinkoCode)
|
||||
.SumAsync(x => SqlFunc.Abs(x.Amount));
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Reflection;
|
||||
using Dlhis.Canteen.Order.Dto;
|
||||
using Dlhis.Canteen.Order.Request;
|
||||
using Dlhis.Canteen.Order.Request.Common;
|
||||
using Dlhis.Canteen.Order.Response;
|
||||
using Dlhis.Entity.Canteen.Entities;
|
||||
using Dlhis.Entity.Canteen.Enums;
|
||||
@@ -23,12 +24,13 @@ public class BalanceSummaryService : IBalanceSummaryService
|
||||
|
||||
public async Task<BalanceRecordAnalysisSummaryResponse> BalanceRecordAnalysisAsync(BalanceRecordAnalysisRequest request)
|
||||
{
|
||||
var list = await _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.WhereIF(request.SearchDateTimePeriod.HasValue(),
|
||||
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();
|
||||
if (request.BusinessPlaceCode.HasValue)
|
||||
{
|
||||
request.BusinessPlaceCodes = new List<Guid> { request.BusinessPlaceCode.Value };
|
||||
}
|
||||
|
||||
var queryable = GetQueryable(request);
|
||||
var list =await queryable.ToListAsync();
|
||||
|
||||
var sum = list.Sum(x => Math.Abs(x.Amount));
|
||||
|
||||
@@ -59,42 +61,16 @@ public class BalanceSummaryService : IBalanceSummaryService
|
||||
}
|
||||
|
||||
|
||||
public async Task<Pagination<BalanceRecordAnalysisByCostResponse>> BalanceRecordAnalysisByCostIdAsync()
|
||||
public async Task<Pagination<BalanceRecordAnalysisDepartmentResponse>> BalanceRecordAnalysisByCostIdAsync(SummaryCommonDto request)
|
||||
{
|
||||
var list = await _dbContext.Queryable<BalanceRecordEntity>()
|
||||
// .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<ShiftEnumType>().ToList();
|
||||
var page = list.GroupBy(record => record.CostDate.Date).Select(grp =>
|
||||
{
|
||||
return new BalanceRecordAnalysisResponse
|
||||
{
|
||||
Date = DateOnly.FromDateTime(grp.Key),
|
||||
Items = shifts.Select(shift =>
|
||||
{
|
||||
return new KeyValueDto<ShiftEnumType, int>
|
||||
{
|
||||
Key = shift,
|
||||
Value = grp.Where(x => x.ShiftType == shift).Select(x => x.UserNo).Distinct().Count()
|
||||
};
|
||||
}).ToList(),
|
||||
Total = grp.Where(x => x.CostDate == grp.Key).Select(x => x.UserNo).Distinct().Count()
|
||||
};
|
||||
}).OrderByDescending(x => x.Date);
|
||||
// var queryable = GetQueryable(request);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public async Task<BalanceRecordAnalysisShiftAmountResponse> BalanceRecordShiftAnalysisAmountAsync(BalanceRecordAnalysisByShiftRequest request)
|
||||
{
|
||||
var queryable = _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out)
|
||||
.WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End)
|
||||
.WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value));
|
||||
var queryable = GetQueryable(request);
|
||||
|
||||
var amount = await queryable.SumAsync(x => SqlFunc.Abs(x.Amount));
|
||||
|
||||
@@ -127,10 +103,7 @@ public class BalanceSummaryService : IBalanceSummaryService
|
||||
|
||||
public async Task<BalanceRecordAnalysisShiftAmountAndCountResponse> BalanceRecordShiftAnalysisAmountAndCountAsync(BalanceRecordAnalysisByShiftRequest request)
|
||||
{
|
||||
var queryable = _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out)
|
||||
.WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End)
|
||||
.WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value));
|
||||
var queryable = GetQueryable(request);
|
||||
|
||||
var amount = await queryable.SumAsync(x => SqlFunc.Abs(x.Amount));
|
||||
|
||||
@@ -149,4 +122,19 @@ public class BalanceSummaryService : IBalanceSummaryService
|
||||
}).ToList()
|
||||
};
|
||||
}
|
||||
|
||||
//**************************************************************help method***********************************************************************
|
||||
|
||||
/// <summary>
|
||||
/// 获取默认查询queryable
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
private ISugarQueryable<BalanceRecordEntity> GetQueryable(SummaryCommonDto request)
|
||||
{
|
||||
return _dbContext.Queryable<BalanceRecordEntity>()
|
||||
.Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Type == BalanceRecordTypeEnumType.Out) //有效,消费数据
|
||||
.WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.CostDate >= request.SearchDateTimePeriod.Start && x.CostDate <= request.SearchDateTimePeriod.End) //成本日期
|
||||
.WhereIF(request.BusinessPlaceCodes?.Any() == true, x => request.BusinessPlaceCodes.Contains(x.BusinessPlaceCode.Value)); //营业点
|
||||
}
|
||||
}
|
||||
@@ -410,40 +410,9 @@ public class OrderService : BaseOrderService, IOrderService
|
||||
/// <returns></returns>
|
||||
private async Task ConsumeAsync(ConsumeRequest request, GainfoEntity gainfo)
|
||||
{
|
||||
var registry = await DbContext.Queryable<DeviceRegistryEntity>().Where(x => x.DeviceUniqueNo == request.DeviceUniqueNo).SingleAsync();
|
||||
registry.ThrowIfNull("设备尚未登记");
|
||||
var checkData = await PreCheckAsync(request.DeviceUniqueNo, request.CostDateTime);
|
||||
|
||||
var device = await DbContext.Queryable<DeviceEntity>().Where(x => x.UniqueNo == request.DeviceUniqueNo).SingleAsync();
|
||||
device.ThrowIfNull("设备尚未登记");
|
||||
device.Enable.ThrowIfFalse("设备已被停用");
|
||||
|
||||
var businessPlaceInfo = await DbContext.Queryable<BusinessPlaceEntity>()
|
||||
.LeftJoin<BusinessPlaceShiftRelationshipEntity>((x, sr) => x.Code == sr.PlaceCode)
|
||||
.Where(x => x.Code == registry.BusinessPlaceCode)
|
||||
.Select((x, sr) => new
|
||||
{
|
||||
x.Code,
|
||||
sr.ShiftCode,
|
||||
x.TenantId
|
||||
})
|
||||
.SingleAsync();
|
||||
|
||||
businessPlaceInfo.ThrowIfNull("设备尚未登记营业点");
|
||||
|
||||
//获取当前消费餐次
|
||||
var shifts = await DbContext.Queryable<BusinessShiftMealRelationshipEntity>().Where(x => x.ShiftCode == businessPlaceInfo.ShiftCode).ToListAsync();
|
||||
shifts.ThrowIfEmpty("营业点餐次尚未设置");
|
||||
|
||||
var shift = shifts.FirstOrDefault(x => new TimePeriod
|
||||
{
|
||||
Start = x.Start,
|
||||
End = x.End
|
||||
}.IsPresent(request.CostDateTime));
|
||||
shift.ThrowIfNull("非就餐时间,无法消费");
|
||||
|
||||
var costDate = await GetCostDateAsync(shift, request.CostDateTime);
|
||||
|
||||
(request.Source == BalanceRecordSourceEnumType.QrCode && businessPlaceInfo.TenantId != gainfo.Factory).ThrowIfTrue("禁止跨厂区消费");
|
||||
(request.Source == BalanceRecordSourceEnumType.QrCode && checkData.BusinessPlaceTenantId != gainfo.Factory).ThrowIfTrue("禁止跨厂区消费");
|
||||
|
||||
var order = new CanteenOrderEntity
|
||||
{
|
||||
@@ -456,30 +425,28 @@ public class OrderService : BaseOrderService, IOrderService
|
||||
UserNo = gainfo.No,
|
||||
UserCode = gainfo.Code,
|
||||
Amount = request.Amount,
|
||||
BusinessPlaceCode = businessPlaceInfo?.Code,
|
||||
BusinessShiftCode = shift?.ShiftCode,
|
||||
ShiftType = shift?.ShiftType,
|
||||
CostDate = costDate.Date,
|
||||
BusinessPlaceCode = checkData.BusinessPlaceCode,
|
||||
BusinessShiftCode = checkData.BusinessShiftCode,
|
||||
ShiftType = checkData.Shift.ShiftType,
|
||||
CostDate = checkData.CostDate,
|
||||
CostId = gainfo.CostId,
|
||||
DepartmentNo = gainfo.DepartmentNo,
|
||||
DeviceUniqueNo = request.DeviceUniqueNo,
|
||||
|
||||
No = SnowFlakeHelper.Instance.NextId().ToString(),
|
||||
IsOffline = request.IsOffline,
|
||||
IsCostCrossTenant = gainfo.Factory != businessPlaceInfo!.TenantId,
|
||||
IsCostCrossTenant = gainfo.Factory != checkData.BusinessPlaceTenantId,
|
||||
|
||||
OriginTenantId = gainfo.Factory,
|
||||
Werks = gainfo.Werks,
|
||||
|
||||
//餐别异常处理
|
||||
Status = shift == null ? BalanceRecordStatusEnumType.Doubtful : BalanceRecordStatusEnumType.Valid,
|
||||
Status = BalanceRecordStatusEnumType.Valid,
|
||||
|
||||
OrderStatus = CanteenOrderStatusEnumType.Wait,
|
||||
|
||||
CostDateTime = request.CostDateTime,
|
||||
|
||||
//标识当前消费的基地
|
||||
TenantId = businessPlaceInfo.TenantId,
|
||||
TenantId = checkData.BusinessPlaceTenantId
|
||||
};
|
||||
|
||||
var orderId = await DbContext.InsertReturnIdentityAsync(order);
|
||||
@@ -714,7 +681,7 @@ public class OrderService : BaseOrderService, IOrderService
|
||||
.Where(x => x.No == no && x.IdNo == idNo).SingleAsync();
|
||||
(nowDate >= current.Start && nowDate <= current.End).ThrowIfFalse("餐券已过期");
|
||||
var time = DateTimeOffset.FromUnixTimeMilliseconds(Convert.ToInt64(ts.Reverse().Join(string.Empty))).ToLocalTime().DateTime;
|
||||
(time.AddMinutes(60) >= DateTime.Now).ThrowIfFalse("二维码已过期");
|
||||
(time.AddMinutes(60) >= DateTime.Now).ThrowIfFalse("餐券二维码已过期");
|
||||
|
||||
var eMealVoucher = await DbContext.Queryable<EMealVoucherEntity>().Where(x => x.No == no).SingleAsync();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user