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