fix 统计,消费明细

This commit is contained in:
2024-08-15 16:49:50 +08:00
parent 399f89785b
commit 9685845a21
23 changed files with 342 additions and 187 deletions

View File

@@ -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);

View File

@@ -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));

View File

@@ -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,32 +61,9 @@ 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;
}
@@ -92,10 +71,7 @@ public class BalanceSummaryService : IBalanceSummaryService
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));
@@ -128,10 +104,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));
@@ -150,4 +123,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)); //营业点
}
}

View File

@@ -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);
@@ -576,7 +543,6 @@ public class OrderService : BaseOrderService, IOrderService
}
else
{
if (request.IsOffline)
{
if (request.ThirdNo.IsPresent())
@@ -684,7 +650,7 @@ public class OrderService : BaseOrderService, IOrderService
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();