报名平台功能完善

This commit is contained in:
马梓彭 2026-08-17 00:14:48 +08:00
parent fa5d0537d0
commit 3be70127b5
22 changed files with 1116 additions and 100 deletions

View File

@ -13,18 +13,27 @@ public class RefereeController : IDynamicApiController
private readonly ISqlSugarRepository<YD_Event.Core.Entities.AppUser> _userRepository;
private readonly ISqlSugarRepository<EventInfo> _eventRepository;
private readonly ISqlSugarRepository<RefereeApplication> _applicationRepository;
private readonly ISqlSugarRepository<YD_Event.Core.Entities.Referee> _refereeRepository;
private readonly ISqlSugarRepository<EventReferee> _eventRefereeRepository;
private readonly AuthManager _authManager;
private readonly IIdGenerator _idGenerator;
public RefereeController(
ISqlSugarRepository<YD_Event.Core.Entities.AppUser> userRepository,
ISqlSugarRepository<EventInfo> eventRepository,
ISqlSugarRepository<RefereeApplication> applicationRepository,
AuthManager authManager)
ISqlSugarRepository<YD_Event.Core.Entities.Referee> refereeRepository,
ISqlSugarRepository<EventReferee> eventRefereeRepository,
AuthManager authManager,
IIdGenerator idGenerator)
{
_userRepository = userRepository;
_eventRepository = eventRepository;
_applicationRepository = applicationRepository;
_refereeRepository = refereeRepository;
_eventRefereeRepository = eventRefereeRepository;
_authManager = authManager;
_idGenerator = idGenerator;
}
[HttpGet("applications")]
@ -80,15 +89,36 @@ public class RefereeController : IDynamicApiController
x.EventId == input.EventId && x.RefereeUserId == userId && x.ApplicationStatus != 4);
if (exists) throw Oops.Bah("已报名执裁当前赛事");
await _applicationRepository.InsertAsync(new RefereeApplication
var referee = await _refereeRepository.GetFirstAsync(x => x.AppUserId == userId);
if (referee == null) throw Oops.Bah("裁判档案不存在,请先完善裁判资料");
var application = new RefereeApplication
{
Id = _idGenerator.NextId(),
EventId = input.EventId,
RefereeUserId = userId,
ApplicationStatus = 1,
// 小程序报名无需后台审批,提交成功即成为赛事裁判。
ApplicationStatus = 2,
Status = AvailabilityStatus.Enable,
CreatedUserId = userId,
CreatedTime = DateTime.Now
});
};
await _applicationRepository.InsertAsync(application);
if (!await _eventRefereeRepository.IsAnyAsync(x => x.EventId == input.EventId && x.RefereeId == referee.Id))
{
await _eventRefereeRepository.InsertAsync(new EventReferee
{
Id = _idGenerator.NextId(),
EventId = input.EventId,
RefereeId = referee.Id,
RefereeApplicationId = application.Id,
SourceType = 2,
Status = AvailabilityStatus.Enable,
CreatedUserId = userId,
CreatedTime = DateTime.Now
});
}
return new { success = true };
}
@ -104,9 +134,9 @@ public class RefereeController : IDynamicApiController
private static string ApplicationStatusText(int status) => status switch
{
2 => "已确认执裁",
2 => "报名成功",
3 => "报名未通过",
4 => "已取消",
_ => "已报名执裁"
_ => "待审批"
};
}

View File

