修复bug

This commit is contained in:
马梓彭 2026-04-05 20:58:17 +08:00
parent 400e366ce2
commit fec7b59a8b
6 changed files with 437 additions and 98 deletions

View File

@ -687,9 +687,9 @@ public class RegistrationItemDTO
public string TeamName { get; set; }
/// <summary>
/// 综合状态描述 (待付款, 待上传素材, 已取消, 已报名, 待审核)
/// 综合状态 (0-待付款, 1-已支付, 2-已取消, 3-已退款, 4-已完成)
/// </summary>
public string Status { get; set; }
public int Status { get; set; }
/// <summary>
/// 创建时间
@ -702,14 +702,14 @@ public class RegistrationItemDTO
public DateTime? UpdateTime { get; set; }
/// <summary>
/// 支付状态
/// 支付状态 (0-未支付, 1-已支付, 2-已取消, 3-已退款, 4-待审核)
/// </summary>
public string PayStatus { get; set; }
public int PayStatus { get; set; }
/// <summary>
/// 证书状态
/// </summary>
public string CertStatus { get; set; }
public int CertStatus { get; set; }
/// <summary>
/// 是否有素材

View File

@ -72,47 +72,6 @@ public class UserEventRecordService : IDynamicApiController, ITransient
public async Task<PageResult<RegistrationItemDTO>> GetRegistrationList([FromQuery] RegistrationListQueryInput input)
{
var userId = _authManager.UserId;
var query = _registrationRepository.AsQueryable()
.InnerJoin<EventInfo>((r, e) => r.EventId == e.Id)
.Where((r, e) => r.CreatedUserId == userId && !r.DeleteMark)
.WhereIF(input.EventId.HasValue, (r, e) => r.EventId == input.EventId)
.WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), (r, e) => r.TeamName.Contains(input.Keyword) || e.EventName.Contains(input.Keyword))
.OrderByDescending((r, e) => r.CreatedTime)
.Select((r, e) => new RegistrationItemDTO
{
RegistrationId = r.Id,
EventName = e.EventName,
TeamName = r.TeamName,
CreateTime = r.CreatedTime,
UpdateTime = r.UpdatedTime,
PayStatus = r.PaymentStatus == 1 ? "已支付" : "待付款", // 简化映射
CertStatus = "未颁发", // 暂无证书逻辑
HasMaterial = SqlFunc.HasValue(r.MaterialUrl),
HasVoucher = SqlFunc.HasValue(r.PaymentProofUrl),
MemberCount = r.TotalPersonCount,
MaxMember = 10, // 假设
ExpireTime = e.MaterialUploadEndTime
});
// 这里需要先把数据查出来再做复杂的状态转换,因为 SqlSugar Select 中不能写太复杂的 switch
var pagedResult = await query.ToPagedListAsync(input);
// 二次处理状态描述
foreach (var item in pagedResult.Rows)
{
// 状态映射逻辑
// status ∈ (待付款, 待上传素材, 已取消, 已报名, 待审核)
// 假设:RegStatus=4 -> 已取消
// RegStatus=1 -> 待审核
// PayStatus=0 -> 待付款
// PayStatus=1 && !HasMaterial -> 待上传素材
// PayStatus=1 && HasMaterial -> 已报名
// 注意:这里需要再次查询原始状态值才能准确判断,上面的Select只映射了部分。
// 优化:Select时把原始状态值带出来
// 重新查询一遍原始数据比较准确
}
// 重新构建查询以支持复杂逻辑
var list = await _registrationRepository.AsQueryable()
.InnerJoin<EventInfo>((r, e) => r.EventId == e.Id)
@ -128,23 +87,33 @@ public class UserEventRecordService : IDynamicApiController, ITransient
.ToPagedListAsync(input);
var resultItems = list.Rows.Select(x => {
string statusDesc = "未知";
if (x.RegistrationStatus == 4) statusDesc = "已取消";
else if (x.RegistrationStatus == 1) statusDesc = "待审核"; // 假设1是待审核
else if (x.PaymentStatus == 0) statusDesc = "待付款";
else if (x.PaymentStatus == 1 && string.IsNullOrEmpty(x.MaterialUrl)) statusDesc = "待上传素材";
else if (x.PaymentStatus == 1 && !string.IsNullOrEmpty(x.MaterialUrl)) statusDesc = "已报名"; // 或已完成
// 计算综合状态
int statusValue = 0;
if (x.RegistrationStatus == 4)
statusValue = 2; // 已取消
else if (x.RegistrationStatus == 1)
statusValue = 1; // 已支付/待审核
else if (x.PaymentStatus == 0)
statusValue = 0; // 待付款
else if (x.PaymentStatus == 1 && string.IsNullOrEmpty(x.MaterialUrl))
statusValue = 1; // 已支付
else if (x.PaymentStatus == 1 && !string.IsNullOrEmpty(x.MaterialUrl))
statusValue = 4; // 已完成/已报名
else if (x.PaymentStatus == 3)
statusValue = 3; // 已退款
else if (x.PaymentStatus == 4)
statusValue = 1; // 待审核
return new RegistrationItemDTO
{
RegistrationId = x.Id,
EventName = x.EventName,
TeamName = x.TeamName,
Status = statusDesc,
Status = statusValue,
CreateTime = x.CreatedTime,
UpdateTime = x.UpdatedTime,
PayStatus = x.PaymentStatus == 1 ? "已支付" : (x.PaymentStatus == 4 ? "待审核" : "待付款"),
CertStatus = "未颁发",
PayStatus = x.PaymentStatus,
CertStatus = 0, // 未颁发
HasMaterial = !string.IsNullOrEmpty(x.MaterialUrl),
HasVoucher = !string.IsNullOrEmpty(x.PaymentProofUrl),
MemberCount = x.TotalPersonCount,

View File

@ -270,10 +270,10 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient
return new UserEventProjectGroupOutput
{
Id = eg.Id,
GroupName = baseGroup?.GroupName,
BirthDateStart = baseGroup?.BirthDateStart,
BirthDateEnd = baseGroup?.BirthDateEnd,
Gender = baseGroup?.Gender.ToString()
GroupName = eg.GroupName ?? baseGroup?.GroupName,
BirthDateStart = eg.BirthDateStart != DateTime.MinValue ? eg.BirthDateStart : baseGroup?.BirthDateStart,
BirthDateEnd = eg.BirthDateEnd != DateTime.MinValue ? eg.BirthDateEnd : baseGroup?.BirthDateEnd,
Gender = eg.Gender.ToString()
};
}).ToList();
@ -367,10 +367,10 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient
return new UserEventProjectGroupOutput
{
Id = eg.Id,
GroupName = baseGroup?.GroupName,
BirthDateStart = baseGroup?.BirthDateStart,
BirthDateEnd = baseGroup?.BirthDateEnd,
Gender = baseGroup?.Gender.ToString()
GroupName = eg.GroupName ?? baseGroup?.GroupName,
BirthDateStart = eg.BirthDateStart != DateTime.MinValue ? eg.BirthDateStart : baseGroup?.BirthDateStart,
BirthDateEnd = eg.BirthDateEnd != DateTime.MinValue ? eg.BirthDateEnd : baseGroup?.BirthDateEnd,
Gender = eg.Gender.ToString()
};
}).ToList();
@ -429,6 +429,34 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient
var eventInfo = await _eventRepository.GetByIdAsync(input.EventId);
if (eventInfo == null) throw Oops.Bah("赛事不存在");
// 验证1:一次报名只能选择一个项目
if (input.ProjectIds != null && input.ProjectIds.Count > 1)
{
throw Oops.Bah("一次报名只能选择一个项目");
}
// 验证2:一次报名只能选择单个团队内的运动员
if (input.MemberIds != null && input.MemberIds.Count > 0)
{
// 获取所有队员的团队ID
var teamMembers = await _db.Queryable<TeamMember>()
.Where(tm => input.MemberIds.Contains(tm.UserId))
.Where(tm => !tm.DeleteMark)
.ToListAsync();
if (teamMembers == null || teamMembers.Count == 0)
{
throw Oops.Bah("未找到队员信息");
}
// 检查所有队员是否属于同一个团队
var teamIds = teamMembers.Select(tm => tm.TeamId).Distinct().ToList();
if (teamIds.Count > 1)
{
throw Oops.Bah("一次报名只能选择单个团队内的运动员");
}
}
var registration = await _registrationRepository.GetFirstAsync(x => x.EventId == input.EventId && x.CreatedUserId == userId && !x.DeleteMark);
@ -1126,22 +1154,25 @@ public class UserEventRegistrationService : IDynamicApiController, ITransient
if (eventProjectGroup != null)
{
var projectGroup = await _projectGroupRepository.GetByIdAsync(eventProjectGroup.ProjectGroupId);
if (projectGroup != null)
// 优先使用EventProjectGroup中保存的信息,如果没有则使用原始ProjectGroup的信息
var birthDateStart = eventProjectGroup.BirthDateStart != DateTime.MinValue ? eventProjectGroup.BirthDateStart : (projectGroup?.BirthDateStart ?? DateTime.MinValue);
var birthDateEnd = eventProjectGroup.BirthDateEnd != DateTime.MinValue ? eventProjectGroup.BirthDateEnd : (projectGroup?.BirthDateEnd ?? DateTime.MaxValue);
var gender = eventProjectGroup.Gender;
var birthDate = member.BirthDate.Value;
if (birthDate < birthDateStart || birthDate > birthDateEnd)
{
var birthDate = member.BirthDate.Value;
if (birthDate < projectGroup.BirthDateStart || birthDate > projectGroup.BirthDateEnd)
{
result.AgeValid = false;
result.IsValid = false;
result.Message = "队员年龄不符合组别要求";
}
result.AgeValid = false;
result.IsValid = false;
result.Message = "队员年龄不符合组别要求";
}
if (projectGroup.Gender != member.Gender && projectGroup.Gender != Gender.Unknown)
{
result.GenderValid = false;
result.IsValid = false;
result.Message = "队员性别不符合组别要求";
}
if (gender != member.Gender && gender != Gender.Unknown && gender != Gender.All)
{
result.GenderValid = false;
result.IsValid = false;
result.Message = "队员性别不符合组别要求";
}
}

