using Furion.FriendlyException;
using Microsoft.Extensions.Logging;
using YD_Event.Application.Points.Dtos;
using YD_Event.Core.Entities;
namespace YD_Event.Application.Points;
///
/// 积分规则管理
///
public class PointsRuleService : BaseService, ITransient
{
private readonly ISqlSugarRepository _repository;
private readonly ISqlSugarRepository _detailRepository;
private readonly ISqlSugarRepository _pointsRecordRepository;
private readonly IIdGenerator _idGenerator;
private readonly Microsoft.Extensions.Logging.ILogger _logger;
public PointsRuleService(ISqlSugarRepository repository,
ISqlSugarRepository detailRepository,
ISqlSugarRepository pointsRecordRepository,
IIdGenerator idGenerator,
Microsoft.Extensions.Logging.ILogger logger) : base(repository)
{
_repository = repository;
_detailRepository = detailRepository;
_pointsRecordRepository = pointsRecordRepository;
_idGenerator = idGenerator;
_logger = logger;
}
///
/// 积分规则分页查询
///
[DisplayName("积分规则分页查询")]
[HttpGet]
public async Task> Page([FromQuery] PointsRuleQueryInput input)
{
return await _repository.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.RuleName), x => x.RuleName.Contains(input.RuleName))
.OrderByDescending(x => x.CreatedTime)
.ToPagedListAsync(input);
}
///
/// 添加积分规则
///
[DisplayName("添加积分规则")]
[HttpPost("add")]
[UnitOfWork]
public async Task Add(AddPointsRuleInput input)
{
ValidateRankDetails(input.Details);
var entity = input.Adapt();
entity.Id = _idGenerator.NextId();
await _repository.InsertAsync(entity);
if (input.Details != null && input.Details.Any())
{
var details = input.Details.Adapt>();
details.ForEach(x =>
{
x.PointsRuleId = entity.Id;
x.Id = _idGenerator.NextId();
});
await _detailRepository.InsertRangeAsync(details);
}
}
///
/// 更新积分规则
///
[DisplayName("更新积分规则")]
[HttpPut("edit")]
[UnitOfWork]
public async Task Update(UpdatePointsRuleInput input)
{
var entity = await _repository.GetByIdAsync(input.Id);
if (entity == null) throw Oops.Bah("规则不存在");
ValidateRankDetails(input.Details);
input.Adapt(entity);
await _repository.UpdateAsync(entity);
// Update details: Delete old, Insert new
await _detailRepository.DeleteAsync(x => x.PointsRuleId == entity.Id);
if (input.Details != null && input.Details.Any())
{
var details = input.Details.Adapt>();
details.ForEach(x =>
{
x.PointsRuleId = entity.Id;
x.Id = _idGenerator.NextId();
});
await _detailRepository.InsertRangeAsync(details);
}
}
///
/// 验证名次积分详情是否有重叠
///
private void ValidateRankDetails(List? details)
{
if (details == null || details.Count <= 1)
return;
for (int i = 0; i < details.Count; i++)
{
var item1 = details[i];
for (int j = i + 1; j < details.Count; j++)
{
var item2 = details[j];
// 检查是否重叠:两个区间 [s1, e1] 和 [s2, e2] 不重叠的条件是 e1 < s2 或 e2 < s1
bool isOverlap = !(item1.EndRank < item2.StartRank || item2.EndRank < item1.StartRank);
if (isOverlap)
{
throw Oops.Bah($"名次范围 {item1.StartRank}-{item1.EndRank} 与 {item2.StartRank}-{item2.EndRank} 存在重叠,请调整!");
}
}
}
}
///
/// 删除积分规则
///
[DisplayName("删除积分规则")]
[HttpPost("delete")]
[UnitOfWork]
public async Task Delete([FromBody] List ids)
{
_logger.LogInformation("开始删除积分规则:规则ID列表={Ids}", string.Join(",", ids ?? new List()));
if (ids == null || !ids.Any())
{
_logger.LogWarning("删除积分规则失败:未选择积分规则");
return;
}
// 执行删除
await _repository.DeleteAsync(x => ids.Contains(x.Id));
await _detailRepository.DeleteAsync(x => ids.Contains(x.PointsRuleId));
_logger.LogInformation("删除积分规则成功:规则ID列表={Ids}", string.Join(",", ids));
}
///
/// 获取积分规则详情
///
[DisplayName("获取积分规则详情")]
[HttpGet("detail")]
public async Task Detail([FromQuery] long id)
{
var entity = await _repository.GetByIdAsync(id);
if (entity == null) throw Oops.Bah("规则不存在");
entity.Details = await _detailRepository.AsQueryable().Where(x => x.PointsRuleId == id).ToListAsync();
return entity;
}
}