YD_Event.Admin/YD_Event.Application/Event/EventRegistrationService.cs

229 lines
9.1 KiB
C#
Raw Normal View History

2026-03-08 15:46:19 +08:00
using YD_Event.Application.Event.Dtos;
2026-04-09 09:09:50 +08:00
using YD_Event.Application.Auth;
2026-02-08 18:09:05 +08:00
using YD_Event.Core.Entities;
using MiniExcelLibs;
2026-03-08 15:46:19 +08:00
namespace YD_Event.Application.Event;
2026-02-08 18:09:05 +08:00
/// <summary>
/// 报名管理服务
/// </summary>
public class EventRegistrationService : BaseService<EventRegistration>, ITransient
{
private readonly ISqlSugarRepository<EventRegistration> _repository;
private readonly ISqlSugarRepository<EventRegistrationItem> _itemRepository;
private readonly ISqlSugarRepository<EventRegistrationPerson> _personRepository;
private readonly ISqlSugarRepository<EventRegistrationPayment> _paymentRepository;
2026-04-09 09:09:50 +08:00
private readonly AuthManager _authManager;
2026-02-08 18:09:05 +08:00
public EventRegistrationService(
ISqlSugarRepository<EventRegistration> repository,
ISqlSugarRepository<EventRegistrationItem> itemRepository,
ISqlSugarRepository<EventRegistrationPerson> personRepository,
2026-04-09 09:09:50 +08:00
ISqlSugarRepository<EventRegistrationPayment> paymentRepository,
AuthManager authManager) : base(repository)
2026-02-08 18:09:05 +08:00
{
_repository = repository;
_itemRepository = itemRepository;
_personRepository = personRepository;
_paymentRepository = paymentRepository;
2026-04-09 09:09:50 +08:00
_authManager = authManager;
2026-02-08 18:09:05 +08:00
}
/// <summary>
/// 分页查询报名
/// </summary>
[DisplayName("分页查询报名")]
public async Task<PageResult<RegistrationListOutput>> Page(RegistrationQueryInput input)
{
var query = _repository.AsQueryable()
.WhereIF(input.EventId.HasValue, x => x.EventId == input.EventId)
.WhereIF(input.RegistrationMode.HasValue, x => x.RegistrationMode == input.RegistrationMode)
.WhereIF(!string.IsNullOrWhiteSpace(input.UnitName), x => x.TeamName.Contains(input.UnitName))
.WhereIF(!string.IsNullOrWhiteSpace(input.UserName), x => x.ContactName.Contains(input.UserName))
.WhereIF(!string.IsNullOrWhiteSpace(input.ContactPhone), x => x.ContactPhone.Contains(input.ContactPhone))
.WhereIF(input.IsUploadMaterial.HasValue, x => (input.IsUploadMaterial.Value ? !string.IsNullOrEmpty(x.MaterialUrl) : string.IsNullOrEmpty(x.MaterialUrl)))
.WhereIF(input.PaymentMethod.HasValue, x => x.PaymentMethod == input.PaymentMethod)
.WhereIF(input.PaymentStatus.HasValue, x => x.PaymentStatus == input.PaymentStatus)
.WhereIF(input.RegistrationTimeStart.HasValue, x => x.RegistrationTime >= input.RegistrationTimeStart)
.WhereIF(input.RegistrationTimeEnd.HasValue, x => x.RegistrationTime <= input.RegistrationTimeEnd)
.OrderByDescending(x => x.RegistrationTime)
.Select(x => new RegistrationListOutput
{
Id = x.Id,
RegistrationMode = x.RegistrationMode,
UnitName = x.TeamName,
ContactName = x.ContactName,
ContactPhone = x.ContactPhone,
TotalPersonCount = x.TotalPersonCount,
IsUploadMaterial = !string.IsNullOrEmpty(x.MaterialUrl),
PaymentMethod = x.PaymentMethod,
OrderNo = x.OrderNo,
TotalAmount = x.TotalAmount,
PaymentStatus = x.PaymentStatus,
PaymentProofUrl = x.PaymentProofUrl,
2026-04-09 23:12:51 +08:00
RegistrationTime = x.RegistrationTime
2026-02-08 18:09:05 +08:00
});
var result = await query.ToPagedListAsync(input);
// 填充下拉详情
if (result.Rows.Any())
{
var regIds = result.Rows.Select(x => x.Id).ToList();
var items = await _itemRepository.GetListAsync(x => regIds.Contains(x.RegistrationId));
var persons = await _personRepository.GetListAsync(x => regIds.Contains(x.RegistrationId));
foreach (var dto in result.Rows)
{
var myItems = items.Where(x => x.RegistrationId == dto.Id).ToList();
dto.Items = new List<RegistrationItemDetailDto>();
foreach (var item in myItems)
{
var myPersons = persons.Where(p => p.RegistrationItemId == item.Id).ToList();
// 构造参与人信息字符串
var personInfo = string.Join(";", myPersons.Select(p => $"{p.Name}/{p.Gender}/{p.Age}/{p.IdCard}"));
if (personInfo.Length > 100) personInfo = personInfo.Substring(0, 97) + "..."; // 截断
var detail = new RegistrationItemDetailDto
{
ProjectName = item.ProjectName,
GroupName = item.GroupName,
ParticipantInfo = personInfo
};
dto.Items.Add(detail);
}
}
}
return result;
}
/// <summary>
/// 批量审核
/// </summary>
[UnitOfWork]
[DisplayName("批量审核")]
public async Task BatchAudit(BatchAuditInput input)
{
if (input.Ids == null || !input.Ids.Any()) return;
await _repository.UpdateAsync(x => new EventRegistration
{
2026-04-09 23:12:51 +08:00
PaymentStatus = input.PaymentStatus,
2026-02-08 18:09:05 +08:00
ReviewRemark = input.ReviewRemark,
ReviewTime = DateTime.Now
}, x => input.Ids.Contains(x.Id));
}
/// <summary>
/// 导出报名
/// </summary>
[DisplayName("导出报名")]
public async Task<byte[]> Export(RegistrationQueryInput input)
{
var list = await _repository.AsQueryable()
.WhereIF(input.EventId.HasValue, x => x.EventId == input.EventId)
.WhereIF(input.RegistrationMode.HasValue, x => x.RegistrationMode == input.RegistrationMode)
.WhereIF(!string.IsNullOrWhiteSpace(input.UnitName), x => x.TeamName.Contains(input.UnitName))
.WhereIF(!string.IsNullOrWhiteSpace(input.UserName), x => x.ContactName.Contains(input.UserName))
.WhereIF(!string.IsNullOrWhiteSpace(input.ContactPhone), x => x.ContactPhone.Contains(input.ContactPhone))
.WhereIF(input.PaymentStatus.HasValue, x => x.PaymentStatus == input.PaymentStatus)
.Select(x => new
{
x.RegistrationMode,
x.TeamName,
x.ContactName,
x.ContactPhone,
x.TotalPersonCount,
x.PaymentMethod,
x.TotalAmount,
x.PaymentStatus,
2026-04-09 23:12:51 +08:00
x.RegistrationTime
2026-02-08 18:09:05 +08:00
})
.ToListAsync();
using var stream = new MemoryStream();
stream.SaveAs(list);
return stream.ToArray();
}
2026-03-08 15:46:19 +08:00
/// <summary>
/// 获取素材下载链接
/// </summary>
[DisplayName("获取素材下载链接")]
2026-03-19 23:36:06 +08:00
public async Task<List<string>> MaterialUrls(List<long> ids)
2026-03-08 15:46:19 +08:00
{
if (ids == null || !ids.Any()) return new List<string>();
return await _repository.AsQueryable()
.Where(x => ids.Contains(x.Id) && !string.IsNullOrEmpty(x.MaterialUrl))
.Select(x => x.MaterialUrl)
.ToListAsync();
}
2026-04-09 09:09:50 +08:00
/// <summary>
/// 单条支付审核
/// </summary>
[UnitOfWork]
[DisplayName("单条支付审核")]
public async Task PaymentAudit(PaymentAuditInput input)
{
var registration = await _repository.GetByIdAsync(input.RegistrationId);
if (registration == null) throw Oops.Bah("报名记录不存在");
if (registration.PaymentStatus != 0)
{
throw Oops.Bah("该记录已完成支付审核,无需重复操作");
}
registration.PaymentStatus = input.PaymentStatus;
registration.ReviewRemark = input.ReviewRemark;
registration.ReviewTime = DateTime.Now;
registration.Reviewer = _authManager.Account;
registration.UpdatedTime = DateTime.Now;
registration.UpdatedUserId = _authManager.UserId;
if (input.PaymentStatus == 1)
{
registration.PaymentTime = DateTime.Now;
}
await _repository.UpdateAsync(registration);
}
/// <summary>
/// 批量支付审核
/// </summary>
[UnitOfWork]
[DisplayName("批量支付审核")]
public async Task BatchPaymentAudit(BatchPaymentAuditInput input)
{
if (input.Ids == null || !input.Ids.Any()) return;
var registrations = await _repository.GetListAsync(x => input.Ids.Contains(x.Id));
if (!registrations.Any()) throw Oops.Bah("未找到有效的报名记录");
var invalidRegistrations = registrations
2026-04-09 23:12:51 +08:00
.Where(r => r.PaymentStatus != 0)
2026-04-09 09:09:50 +08:00
.ToList();
if (invalidRegistrations.Any())
{
2026-04-09 23:12:51 +08:00
throw Oops.Bah("存在非待审核状态的记录,无法进行支付审核");
2026-04-09 09:09:50 +08:00
}
var now = DateTime.Now;
await _repository.UpdateAsync(x => new EventRegistration
{
PaymentStatus = input.PaymentStatus,
ReviewRemark = input.ReviewRemark,
ReviewTime = now,
Reviewer = _authManager.Account,
UpdatedTime = now,
UpdatedUserId = _authManager.UserId,
PaymentTime = input.PaymentStatus == 1 ? now : x.PaymentTime
}, x => input.Ids.Contains(x.Id));
}
2026-02-08 18:09:05 +08:00
}