Основные изменения:

состояние окон видимости, расписания планов, попыток выдачи и job’ов перенесено в БД;
план и попытка выдачи разделены на разные сущности;
Kafka-события теперь двигают persisted state/jobs, а не локальную память pod’а;
BPMN createSatelliteMission теперь отвечает только за одну попытку выдачи плана;
обновление слотов после принятия плана вынесено в отдельный BPMN-процесс;
workers используют DB claim/lock model и безопасны для нескольких pod’ов;
тестовый ручной API вынесен в отдельный disabled-by-default controller
This commit is contained in:
Дмитрий Соловьев
2026-05-27 10:29:41 +03:00
parent cf3bb63bc1
commit 3dce0aec0d
89 changed files with 3922 additions and 1953 deletions
@@ -0,0 +1,105 @@
CREATE TABLE IF NOT EXISTS spacecraft_snapshot (
spacecraft_id VARCHAR(255) PRIMARY KEY,
norad_id BIGINT NOT NULL,
nsi_id VARCHAR(255),
business_key VARCHAR(255),
name VARCHAR(1024),
status VARCHAR(255),
mission VARCHAR(1024),
valid_from TIMESTAMP,
valid_to TIMESTAMP,
active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
CREATE TABLE IF NOT EXISTS spacecraft_visibility_snapshot (
spacecraft_id VARCHAR(255) PRIMARY KEY,
norad_id BIGINT NOT NULL,
payload_json TEXT NOT NULL,
payload_hash VARCHAR(128) NOT NULL,
fetched_at TIMESTAMP NOT NULL,
visibility_from TIMESTAMP,
visibility_to TIMESTAMP,
windows_count INTEGER,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
CREATE TABLE IF NOT EXISTS planned_plan (
plan_id UUID PRIMARY KEY,
spacecraft_id VARCHAR(255) NOT NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP NOT NULL,
kpp_id VARCHAR(255) NOT NULL,
status VARCHAR(64) NOT NULL,
issue_not_before TIMESTAMP,
base_plan_id UUID,
chain_version BIGINT NOT NULL DEFAULT 0,
accepted_at TIMESTAMP,
superseded_by_plan_id UUID,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
CONSTRAINT uq_planned_plan_business_key UNIQUE (spacecraft_id, start_time, end_time, kpp_id)
);
CREATE INDEX IF NOT EXISTS idx_planned_plan_due
ON planned_plan (status, issue_not_before, start_time);
CREATE INDEX IF NOT EXISTS idx_planned_plan_spacecraft_start
ON planned_plan (spacecraft_id, start_time);
CREATE TABLE IF NOT EXISTS plan_issue_attempt (
attempt_id UUID PRIMARY KEY,
plan_id UUID NOT NULL REFERENCES planned_plan(plan_id),
attempt_no INTEGER NOT NULL,
status VARCHAR(64) NOT NULL,
process_instance_key BIGINT,
decision_event_id UUID,
decision_reason TEXT,
started_at TIMESTAMP,
finished_at TIMESTAMP,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
CONSTRAINT uq_plan_issue_attempt_no UNIQUE (plan_id, attempt_no)
);
CREATE INDEX IF NOT EXISTS idx_plan_issue_attempt_plan
ON plan_issue_attempt (plan_id, attempt_no);
CREATE TABLE IF NOT EXISTS visibility_refresh_job (
spacecraft_id VARCHAR(255) PRIMARY KEY,
norad_id BIGINT,
status VARCHAR(64) NOT NULL,
reason VARCHAR(255),
locked_by VARCHAR(255),
locked_until TIMESTAMP,
attempts INTEGER NOT NULL DEFAULT 0,
requested_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
CREATE TABLE IF NOT EXISTS plan_recalculation_job (
spacecraft_id VARCHAR(255) PRIMARY KEY,
status VARCHAR(64) NOT NULL,
reason VARCHAR(255),
locked_by VARCHAR(255),
locked_until TIMESTAMP,
attempts INTEGER NOT NULL DEFAULT 0,
requested_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
CREATE TABLE IF NOT EXISTS processed_plan_decision_event (
event_id UUID PRIMARY KEY,
received_at TIMESTAMP NOT NULL
);
ALTER TABLE spacecraft_planning_state
ADD COLUMN IF NOT EXISTS active_plan_id UUID;
ALTER TABLE spacecraft_planning_state
ADD COLUMN IF NOT EXISTS active_attempt_id UUID;
ALTER TABLE spacecraft_planning_state
ADD COLUMN IF NOT EXISTS chain_version BIGINT NOT NULL DEFAULT 0;
@@ -0,0 +1,11 @@
CREATE TABLE IF NOT EXISTS accepted_plan_slots_update_job (
plan_id UUID PRIMARY KEY,
status VARCHAR(32) NOT NULL,
process_instance_key BIGINT NULL,
locked_by VARCHAR(255) NULL,
locked_until TIMESTAMP NULL,
attempts INT NOT NULL DEFAULT 0,
last_error TEXT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL
);
@@ -0,0 +1,5 @@
ALTER TABLE visibility_refresh_job
ADD COLUMN IF NOT EXISTS rerun_requested BOOLEAN NOT NULL DEFAULT FALSE;
ALTER TABLE plan_recalculation_job
ADD COLUMN IF NOT EXISTS rerun_requested BOOLEAN NOT NULL DEFAULT FALSE;