Files
TieMeasureFlow/src/backend/models/api/statistics.py
T

96 lines
2.6 KiB
Python

"""Pydantic schemas for SPC statistics responses."""
from src.backend.models.api.tipi import UtcDateTime, UtcNaiveInput
from typing import Optional
from pydantic import BaseModel, Field
class StatisticsQuery(BaseModel):
"""Common query parameters for statistics endpoints."""
recipe_id: int
version_id: Optional[int] = None
subtask_id: Optional[int] = None
date_from: UtcNaiveInput = None
date_to: UtcNaiveInput = None
operator_id: Optional[int] = None
lot_number: Optional[str] = None
serial_number: Optional[str] = None
class ControlChartData(BaseModel):
"""Data for X-bar/R control chart."""
values: list[float]
timestamps: list[UtcDateTime]
mean: float
ucl: float # Upper Control Limit
lcl: float # Lower Control Limit
utl: Optional[float] = None
uwl: Optional[float] = None
lwl: Optional[float] = None
ltl: Optional[float] = None
nominal: Optional[float] = None
out_of_control: list[int] = [] # Indices of OOC points
class HistogramData(BaseModel):
"""Data for histogram with normal curve."""
bins: list[float]
counts: list[int]
normal_x: list[float]
normal_y: list[float]
mean: float
std_dev: float
n: int
class CapabilityData(BaseModel):
"""Capability indices."""
cp: Optional[float] = None
cpk: Optional[float] = None
pp: Optional[float] = None
ppk: Optional[float] = None
mean: float
std_dev: float # overall sample std dev (n-1), used for Pp/Ppk
std_dev_within: Optional[float] = None # MRbar/1.128, used for Cp/Cpk
n: int
utl: Optional[float] = None
ltl: Optional[float] = None
nominal: Optional[float] = None
class TrendData(BaseModel):
"""Temporal trend data for capability indices."""
dates: list[UtcDateTime]
cpk_values: list[Optional[float]]
ppk_values: list[Optional[float]]
n_per_period: list[int]
class SummaryData(BaseModel):
"""Pass/fail/warning summary counts."""
total: int
pass_count: int
warning_count: int
fail_count: int
pass_rate: float
warning_rate: float
fail_rate: float
class AlertData(BaseModel):
"""Western Electric rules violations."""
rule: str
description: str
points: list[int] # Indices of violating points
severity: str = Field(..., pattern="^(info|warning|critical)$")
class StatisticsResponse(BaseModel):
"""Combined statistics response."""
summary: SummaryData
capability: Optional[CapabilityData] = None
control_chart: Optional[ControlChartData] = None
histogram: Optional[HistogramData] = None
trend: Optional[TrendData] = None
alerts: list[AlertData] = []