Files
jinko.yikatong/Src/Dlhis.Middle/Services/Implements/BalanceService.cs
2024-08-28 11:50:30 +08:00

102 lines
4.4 KiB
C#

using Dlhis.Entity.Basic.Entity;
using Dlhis.Entity.Canteen.Enums;
using Dlhis.Middle.Entities;
using Dlhis.Middle.Request;
using Dlhis.Middle.Response;
using Kurisu.AspNetCore.DataAccess.Dto;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions;
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
using Kurisu.AspNetCore.Utils.Extensions;
using SqlSugar;
namespace Dlhis.Middle.Services.Implements;
public class BalanceService : IBalanceService
{
private readonly IDbContext _dbContext;
private readonly ICanteenSettingService _canteenSettingService;
public BalanceService(IDbContext dbContext, ICanteenSettingService canteenSettingService)
{
_dbContext = dbContext;
_canteenSettingService = canteenSettingService;
}
/// <inheritdoc />
public async Task<Pagination<BalanceRecordDeviceResponse>> GetPageByDeviceUniqueNoAsync(BalanceRecordPageByDeviceUniqueNoRequest request)
{
var device = await _dbContext.Queryable<LocalDeviceEntity>()
.Where(x => x.UniqueNo == request.DeviceUniqueNo)
.SingleAsync();
if (device == null)
{
return new Pagination<BalanceRecordDeviceResponse>
{
Data = new List<BalanceRecordDeviceResponse>()
};
}
if (request.SearchDate.HasValue)
{
request.Start = request.SearchDate;
request.End = request.SearchDate;
}
var switchTime = await _canteenSettingService.GetBusinessSwitchTimeAsync(device.TenantId);
if (switchTime.HasValue)
{
var setTime = request.Start!.Value.Add(switchTime.Value.ToTimeSpan());
if (DateTime.Now < setTime)
{
request.Start = request.Start.Value.AddDays(-1);
request.End = request.End!.Value.AddDays(-1);
}
}
var page = await _dbContext.Queryable<LocalBalanceRecordEntity>()
.LeftJoin<LocalGainfoEntity>((record, ga) => record.UserNo == ga.No)
.LeftJoin<LocalDepartmentEntity>((record, ga, department) => ga.DepartmentNo == department.No)
.LeftJoin<LocalBusinessPlaceEntity>((record, ga, department, bPlace) => record.BusinessPlaceCode == bPlace.Code)
//.LeftJoin<ImageRecordEntity>((record, ga, department, bPlace, imageRecord) => imageRecord.No == record.No)
.Where(record => record.DeviceUniqueNo == device.UniqueNo)
.Where(record => record.CostDate >= request.Start && record.CostDate <= request.End)
.Where(record => record.Type == BalanceRecordTypeEnumType.Out
&& (record.Status == BalanceRecordStatusEnumType.Valid || (record.Status == BalanceRecordStatusEnumType.Obsolute && record.Remark == "退款")))
.WhereIF(request.UserCode.IsPresent(), record => record.UserCode == request.UserCode)
.OrderBy(record => record.CostDateTime, OrderByType.Desc)
.Select((record, ga, department, bPlace) => new BalanceRecordDeviceResponse
{
Id = record.Id,
Amount = SqlFunc.Abs(record.Amount),
CostDate = record.CostDate,
DepartmentNo = record.DepartmentNo,
UserNo = record.UserNo,
UserCode = record.UserCode,
Type = record.Type,
Status = record.Status,
Source = record.Source,
No = SqlFunc.IIF(record.Status == BalanceRecordStatusEnumType.Obsolute && record.Remark == "退款", "(已退)" + record.No, record.No),
Name = record.Name,
DepartmentName = department.Name,
BusinessPlaceName = bPlace.Name,
ShiftType = record.ShiftType,
CostDateTime = record.CostDateTime,
TenantId = record.TenantId,
Image = string.Empty
})
.ToPageListAsync(request);
//消费总金额
var sum = await _dbContext.Queryable<LocalBalanceRecordEntity>()
.Where(record => record.CostDate >= request.Start && record.CostDate <= request.End)
.Where(record => record.DeviceUniqueNo == device.UniqueNo)
.Where(record => record.Type == BalanceRecordTypeEnumType.Out && record.Status == BalanceRecordStatusEnumType.Valid)
.SumAsync(record => SqlFunc.Abs(SqlFunc.IsNull(record.Amount, 0)));
page.Data.ForEach(x => x.Sum = sum);
return page;
}
}