스케줄링/실행 통제는 촬영 후보를 실제 운용 일정으로 배치하고, 명령 요청과 실행을 통제하는 업무 도메인이다.
스케줄 실행: horizon 범위 내에서 촬영, 다운링크, 기타 운용 슬롯을 생성한다.슬롯 상태 관리: 배정, 고정, 대체, 취소 등 슬롯의 상태를 관리한다.변경 이력 관리: 수동 개입과 자동 재계산 이력을 추적한다.명령 사전 관리: 실행 가능한 명령의 유형과 검증 규칙을 통제한다.명령 요청/승인/실행: 명령 요청, 승인, 세션 내 전송, 결과 수집을 관리한다.SCHEDULE_RUNSCHEDULE_SLOTSCHEDULE_SLOT_HISTORYCOMMAND_DICTIONARYCOMMAND_REQUESTCOMMAND_EXECUTIONerDiagram
SCHEDULE_RUN {
uuid schedule_run_id PK
datetime horizon_start
datetime horizon_end
datetime freeze_from
datetime freeze_to
string objective_policy
string status
datetime created_at
}
SCHEDULE_SLOT {
uuid slot_id PK
uuid schedule_run_id FK
uuid satellite_id FK
uuid candidate_id FK
uuid superseded_by_slot_id FK
datetime start_time
datetime end_time
string slot_type
string state
int version
boolean locked
datetime created_at
}
SCHEDULE_SLOT_HISTORY {
uuid slot_hist_id PK
uuid slot_id FK
uuid actor_user_id FK
string action
string prev_state
string new_state
datetime changed_at
string reason_code
}
COMMAND_DICTIONARY {
uuid cmd_dict_id PK
string command_type
string schema_version
string validation_rules_uri
string status
}
COMMAND_REQUEST {
uuid cmd_req_id PK
uuid satellite_id FK
uuid tenant_id FK
uuid user_id FK
uuid cmd_dict_id FK
uuid approved_by_user_id FK
string command_type
json payload_json
int priority
string status
uuid correlation_id
datetime requested_at
datetime approved_at
}
COMMAND_EXECUTION {
uuid cmd_exec_id PK
uuid cmd_req_id FK
uuid session_id FK
datetime sent_at
datetime ack_at
string result
string error_code
string raw_log_uri
}
SCHEDULE_RUN ||--o{ SCHEDULE_SLOT : produces
SCHEDULE_SLOT ||--o{ SCHEDULE_SLOT_HISTORY : changes
SCHEDULE_SLOT ||--o{ SCHEDULE_SLOT : supersedes
COMMAND_DICTIONARY ||--o{ COMMAND_REQUEST : validates
COMMAND_REQUEST ||--o{ COMMAND_EXECUTION : executed_as
SCHEDULE_SLOT는 feasibility 도메인의 IMAGING_CANDIDATE와 위성 도메인의 SATELLITE를 참조한다.COMMAND_EXECUTION은 궤도/지상국 운영 도메인의 CONTACT_SESSION에서 수행된다.USER_ACCOUNT는 슬롯 변경과 명령 요청/승인의 주체로 연결된다.schedule_run_id는 실행 식별자, horizon_start, horizon_end는 스케줄링 범위, freeze_from, freeze_to는 고정 구간, objective_policy는 최적화 정책, status는 실행 상태, created_at은 생성 시각이다.slot_id는 식별자, schedule_run_id는 상위 스케줄 실행, satellite_id는 대상 위성, candidate_id는 원 후보, superseded_by_slot_id는 대체 슬롯, start_time, end_time은 슬롯 구간, slot_type은 유형, state는 상태, version은 버전, locked는 고정 여부, created_at은 생성 시각이다.slot_hist_id는 이력 식별자, slot_id는 대상 슬롯, actor_user_id는 변경 사용자, action은 수행 행위, prev_state, new_state는 상태 전이, changed_at은 변경 시각, reason_code는 사유 코드다.cmd_dict_id는 식별자, command_type은 명령 유형, schema_version은 스키마 버전, validation_rules_uri는 검증 규칙 참조, status는 사용 상태다.cmd_req_id는 식별자, satellite_id, tenant_id, user_id, cmd_dict_id는 관련 자원, approved_by_user_id는 승인자, command_type은 명령 종류, payload_json은 명령 본문, priority는 우선순위, status는 상태, correlation_id는 추적 키, requested_at, approved_at은 요청 및 승인 시각이다.cmd_exec_id는 식별자, cmd_req_id는 원 요청, session_id는 수행 세션, sent_at, ack_at은 전송/응답 시각, result는 실행 결과, error_code는 오류 코드, raw_log_uri는 원시 로그 위치다.schedule_run_id.horizon_start, horizon_end, objective_policy, status, created_at은 NOT NULL, freeze_from, freeze_to는 nullable 가능.(created_at DESC), (status, created_at DESC) 인덱스 권장.objective_policy는 maximize_revenue, maximize_completion, priority_first. status는 created, running, completed, failed.slot_id, FK는 schedule_run_id -> SCHEDULE_RUN.schedule_run_id, satellite_id -> SATELLITE.satellite_id, candidate_id -> IMAGING_CANDIDATE.candidate_id, superseded_by_slot_id -> SCHEDULE_SLOT.slot_id.schedule_run_id, satellite_id, start_time, end_time, slot_type, state, version, locked, created_at은 NOT NULL, candidate_id, superseded_by_slot_id는 nullable 가능.(satellite_id, start_time), (schedule_run_id, start_time), (candidate_id) 인덱스 권장.slot_type은 imaging, downlink, idle, maintenance. state는 planned, locked, executing, completed, cancelled.slot_hist_id, FK는 slot_id -> SCHEDULE_SLOT.slot_id, actor_user_id -> USER_ACCOUNT.user_id.slot_id, action, prev_state, new_state, changed_at은 NOT NULL, actor_user_id, reason_code는 nullable 가능.(slot_id, changed_at DESC), (actor_user_id, changed_at DESC) 인덱스 권장.action은 CREATE, LOCK, UNLOCK, RESCHEDULE, CANCEL.cmd_dict_id.command_type, schema_version, status는 NOT NULL, validation_rules_uri는 nullable 가능.(command_type, schema_version) 유니크, status 인덱스 권장.status는 active, deprecated, blocked.cmd_req_id, FK는 satellite_id, tenant_id, user_id, cmd_dict_id, approved_by_user_id.satellite_id, tenant_id, user_id, cmd_dict_id, command_type, payload_json, priority, status, requested_at은 NOT NULL, approved_by_user_id, approved_at은 nullable 가능.(satellite_id, status, requested_at DESC), (user_id, requested_at DESC), correlation_id 인덱스 권장.status는 requested, approved, rejected, queued, sent, failed. priority는 수치형이지만 1-5 또는 10-100 체계 표준화 권장.cmd_exec_id, FK는 cmd_req_id -> COMMAND_REQUEST.cmd_req_id, session_id -> CONTACT_SESSION.session_id.cmd_req_id, session_id, sent_at, result는 NOT NULL, ack_at, error_code, raw_log_uri는 nullable 가능.(cmd_req_id), (session_id, sent_at DESC), (result, sent_at DESC) 인덱스 권장.result는 ACK, NACK, TIMEOUT, PARTIAL, FAILED.