feat(scada): add calibrated monitoring and incident recovery

This commit is contained in:
2026-11-07 19:44:58 +08:00
parent 26fa5d1909
commit ff8aba4964
109 changed files with 9165 additions and 629 deletions
+25 -1
View File
@@ -6,7 +6,7 @@ from pydantic import ValidationError
from app.domain.domain_errors import DomainError
from app.domain.schemas.operational_data import TaskDataSnapshot
from app.domain.schemas.operational_task import TaskPresentationEventCommand
from app.domain.schemas.operational_task import TaskPresentationEventCommand, TaskSafeChart
from app.services.operational_presentation import resolve_overlay
@@ -86,3 +86,27 @@ def test_unified_presentation_commands_preserve_flat_shape(command):
def test_unified_presentation_rejects_invalid_commands(command):
with pytest.raises(ValidationError):
TaskPresentationEventCommand(request_id=uuid4(), run_id=uuid4(), source_session_id="session", command=command)
def test_safe_chart_preserves_sparse_scatter_and_real_sample_times():
data = {"title": "压力对比", "chart_type": "line", "x_data": ["19:45", "20:00"],
"x_axis_name": "时刻", "y_axis_name": "压力 m", "series": [
{"name": "当前", "data": [0., 25.]},
{"name": "前一天", "type": "scatter", "data": [None, 26.],
"sample_times": [None, "2026-06-13T20:00:00+08:00"]}]}
assert TaskSafeChart.model_validate(data).model_dump(mode="json") == data
@pytest.mark.parametrize("series", [
{"name": "s", "data": [None], "sample_times": ["2026-06-14T20:00:00Z"]},
{"name": "s", "data": [1.], "sample_times": ["2026-06-14T20:00:00"]},
{"name": "s", "data": [1.], "sample_times": ["not-a-time"]},
{"name": "s", "data": [1.], "sample_times": ["2026-06-14 20:00:00+08:00"]},
{"name": "s", "data": [1.], "sample_times": []},
{"name": "s", "data": [float("inf")]},
{"name": "s", "data": [True]},
{"name": "s", "type": "script", "data": [1.]},
])
def test_safe_chart_rejects_invalid_sample_metadata_and_values(series):
with pytest.raises(ValidationError):
TaskSafeChart(title="X", chart_type="line", x_data=["t"], series=[series])