using YD_Event.Application.Points.Dtos;
using YD_Event.Core.Entities;
using YD_Event.Core.Enum;
namespace YD_Event.Application.Points;
///
/// 积分记录管理
///
public class PointsRecordService : BaseService, ITransient
{
private readonly ISqlSugarRepository _repository;
public PointsRecordService(ISqlSugarRepository repository) : base(repository)
{
_repository = repository;
}
///
/// 积分记录分页查询
///
[DisplayName("积分记录分页查询")]
[HttpGet]
public async Task> Page([FromQuery] PointsRecordQueryInput input)
{
return await _repository.AsQueryable()
.LeftJoin((r, u) => r.UserId == u.Id)
.WhereIF(input.UserId.HasValue, (r, u) => r.UserId == input.UserId)
.WhereIF(input.Type.HasValue, (r, u) => r.Type == input.Type)
.WhereIF(input.StartTime.HasValue, (r, u) => r.CreatedTime >= input.StartTime)
.WhereIF(input.EndTime.HasValue, (r, u) => r.CreatedTime <= input.EndTime)
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), (r, u) =>
u.Name.Contains(input.Keyword) ||
u.Mobile.Contains(input.Keyword) ||
u.Account.Contains(input.Keyword))
.OrderByDescending((r, u) => r.CreatedTime)
.Select((r, u) => new PointsRecordPageOutput
{
Id = r.Id,
UserId = r.UserId,
UserName = u.Name,
Phone = u.Mobile,
IdCard = "",
Type = r.Type,
Action = r.Action,
Item = r.Item,
Group = r.Group,
Points = r.Points,
CreatedTime = r.CreatedTime
})
.ToPagedListAsync(input);
}
///
/// 积分统计
///
[DisplayName("积分统计")]
[HttpGet("stats")]
public async Task Stats([FromQuery] PointsRecordQueryInput input)
{
var query = _repository.AsQueryable()
.LeftJoin((r, u) => r.UserId == u.Id)
.WhereIF(input.UserId.HasValue, (r, u) => r.UserId == input.UserId)
.WhereIF(input.Type.HasValue, (r, u) => r.Type == input.Type)
.WhereIF(input.StartTime.HasValue, (r, u) => r.CreatedTime >= input.StartTime)
.WhereIF(input.EndTime.HasValue, (r, u) => r.CreatedTime <= input.EndTime)
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), (r, u) =>
u.Name.Contains(input.Keyword) ||
u.Mobile.Contains(input.Keyword));
var given = await query.Clone().Where((r, u) => r.Type == PointsOperationType.Acquire).SumAsync((r, u) => r.Points);
var consumed = await query.Clone().Where((r, u) => r.Type == PointsOperationType.Consume).SumAsync((r, u) => r.Points);
return new PointsStatsOutput
{
TotalPointsGiven = given,
TotalPointsConsumed = consumed
};
}
}