Files
OrpaonVision/OrpaonVision.ConfigApp/Infrastructure/Persistence/IProductionSessionRepository.cs
2026-04-06 22:04:05 +08:00

551 lines
15 KiB
C#

using OrpaonVision.Core.Results;
using OrpaonVision.Core.Common;
using OrpaonVision.Model.Production;
namespace OrpaonVision.ConfigApp.Infrastructure.Persistence;
/// <summary>
/// 产品会话仓储接口。
/// </summary>
public interface IProductionSessionRepository
{
/// <summary>
/// 创建会话。
/// </summary>
/// <param name="session">会话模型。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>创建结果。</returns>
Task<Result> CreateAsync(ProductionSessionModel session, CancellationToken cancellationToken = default);
/// <summary>
/// 更新会话。
/// </summary>
/// <param name="session">会话模型。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>更新结果。</returns>
Task<Result> UpdateAsync(ProductionSessionModel session, CancellationToken cancellationToken = default);
/// <summary>
/// 删除会话。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>删除结果。</returns>
Task<Result> DeleteAsync(Guid sessionId, CancellationToken cancellationToken = default);
/// <summary>
/// 根据ID获取会话。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>会话模型。</returns>
Task<Result<ProductionSessionModel?>> GetByIdAsync(Guid sessionId, CancellationToken cancellationToken = default);
/// <summary>
/// 根据工位ID获取当前活动会话。
/// </summary>
/// <param name="stationId">工位ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>当前活动会话。</returns>
Task<Result<ProductionSessionModel?>> GetActiveByStationIdAsync(string stationId, CancellationToken cancellationToken = default);
/// <summary>
/// 根据条件查询会话列表。
/// </summary>
/// <param name="query">查询条件。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>会话列表。</returns>
Task<Result<IReadOnlyList<ProductionSessionModel>>> GetByQueryAsync(SessionQuery query, CancellationToken cancellationToken = default);
/// <summary>
/// 根据条件分页查询会话。
/// </summary>
/// <param name="query">查询条件。</param>
/// <param name="pageIndex">页码。</param>
/// <param name="pageSize">页大小。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>分页结果。</returns>
Task<Result<PagedSessionResult>> GetPagedByQueryAsync(SessionQuery query, int pageIndex, int pageSize, CancellationToken cancellationToken = default);
/// <summary>
/// 批量创建会话。
/// </summary>
/// <param name="sessions">会话列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>创建结果。</returns>
Task<Result<BatchCreateResult>> BatchCreateAsync(IReadOnlyList<ProductionSessionModel> sessions, CancellationToken cancellationToken = default);
/// <summary>
/// 批量更新会话。
/// </summary>
/// <param name="sessions">会话列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>更新结果。</returns>
Task<Result<BatchUpdateResult>> BatchUpdateAsync(IReadOnlyList<ProductionSessionModel> sessions, CancellationToken cancellationToken = default);
/// <summary>
/// 批量删除会话。
/// </summary>
/// <param name="sessionIds">会话ID列表。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>删除结果。</returns>
Task<Result<BatchDeleteResult>> BatchDeleteAsync(IReadOnlyList<Guid> sessionIds, CancellationToken cancellationToken = default);
/// <summary>
/// 获取会话统计信息。
/// </summary>
/// <param name="query">统计查询条件。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>统计结果。</returns>
Task<Result<SessionStatistics>> GetStatisticsAsync(SessionStatisticsQuery query, CancellationToken cancellationToken = default);
/// <summary>
/// 清理过期会话。
/// </summary>
/// <param name="cutoffDate">截止日期。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>清理结果。</returns>
Task<Result<CleanupResult>> CleanupExpiredAsync(DateTime cutoffDate, CancellationToken cancellationToken = default);
/// <summary>
/// 检查会话是否存在。
/// </summary>
/// <param name="sessionId">会话ID。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>是否存在。</returns>
Task<Result<bool>> ExistsAsync(Guid sessionId, CancellationToken cancellationToken = default);
/// <summary>
/// 获取会话数量。
/// </summary>
/// <param name="query">查询条件。</param>
/// <param name="cancellationToken">取消令牌。</param>
/// <returns>会话数量。</returns>
Task<Result<int>> CountAsync(SessionQuery query, CancellationToken cancellationToken = default);
}
/// <summary>
/// 会话查询条件。
/// </summary>
public sealed class SessionQuery
{
/// <summary>
/// 会话ID列表。
/// </summary>
public IReadOnlyList<Guid>? SessionIds { get; set; }
/// <summary>
/// 产品类型编码。
/// </summary>
public string? ProductTypeCode { get; set; }
/// <summary>
/// 工位ID。
/// </summary>
public string? StationId { get; set; }
/// <summary>
/// 操作员ID。
/// </summary>
public string? OperatorId { get; set; }
/// <summary>
/// 班次ID。
/// </summary>
public string? ShiftId { get; set; }
/// <summary>
/// 会话状态列表。
/// </summary>
public IReadOnlyList<ProductionSessionStatus>? Statuses { get; set; }
/// <summary>
/// 会话结果列表。
/// </summary>
public IReadOnlyList<ProductionSessionResult>? Results { get; set; }
/// <summary>
/// 开始时间范围。
/// </summary>
public DateTimeRange? StartTimeRange { get; set; }
/// <summary>
/// 结束时间范围。
/// </summary>
public DateTimeRange? EndTimeRange { get; set; }
/// <summary>
/// 创建时间范围。
/// </summary>
public DateTimeRange? CreatedTimeRange { get; set; }
/// <summary>
/// 关键词搜索(搜索产品类型、工位、操作员等)。
/// </summary>
public string? Keyword { get; set; }
/// <summary>
/// 是否只包含活动会话。
/// </summary>
public bool ActiveOnly { get; set; } = false;
/// <summary>
/// 是否只包含已完成会话。
/// </summary>
public bool CompletedOnly { get; set; } = false;
/// <summary>
/// 排序字段。
/// </summary>
public SessionSortField SortField { get; set; } = SessionSortField.StartTimeUtc;
/// <summary>
/// 排序方向。
/// </summary>
public SortDirection SortDirection { get; set; } = SortDirection.Descending;
}
/// <summary>
/// 会话统计查询条件。
/// </summary>
public sealed class SessionStatisticsQuery
{
/// <summary>
/// 产品类型编码。
/// </summary>
public string? ProductTypeCode { get; set; }
/// <summary>
/// 工位ID。
/// </summary>
public string? StationId { get; set; }
/// <summary>
/// 操作员ID。
/// </summary>
public string? OperatorId { get; set; }
/// <summary>
/// 班次ID。
/// </summary>
public string? ShiftId { get; set; }
/// <summary>
/// 统计开始时间。
/// </summary>
public DateTime StartTime { get; set; }
/// <summary>
/// 统计结束时间。
/// </summary>
public DateTime EndTime { get; set; }
/// <summary>
/// 统计维度。
/// </summary>
public List<StatisticsDimension> Dimensions { get; set; } = new();
/// <summary>
/// 是否包含活动会话。
/// </summary>
public bool IncludeActive { get; set; } = true;
/// <summary>
/// 是否包含已完成会话。
/// </summary>
public bool IncludeCompleted { get; set; } = true;
}
/// <summary>
/// 分页会话结果。
/// </summary>
public sealed class PagedSessionResult
{
/// <summary>
/// 会话列表。
/// </summary>
public IReadOnlyList<ProductionSessionModel> Items { get; init; } = Array.Empty<ProductionSessionModel>();
/// <summary>
/// 总记录数。
/// </summary>
public int TotalCount { get; init; }
/// <summary>
/// 页码。
/// </summary>
public int PageIndex { get; init; }
/// <summary>
/// 页大小。
/// </summary>
public int PageSize { get; init; }
/// <summary>
/// 总页数。
/// </summary>
public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);
}
/// <summary>
/// 批量创建结果。
/// </summary>
public sealed class BatchCreateResult
{
/// <summary>
/// 总数量。
/// </summary>
public int TotalCount { get; init; }
/// <summary>
/// 成功数量。
/// </summary>
public int SuccessCount { get; init; }
/// <summary>
/// 失败数量。
/// </summary>
public int FailureCount { get; init; }
/// <summary>
/// 失败的会话索引列表。
/// </summary>
public List<int> FailedIndexes { get; init; } = new();
/// <summary>
/// 错误信息。
/// </summary>
public List<string> Errors { get; init; } = new();
}
/// <summary>
/// 批量更新结果。
/// </summary>
public sealed class BatchUpdateResult
{
/// <summary>
/// 总数量。
/// </summary>
public int TotalCount { get; init; }
/// <summary>
/// 成功数量。
/// </summary>
public int SuccessCount { get; init; }
/// <summary>
/// 失败数量。
/// </summary>
public int FailureCount { get; init; }
/// <summary>
/// 失败的会话索引列表。
/// </summary>
public List<int> FailedIndexes { get; init; } = new();
/// <summary>
/// 错误信息。
/// </summary>
public List<string> Errors { get; init; } = new();
}
/// <summary>
/// 批量删除结果。
/// </summary>
public sealed class BatchDeleteResult
{
/// <summary>
/// 总数量。
/// </summary>
public int TotalCount { get; init; }
/// <summary>
/// 成功数量。
/// </summary>
public int SuccessCount { get; init; }
/// <summary>
/// 失败数量。
/// </summary>
public int FailureCount { get; init; }
/// <summary>
/// 失败的会话ID列表。
/// </summary>
public List<Guid> FailedSessionIds { get; init; } = new();
/// <summary>
/// 错误信息。
/// </summary>
public List<string> Errors { get; init; } = new();
}
/// <summary>
/// 会话统计结果。
/// </summary>
public sealed class SessionStatistics
{
/// <summary>
/// 总会话数。
/// </summary>
public int TotalSessions { get; init; }
/// <summary>
/// OK会话数。
/// </summary>
public int OkSessions { get; init; }
/// <summary>
/// NG会话数。
/// </summary>
public int NgSessions { get; init; }
/// <summary>
/// 进行中会话数。
/// </summary>
public int InProgressSessions { get; init; }
/// <summary>
/// 取消会话数。
/// </summary>
public int CancelledSessions { get; init; }
/// <summary>
/// 暂停会话数。
/// </summary>
public int PausedSessions { get; init; }
/// <summary>
/// 合格率。
/// </summary>
public double PassRate { get; init; }
/// <summary>
/// 平均处理时间(秒)。
/// </summary>
public double AverageProcessingTimeSeconds { get; init; }
/// <summary>
/// 每小时处理量。
/// </summary>
public double ThroughputPerHour { get; init; }
/// <summary>
/// 按产品类型分组的统计。
/// </summary>
public List<ProductTypeStatistics> ByProductType { get; init; } = new();
/// <summary>
/// 按工位分组的统计。
/// </summary>
public List<StationStatistics> ByStation { get; init; } = new();
/// <summary>
/// 按操作员分组的统计。
/// </summary>
public List<OperatorStatistics> ByOperator { get; init; } = new();
/// <summary>
/// 按日期分组的统计。
/// </summary>
public List<DailyStatistics> ByDate { get; init; } = new();
/// <summary>
/// 按班次分组的统计。
/// </summary>
public List<ShiftStatistics> ByShift { get; init; } = new();
}
/// <summary>
/// 班次统计。
/// </summary>
public sealed class ShiftStatistics
{
/// <summary>
/// 班次ID。
/// </summary>
public string ShiftId { get; init; } = string.Empty;
/// <summary>
/// 班次名称。
/// </summary>
public string ShiftName { get; init; } = string.Empty;
/// <summary>
/// 总会话数。
/// </summary>
public int TotalSessions { get; init; }
/// <summary>
/// OK会话数。
/// </summary>
public int OkSessions { get; init; }
/// <summary>
/// NG会话数。
/// </summary>
public int NgSessions { get; init; }
/// <summary>
/// 合格率。
/// </summary>
public double PassRate { get; init; }
/// <summary>
/// 每小时处理量。
/// </summary>
public double ThroughputPerHour { get; init; }
}
/// <summary>
/// 清理结果。
/// </summary>
public sealed class CleanupResult
{
/// <summary>
/// 清理的会话数量。
/// </summary>
public int CleanedCount { get; init; }
/// <summary>
/// 释放的存储空间(字节)。
/// </summary>
public long FreedSpaceBytes { get; init; }
/// <summary>
/// 清理耗时(毫秒)。
/// </summary>
public long ElapsedMilliseconds { get; init; }
/// <summary>
/// 清理的会话事件数量。
/// </summary>
public int CleanedEventCount { get; init; }
}
/// <summary>
/// 日期时间范围。
/// </summary>
public sealed class DateTimeRange
{
/// <summary>
/// 开始时间。
/// </summary>
public DateTime Start { get; init; }
/// <summary>
/// 结束时间。
/// </summary>
public DateTime End { get; init; }
/// <summary>
/// 是否包含开始时间。
/// </summary>
public bool IncludeStart { get; init; } = true;
/// <summary>
/// 是否包含结束时间。
/// </summary>
public bool IncludeEnd { get; init; } = true;
}