View File

@ -1,4 +1,7 @@
using System.Text;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.Drawing;
using YD_Event.Application.Auth;
using YD_Event.Application.Order.Dtos;
using YD_Event.Core.Entities;
@ -167,6 +170,12 @@ public class OrderService : BaseService<YD_Event.Core.Entities.Order>, ITransien
.LeftJoin<YD_Event.Core.Entities.Merchant>((o, e, m) => o.MerchantId == m.Id)
.LeftJoin<EventRegistration>((o, e, m, r) => o.RegistrationId == r.Id)
.LeftJoin<YD_Event.Core.Entities.Order>((o, e, m, r, ro) => o.RelatedOrderId == ro.Id) // Join self for Related Order No
// 默认只显示已完成支付流程的订单(已支付、已发货、已完成、已退款)
.WhereIF(!input.OrderStatus.HasValue, (o, e, m, r, ro) =>
o.OrderStatus == OrderStatus.Paid ||
o.OrderStatus == OrderStatus.Shipped ||
o.OrderStatus == OrderStatus.Completed ||
o.OrderStatus == OrderStatus.Refunded)
.WhereIF(!string.IsNullOrWhiteSpace(input.OrderNo), (o, e, m, r, ro) => o.OrderNo.Contains(input.OrderNo))
.WhereIF(!string.IsNullOrWhiteSpace(input.EventName), (o, e, m, r, ro) => e.EventName.Contains(input.EventName))
.WhereIF(input.OrderType.HasValue, (o, e, m, r, ro) => o.OrderType == input.OrderType)
@ -382,6 +391,12 @@ public class OrderService : BaseService<YD_Event.Core.Entities.Order>, ITransien
.LeftJoin<YD_Event.Core.Entities.Merchant>((o, e, m) => o.MerchantId == m.Id)
.LeftJoin<EventRegistration>((o, e, m, r) => o.RegistrationId == r.Id)
.LeftJoin<YD_Event.Core.Entities.Order>((o, e, m, r, ro) => o.RelatedOrderId == ro.Id)
// 默认只导出已完成支付流程的订单(已支付、已发货、已完成、已退款)
.WhereIF(!input.OrderStatus.HasValue, (o, e, m, r, ro) =>
o.OrderStatus == OrderStatus.Paid ||
o.OrderStatus == OrderStatus.Shipped ||
o.OrderStatus == OrderStatus.Completed ||
o.OrderStatus == OrderStatus.Refunded)
.WhereIF(!string.IsNullOrWhiteSpace(input.OrderNo), (o, e, m, r, ro) => o.OrderNo.Contains(input.OrderNo))
.WhereIF(!string.IsNullOrWhiteSpace(input.EventName), (o, e, m, r, ro) => e.EventName.Contains(input.EventName))
.WhereIF(input.OrderType.HasValue, (o, e, m, r, ro) => o.OrderType == input.OrderType)
@ -418,26 +433,133 @@ public class OrderService : BaseService<YD_Event.Core.Entities.Order>, ITransien
})
.ToListAsync();
// Calculate Summary
decimal totalOriginal = list.Sum(x => x.OriginalAmount);
decimal totalDiscount = list.Sum(x => x.DiscountAmount);
decimal totalRefund = list.Where(x => x.OrderType == "退款").Sum(x => x.ActualAmount);
decimal totalActual = list.Where(x => x.OrderType == "收入").Sum(x => x.ActualAmount);
var sb = new StringBuilder();
// Summary Row
sb.AppendLine($"汇总信息: 原金额:{totalOriginal}, 优惠金额:{totalDiscount}, 退款金额:{totalRefund}, 实付金额:{totalActual}");
sb.AppendLine("订单编号,单位名称,所属赛事,订单类型,关联订单,支付方式,报名方式,报名用户,报名账号,原金额,优惠金额,实付/退款金额,订单状态,生成时间");
var bytes = await GenerateOrderExcelAsync(list);
foreach (var item in list)
return new FileContentResult(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
sb.AppendLine($"{item.OrderNo},{item.UnitName},{item.EventName},{item.OrderType},{item.RelatedOrderNo},{item.PaymentMethod},{item.RegistrationMode},{item.ContactName},{item.ContactPhone},{item.OriginalAmount},{item.DiscountAmount},{item.ActualAmount},{item.OrderStatusText},{item.CreatedTime}");
}
var bytes = Encoding.UTF8.GetBytes(sb.ToString());
return new FileContentResult(bytes, "text/csv")
{
FileDownloadName = $"Orders_{DateTime.Now:yyyyMMddHHmmss}.csv"
FileDownloadName = $"订单列表_{DateTime.Now:yyyyMMddHHmmss}.xlsx"
};
}
/// <summary>
/// 生成订单Excel文件
/// </summary>
private async Task<byte[]> GenerateOrderExcelAsync(List<OrderListOutput> orders)
{
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
using var package = new ExcelPackage();
var worksheet = package.Workbook.Worksheets.Add("订单列表");
var rowIndex = 1;
// 计算汇总数据
var totalOriginal = orders.Sum(x => x.OriginalAmount);
var totalDiscount = orders.Sum(x => x.DiscountAmount);
var totalRefund = orders.Where(x => x.OrderType == "退款").Sum(x => x.ActualAmount);
var totalActual = orders.Where(x => x.OrderType == "收入").Sum(x => x.ActualAmount);
// 汇总信息行
var summaryRange = worksheet.Cells[rowIndex, 1, rowIndex, 14];
summaryRange.Merge = true;
summaryRange.Value = $"汇总信息: 原金额:{totalOriginal}, 优惠金额:{totalDiscount}, 退款金额:{totalRefund}, 实付金额:{totalActual}";
var summaryStyle = summaryRange.Style;
summaryStyle.Font.Bold = true;
summaryStyle.Font.Size = 12;
summaryStyle.HorizontalAlignment = ExcelHorizontalAlignment.Center;
summaryStyle.VerticalAlignment = ExcelVerticalAlignment.Center;
summaryStyle.Fill.PatternType = ExcelFillStyle.Solid;
summaryStyle.Fill.BackgroundColor.SetColor(Color.LightGray);
rowIndex++;
// 列标题
var headers = new[]
{
"订单编号", "单位名称", "所属赛事", "订单类型", "关联订单",
"支付方式", "报名方式", "报名用户", "报名账号", "原金额(元)",
"优惠金额(元)", "退款金额(元)", "实付金额(元)", "生成时间"
};
for (int i = 0; i < headers.Length; i++)
{
worksheet.Cells[rowIndex, i + 1].Value = headers[i];
}
var headerRange = worksheet.Cells[rowIndex, 1, rowIndex, headers.Length];
var headerStyle = headerRange.Style;
headerStyle.Font.Bold = true;
headerStyle.Font.Size = 11;
headerStyle.HorizontalAlignment = ExcelHorizontalAlignment.Center;
headerStyle.VerticalAlignment = ExcelVerticalAlignment.Center;
headerStyle.Fill.PatternType = ExcelFillStyle.Solid;
headerStyle.Fill.BackgroundColor.SetColor(Color.LightBlue);
SetCellBorders(headerRange, ExcelBorderStyle.Thin);
rowIndex++;
// 数据行
foreach (var item in orders)
{
var refundAmount = item.OrderType == "退款" ? item.ActualAmount : 0;
var actualPayAmount = item.OrderType == "收入" ? item.ActualAmount : 0;
worksheet.Cells[rowIndex, 1].Value = item.OrderNo;
worksheet.Cells[rowIndex, 2].Value = item.UnitName;
worksheet.Cells[rowIndex, 3].Value = item.EventName;
worksheet.Cells[rowIndex, 4].Value = item.OrderType;
worksheet.Cells[rowIndex, 5].Value = item.RelatedOrderNo;
worksheet.Cells[rowIndex, 6].Value = item.PaymentMethod;
worksheet.Cells[rowIndex, 7].Value = item.RegistrationMode;
worksheet.Cells[rowIndex, 8].Value = item.ContactName;
worksheet.Cells[rowIndex, 9].Value = item.ContactPhone;
worksheet.Cells[rowIndex, 10].Value = item.OriginalAmount;
worksheet.Cells[rowIndex, 11].Value = item.DiscountAmount;
worksheet.Cells[rowIndex, 12].Value = refundAmount;
worksheet.Cells[rowIndex, 13].Value = actualPayAmount;
worksheet.Cells[rowIndex, 14].Value = item.CreatedTime.ToString("yyyy-MM-dd HH:mm:ss");
// 设置金额格式
worksheet.Cells[rowIndex, 10].Style.Numberformat.Format = "0.00";
worksheet.Cells[rowIndex, 11].Style.Numberformat.Format = "0.00";
worksheet.Cells[rowIndex, 12].Style.Numberformat.Format = "0.00";
worksheet.Cells[rowIndex, 13].Style.Numberformat.Format = "0.00";
SetDataRowStyle(worksheet, rowIndex, 14);
rowIndex++;
}
// 设置列宽
var columnWidths = new double[] { 18, 15, 15, 10, 12, 10, 10, 12, 14, 12, 14, 14, 12, 18 };
for (int i = 0; i < columnWidths.Length; i++)
{
worksheet.Column(i + 1).Width = columnWidths[i];
}
// 冻结表头
worksheet.View.FreezePanes(3, 1);
return await package.GetAsByteArrayAsync();
}
/// <summary>
/// 设置单元格边框
/// </summary>
private void SetCellBorders(ExcelRange range, ExcelBorderStyle borderStyle)
{
range.Style.Border.Top.Style = borderStyle;
range.Style.Border.Bottom.Style = borderStyle;
range.Style.Border.Left.Style = borderStyle;
range.Style.Border.Right.Style = borderStyle;
}
/// <summary>
/// 设置数据行样式
/// </summary>
private void SetDataRowStyle(ExcelWorksheet worksheet, int rowIndex, int colCount)
{
var range = worksheet.Cells[rowIndex, 1, rowIndex, colCount];
var style = range.Style;
style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
style.VerticalAlignment = ExcelVerticalAlignment.Center;
SetCellBorders(range, ExcelBorderStyle.Thin);
}
}