@ -12,6 +12,16 @@ public class RefereeApplicationOutput
public int Roles { get; set; }
public List<string> RoleNames { get; set; } = new();
public DateTime CreatedTime { get; set; }
public int ApplicationStatus { get; set; }
public string ApplicationStatusName { get; set; } = null!;
public string? Remark { get; set; }
}
public class EventRefereeOutput : RefereeApplicationOutput
{
public long EventRefereeId { get; set; }
public int SourceType { get; set; }
public string SourceTypeName { get; set; } = null!;
}
public class JudgeAssignmentBoardOutput
@ -41,6 +51,7 @@ public class JudgeAssignmentSessionOutput
public class JudgeAssignmentItemOutput
{
public long EventRefereeId { get; set; }
public string JudgeRole { get; set; } = null!;
public string JudgeRoleName { get; set; } = null!;
public long RefereeId { get; set; }
@ -58,6 +69,7 @@ public class SaveJudgeAssignmentsInput
public class SaveJudgeAssignmentItem
{
public string JudgeRole { get; set; } = null!;
public long EventRefereeId { get; set; }
public long RefereeId { get; set; }
}

View File

@ -6,9 +6,8 @@ namespace YD_Event.Application.Event;
/// <summary>赛事裁判报名与分配。</summary>
public class JudgeAssignmentService : IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository<RefereeApplication> _applicationRepository;
private readonly ISqlSugarRepository<EventReferee> _eventRefereeRepository;
private readonly ISqlSugarRepository<YD_Event.Core.Entities.Referee> _refereeRepository;
private readonly ISqlSugarRepository<YD_Event.Core.Entities.AppUser> _appUserRepository;
private readonly ISqlSugarRepository<EventSession> _sessionRepository;
private readonly ISqlSugarRepository<EventVenue> _venueRepository;
private readonly ISqlSugarRepository<EventProject> _eventProjectRepository;
@ -19,48 +18,33 @@ public class JudgeAssignmentService : IDynamicApiController, ITransient
private readonly IIdGenerator _idGenerator;
private readonly AuthManager _authManager;
public JudgeAssignmentService(ISqlSugarRepository<RefereeApplication> applicationRepository,
public JudgeAssignmentService(ISqlSugarRepository<EventReferee> eventRefereeRepository,
ISqlSugarRepository<YD_Event.Core.Entities.Referee> refereeRepository,
ISqlSugarRepository<YD_Event.Core.Entities.AppUser> appUserRepository,
ISqlSugarRepository<EventSession> sessionRepository, ISqlSugarRepository<EventVenue> venueRepository,
ISqlSugarRepository<EventProject> eventProjectRepository, ISqlSugarRepository<YD_Event.Core.Entities.Project> projectRepository,
ISqlSugarRepository<YD_Event.Core.Entities.ScoreRule> ruleRepository, ISqlSugarRepository<EventJudgeAssignment> assignmentRepository,
ISqlSugarRepository<EventInfo> eventRepository, IIdGenerator idGenerator, AuthManager authManager)
{
_applicationRepository = applicationRepository; _refereeRepository = refereeRepository; _appUserRepository = appUserRepository;
_eventRefereeRepository = eventRefereeRepository;
_refereeRepository = refereeRepository;
_sessionRepository = sessionRepository; _venueRepository = venueRepository; _eventProjectRepository = eventProjectRepository;
_projectRepository = projectRepository; _ruleRepository = ruleRepository; _assignmentRepository = assignmentRepository;
_eventRepository = eventRepository;
_idGenerator = idGenerator; _authManager = authManager;
}
[HttpGet("applications/{eventId}"), DisplayName("赛事裁判报名列表")]
public async Task<List<RefereeApplicationOutput>> GetApplications(long eventId)
[HttpGet("event-referees/{eventId}"), DisplayName("获取赛事裁判列表")]
public async Task<List<EventRefereeOutput>> GetEventReferees(long eventId)
{
var applications = await _applicationRepository.AsQueryable()
.Where(x => x.EventId == eventId && (x.ApplicationStatus == 1 || x.ApplicationStatus == 2))
var relations = await _eventRefereeRepository.AsQueryable()
// 赛事裁判目前没有“禁用”业务,是否有效统一由软删除标记控制。
// 同时兼容早期迁移中被错误写成 Status=1 的存量记录。
.Where(x => x.EventId == eventId)
.OrderByDescending(x => x.CreatedTime).ToListAsync();
var users = await _appUserRepository.AsQueryable().Where(x => applications.Select(a => a.RefereeUserId).Contains(x.Id)).ToListAsync();
var mobiles = users.Select(x => x.Mobile).Distinct().ToList();
var referees = await _refereeRepository.AsQueryable().Where(x => mobiles.Contains(x.Mobile) && x.AuditStatus == AuditStatus.Pass).ToListAsync();
return (from app in applications join user in users on app.RefereeUserId equals user.Id join referee in referees on user.Mobile equals referee.Mobile
select new RefereeApplicationOutput { ApplicationId = app.Id, RefereeId = referee.Id, Name = referee.Name,
RegionName = $"{referee.ProvinceName}/{referee.CityName}/{referee.DistrictName}", LevelName = referee.Level.Description(),
CertificateUrl = referee.CertificateUrl, Mobile = referee.Mobile, Roles = (int)referee.Roles,
RoleNames = Enum.GetValues<RefereeRole>().Where(r => r != RefereeRole.None && referee.Roles.HasFlag(r)).Select(r => r.Description()).ToList(), CreatedTime = app.CreatedTime }).ToList();
}
[HttpDelete("applications"), DisplayName("移除裁判报名"), UnitOfWork]
public async Task DeleteApplication([FromBody] KeyDto input)
{
var app = await _applicationRepository.GetByIdAsync(input.Id);
if (app == null) throw Oops.Bah("裁判报名不存在");
var user = await _appUserRepository.GetByIdAsync(app.RefereeUserId);
var referee = user == null ? null : await _refereeRepository.GetFirstAsync(x => x.Mobile == user.Mobile && x.AuditStatus == AuditStatus.Pass);
if (referee != null && await _assignmentRepository.IsAnyAsync(x => x.EventId == app.EventId && x.RefereeId == referee.Id && x.AssignmentStatus < 9))
throw Oops.Bah("该裁判已存在分配记录,不能移除报名");
app.ApplicationStatus = 4; app.UpdatedUserId = _authManager.UserId; app.UpdatedTime = DateTime.Now;
await _applicationRepository.UpdateAsync(app);
var referees = await _refereeRepository.AsQueryable()
.Where(x => relations.Select(r => r.RefereeId).Contains(x.Id)).ToListAsync();
return relations.Select(relation => ToEventRefereeOutput(relation,
referees.FirstOrDefault(x => x.Id == relation.RefereeId))).ToList();
}
[HttpGet("board/{eventId}"), DisplayName("获取裁判分配看板")]
@ -82,7 +66,7 @@ public class JudgeAssignmentService : IDynamicApiController, ITransient
var group = new JudgeAssignmentProjectOutput { EventProjectId = ep.Id, ProjectName = project.Name, RuleName = rule?.RuleName ?? "未配置计分规则", JudgeRoleSchemaJson = rule?.JudgeRoleSchemaJson ?? "[]" };
foreach (var session in sessions.Where(x => x.EventProjectId == ep.Id).OrderBy(x => venueMap.GetValueOrDefault(x.VenueId)?.Sort))
{
var items = assignments.Where(x => x.SessionId == session.Id).Select(x => { var referee = referees.FirstOrDefault(r => r.Id == x.RefereeId); return new JudgeAssignmentItemOutput { JudgeRole = x.JudgeRole, JudgeRoleName = x.JudgeRole, RefereeId = x.RefereeId, RefereeName = referee?.Name ?? "-", Mobile = referee?.Mobile ?? "" }; }).ToList();
var items = assignments.Where(x => x.SessionId == session.Id).Select(x => { var referee = referees.FirstOrDefault(r => r.Id == x.RefereeId); return new JudgeAssignmentItemOutput { EventRefereeId = x.EventRefereeId, JudgeRole = x.JudgeRole, JudgeRoleName = x.JudgeRole, RefereeId = x.RefereeId, RefereeName = referee?.Name ?? "-", Mobile = referee?.Mobile ?? "" }; }).ToList();
group.Sessions.Add(new JudgeAssignmentSessionOutput { SessionId = session.Id, SessionName = session.SessionName ?? session.SessionNo,
VenueName = venueMap.GetValueOrDefault(session.VenueId)?.VenueName ?? "-", Assigned = items.Count > 0, Assignments = items });
}
@ -92,10 +76,10 @@ public class JudgeAssignmentService : IDynamicApiController, ITransient
}
[HttpGet("candidates/{eventId}/{sessionId}"), DisplayName("获取可分配裁判")]
public async Task<List<RefereeApplicationOutput>> GetCandidates(long eventId, long sessionId)
public async Task<List<EventRefereeOutput>> GetCandidates(long eventId, long sessionId)
{
if (!await _sessionRepository.IsAnyAsync(x => x.Id == sessionId && x.EventId == eventId)) throw Oops.Bah("场次不存在");
return await GetApplications(eventId);
return await GetEventReferees(eventId);
}
[HttpPost("save"), DisplayName("保存裁判分配"), UnitOfWork]
@ -105,25 +89,36 @@ public class JudgeAssignmentService : IDynamicApiController, ITransient
if (session == null || session.SessionStatus == 90) throw Oops.Bah("场次不存在或已取消");
if (await _assignmentRepository.IsAnyAsync(x => x.SessionId == input.SessionId && x.AssignmentStatus == 1))
throw Oops.Bah("裁判分配已提交,不能再次修改");
if (input.Assignments.Any(x => string.IsNullOrWhiteSpace(x.JudgeRole) || x.RefereeId <= 0)) throw Oops.Bah("裁判岗位未完整分配");
if (input.Assignments.Any(x => string.IsNullOrWhiteSpace(x.JudgeRole) || (x.EventRefereeId <= 0 && x.RefereeId <= 0)))
throw Oops.Bah("裁判岗位未完整分配");
var rule = await _ruleRepository.GetByIdAsync(session.ScoreRuleId);
var requiredRoles = JArray.Parse(rule?.JudgeRoleSchemaJson ?? "[]").SelectMany(x => x["slots"] ?? new JArray()).Select(x => x["code"]?.ToString()).Where(x => !string.IsNullOrWhiteSpace(x)).ToList();
if (requiredRoles.Count == 0 || requiredRoles.Except(input.Assignments.Select(x => x.JudgeRole)).Any() || input.Assignments.Any(x => !requiredRoles.Contains(x.JudgeRole)))
throw Oops.Bah("请完成计分规则要求的全部裁判岗位分配");
if (input.Assignments.GroupBy(x => x.JudgeRole).Any(x => x.Count() > 1)) throw Oops.Bah("同一岗位只能分配一名裁判");
if (input.Assignments.GroupBy(x => x.RefereeId).Any(x => x.Count() > 1)) throw Oops.Bah("同一场次一名裁判只能分配一个岗位");
var candidates = await GetApplications(input.EventId);
if (input.Assignments.GroupBy(x => x.EventRefereeId > 0 ? x.EventRefereeId : x.RefereeId).Any(x => x.Count() > 1))
throw Oops.Bah("同一场次一名裁判只能分配一个岗位");
var candidates = await GetEventReferees(input.EventId);
foreach (var item in input.Assignments)
{
var candidate = candidates.FirstOrDefault(x => x.RefereeId == item.RefereeId);
if (candidate == null) throw Oops.Bah("存在未报名或未审核通过的裁判");
var candidate = item.EventRefereeId > 0
? candidates.FirstOrDefault(x => x.EventRefereeId == item.EventRefereeId)
: candidates.FirstOrDefault(x => x.RefereeId == item.RefereeId);
if (candidate == null) throw Oops.Bah("存在尚未关联到当前赛事的裁判");
item.EventRefereeId = candidate.EventRefereeId;
item.RefereeId = candidate.RefereeId;
var requiredFlag = RoleFlag(item.JudgeRole);
if (requiredFlag != 0 && (candidate.Roles & requiredFlag) == 0) throw Oops.Bah($"裁判{candidate.Name}不具备岗位{item.JudgeRole}资格");
}
await _assignmentRepository.SoftDeleteAsync(x => x.SessionId == input.SessionId && x.AssignmentStatus == 0);
var now = DateTime.Now;
var refereeIds = input.Assignments.Select(x => x.RefereeId).Distinct().ToList();
var refereeUsers = (await _refereeRepository.AsQueryable()
.Where(x => refereeIds.Contains(x.Id)).ToListAsync())
.ToDictionary(x => x.Id, x => x.AppUserId);
await _assignmentRepository.InsertRangeAsync(input.Assignments.Select(x => new EventJudgeAssignment { Id = _idGenerator.NextId(), EventId = input.EventId,
SessionId = input.SessionId, RefereeId = x.RefereeId, JudgeRole = x.JudgeRole, AssignmentStatus = 0,
SessionId = input.SessionId, EventRefereeId = x.EventRefereeId, RefereeId = x.RefereeId,
JudgeUserId = refereeUsers.GetValueOrDefault(x.RefereeId), JudgeRole = x.JudgeRole, AssignmentStatus = 0,
Status = AvailabilityStatus.Enable, CreatedUserId = _authManager.UserId, CreatedTime = now }).ToList());
}
@ -139,13 +134,6 @@ public class JudgeAssignmentService : IDynamicApiController, ITransient
sessions.ForEach(x => { x.SessionStatus = 10; x.Version++; x.UpdatedUserId = _authManager.UserId; x.UpdatedTime = DateTime.Now; });
await _sessionRepository.UpdateRangeAsync(sessions);
var assignedRefereeIds = assignments.Select(x => x.RefereeId).Distinct().ToList();
var assignedMobiles = await _refereeRepository.AsQueryable().Where(x => assignedRefereeIds.Contains(x.Id)).Select(x => x.Mobile).ToListAsync();
var assignedUserIds = await _appUserRepository.AsQueryable().Where(x => assignedMobiles.Contains(x.Mobile)).Select(x => x.Id).ToListAsync();
var applications = await _applicationRepository.AsQueryable()
.Where(x => x.EventId == input.EventId && assignedUserIds.Contains(x.RefereeUserId) && x.ApplicationStatus == 1).ToListAsync();
applications.ForEach(x => { x.ApplicationStatus = 2; x.UpdatedUserId = _authManager.UserId; x.UpdatedTime = DateTime.Now; });
if (applications.Count > 0) await _applicationRepository.UpdateRangeAsync(applications);
}
[HttpPost("registration-code/{eventId}"), DisplayName("生成裁判报名码")]
@ -162,6 +150,32 @@ public class JudgeAssignmentService : IDynamicApiController, ITransient
return entity.RefereeRegistrationCode;
}
private static EventRefereeOutput ToEventRefereeOutput(EventReferee? relation,
YD_Event.Core.Entities.Referee? referee)
{
var roles = referee?.Roles ?? RefereeRole.None;
return new EventRefereeOutput
{
EventRefereeId = relation?.Id ?? 0,
ApplicationId = relation?.RefereeApplicationId ?? 0,
RefereeId = referee?.Id ?? relation?.RefereeId ?? 0,
Name = referee?.Name ?? "-",
RegionName = referee == null ? "-" : $"{referee.ProvinceName}/{referee.CityName}/{referee.DistrictName}",
LevelName = referee?.Level.Description() ?? "-",
CertificateUrl = referee?.CertificateUrl ?? string.Empty,
Mobile = referee?.Mobile ?? string.Empty,
Roles = (int)roles,
RoleNames = Enum.GetValues<RefereeRole>()
.Where(role => role != RefereeRole.None && roles.HasFlag(role))
.Select(role => role.Description()).ToList(),
CreatedTime = relation?.CreatedTime ?? referee?.CreatedTime ?? DateTime.MinValue,
ApplicationStatus = 2,
ApplicationStatusName = "已通过",
SourceType = relation?.SourceType ?? 1,
SourceTypeName = relation?.SourceType == 2 ? "小程序报名" : "后台添加"
};
}
private static int RoleFlag(string role) => role switch
{
"T" => (int)RefereeRole.Chief,

View File

@ -53,6 +53,7 @@ public class UpdateRefereeInput : SaveRefereeInput
public class RefereeOutput
{
public long Id { get; set; }
public long? AppUserId { get; set; }
public string Name { get; set; } = null!;
public string Mobile { get; set; } = null!;
public string ProvinceCode { get; set; } = null!;

View File

@ -27,6 +27,7 @@ public class RefereeService : BaseService<YD_Event.Core.Entities.Referee>, ITran
}
[DisplayName("裁判分页查询")]
[HttpGet("page")]
public async Task<PageResult<RefereeOutput>> Page([FromQuery] RefereeQueryInput input)
{
var query = _repository.AsQueryable()
@ -48,13 +49,17 @@ public class RefereeService : BaseService<YD_Event.Core.Entities.Referee>, ITran
}
[DisplayName("新增裁判")]
[HttpPost("add")]
public async Task Add([FromBody] SaveRefereeInput input)
{
await EnsureMobileAvailable(input.Mobile, null);
await VerifyCode(input.Mobile, input.VerificationCode);
var appUser = await FindAppUserAsync(input.Mobile);
var entity = input.Adapt<YD_Event.Core.Entities.Referee>();
entity.Id = _idGenerator.NextId();
entity.AuditStatus = AuditStatus.PendingAudit;
entity.AppUserId = appUser?.Id;
// 后台管理员直接维护的裁判档案无需再次审批。
entity.AuditStatus = AuditStatus.Pass;
entity.Status = AvailabilityStatus.Enable;
entity.CreatedUserId = _authManager.UserId;
entity.CreatedTime = DateTime.Now;
@ -63,6 +68,7 @@ public class RefereeService : BaseService<YD_Event.Core.Entities.Referee>, ITran
}
[DisplayName("修改裁判")]
[HttpPut("update")]
public async Task Update([FromBody] UpdateRefereeInput input)
{
var entity = await _repository.GetByIdAsync(input.Id);
@ -73,7 +79,9 @@ public class RefereeService : BaseService<YD_Event.Core.Entities.Referee>, ITran
await VerifyCode(input.Mobile, input.VerificationCode);
await _cache.RemoveAsync($"sms:code:{input.Mobile}");
}
var appUser = await FindAppUserAsync(input.Mobile);
input.Adapt(entity);
entity.AppUserId = appUser?.Id;
entity.UpdatedUserId = _authManager.UserId;
entity.UpdatedTime = DateTime.Now;
await _repository.UpdateAsync(entity);
@ -95,10 +103,21 @@ public class RefereeService : BaseService<YD_Event.Core.Entities.Referee>, ITran
private async Task EnsureMobileAvailable(string mobile, long? exceptId)
{
if (await _repository.IsAnyAsync(x => x.Mobile == mobile && (!exceptId.HasValue || x.Id != exceptId.Value)))
// 不要把 Nullable.HasValue 分支写进 SqlSugar 表达式;空值时会生成 “<>” 附近的非法 SQL。
var refereeQuery = _repository.AsQueryable().Where(x => x.Mobile == mobile);
if (exceptId.HasValue)
refereeQuery = refereeQuery.Where(x => x.Id != exceptId.Value);
if (await refereeQuery.AnyAsync())
throw Oops.Bah("该手机号已存在于裁判库");
if (await _userRepository.IsAnyAsync(x => x.Mobile == mobile))
throw Oops.Bah("该手机号已绑定现有账号");
}
/// <summary>
/// 手机号已注册小程序账号时自动建立关联,未注册时允许裁判档案独立存在。
/// </summary>
private Task<YD_Event.Core.Entities.AppUser?> FindAppUserAsync(string mobile)
{
return _userRepository.AsQueryable().Where(x => x.Mobile == mobile).FirstAsync();
}
private async Task VerifyCode(string mobile, string? code)
@ -110,7 +129,7 @@ public class RefereeService : BaseService<YD_Event.Core.Entities.Referee>, ITran
private static RefereeOutput ToOutput(YD_Event.Core.Entities.Referee x) => new()
{
Id = x.Id, Name = x.Name, Mobile = x.Mobile,
Id = x.Id, AppUserId = x.AppUserId, Name = x.Name, Mobile = x.Mobile,
ProvinceCode = x.ProvinceCode, ProvinceName = x.ProvinceName,
CityCode = x.CityCode, CityName = x.CityName,
DistrictCode = x.DistrictCode, DistrictName = x.DistrictName,

View File

@ -6,7 +6,7 @@ namespace YD_Event.Application.Unit.Dtos;
public class UnitAccountQueryInput : Pagination
{
/// <summary>
/// 所属平台(0-报名平台 1-打分系统)
/// 所属平台(1-报名平台 2-打分系统)
/// </summary>
[Required(ErrorMessage = "请选择所属平台")]
public UnitAccountPlatform Platform { get; set; }
@ -38,7 +38,7 @@ public class UnitAccountQueryInput : Pagination
public class AddUnitAccountInput
{
/// <summary>
/// 所属平台(0-报名平台 1-打分系统)
/// 所属平台(1-报名平台 2-打分系统)
/// </summary>
[Required(ErrorMessage = "请选择所属平台")]
public UnitAccountPlatform Platform { get; set; }
@ -154,7 +154,7 @@ public class UnitAccountOutput
/// <summary>
/// 所属平台
/// </summary>
public UnitAccountPlatform? Platform { get; set; }
public UnitAccountPlatform Platform { get; set; }
/// <summary>
/// 状态(0-启用 1-禁用)

View File

@ -35,6 +35,7 @@ public class UnitAccountService : BaseService<SysUser>, ITransient
[HttpGet("page")]
public async Task<PageResult<UnitAccountOutput>> Page([FromQuery] UnitAccountQueryInput input)
{
EnsureUnitPlatform(input.Platform);
return await _repository.AsQueryable()
.Where(x => x.UnitPlatform == input.Platform)
.WhereIF(!string.IsNullOrWhiteSpace(input.UnitName), x => x.UnitName.Contains(input.UnitName))
@ -85,6 +86,7 @@ public class UnitAccountService : BaseService<SysUser>, ITransient
[UnitOfWork]
public async Task Add(AddUnitAccountInput input)
{
EnsureUnitPlatform(input.Platform);
// 账号是全局登录标识,需在整张 SysUser 表内查重
if (await _repository.IsAnyAsync(x => x.Account == input.Account))
{
@ -191,10 +193,16 @@ public class UnitAccountService : BaseService<SysUser>, ITransient
{
var user = await _repository.GetByIdAsync(id);
if (user == null) throw Oops.Bah("单位账号不存在");
if (user.UnitPlatform == null) throw Oops.Bah("该账号不是单位账号,请在系统用户中管理");
if (user.UnitPlatform == UnitAccountPlatform.EventSystem) throw Oops.Bah("该账号不是单位账号,请在系统用户中管理");
return user;
}
private static void EnsureUnitPlatform(UnitAccountPlatform platform)
{
if (platform is not UnitAccountPlatform.Registration and not UnitAccountPlatform.Scoring)
throw Oops.Bah("所属平台只能选择报名平台或打分系统");
}
/// <summary>
/// 平台对应的角色
/// </summary>

View File

@ -12476,6 +12476,11 @@
<member name="T:YD_Event.Application.Referee.RefereeService">
<summary>裁判库管理。</summary>
</member>
<member name="M:YD_Event.Application.Referee.RefereeService.FindAppUserAsync(System.String)">
<summary>
手机号已注册小程序账号时自动建立关联,未注册时允许裁判档案独立存在。
</summary>
</member>
<member name="T:YD_Event.Application.Refund.Dtos.RefundConfigDto">
<summary>
退款配置DTO
@ -13135,7 +13140,7 @@
</member>
<member name="P:YD_Event.Application.Unit.Dtos.UnitAccountQueryInput.Platform">
<summary>
所属平台(0-报名平台 1-打分系统)
所属平台(1-报名平台 2-打分系统)
</summary>
</member>
<member name="P:YD_Event.Application.Unit.Dtos.UnitAccountQueryInput.UnitName">
@ -13165,7 +13170,7 @@
</member>
<member name="P:YD_Event.Application.Unit.Dtos.AddUnitAccountInput.Platform">
<summary>
所属平台(0-报名平台 1-打分系统)
所属平台(1-报名平台 2-打分系统)
</summary>
</member>
<member name="P:YD_Event.Application.Unit.Dtos.AddUnitAccountInput.UnitName">

View File

@ -1,7 +1,7 @@
namespace YD_Event.Core.Entities;
/// <summary>
/// 检录人员状态记录表(每个秩序册列在单次检录中的检录状态)
/// 检录人员状态记录表
/// </summary>
[SugarTable("CheckinRecord")]
public class CheckinRecord : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime, IUpdatedUserId, IUpdatedTime

View File

@ -4,8 +4,6 @@ namespace YD_Event.Core.Entities;
/// <summary>
/// 赛事检录任务表
/// 一个检录员对应一条任务,记录总检录次数以及当前检录轮次、组别;
/// Current 系列字段为现场进度快照,切换检次或重新绑定检录员时会被重置
/// </summary>
[SugarTable("CheckinTask")]
public class CheckinTask : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime, IUpdatedUserId, IUpdatedTime, IAvailability

View File

@ -3,7 +3,7 @@ using YD_Event.Core.Enum;
namespace YD_Event.Core.Entities;
/// <summary>
/// 赛事裁判分配表(按场次分配裁判席位)
/// 赛事裁判分配表
/// </summary>
[SugarTable("EventJudgeAssignment")]
public class EventJudgeAssignment : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime, IUpdatedUserId, IUpdatedTime, IAvailability
@ -19,7 +19,12 @@ public class EventJudgeAssignment : Entity<long>, ISoftDelete, ICreatedUserId, I
public long SessionId { get; set; }
/// <summary>
/// 关联的裁判档案ID
/// 关联的赛事裁判记录ID
/// </summary>
public long EventRefereeId { get; set; }
/// <summary>
/// 关联的裁判档案ID(兼容历史查询的冗余字段)
/// </summary>
public long RefereeId { get; set; }

View File

@ -0,0 +1,63 @@
using YD_Event.Core.Enum;
namespace YD_Event.Core.Entities;
/// <summary>
/// 赛事裁判表
/// </summary>
[SugarTable("EventReferee")]
public class EventReferee : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime, IUpdatedUserId, IUpdatedTime, IAvailability
{
/// <summary>
/// 关联的赛事ID
/// </summary>
public long EventId { get; set; }
/// <summary>
/// 关联的裁判档案ID
/// </summary>
public long RefereeId { get; set; }
/// <summary>
/// 关联的裁判报名记录ID(非小程序报名时为空)
/// </summary>
[SugarColumn(IsNullable = true)]
public long? RefereeApplicationId { get; set; }
/// <summary>
/// 关联来源:1-后台添加,2-小程序报名
/// </summary>
public int SourceType { get; set; } = 1;
/// <summary>
/// 可用状态
/// </summary>
public AvailabilityStatus Status { get; set; } = AvailabilityStatus.Enable;
/// <summary>
/// 标记删除
/// </summary>
public bool DeleteMark { get; set; }
/// <summary>
/// 创建人
/// </summary>
public long CreatedUserId { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreatedTime { get; set; }
/// <summary>
/// 更新人
/// </summary>
[SugarColumn(IsNullable = true)]
public long? UpdatedUserId { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(IsNullable = true)]
public DateTime? UpdatedTime { get; set; }
}

View File

@ -3,7 +3,7 @@ using YD_Event.Core.Enum;
namespace YD_Event.Core.Entities;
/// <summary>
/// 赛事比赛场次表(编排确认后生成的正式场次)
/// 赛事比赛场次表
/// </summary>
[SugarTable("EventSession")]
public class EventSession : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime, IUpdatedUserId, IUpdatedTime, IAvailability

View File

@ -3,7 +3,7 @@ using YD_Event.Core.Enum;
namespace YD_Event.Core.Entities;
/// <summary>
/// 赛事场次出场记录表(场次内每个参赛单元的出场信息)
/// 赛事场次出场记录表
/// </summary>
[SugarTable("EventSessionEntry")]
public class EventSessionEntry : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime, IUpdatedUserId, IUpdatedTime, IAvailability

View File

@ -15,11 +15,17 @@ public class Referee : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime,
public string Name { get; set; } = null!;
/// <summary>
/// 联系电话(未删除数据中唯一,作为裁判与小程序账号的关联依据)
/// 联系电话(未删除数据中唯一)
/// </summary>
[SugarColumn(Length = 16)]
public string Mobile { get; set; } = null!;
/// <summary>
/// 关联的小程序用户ID(未关联小程序账号时为空)
/// </summary>
[SugarColumn(IsNullable = true, ColumnDescription = "关联的小程序用户ID")]
public long? AppUserId { get; set; }
/// <summary>
/// 所属省份编码
/// </summary>

View File

@ -19,7 +19,7 @@ public class RefereeApplication : Entity<long>, ISoftDelete, ICreatedUserId, ICr
public long RefereeUserId { get; set; }
/// <summary>
/// 报名状态:1-已报名执裁,2-已确认执裁,3-报名未通过,4-已取消
/// 报名状态:1-处理中(历史数据),2-报名成功,3-报名失败,4-已取消
/// </summary>
public int ApplicationStatus { get; set; } = 1;

View File

@ -97,15 +97,16 @@ public class SysUser : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime,
public DateTime? LockExpired { get; set; }
/// <summary>
/// 单位名称(单位账号专用)
/// 单位名称
/// </summary>
[SugarColumn(Length = 128)]
public string? UnitName { get; set; }
/// <summary>
/// 所属平台(null 表示普通系统用户,非单位管理创建的账号)
/// 所属平台
/// </summary>
public UnitAccountPlatform? UnitPlatform { get; set; }
[SugarColumn(ColumnDescription = "所属平台")]
public UnitAccountPlatform UnitPlatform { get; set; } = UnitAccountPlatform.EventSystem;
/// <summary>
/// 标记删除
@ -131,4 +132,4 @@ public class SysUser : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime,
/// 更新时间
/// </summary>
public DateTime? UpdatedTime { get; set; }
}
}

View File

@ -1,14 +1,17 @@
namespace YD_Event.Core.Entities;
/// <summary>
/// 系统用户角色关联表
/// </summary>
public class SysUserRole : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTime, IUpdatedUserId, IUpdatedTime
{
/// <summary>
/// 用户id
/// 关联的系统用户ID
/// </summary>
public long UserId { get; set; }
/// <summary>
/// 角色id
/// 关联的系统角色ID
/// </summary>
public long RoleId { get; set; }
@ -36,4 +39,4 @@ public class SysUserRole : Entity<long>, ISoftDelete, ICreatedUserId, ICreatedTi
/// 更新时间
/// </summary>
public DateTime? UpdatedTime { get; set; }
}
}

View File

@ -3,19 +3,25 @@ using System.ComponentModel;
namespace YD_Event.Core.Enum;
/// <summary>
/// 单位账号所属平台
/// 用户所属平台
/// </summary>
public enum UnitAccountPlatform
{
/// <summary>
/// 赛事系统用户
/// </summary>
[Description("赛事系统用户")]
EventSystem = 0,
/// <summary>
/// 报名平台
/// </summary>
[Description("报名平台")]
Registration = 0,
Registration = 1,
/// <summary>
/// 打分系统
/// </summary>
[Description("打分系统")]
Scoring = 1
Scoring = 2
}

View File

@ -1000,19 +1000,203 @@
</member>
<member name="T:YD_Event.Core.Entities.CheckinRecord">
<summary>
单次检录人员状态记录。
检录人员状态记录表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.TaskId">
<summary>
关联的检录任务ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.Round">
<summary>
检次(与检录任务的 CheckinNo 一致)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.SessionKey">
<summary>
秩序册列标识
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.SessionOrder">
<summary>
秩序册列的出场顺序
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.GroupId">
<summary>
参赛组别ID(不限定组别时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.RegistrationPersonId">
<summary>
关联的报名人员ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.CheckerUserId">
<summary>
执行检录的检录员用户ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.Checked">
<summary>
是否已检录
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.CheckedTime">
<summary>
检录时间(取消检录时置空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinRecord.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.CheckinTask">
<summary>
赛事检录任务,记录总检录次数以及当前检录轮次、组别。
赛事检录任务表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.EventId">
<summary>
关联的赛事ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CheckinNo">
<summary>该检录员负责的检次:1-一检,2-二检,3-三检。</summary>
<summary>
该检录员负责的检次:1-一检,2-二检,3-三检
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CheckerUserId">
<summary>
关联的检录员用户ID(尚未绑定检录员时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.TotalRounds">
<summary>
赛事的检录总次数
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentRound">
<summary>
当前检录轮次(与 CheckinNo 保持一致)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentSessionKey">
<summary>
当前秩序册列标识
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentSessionOrder">
<summary>
当前秩序册列的出场顺序
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentSessionName">
<summary>
当前秩序册列名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentEventProjectId">
<summary>
当前检录的赛事项目ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentSessionVenue">
<summary>
当前秩序册列所在场地
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.RoundName">
<summary>
检次名称(由 CheckinNo 转换而来,如一检、二检)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentGroupId">
<summary>
当前检录的参赛组别ID(不限定组别时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CurrentGroupName">
<summary>
当前检录的参赛组别名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.GroupOrder">
<summary>
当前组别的顺序
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.TotalGroups">
<summary>
本次检录的组别总数
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.NextGroupName">
<summary>
下一个待检录组别名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.Venue">
<summary>
检录场地
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.TaskStatus">
<summary>0-未开始,1-进行中,2-已结束。</summary>
<summary>
任务状态:0-未开始,1-进行中,2-已结束
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.CheckinTask.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.Coupon">
<summary>
@ -1330,7 +1514,9 @@
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventInfo.RefereeRegistrationCode">
<summary>裁判报名邀请码。</summary>
<summary>
裁判报名邀请码
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventInfo.CoverImage">
<summary>
@ -1512,8 +1698,85 @@
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventJudgeAssignment">
<summary>
赛事裁判分配表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.EventId">
<summary>
关联的赛事ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.SessionId">
<summary>
关联的比赛场次ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.EventRefereeId">
<summary>
关联的赛事裁判记录ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.RefereeId">
<summary>
关联的裁判档案ID(兼容历史查询的冗余字段)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.JudgeUserId">
<summary>
关联的小程序用户ID(裁判尚未注册小程序账号时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.JudgeRole">
<summary>
裁判席位编码(取自计分规则的裁判席位配置,如 T、DP1、P)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.AssignmentStatus">
<summary>0草稿,1已提交,2已替换,9停用。</summary>
<summary>
分配状态:0-草稿,1-已提交,2-已替换,9-已停用
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.SubmittedTime">
<summary>
提交时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.Remark">
<summary>
备注
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventJudgeAssignment.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventParticipationRecord">
<summary>
@ -1780,6 +2043,61 @@
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventReferee">
<summary>
赛事裁判表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.EventId">
<summary>
关联的赛事ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.RefereeId">
<summary>
关联的裁判档案ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.RefereeApplicationId">
<summary>
关联的裁判报名记录ID(非小程序报名时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.SourceType">
<summary>
关联来源:1-后台添加,2-小程序报名
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventReferee.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventRegistration">
<summary>
赛事报名表
@ -2485,8 +2803,180 @@
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventSession">
<summary>
赛事比赛场次表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.EventId">
<summary>
关联的赛事ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.EventProjectId">
<summary>
关联的赛事项目ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.EventProjectGroupId">
<summary>
关联的赛事项目组别ID(本场次为多个组别混合时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.VenueId">
<summary>
关联的比赛场地ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.ScoreRuleId">
<summary>
关联的计分规则ID(取自项目配置的计分规则)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.SessionNo">
<summary>
场次编号(同一赛事内未删除数据中唯一)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.SessionName">
<summary>
场次名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.StartTime">
<summary>
场次开始时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.EndTime">
<summary>
场次结束时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.SessionStatus">
<summary>0草稿,10就绪,30进行中,60结束,90取消。</summary>
<summary>
场次状态:0-草稿,10-就绪,30-进行中,60-已结束,90-已取消
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.Version">
<summary>
版本号(场次内容变更时递增)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSession.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventSessionEntry">
<summary>
赛事场次出场记录表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.SessionId">
<summary>
关联的比赛场次ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.ParticipationRecordId">
<summary>
关联的赛事参赛记录ID(未匹配到参赛记录时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.RegistrationItemId">
<summary>
关联的报名项目明细ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.EntryNo">
<summary>
出场编号(项目序号+场地序号+出场顺序)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.PlayOrder">
<summary>
出场顺序(同一场次内未删除数据中唯一)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.EntryStatus">
<summary>
出场状态:0-待出场(其余状态由打分系统流转时写入)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.ParticipantName">
<summary>
参赛人员姓名
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.TeamName">
<summary>
参赛队伍名称(个人项目时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.GroupName">
<summary>
参赛组别名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.Version">
<summary>
版本号(出场信息变更时递增)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventSessionEntry.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventUnit">
<summary>
@ -2548,6 +3038,61 @@
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.EventVenue">
<summary>
赛事比赛场地表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.EventId">
<summary>
关联的赛事ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.VenueCode">
<summary>
场地编码(同一赛事内未删除数据中唯一,如 V01)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.VenueName">
<summary>
场地名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.Sort">
<summary>
排序
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.EventVenue.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.IAvailability">
<summary>
可用状态
@ -3130,7 +3675,9 @@
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Project.ScoreRuleId">
<summary>计分规则。</summary>
<summary>
计分规则ID(未配置计分规则时为空,赛事编排确认前必须配置)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Project.Remark">
<summary>
@ -3238,15 +3785,164 @@
</summary>
</member>
<member name="T:YD_Event.Core.Entities.Referee">
<summary>裁判档案。</summary>
<summary>
裁判档案表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.Name">
<summary>
裁判姓名
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.Mobile">
<summary>
联系电话(未删除数据中唯一)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.AppUserId">
<summary>
关联的小程序用户ID(未关联小程序账号时为空)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.ProvinceCode">
<summary>
所属省份编码
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.ProvinceName">
<summary>
所属省份名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.CityCode">
<summary>
所属城市编码
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.CityName">
<summary>
所属城市名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.DistrictCode">
<summary>
所属区县编码
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.DistrictName">
<summary>
所属区县名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.Level">
<summary>
裁判等级:1-国际级,2-国家级,3-一级,4-二级,5-三级
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.CertificateUrl">
<summary>
裁判证书图片URL
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.Roles">
<summary>
可执裁角色(位标记,可多选)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.AuditStatus">
<summary>
审核状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.AuditRemark">
<summary>
审核备注
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.Referee.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.RefereeApplication">
<summary>
裁判报名执裁记录。
裁判报名执裁记录表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.EventId">
<summary>
关联的赛事ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.RefereeUserId">
<summary>
报名执裁的小程序用户ID(对应 AppUser.Id,账户角色为裁判)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.ApplicationStatus">
<summary>1-已报名,2-已确认,3-已拒绝,4-已取消。</summary>
<summary>
报名状态:1-处理中(历史数据),2-报名成功,3-报名失败,4-已取消
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.Remark">
<summary>
备注
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.RefereeApplication.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.RefundConfig">
<summary>
@ -3429,7 +4125,64 @@
</summary>
</member>
<member name="T:YD_Event.Core.Entities.ScoreRule">
<summary>项目计分规则。</summary>
<summary>
项目计分规则表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.RuleCode">
<summary>
规则编码(未删除数据中唯一,如 ROPE_PRESCRIBED、FREESTYLE_SINGLE)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.RuleName">
<summary>
规则名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.JudgeRoleSchemaJson">
<summary>
裁判席位配置(JSON格式,按裁判组描述该规则需要的裁判角色席位)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.RuleConfigJson">
<summary>
计分参数配置(JSON格式,规则的扣分项、权重等扩展参数)
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.Status">
<summary>
可用状态
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.Sort">
<summary>
排序
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.DeleteMark">
<summary>
标记删除
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.CreatedUserId">
<summary>
创建人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.CreatedTime">
<summary>
创建时间
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.UpdatedUserId">
<summary>
更新人
</summary>
</member>
<member name="P:YD_Event.Core.Entities.ScoreRule.UpdatedTime">
<summary>
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.SysCity">
<summary>
@ -4128,12 +4881,12 @@
</member>
<member name="P:YD_Event.Core.Entities.SysUser.UnitName">
<summary>
单位名称(单位账号专用)
单位名称
</summary>
</member>
<member name="P:YD_Event.Core.Entities.SysUser.UnitPlatform">
<summary>
所属平台(null 表示普通系统用户,非单位管理创建的账号)
所属平台
</summary>
</member>
<member name="P:YD_Event.Core.Entities.SysUser.DeleteMark">
@ -4161,14 +4914,19 @@
更新时间
</summary>
</member>
<member name="T:YD_Event.Core.Entities.SysUserRole">
<summary>
系统用户角色关联表
</summary>
</member>
<member name="P:YD_Event.Core.Entities.SysUserRole.UserId">
<summary>
用户id
关联的系统用户ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.SysUserRole.RoleId">
<summary>
角色id
关联的系统角色ID
</summary>
</member>
<member name="P:YD_Event.Core.Entities.SysUserRole.DeleteMark">
@ -4720,7 +5478,23 @@
</member>
<member name="T:YD_Event.Core.Enum.MiniProgramRole">
<summary>
小程序账户角色。与参赛人员的 PersonType 分离,避免混淆业务身份。
小程序账户角色
与报名人员类型 PersonType 相互独立,避免混淆业务身份
</summary>
</member>
<member name="F:YD_Event.Core.Enum.MiniProgramRole.Participant">
<summary>
参赛者
</summary>
</member>
<member name="F:YD_Event.Core.Enum.MiniProgramRole.Referee">
<summary>
裁判
</summary>
</member>
<member name="F:YD_Event.Core.Enum.MiniProgramRole.Checker">
<summary>
检录员
</summary>
</member>
<member name="T:YD_Event.Core.Enum.OrderStatus">
@ -4908,6 +5682,72 @@
团队花样
</summary>
</member>
<member name="T:YD_Event.Core.Enum.RefereeLevel">
<summary>
裁判等级
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeLevel.International">
<summary>
国际级裁判员
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeLevel.National">
<summary>
国家级裁判员
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeLevel.LevelOne">
<summary>
一级裁判员
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeLevel.LevelTwo">
<summary>
二级裁判员
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeLevel.LevelThree">
<summary>
三级裁判员
</summary>
</member>
<member name="T:YD_Event.Core.Enum.RefereeRole">
<summary>
裁判可执裁的角色
位标记枚举,一名裁判可同时具备多个执裁角色,按位组合存储
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeRole.None">
<summary>
无(未选择任何执裁角色)
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeRole.Chief">
<summary>
主裁
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeRole.Performance">
<summary>
表现裁判
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeRole.Difficulty">
<summary>
难度裁判
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeRole.Choreography">
<summary>
创意编排裁判(仅规定赛使用)
</summary>
</member>
<member name="F:YD_Event.Core.Enum.RefereeRole.CompletionQuality">
<summary>
完成质量裁判(仅规定赛使用)
</summary>
</member>
<member name="T:YD_Event.Core.Enum.RegistrationType">
<summary>
报名方式
@ -4930,7 +5770,12 @@
</member>
<member name="T:YD_Event.Core.Enum.UnitAccountPlatform">
<summary>
单位账号所属平台
用户所属平台
</summary>
</member>
<member name="F:YD_Event.Core.Enum.UnitAccountPlatform.EventSystem">
<summary>
赛事系统用户
</summary>
</member>
<member name="F:YD_Event.Core.Enum.UnitAccountPlatform.Registration">