496 lines
11 KiB
C#
496 lines
11 KiB
C#
using OrpaonVision.Core.Results;
|
||
using OrpaonVision.Model.Production;
|
||
|
||
namespace OrpaonVision.Core.Abstractions;
|
||
|
||
/// <summary>
|
||
/// 产品会话记录服务接口。
|
||
/// </summary>
|
||
public interface IProductionSessionService
|
||
{
|
||
/// <summary>
|
||
/// 创建新的产品会话。
|
||
/// </summary>
|
||
Result<ProductionSessionModel> CreateSession(CreateProductionSessionRequest request);
|
||
|
||
/// <summary>
|
||
/// 更新会话状态。
|
||
/// </summary>
|
||
Result UpdateSessionStatus(Guid sessionId, ProductionSessionStatus status, string? reason = null);
|
||
|
||
/// <summary>
|
||
/// 更新会话进度。
|
||
/// </summary>
|
||
Result UpdateSessionProgress(Guid sessionId, int currentLayer);
|
||
|
||
/// <summary>
|
||
/// 完成会话。
|
||
/// </summary>
|
||
Result CompleteSession(Guid sessionId, ProductionSessionResult result, string? ngReason = null, string? remark = null);
|
||
|
||
/// <summary>
|
||
/// 取消会话。
|
||
/// </summary>
|
||
Result CancelSession(Guid sessionId, string? reason = null);
|
||
|
||
/// <summary>
|
||
/// 获取会话详情。
|
||
/// </summary>
|
||
Result<ProductionSessionModel?> GetSession(Guid sessionId);
|
||
|
||
/// <summary>
|
||
/// 获取会话列表。
|
||
/// </summary>
|
||
Result<PagedResult<ProductionSessionModel>> GetSessions(GetProductionSessionsRequest request);
|
||
|
||
/// <summary>
|
||
/// 获取当前活动会话。
|
||
/// </summary>
|
||
Result<ProductionSessionModel?> GetCurrentSession(string stationId);
|
||
|
||
/// <summary>
|
||
/// 获取会话统计信息。
|
||
/// </summary>
|
||
Result<ProductionSessionStatistics> GetStatistics(GetProductionSessionStatisticsRequest request);
|
||
|
||
/// <summary>
|
||
/// 导出会话记录。
|
||
/// </summary>
|
||
Result<byte[]> ExportSessions(ExportProductionSessionsRequest request);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 创建产品会话请求。
|
||
/// </summary>
|
||
public sealed class CreateProductionSessionRequest
|
||
{
|
||
/// <summary>
|
||
/// 产品类型编码。
|
||
/// </summary>
|
||
public string ProductTypeCode { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 产品类型名称。
|
||
/// </summary>
|
||
public string ProductTypeName { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 工位ID。
|
||
/// </summary>
|
||
public string StationId { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 工位名称。
|
||
/// </summary>
|
||
public string StationName { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 操作员ID。
|
||
/// </summary>
|
||
public string OperatorId { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 操作员姓名。
|
||
/// </summary>
|
||
public string OperatorName { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 班次ID。
|
||
/// </summary>
|
||
public string ShiftId { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 班次名称。
|
||
/// </summary>
|
||
public string ShiftName { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 总层级数。
|
||
/// </summary>
|
||
public int TotalLayers { get; set; }
|
||
|
||
/// <summary>
|
||
/// 创建人。
|
||
/// </summary>
|
||
public string CreatedBy { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 备注。
|
||
/// </summary>
|
||
public string? Remark { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取产品会话列表请求。
|
||
/// </summary>
|
||
public sealed class GetProductionSessionsRequest
|
||
{
|
||
/// <summary>
|
||
/// 产品类型编码(可选)。
|
||
/// </summary>
|
||
public string? ProductTypeCode { get; set; }
|
||
|
||
/// <summary>
|
||
/// 工位ID(可选)。
|
||
/// </summary>
|
||
public string? StationId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 操作员ID(可选)。
|
||
/// </summary>
|
||
public string? OperatorId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 会话状态(可选)。
|
||
/// </summary>
|
||
public ProductionSessionStatus? Status { get; set; }
|
||
|
||
/// <summary>
|
||
/// 会话结果(可选)。
|
||
/// </summary>
|
||
public ProductionSessionResult? Result { get; set; }
|
||
|
||
/// <summary>
|
||
/// 开始时间(UTC)。
|
||
/// </summary>
|
||
public DateTime? StartTimeUtc { get; set; }
|
||
|
||
/// <summary>
|
||
/// 结束时间(UTC)。
|
||
/// </summary>
|
||
public DateTime? EndTimeUtc { get; set; }
|
||
|
||
/// <summary>
|
||
/// 页码(从1开始)。
|
||
/// </summary>
|
||
public int PageIndex { get; set; } = 1;
|
||
|
||
/// <summary>
|
||
/// 每页大小。
|
||
/// </summary>
|
||
public int PageSize { get; set; } = 20;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取产品会话统计信息请求。
|
||
/// </summary>
|
||
public sealed class GetProductionSessionStatisticsRequest
|
||
{
|
||
/// <summary>
|
||
/// 产品类型编码(可选)。
|
||
/// </summary>
|
||
public string? ProductTypeCode { get; set; }
|
||
|
||
/// <summary>
|
||
/// 工位ID(可选)。
|
||
/// </summary>
|
||
public string? StationId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 操作员ID(可选)。
|
||
/// </summary>
|
||
public string? OperatorId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 统计开始时间(UTC)。
|
||
/// </summary>
|
||
public DateTime StartTimeUtc { get; set; }
|
||
|
||
/// <summary>
|
||
/// 统计结束时间(UTC)。
|
||
/// </summary>
|
||
public DateTime EndTimeUtc { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导出产品会话记录请求。
|
||
/// </summary>
|
||
public sealed class ExportProductionSessionsRequest
|
||
{
|
||
/// <summary>
|
||
/// 产品类型编码(可选)。
|
||
/// </summary>
|
||
public string? ProductTypeCode { get; set; }
|
||
|
||
/// <summary>
|
||
/// 工位ID(可选)。
|
||
/// </summary>
|
||
public string? StationId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 操作员ID(可选)。
|
||
/// </summary>
|
||
public string? OperatorId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 会话状态(可选)。
|
||
/// </summary>
|
||
public ProductionSessionStatus? Status { get; set; }
|
||
|
||
/// <summary>
|
||
/// 会话结果(可选)。
|
||
/// </summary>
|
||
public ProductionSessionResult? Result { get; set; }
|
||
|
||
/// <summary>
|
||
/// 开始时间(UTC)。
|
||
/// </summary>
|
||
public DateTime? StartTimeUtc { get; set; }
|
||
|
||
/// <summary>
|
||
/// 结束时间(UTC)。
|
||
/// </summary>
|
||
public DateTime? EndTimeUtc { get; set; }
|
||
|
||
/// <summary>
|
||
/// 导出格式。
|
||
/// </summary>
|
||
public ExportFormat Format { get; set; } = ExportFormat.Excel;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 导出格式。
|
||
/// </summary>
|
||
public enum ExportFormat
|
||
{
|
||
/// <summary>
|
||
/// Excel格式。
|
||
/// </summary>
|
||
Excel = 0,
|
||
|
||
/// <summary>
|
||
/// CSV格式。
|
||
/// </summary>
|
||
Csv = 1,
|
||
|
||
/// <summary>
|
||
/// JSON格式。
|
||
/// </summary>
|
||
Json = 2
|
||
}
|
||
|
||
/// <summary>
|
||
/// 产品会话统计信息。
|
||
/// </summary>
|
||
public sealed class ProductionSessionStatistics
|
||
{
|
||
/// <summary>
|
||
/// 总会话数。
|
||
/// </summary>
|
||
public int TotalSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// OK会话数。
|
||
/// </summary>
|
||
public int OkSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// NG会话数。
|
||
/// </summary>
|
||
public int NgSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 进行中会话数。
|
||
/// </summary>
|
||
public int InProgressSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 取消会话数。
|
||
/// </summary>
|
||
public int CancelledSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 暂停会话数。
|
||
/// </summary>
|
||
public int PausedSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 合格率。
|
||
/// </summary>
|
||
public double PassRate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 平均处理时间(秒)。
|
||
/// </summary>
|
||
public double AverageProcessingTimeSeconds { get; set; }
|
||
|
||
/// <summary>
|
||
/// 每小时处理量。
|
||
/// </summary>
|
||
public double ThroughputPerHour { get; set; }
|
||
|
||
/// <summary>
|
||
/// 按产品类型分组的统计。
|
||
/// </summary>
|
||
public List<ProductTypeStatistics> ByProductType { get; set; } = new();
|
||
|
||
/// <summary>
|
||
/// 按工位分组的统计。
|
||
/// </summary>
|
||
public List<StationStatistics> ByStation { get; set; } = new();
|
||
|
||
/// <summary>
|
||
/// 按操作员分组的统计。
|
||
/// </summary>
|
||
public List<OperatorStatistics> ByOperator { get; set; } = new();
|
||
|
||
/// <summary>
|
||
/// 按日期分组的统计。
|
||
/// </summary>
|
||
public List<DailyStatistics> ByDate { get; set; } = new();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 产品类型统计。
|
||
/// </summary>
|
||
public sealed class ProductTypeStatistics
|
||
{
|
||
/// <summary>
|
||
/// 产品类型编码。
|
||
/// </summary>
|
||
public string ProductTypeCode { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 产品类型名称。
|
||
/// </summary>
|
||
public string ProductTypeName { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 总会话数。
|
||
/// </summary>
|
||
public int TotalSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// OK会话数。
|
||
/// </summary>
|
||
public int OkSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// NG会话数。
|
||
/// </summary>
|
||
public int NgSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 合格率。
|
||
/// </summary>
|
||
public double PassRate { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 工位统计。
|
||
/// </summary>
|
||
public sealed class StationStatistics
|
||
{
|
||
/// <summary>
|
||
/// 工位ID。
|
||
/// </summary>
|
||
public string StationId { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 工位名称。
|
||
/// </summary>
|
||
public string StationName { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 总会话数。
|
||
/// </summary>
|
||
public int TotalSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// OK会话数。
|
||
/// </summary>
|
||
public int OkSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// NG会话数。
|
||
/// </summary>
|
||
public int NgSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 合格率。
|
||
/// </summary>
|
||
public double PassRate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 每小时处理量。
|
||
/// </summary>
|
||
public double ThroughputPerHour { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 操作员统计。
|
||
/// </summary>
|
||
public sealed class OperatorStatistics
|
||
{
|
||
/// <summary>
|
||
/// 操作员ID。
|
||
/// </summary>
|
||
public string OperatorId { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 操作员姓名。
|
||
/// </summary>
|
||
public string OperatorName { get; set; } = string.Empty;
|
||
|
||
/// <summary>
|
||
/// 总会话数。
|
||
/// </summary>
|
||
public int TotalSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// OK会话数。
|
||
/// </summary>
|
||
public int OkSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// NG会话数。
|
||
/// </summary>
|
||
public int NgSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 合格率。
|
||
/// </summary>
|
||
public double PassRate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 平均处理时间(秒)。
|
||
/// </summary>
|
||
public double AverageProcessingTimeSeconds { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 日期统计。
|
||
/// </summary>
|
||
public sealed class DailyStatistics
|
||
{
|
||
/// <summary>
|
||
/// 日期(UTC)。
|
||
/// </summary>
|
||
public DateTime DateUtc { get; set; }
|
||
|
||
/// <summary>
|
||
/// 总会话数。
|
||
/// </summary>
|
||
public int TotalSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// OK会话数。
|
||
/// </summary>
|
||
public int OkSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// NG会话数。
|
||
/// </summary>
|
||
public int NgSessions { get; set; }
|
||
|
||
/// <summary>
|
||
/// 合格率。
|
||
/// </summary>
|
||
public double PassRate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 每小时处理量。
|
||
/// </summary>
|
||
public double ThroughputPerHour { get; set; }
|
||
}
|