View File

@ -1672,7 +1672,7 @@
</member>
<member name="T:YD_Event.Application.Client.Dtos.EventProjectDto">
<summary>
赛事项目DTO
赛事项目DTO扩展(含项目限制信息)
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.EventProjectDto.Id">
@ -1695,11 +1695,116 @@
报名费用
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.EventProjectDto.ProjectLimitCount">
<summary>
项目限报数量
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.EventProjectDto.Groups">
<summary>
组别列表
</summary>
</member>
<member name="T:YD_Event.Application.Client.Dtos.CalculateAmountInput">
<summary>
计算报名金额输入DTO
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountInput.EventId">
<summary>
赛事ID
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountInput.RegistrationMode">
<summary>
报名模式 (1-个人 2-团队)
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountInput.Items">
<summary>
报名项目列表
</summary>
</member>
<member name="T:YD_Event.Application.Client.Dtos.CalculateAmountItemInput">
<summary>
计算报名金额项目输入DTO
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountItemInput.ProjectId">
<summary>
项目ID
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountItemInput.PersonCount">
<summary>
参赛人员数量
</summary>
</member>
<member name="T:YD_Event.Application.Client.Dtos.CalculateAmountOutput">
<summary>
计算报名金额输出DTO
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountOutput.ChargeMode">
<summary>
赛事收费模式
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountOutput.TotalAmount">
<summary>
总金额
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountOutput.ItemDetails">
<summary>
项目费用明细
</summary>
</member>
<member name="T:YD_Event.Application.Client.Dtos.CalculateAmountItemOutput">
<summary>
计算报名金额项目输出DTO
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountItemOutput.ProjectId">
<summary>
项目ID
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountItemOutput.ProjectName">
<summary>
项目名称
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountItemOutput.UnitPrice">
<summary>
单价
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountItemOutput.PersonCount">
<summary>
人数
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.CalculateAmountItemOutput.Subtotal">
<summary>
小计
</summary>
</member>
<member name="T:YD_Event.Application.Client.Dtos.SelectPaymentMethodInput">
<summary>
选择支付方式输入DTO
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.SelectPaymentMethodInput.RegistrationId">
<summary>
报名ID
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.SelectPaymentMethodInput.PaymentMethod">
<summary>
支付方式 (1-线下 2-微信支付)
</summary>
</member>
<member name="T:YD_Event.Application.Client.Dtos.EventProjectGroupDto">
<summary>
项目组别DTO
@ -2255,6 +2360,16 @@
所在单位
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.MyProfileDto.Gender">
<summary>
性别:0-未知,1-男,2-女
</summary>
</member>
<member name="P:YD_Event.Application.Client.Dtos.MyProfileDto.BirthDate">
<summary>
出生日期
</summary>
</member>
<member name="T:YD_Event.Application.Client.Dtos.MyAuthInfoDto">
<summary>
个人中心-实名认证信息
@ -2783,6 +2898,13 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.CalculateRegistrationAmount(YD_Event.Application.Client.Dtos.CalculateAmountInput)">
<summary>
计算报名金额
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.SubmitRegistration(YD_Event.Application.Client.Dtos.SubmitRegistrationInput)">
<summary>
提交赛事报名
@ -2794,6 +2916,19 @@
<summary>
获取支付信息
</summary>
<remarks>
OpenId 参数获取方式:
- 支持从查询字符串(QueryString)传入:openId 或 openid
- 支持从表单数据(FormData)传入:openId 或 openid
- 支持从用户 Claims 中获取(兜底方案)
OpenId 参数验证规则:
- 不能为空或空白字符串
- 长度必须在 10-50 个字符之间
- 只能包含字母、数字、下划线和连字符
</remarks>
<param name="registrationId">报名记录ID</param>
<returns>支付信息,包括微信支付参数(如果是微信支付)</returns>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.UploadPaymentVoucher(System.Int64,YD_Event.Application.Client.Dtos.UploadVoucherInput)">
<summary>
@ -2830,6 +2965,48 @@
<param name="registrationId"></param>
<returns></returns>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.SelectPaymentMethod(YD_Event.Application.Client.Dtos.SelectPaymentMethodInput)">
<summary>
选择支付方式
</summary>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.SyncPaymentStatus(System.Int64)">
<summary>
同步支付状态(主动查询微信支付)
</summary>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.WeChatPayNotify">
<summary>
微信支付回调通知处理
</summary>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.GetOpenIdFromRequest">
<summary>
从请求中获取 OpenId 参数
</summary>
<remarks>
支持从以下来源获取 OpenId(按优先级顺序):
1. 查询字符串 (QueryString):openId 或 openid 参数
2. 表单数据 (FormData):openId 或 openid 字段
3. 请求体 (JSON):openId 或 openid 属性
4. 用户 Claims(兜底方案):openid claim
</remarks>
<returns>获取到的 OpenId 值,如果未找到则返回空字符串</returns>
</member>
<member name="M:YD_Event.Application.Client.EventClientController.ValidateOpenId(System.String,System.String@)">
<summary>
验证 OpenId 参数的有效性
</summary>
<remarks>
验证规则:
1. OpenId 不能为空或空白字符串
2. OpenId 长度必须在合理范围内(微信 OpenId 通常为 28 个字符左右)
3. OpenId 只能包含字母、数字和下划线
</remarks>
<param name="openId">待验证的 OpenId</param>
<param name="errorMessage">验证失败时的错误信息</param>
<returns>验证通过返回 true,否则返回 false</returns>
</member>
<member name="T:YD_Event.Application.Client.MyController">
<summary>
小程序-个人中心接口
@ -5328,7 +5505,7 @@
</member>
<member name="P:YD_Event.Application.Event.Dtos.RegistrationItemDTO.Status">
<summary>
综合状态描述 (待付款, 待上传素材, 已取消, 已报名, 待审核)
综合状态 (0-待付款, 1-已支付, 2-已取消, 3-已退款, 4-已完成)
</summary>
</member>
<member name="P:YD_Event.Application.Event.Dtos.RegistrationItemDTO.CreateTime">
@ -5343,7 +5520,7 @@
</member>
<member name="P:YD_Event.Application.Event.Dtos.RegistrationItemDTO.PayStatus">
<summary>
支付状态
支付状态 (0-未支付, 1-已支付, 2-已取消, 3-已退款, 4-待审核)
</summary>
</member>
<member name="P:YD_Event.Application.Event.Dtos.RegistrationItemDTO.CertStatus">
@ -7735,6 +7912,21 @@
导出订单
</summary>
</member>
<member name="M:YD_Event.Application.Order.OrderService.GenerateOrderExcelAsync(System.Collections.Generic.List{YD_Event.Application.Order.Dtos.OrderListOutput})">
<summary>
生成订单Excel文件
</summary>
</member>
<member name="M:YD_Event.Application.Order.OrderService.SetCellBorders(OfficeOpenXml.ExcelRange,OfficeOpenXml.Style.ExcelBorderStyle)">
<summary>
设置单元格边框
</summary>
</member>
<member name="M:YD_Event.Application.Order.OrderService.SetDataRowStyle(OfficeOpenXml.ExcelWorksheet,System.Int32,System.Int32)">
<summary>
设置数据行样式
</summary>
</member>
<member name="T:YD_Event.Application.Organization.Dtos.AddOrgInput">
<summary>
添加机构输入
@ -9207,6 +9399,11 @@
账号
</summary>
</member>
<member name="P:YD_Event.Application.User.Dtos.AddSysUserInput.Password">
<summary>
密码
</summary>
</member>
<member name="P:YD_Event.Application.User.Dtos.AddSysUserInput.Roles">
<summary>
关联角色ID集合

View File

@ -1504,6 +1504,26 @@
关联的项目组别ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventProjectGroup.GroupName">
<summary>
组别名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventProjectGroup.BirthDateStart">
<summary>
出生日期起始日期
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventProjectGroup.BirthDateEnd">
<summary>
出生日期结束日期
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventProjectGroup.Gender">
<summary>
性别要求
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventProjectGroup.DeleteMark">
<summary>
标记删除