using Jiaowu.Api.Domain.Common; namespace Jiaowu.Api.Domain.Academic; public sealed class ExperimentProject : EntityBase { public Guid TeachingTaskId { get; set; } public TeachingTask? TeachingTask { get; set; } // 集中安排的项目复用已发布课表中的实验课,不再维护一份重复的场次。 public Guid? ScheduleEntryId { get; set; } public ScheduleEntry? ScheduleEntry { get; set; } public required string Code { get; set; } public required string Name { get; set; } public ExperimentArrangementMode ArrangementMode { get; set; } public string? Description { get; set; } public string? Requirements { get; set; } public DateOnly StartDate { get; set; } public DateOnly EndDate { get; set; } public ExperimentProjectStatus Status { get; set; } = ExperimentProjectStatus.Draft; public DateTime? PublishedAt { get; set; } public DateTime? ClosedAt { get; set; } public ICollection Sessions { get; set; } = []; public ICollection Bookings { get; set; } = []; public ExperimentGradeSheet? GradeSheet { get; set; } } public sealed class ExperimentSession : EntityBase { public Guid ExperimentProjectId { get; set; } public ExperimentProject? ExperimentProject { get; set; } public Guid ClassroomId { get; set; } public Classroom? Classroom { get; set; } public DateOnly SessionDate { get; set; } public int StartPeriod { get; set; } public int PeriodCount { get; set; } public int Capacity { get; set; } public int ReservedCount { get; set; } public string? Notes { get; set; } public ExperimentSessionStatus Status { get; set; } = ExperimentSessionStatus.Scheduled; public DateTime? CancelledAt { get; set; } public ICollection Bookings { get; set; } = []; } public sealed class ExperimentBooking : EntityBase { public Guid ExperimentProjectId { get; set; } public ExperimentProject? ExperimentProject { get; set; } public Guid ExperimentSessionId { get; set; } public ExperimentSession? ExperimentSession { get; set; } public Guid StudentId { get; set; } public Student? Student { get; set; } public ExperimentBookingStatus Status { get; set; } = ExperimentBookingStatus.Booked; public DateTime BookedAt { get; set; } = DateTime.UtcNow; public DateTime? CancelledAt { get; set; } } public enum ExperimentArrangementMode { Centralized = 1, SelfScheduled = 2 } public enum ExperimentProjectStatus { Draft = 1, Published = 2, Closed = 3 } public enum ExperimentSessionStatus { Scheduled = 1, Cancelled = 2 } public enum ExperimentBookingStatus { Booked = 1, Cancelled = 2 }