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 }; } }