using YD_Event.Application.Event.Dtos; using YD_Event.Application.Auth; using YD_Event.Core.Entities; using MiniExcelLibs; namespace YD_Event.Application.Event; /// /// 报名管理服务 /// public class EventRegistrationService : BaseService, ITransient { private readonly ISqlSugarRepository _repository; private readonly ISqlSugarRepository _itemRepository; private readonly ISqlSugarRepository _personRepository; private readonly ISqlSugarRepository _paymentRepository; private readonly AuthManager _authManager; public EventRegistrationService( ISqlSugarRepository repository, ISqlSugarRepository itemRepository, ISqlSugarRepository personRepository, ISqlSugarRepository paymentRepository, AuthManager authManager) : base(repository) { _repository = repository; _itemRepository = itemRepository; _personRepository = personRepository; _paymentRepository = paymentRepository; _authManager = authManager; } /// /// 分页查询报名 /// [DisplayName("分页查询报名")] public async Task> 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, RegistrationTime = x.RegistrationTime }); 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(); 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; } /// /// 批量审核 /// [UnitOfWork] [DisplayName("批量审核")] public async Task BatchAudit(BatchAuditInput input) { if (input.Ids == null || !input.Ids.Any()) return; await _repository.UpdateAsync(x => new EventRegistration { PaymentStatus = input.PaymentStatus, ReviewRemark = input.ReviewRemark, ReviewTime = DateTime.Now }, x => input.Ids.Contains(x.Id)); } /// /// 导出报名 /// [DisplayName("导出报名")] public async Task 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, x.RegistrationTime }) .ToListAsync(); using var stream = new MemoryStream(); stream.SaveAs(list); return stream.ToArray(); } /// /// 获取素材下载链接 /// [DisplayName("获取素材下载链接")] public async Task> MaterialUrls(List ids) { if (ids == null || !ids.Any()) return new List(); return await _repository.AsQueryable() .Where(x => ids.Contains(x.Id) && !string.IsNullOrEmpty(x.MaterialUrl)) .Select(x => x.MaterialUrl) .ToListAsync(); } /// /// 单条支付审核 /// [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); } /// /// 批量支付审核 /// [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 .Where(r => r.PaymentStatus != 0) .ToList(); if (invalidRegistrations.Any()) { throw Oops.Bah("存在非待审核状态的记录,无法进行支付审核"); } 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)); } }