版本260406
This commit is contained in:
@@ -0,0 +1,295 @@
|
||||
namespace OrpaonVision.Core.Production.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// 产品会话详情。
|
||||
/// </summary>
|
||||
public sealed class ProductSessionDetailDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 会话ID。
|
||||
/// </summary>
|
||||
public Guid SessionId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品序列号。
|
||||
/// </summary>
|
||||
public string ProductSerialNumber { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 机种ID。
|
||||
/// </summary>
|
||||
public Guid ProductTypeId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 机种编码。
|
||||
/// </summary>
|
||||
public string ProductTypeCode { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 机种名称。
|
||||
/// </summary>
|
||||
public string ProductTypeName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 工位ID。
|
||||
/// </summary>
|
||||
public Guid WorkstationId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位名称。
|
||||
/// </summary>
|
||||
public string WorkstationName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 开始时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime StartedAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 结束时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? EndedAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 总耗时(秒)。
|
||||
/// </summary>
|
||||
public decimal? TotalDurationSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最终结果。
|
||||
/// </summary>
|
||||
public string FinalResult { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 最终NG类型。
|
||||
/// </summary>
|
||||
public string? FinalNgType { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员ID。
|
||||
/// </summary>
|
||||
public Guid? OperatorId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员姓名。
|
||||
/// </summary>
|
||||
public string OperatorName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 班次。
|
||||
/// </summary>
|
||||
public string Shift { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 当前模型版本。
|
||||
/// </summary>
|
||||
public string ModelVersion { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 当前规则版本。
|
||||
/// </summary>
|
||||
public string RuleVersion { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 层级结果列表。
|
||||
/// </summary>
|
||||
public IReadOnlyList<LayerResultDto> LayerResults { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 异常记录列表。
|
||||
/// </summary>
|
||||
public IReadOnlyList<AbnormalRecordDto> AbnormalRecords { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 关键截图列表。
|
||||
/// </summary>
|
||||
public IReadOnlyList<KeyScreenshotDto> KeyScreenshots { get; init; } = [];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 层级结果。
|
||||
/// </summary>
|
||||
public sealed class LayerResultDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 层级结果ID。
|
||||
/// </summary>
|
||||
public Guid LayerResultId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 层级ID。
|
||||
/// </summary>
|
||||
public Guid LayerId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 层级名称。
|
||||
/// </summary>
|
||||
public string LayerName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 层级序号。
|
||||
/// </summary>
|
||||
public int LayerSequence { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime StartedAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 结束时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? EndedAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 层级结果。
|
||||
/// </summary>
|
||||
public string Result { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// NG类型。
|
||||
/// </summary>
|
||||
public string? NgType { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 检测次数。
|
||||
/// </summary>
|
||||
public int DetectionCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均检测时间(毫秒)。
|
||||
/// </summary>
|
||||
public decimal AverageDetectionTimeMs { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 应装部件数量。
|
||||
/// </summary>
|
||||
public int RequiredPartsCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 已装部件数量。
|
||||
/// </summary>
|
||||
public int InstalledPartsCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 到位部件数量。
|
||||
/// </summary>
|
||||
public int PositionedPartsCount { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 异常记录。
|
||||
/// </summary>
|
||||
public sealed class AbnormalRecordDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 异常记录ID。
|
||||
/// </summary>
|
||||
public Guid RecordId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 异常类型。
|
||||
/// </summary>
|
||||
public string AbnormalType { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 异常描述。
|
||||
/// </summary>
|
||||
public string Description { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 发生时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime OccurredAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 相关层级ID。
|
||||
/// </summary>
|
||||
public Guid? LayerId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 相关层级名称。
|
||||
/// </summary>
|
||||
public string? LayerName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 严重程度。
|
||||
/// </summary>
|
||||
public string Severity { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 是否已处理。
|
||||
/// </summary>
|
||||
public bool IsHandled { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 处理时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? HandledAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 处理人。
|
||||
/// </summary>
|
||||
public string? HandledBy { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 处理备注。
|
||||
/// </summary>
|
||||
public string? HandlingRemark { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 关键截图。
|
||||
/// </summary>
|
||||
public sealed class KeyScreenshotDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 截图ID。
|
||||
/// </summary>
|
||||
public Guid ScreenshotId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 截图类型。
|
||||
/// </summary>
|
||||
public string ScreenshotType { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 截图描述。
|
||||
/// </summary>
|
||||
public string Description { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 拍摄时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime CapturedAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 相关层级ID。
|
||||
/// </summary>
|
||||
public Guid? LayerId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 相关层级名称。
|
||||
/// </summary>
|
||||
public string? LayerName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 图片文件路径。
|
||||
/// </summary>
|
||||
public string ImageFilePath { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 缩略图文件路径。
|
||||
/// </summary>
|
||||
public string ThumbnailPath { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 检测结果(JSON)。
|
||||
/// </summary>
|
||||
public string DetectionResultJson { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 文件大小(字节)。
|
||||
/// </summary>
|
||||
public long FileSizeBytes { get; init; }
|
||||
}
|
||||
465
OrpaonVision.Core/Production/Contracts/ProductionAnalysisDto.cs
Normal file
465
OrpaonVision.Core/Production/Contracts/ProductionAnalysisDto.cs
Normal file
@@ -0,0 +1,465 @@
|
||||
namespace OrpaonVision.Core.Production.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// 实时生产状态。
|
||||
/// </summary>
|
||||
public sealed class RealtimeProductionStatusDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 工位ID。
|
||||
/// </summary>
|
||||
public Guid WorkstationId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位名称。
|
||||
/// </summary>
|
||||
public string WorkstationName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 当前状态。
|
||||
/// </summary>
|
||||
public string CurrentStatus { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 当前产品序列号。
|
||||
/// </summary>
|
||||
public string? CurrentProductSerialNumber { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前机种编码。
|
||||
/// </summary>
|
||||
public string? CurrentProductTypeCode { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前层级名称。
|
||||
/// </summary>
|
||||
public string? CurrentLayerName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前层级序号。
|
||||
/// </summary>
|
||||
public int? CurrentLayerSequence { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前操作员姓名。
|
||||
/// </summary>
|
||||
public string? CurrentOperatorName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前班次。
|
||||
/// </summary>
|
||||
public string? CurrentShift { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 今日OK数量。
|
||||
/// </summary>
|
||||
public long TodayOkCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 今日NG数量。
|
||||
/// </summary>
|
||||
public long TodayNgCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 今日良率。
|
||||
/// </summary>
|
||||
public decimal TodayYieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前班次OK数量。
|
||||
/// </summary>
|
||||
public long ShiftOkCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前班次NG数量。
|
||||
/// </summary>
|
||||
public long ShiftNgCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前班次良率。
|
||||
/// </summary>
|
||||
public decimal ShiftYieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 设备运行状态。
|
||||
/// </summary>
|
||||
public string DeviceStatus { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 最后更新时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime LastUpdatedAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 连续正常生产数量。
|
||||
/// </summary>
|
||||
public int ConsecutiveOkCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最近一次NG时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? LastNgAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最近一次NG类型。
|
||||
/// </summary>
|
||||
public string? LastNgType { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 质量分析报告。
|
||||
/// </summary>
|
||||
public sealed class QualityAnalysisReportDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 报告时间范围开始(UTC)。
|
||||
/// </summary>
|
||||
public DateTime StartTimeUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 报告时间范围结束(UTC)。
|
||||
/// </summary>
|
||||
public DateTime EndTimeUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位名称。
|
||||
/// </summary>
|
||||
public string WorkstationName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 总体质量指标。
|
||||
/// </summary>
|
||||
public OverallQualityMetricsDto OverallMetrics { get; init; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// NG类型分析。
|
||||
/// </summary>
|
||||
public IReadOnlyList<NgTypeAnalysisDto> NgTypeAnalysis { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 机种质量对比。
|
||||
/// </summary>
|
||||
public IReadOnlyList<ProductTypeQualityDto> ProductTypeQuality { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 层级质量分析。
|
||||
/// </summary>
|
||||
public IReadOnlyList<LayerQualityAnalysisDto> LayerQualityAnalysis { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 操作员质量分析。
|
||||
/// </summary>
|
||||
public IReadOnlyList<OperatorQualityAnalysisDto> OperatorQualityAnalysis { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 时间趋势分析。
|
||||
/// </summary>
|
||||
public IReadOnlyList<QualityTrendDto> QualityTrends { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 改进建议。
|
||||
/// </summary>
|
||||
public IReadOnlyList<ImprovementSuggestionDto> ImprovementSuggestions { get; init; } = [];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 总体质量指标。
|
||||
/// </summary>
|
||||
public sealed class OverallQualityMetricsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 总产品数量。
|
||||
/// </summary>
|
||||
public long TotalProducts { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// OK产品数量。
|
||||
/// </summary>
|
||||
public long OkProducts { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG产品数量。
|
||||
/// </summary>
|
||||
public long NgProducts { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 目标良率。
|
||||
/// </summary>
|
||||
public decimal TargetYieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率达成率。
|
||||
/// </summary>
|
||||
public decimal YieldRateAchievement { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 目标节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal TargetCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 节拍达成率。
|
||||
/// </summary>
|
||||
public decimal CycleTimeAchievement { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 质量评分(0-100)。
|
||||
/// </summary>
|
||||
public decimal QualityScore { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 质量等级。
|
||||
/// </summary>
|
||||
public string QualityGrade { get; init; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// NG类型分析。
|
||||
/// </summary>
|
||||
public sealed class NgTypeAnalysisDto
|
||||
{
|
||||
/// <summary>
|
||||
/// NG类型。
|
||||
/// </summary>
|
||||
public string NgType { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// NG类型描述。
|
||||
/// </summary>
|
||||
public string Description { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// NG数量。
|
||||
/// </summary>
|
||||
public long Count { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 占比。
|
||||
/// </summary>
|
||||
public decimal Percentage { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 严重程度。
|
||||
/// </summary>
|
||||
public string Severity { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 主要发生层级。
|
||||
/// </summary>
|
||||
public string MainLayer { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 趋势(上升/下降/稳定)。
|
||||
/// </summary>
|
||||
public string Trend { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 趋势变化率。
|
||||
/// </summary>
|
||||
public decimal TrendChangeRate { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 机种质量对比。
|
||||
/// </summary>
|
||||
public sealed class ProductTypeQualityDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 机种编码。
|
||||
/// </summary>
|
||||
public string ProductTypeCode { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 机种名称。
|
||||
/// </summary>
|
||||
public string ProductTypeName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 产品数量。
|
||||
/// </summary>
|
||||
public long ProductCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 质量排名。
|
||||
/// </summary>
|
||||
public int QualityRanking { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 效率排名。
|
||||
/// </summary>
|
||||
public int EfficiencyRanking { init; get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 层级质量分析。
|
||||
/// </summary>
|
||||
public sealed class LayerQualityAnalysisDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 层级名称。
|
||||
/// </summary>
|
||||
public string LayerName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 层级序号。
|
||||
/// </summary>
|
||||
public int LayerSequence { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 检测次数。
|
||||
/// </summary>
|
||||
public long DetectionCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG次数。
|
||||
/// </summary>
|
||||
public long NgCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG率。
|
||||
/// </summary>
|
||||
public decimal NgRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均检测时间(毫秒)。
|
||||
/// </summary>
|
||||
public decimal AverageDetectionTimeMs { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 风险等级。
|
||||
/// </summary>
|
||||
public string RiskLevel { get; init; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 操作员质量分析。
|
||||
/// </summary>
|
||||
public sealed class OperatorQualityAnalysisDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 操作员姓名。
|
||||
/// </summary>
|
||||
public string OperatorName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 班次。
|
||||
/// </summary>
|
||||
public string Shift { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 产品数量。
|
||||
/// </summary>
|
||||
public long ProductCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 技能等级。
|
||||
/// </summary>
|
||||
public string SkillLevel { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 绩效评分。
|
||||
/// </summary>
|
||||
public decimal PerformanceScore { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 质量趋势。
|
||||
/// </summary>
|
||||
public sealed class QualityTrendDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 时间点(UTC)。
|
||||
/// </summary>
|
||||
public DateTime TimePointUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品数量。
|
||||
/// </summary>
|
||||
public long ProductCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 移动平均良率。
|
||||
/// </summary>
|
||||
public decimal MovingAverageYieldRate { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 改进建议。
|
||||
/// </summary>
|
||||
public sealed class ImprovementSuggestionDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 建议类型。
|
||||
/// </summary>
|
||||
public string SuggestionType { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 建议标题。
|
||||
/// </summary>
|
||||
public string Title { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 建议描述。
|
||||
/// </summary>
|
||||
public string Description { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 优先级。
|
||||
/// </summary>
|
||||
public string Priority { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 预期效果。
|
||||
/// </summary>
|
||||
public string ExpectedImpact { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 实施难度。
|
||||
/// </summary>
|
||||
public string ImplementationDifficulty { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 相关数据支持。
|
||||
/// </summary>
|
||||
public string SupportingData { get; init; } = string.Empty;
|
||||
}
|
||||
@@ -0,0 +1,297 @@
|
||||
namespace OrpaonVision.Core.Production.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// 生产统计详情。
|
||||
/// </summary>
|
||||
public sealed class ProductionStatisticsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 统计时间范围开始(UTC)。
|
||||
/// </summary>
|
||||
public DateTime StartTimeUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 统计时间范围结束(UTC)。
|
||||
/// </summary>
|
||||
public DateTime EndTimeUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位ID。
|
||||
/// </summary>
|
||||
public Guid? WorkstationId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位名称。
|
||||
/// </summary>
|
||||
public string WorkstationName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 班次。
|
||||
/// </summary>
|
||||
public string Shift { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 总产品数量。
|
||||
/// </summary>
|
||||
public long TotalProducts { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// OK产品数量。
|
||||
/// </summary>
|
||||
public long OkProducts { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG产品数量。
|
||||
/// </summary>
|
||||
public long NgProducts { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最快节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal FastestCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最慢节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal SlowestCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 按机种分组的统计。
|
||||
/// </summary>
|
||||
public IReadOnlyList<ProductTypeStatisticsDto> ProductTypeStatistics { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 按NG类型分组的统计。
|
||||
/// </summary>
|
||||
public IReadOnlyList<NgTypeStatisticsDto> NgTypeStatistics { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 按层级分组的统计。
|
||||
/// </summary>
|
||||
public IReadOnlyList<LayerStatisticsDto> LayerStatistics { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 按小时分组的统计。
|
||||
/// </summary>
|
||||
public IReadOnlyList<HourlyProductionDto> HourlyStatistics { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 操作员统计。
|
||||
/// </summary>
|
||||
public IReadOnlyList<OperatorStatisticsDto> OperatorStatistics { get; init; } = [];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 机种统计。
|
||||
/// </summary>
|
||||
public sealed class ProductTypeStatisticsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 机种ID。
|
||||
/// </summary>
|
||||
public Guid ProductTypeId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 机种编码。
|
||||
/// </summary>
|
||||
public string ProductTypeCode { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 机种名称。
|
||||
/// </summary>
|
||||
public string ProductTypeName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 产品数量。
|
||||
/// </summary>
|
||||
public long Count { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// OK数量。
|
||||
/// </summary>
|
||||
public long OkCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG数量。
|
||||
/// </summary>
|
||||
public long NgCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// NG类型统计。
|
||||
/// </summary>
|
||||
public sealed class NgTypeStatisticsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// NG类型。
|
||||
/// </summary>
|
||||
public string NgType { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// NG类型描述。
|
||||
/// </summary>
|
||||
public string NgTypeDescription { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// NG数量。
|
||||
/// </summary>
|
||||
public long Count { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 占比。
|
||||
/// </summary>
|
||||
public decimal Percentage { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 主要发生的层级。
|
||||
/// </summary>
|
||||
public string MainLayer { get; init; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 层级统计。
|
||||
/// </summary>
|
||||
public sealed class LayerStatisticsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 层级ID。
|
||||
/// </summary>
|
||||
public Guid LayerId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 层级名称。
|
||||
/// </summary>
|
||||
public string LayerName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 层级序号。
|
||||
/// </summary>
|
||||
public int LayerSequence { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 检测次数。
|
||||
/// </summary>
|
||||
public long DetectionCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG次数。
|
||||
/// </summary>
|
||||
public long NgCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG率。
|
||||
/// </summary>
|
||||
public decimal NgRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均检测时间(毫秒)。
|
||||
/// </summary>
|
||||
public decimal AverageDetectionTimeMs { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 每小时生产统计。
|
||||
/// </summary>
|
||||
public sealed class HourlyProductionDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 小时(0-23)。
|
||||
/// </summary>
|
||||
public int Hour { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品数量。
|
||||
/// </summary>
|
||||
public long ProductCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// OK数量。
|
||||
/// </summary>
|
||||
public long OkCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG数量。
|
||||
/// </summary>
|
||||
public long NgCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 操作员统计。
|
||||
/// </summary>
|
||||
public sealed class OperatorStatisticsDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 操作员ID。
|
||||
/// </summary>
|
||||
public Guid OperatorId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员姓名。
|
||||
/// </summary>
|
||||
public string OperatorName { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 班次。
|
||||
/// </summary>
|
||||
public string Shift { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 产品数量。
|
||||
/// </summary>
|
||||
public long ProductCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// OK数量。
|
||||
/// </summary>
|
||||
public long OkCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// NG数量。
|
||||
/// </summary>
|
||||
public long NgCount { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 良率。
|
||||
/// </summary>
|
||||
public decimal YieldRate { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 平均节拍(秒)。
|
||||
/// </summary>
|
||||
public decimal AverageCycleTimeSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工作时长(小时)。
|
||||
/// </summary>
|
||||
public decimal WorkingHours { get; init; }
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
namespace OrpaonVision.Core.Production.Contracts.Queries;
|
||||
|
||||
/// <summary>
|
||||
/// 产品会话查询条件。
|
||||
/// </summary>
|
||||
public sealed class ProductSessionQueryDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 产品序列号(精确匹配)。
|
||||
/// </summary>
|
||||
public string? ProductSerialNumber { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品序列号(模糊匹配)。
|
||||
/// </summary>
|
||||
public string? ProductSerialNumberLike { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 机种ID。
|
||||
/// </summary>
|
||||
public Guid? ProductTypeId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 机种编码。
|
||||
/// </summary>
|
||||
public string? ProductTypeCode { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位ID。
|
||||
/// </summary>
|
||||
public Guid? WorkstationId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位名称。
|
||||
/// </summary>
|
||||
public string? WorkstationName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员ID。
|
||||
/// </summary>
|
||||
public Guid? OperatorId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员姓名。
|
||||
/// </summary>
|
||||
public string? OperatorName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 班次。
|
||||
/// </summary>
|
||||
public string? Shift { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最终结果。
|
||||
/// </summary>
|
||||
public string? FinalResult { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最终NG类型。
|
||||
/// </summary>
|
||||
public string? FinalNgType { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始时间范围开始(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? StartedAtUtcStart { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始时间范围结束(UTC)。
|
||||
/// </summary>
|
||||
public DateTime? StartedAtUtcEnd { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 模型版本。
|
||||
/// </summary>
|
||||
public string? ModelVersion { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 规则版本。
|
||||
/// </summary>
|
||||
public string? RuleVersion { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否包含异常记录。
|
||||
/// </summary>
|
||||
public bool? HasAbnormalRecords { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否包含关键截图。
|
||||
/// </summary>
|
||||
public bool? HasKeyScreenshots { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最小耗时(秒)。
|
||||
/// </summary>
|
||||
public decimal? MinDurationSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 最大耗时(秒)。
|
||||
/// </summary>
|
||||
public decimal? MaxDurationSeconds { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 页码(从1开始)。
|
||||
/// </summary>
|
||||
public int PageIndex { get; init; } = 1;
|
||||
|
||||
/// <summary>
|
||||
/// 每页大小。
|
||||
/// </summary>
|
||||
public int PageSize { get; init; } = 20;
|
||||
|
||||
/// <summary>
|
||||
/// 排序字段。
|
||||
/// </summary>
|
||||
public string SortField { get; init; } = "StartedAtUtc";
|
||||
|
||||
/// <summary>
|
||||
/// 排序方向(ASC/DESC)。
|
||||
/// </summary>
|
||||
public string SortDirection { get; init; } = "DESC";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 生产统计查询条件。
|
||||
/// </summary>
|
||||
public sealed class ProductionStatisticsQueryDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 统计时间范围开始(UTC)。
|
||||
/// </summary>
|
||||
public DateTime StartTimeUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 统计时间范围结束(UTC)。
|
||||
/// </summary>
|
||||
public DateTime EndTimeUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位ID。
|
||||
/// </summary>
|
||||
public Guid? WorkstationId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 工位名称。
|
||||
/// </summary>
|
||||
public string? WorkstationName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 机种ID。
|
||||
/// </summary>
|
||||
public Guid? ProductTypeId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 机种编码。
|
||||
/// </summary>
|
||||
public string? ProductTypeCode { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 班次。
|
||||
/// </summary>
|
||||
public string? Shift { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员ID。
|
||||
/// </summary>
|
||||
public Guid? OperatorId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作员姓名。
|
||||
/// </summary>
|
||||
public string? OperatorName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否包含详细统计。
|
||||
/// </summary>
|
||||
public bool IncludeDetailedStatistics { get; init; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 统计粒度(Hour/Day/Week/Month)。
|
||||
/// </summary>
|
||||
public string Granularity { get; init; } = "Hour";
|
||||
|
||||
/// <summary>
|
||||
/// 是否按层级分组。
|
||||
/// </summary>
|
||||
public bool GroupByLayer { get; init; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 是否按NG类型分组。
|
||||
/// </summary>
|
||||
public bool GroupByNgType { get; init; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 是否按操作员分组。
|
||||
/// </summary>
|
||||
public bool GroupByOperator { get; init; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 最小样本数(用于统计过滤)。
|
||||
/// </summary>
|
||||
public int? MinSampleCount { get; init; }
|
||||
}
|
||||
61
OrpaonVision.Core/Production/IProductionAppService.cs
Normal file
61
OrpaonVision.Core/Production/IProductionAppService.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using OrpaonVision.Core.Results;
|
||||
using OrpaonVision.Core.Production.Contracts;
|
||||
using OrpaonVision.Core.Production.Contracts.Queries;
|
||||
using OrpaonVision.Core.Training.Contracts;
|
||||
|
||||
namespace OrpaonVision.Core.Production;
|
||||
|
||||
/// <summary>
|
||||
/// 生产应用服务接口。
|
||||
/// </summary>
|
||||
public interface IProductionAppService
|
||||
{
|
||||
/// <summary>
|
||||
/// 分页查询产品会话。
|
||||
/// </summary>
|
||||
/// <param name="query">查询条件。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>分页结果。</returns>
|
||||
Task<Result<PagedResult<ProductSessionDetailDto>>> GetProductSessionsAsync(ProductSessionQueryDto query, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取产品会话详情。
|
||||
/// </summary>
|
||||
/// <param name="sessionId">会话ID。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>产品会话详情。</returns>
|
||||
Task<Result<ProductSessionDetailDto>> GetProductSessionDetailAsync(Guid sessionId, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取生产统计。
|
||||
/// </summary>
|
||||
/// <param name="query">统计查询条件。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>生产统计结果。</returns>
|
||||
Task<Result<ProductionStatisticsDto>> GetProductionStatisticsAsync(ProductionStatisticsQueryDto query, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取实时生产状态。
|
||||
/// </summary>
|
||||
/// <param name="workstationId">工位ID。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>实时生产状态。</returns>
|
||||
Task<Result<RealtimeProductionStatusDto>> GetRealtimeProductionStatusAsync(Guid workstationId, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 导出生产数据。
|
||||
/// </summary>
|
||||
/// <param name="query">导出查询条件。</param>
|
||||
/// <param name="format">导出格式。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>导出文件信息。</returns>
|
||||
Task<Result<ExportFileDto>> ExportProductionDataAsync(ProductSessionQueryDto query, string format = "Excel", CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取质量分析报告。
|
||||
/// </summary>
|
||||
/// <param name="query">分析查询条件。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>质量分析报告。</returns>
|
||||
Task<Result<QualityAnalysisReportDto>> GetQualityAnalysisReportAsync(ProductionStatisticsQueryDto query, CancellationToken cancellationToken = default);
|
||||
}
|
||||
468
OrpaonVision.Core/Production/IProductionSessionManagerService.cs
Normal file
468
OrpaonVision.Core/Production/IProductionSessionManagerService.cs
Normal file
@@ -0,0 +1,468 @@
|
||||
using OrpaonVision.Core.Results;
|
||||
using OrpaonVision.Core.Common;
|
||||
using OrpaonVision.Model.Production;
|
||||
using OrpaonVision.Model.Configuration;
|
||||
|
||||
namespace OrpaonVision.Core.Production;
|
||||
|
||||
/// <summary>
|
||||
/// 产品会话管理服务接口。
|
||||
/// </summary>
|
||||
public interface IProductionSessionManagerService
|
||||
{
|
||||
/// <summary>
|
||||
/// 进站建会话。
|
||||
/// </summary>
|
||||
/// <param name="request">进站请求。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>会话创建结果。</returns>
|
||||
Task<Result<ProductionSessionModel>> CreateSessionOnArrivalAsync(CreateSessionOnArrivalRequest request, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 离站归档会话。
|
||||
/// </summary>
|
||||
/// <param name="sessionId">会话ID。</param>
|
||||
/// <param name="result">最终结果。</param>
|
||||
/// <param name="ngReason">NG原因。</param>
|
||||
/// <param name="remark">备注。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>归档结果。</returns>
|
||||
Task<Result> ArchiveSessionOnDepartureAsync(Guid sessionId, ProductionSessionResult result, string? ngReason = null, string? remark = null, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 更新会话进度。
|
||||
/// </summary>
|
||||
/// <param name="sessionId">会话ID。</param>
|
||||
/// <param name="currentLayer">当前层级。</param>
|
||||
/// <param name="layerStatus">层级状态。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>更新结果。</returns>
|
||||
Task<Result> UpdateSessionProgressAsync(Guid sessionId, int currentLayer, ProductionSessionStatus layerStatus, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 暂停会话。
|
||||
/// </summary>
|
||||
/// <param name="sessionId">会话ID。</param>
|
||||
/// <param name="reason">暂停原因。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>暂停结果。</returns>
|
||||
Task<Result> PauseSessionAsync(Guid sessionId, string reason, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 恢复会话。
|
||||
/// </summary>
|
||||
/// <param name="sessionId">会话ID。</param>
|
||||
/// <param name="reason">恢复原因。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>恢复结果。</returns>
|
||||
Task<Result> ResumeSessionAsync(Guid sessionId, string reason, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 取消会话。
|
||||
/// </summary>
|
||||
/// <param name="sessionId">会话ID。</param>
|
||||
/// <param name="reason">取消原因。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>取消结果。</returns>
|
||||
Task<Result> CancelSessionAsync(Guid sessionId, string reason, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前活动会话。
|
||||
/// </summary>
|
||||
/// <param name="stationId">工位ID。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>当前会话。</returns>
|
||||
Task<Result<ProductionSessionModel?>> GetCurrentActiveSessionAsync(string stationId, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取会话详情。
|
||||
/// </summary>
|
||||
/// <param name="sessionId">会话ID。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>会话详情。</returns>
|
||||
Task<Result<ProductionSessionModel?>> GetSessionAsync(Guid sessionId, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取会话历史记录。
|
||||
/// </summary>
|
||||
/// <param name="request">查询请求。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>会话列表。</returns>
|
||||
Task<Result<PagedResult<ProductionSessionModel>>> GetSessionHistoryAsync(GetSessionHistoryRequest request, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 获取会话统计信息。
|
||||
/// </summary>
|
||||
/// <param name="request">统计请求。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>统计信息。</returns>
|
||||
Task<Result<ProductionSessionStatistics>> GetSessionStatisticsAsync(GetSessionStatisticsRequest request, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 导出会话记录。
|
||||
/// </summary>
|
||||
/// <param name="request">导出请求。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>导出数据。</returns>
|
||||
Task<Result<byte[]>> ExportSessionsAsync(ExportSessionsRequest request, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 批量归档会话。
|
||||
/// </summary>
|
||||
/// <param name="sessionIds">会话ID列表。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>归档结果。</returns>
|
||||
Task<Result<BatchArchiveResult>> BatchArchiveSessionsAsync(IReadOnlyList<Guid> sessionIds, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 清理过期会话。
|
||||
/// </summary>
|
||||
/// <param name="retentionDays">保留天数。</param>
|
||||
/// <param name="cancellationToken">取消令牌。</param>
|
||||
/// <returns>清理结果。</returns>
|
||||
Task<Result<CleanupResult>> CleanupExpiredSessionsAsync(int retentionDays, CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 进站建会话请求。
|
||||
/// </summary>
|
||||
public sealed class CreateSessionOnArrivalRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 产品类型ID。
|
||||
/// </summary>
|
||||
public Guid ProductTypeId { get; set; }
|
||||
|
||||
/// <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? ProductSerialNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 进站时间(UTC)。
|
||||
/// </summary>
|
||||
public DateTime ArrivalTimeUtc { get; set; } = DateTime.UtcNow;
|
||||
|
||||
/// <summary>
|
||||
/// 创建人。
|
||||
/// </summary>
|
||||
public string CreatedBy { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 备注。
|
||||
/// </summary>
|
||||
public string? Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 扩展属性。
|
||||
/// </summary>
|
||||
public Dictionary<string, object> ExtendedProperties { get; set; } = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取会话历史记录请求。
|
||||
/// </summary>
|
||||
public sealed class GetSessionHistoryRequest
|
||||
{
|
||||
/// <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 SessionSortField SortField { get; set; } = SessionSortField.StartTimeUtc;
|
||||
|
||||
/// <summary>
|
||||
/// 排序方向。
|
||||
/// </summary>
|
||||
public SortDirection SortDirection { get; set; } = SortDirection.Descending;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取会话统计信息请求。
|
||||
/// </summary>
|
||||
public sealed class GetSessionStatisticsRequest
|
||||
{
|
||||
/// <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 List<StatisticsDimension> Dimensions { get; set; } = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 导出会话记录请求。
|
||||
/// </summary>
|
||||
public sealed class ExportSessionsRequest
|
||||
{
|
||||
/// <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 bool IncludeDetails { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 是否包含扩展属性。
|
||||
/// </summary>
|
||||
public bool IncludeExtendedProperties { get; set; } = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量归档结果。
|
||||
/// </summary>
|
||||
public sealed class BatchArchiveResult
|
||||
{
|
||||
/// <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 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 enum SessionSortField
|
||||
{
|
||||
/// <summary>
|
||||
/// 开始时间。
|
||||
/// </summary>
|
||||
StartTimeUtc = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 结束时间。
|
||||
/// </summary>
|
||||
EndTimeUtc = 1,
|
||||
|
||||
/// <summary>
|
||||
/// 会话ID。
|
||||
/// </summary>
|
||||
SessionId = 2,
|
||||
|
||||
/// <summary>
|
||||
/// 产品类型编码。
|
||||
/// </summary>
|
||||
ProductTypeCode = 3,
|
||||
|
||||
/// <summary>
|
||||
/// 工位ID。
|
||||
/// </summary>
|
||||
StationId = 4,
|
||||
|
||||
/// <summary>
|
||||
/// 操作员姓名。
|
||||
/// </summary>
|
||||
OperatorName = 5,
|
||||
|
||||
/// <summary>
|
||||
/// 当前层级。
|
||||
/// </summary>
|
||||
CurrentLayer = 6
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 排序方向。
|
||||
/// </summary>
|
||||
public enum SortDirection
|
||||
{
|
||||
/// <summary>
|
||||
/// 升序。
|
||||
/// </summary>
|
||||
Ascending = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 降序。
|
||||
/// </summary>
|
||||
Descending = 1
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user