2026-02-08 18:09:05 +08:00

163 lines
5.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using YD_Event.Application.Coupon.Dtos;
using YD_Event.Core.Entities;
namespace YD_Event.Application.Coupon;
/// <summary>
/// 优惠券服务
/// </summary>
public class CouponService : BaseService<YD_Event.Core.Entities.Coupon>, ITransient
{
private readonly ISqlSugarRepository<YD_Event.Core.Entities.Coupon> _repository;
private readonly ISqlSugarRepository<EventInfo> _eventRepository;
private readonly IIdGenerator _idGenerator;
public CouponService(
ISqlSugarRepository<YD_Event.Core.Entities.Coupon> repository,
ISqlSugarRepository<EventInfo> eventRepository,
IIdGenerator idGenerator) : base(repository)
{
_repository = repository;
_eventRepository = eventRepository;
_idGenerator = idGenerator;
}
/// <summary>
/// 优惠券分页查询
/// </summary>
[DisplayName("优惠券分页查询")]
public async Task<CouponPageResult> Page(CouponQueryInput input)
{
var query = _repository.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), x => x.Name.Contains(input.Name))
.WhereIF(input.Type.HasValue, x => x.Type == input.Type.Value)
.OrderByDescending(x => x.CreatedTime);
// 先获取实体列表
var entityList = await query.ToPagedListAsync(input);
// 转换并填充赛事名称
var resultList = new List<CouponPageOutput>();
foreach (var item in entityList.Rows)
{
var output = item.Adapt<CouponPageOutput>();
output.EventIds = string.IsNullOrEmpty(item.EventIds)
? new List<long>()
: item.EventIds.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(long.Parse).ToList();
if (output.EventIds.Any())
{
var eventNames = await _eventRepository.AsQueryable()
.Where(x => output.EventIds.Contains(x.Id))
.Select(x => x.EventName)
.ToListAsync();
output.EventNames = string.Join(",", eventNames);
}
else
{
output.EventNames = "通用";
}
resultList.Add(output);
}
return new CouponPageResult
{
PageNo = entityList.PageNo,
PageSize = entityList.PageSize,
Total = entityList.Total,
Rows = resultList,
TotalPage = (int)Math.Ceiling((double)entityList.Total / entityList.PageSize)
};
}
/// <summary>
/// 添加优惠券
/// </summary>
[DisplayName("添加优惠券")]
public async Task Add(AddCouponInput input)
{
var entity = input.Adapt<YD_Event.Core.Entities.Coupon>();
entity.Id = _idGenerator.NextId();
// 处理赛事ID集合
if (input.EventIds != null && input.EventIds.Any())
{
entity.EventIds = string.Join(",", input.EventIds);
}
await _repository.InsertAsync(entity);
}
/// <summary>
/// 更新优惠券
/// </summary>
[DisplayName("更新优惠券")]
public async Task Update(UpdateCouponInput input)
{
var entity = await _repository.GetByIdAsync(input.Id);
if (entity == null) throw Oops.Bah("优惠券不存在");
input.Adapt(entity);
// 处理赛事ID集合
if (input.EventIds != null && input.EventIds.Any())
{
entity.EventIds = string.Join(",", input.EventIds);
}
else
{
entity.EventIds = null;
}
await _repository.UpdateAsync(entity);
}
/// <summary>
/// 删除优惠券
/// </summary>
[DisplayName("删除优惠券")]
public async Task Delete(List<long> ids)
{
if (ids == null || !ids.Any()) return;
await _repository.DeleteAsync(x => ids.Contains(x.Id));
}
/// <summary>
/// 生成兑换码
/// </summary>
[DisplayName("生成兑换码")]
public async Task<string> GenerateCode(long id)
{
var entity = await _repository.GetByIdAsync(id);
if (entity == null) throw Oops.Bah("优惠券不存在");
// 如果已经有码,直接返回;如果没有,生成新的
if (string.IsNullOrWhiteSpace(entity.RedemptionCode))
{
// 简单生成一个随机码,实际业务可能需要更复杂的规则
entity.RedemptionCode = Guid.NewGuid().ToString("N").Substring(0, 8).ToUpper();
await _repository.UpdateAsync(entity);
}
return entity.RedemptionCode;
}
/// <summary>
/// 获取赛事列表(下拉选择用)
/// </summary>
[DisplayName("获取赛事列表")]
public async Task<List<EventSelectOutput>> GetEventList()
{
// 这里可以根据需要过滤赛事状态
return await _eventRepository.AsQueryable()
.Where(x => x.DeleteMark == false)
.OrderByDescending(x => x.CreatedTime)
.Select(x => new EventSelectOutput
{
Id = x.Id,
Name = x.EventName
})
.ToListAsync();
}
}