551 lines
15 KiB
C#
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;
|
|
}
|