87905311b1
Базой цепочки план становится на ЗАКЛАДКЕ (LAID_IN), а не на приёмке.
После принятого плана можно отправить коррекцию — она тоже примется;
несколько выдач «в полёте» по одному КА теперь норма, а не конфликт.
- ACCEPT больше не двигает currentBasePlanId/chainVersion и не запирает
слот — только переводит план в AWAITING_LAYIN.
- Новый позитивный топик layin-confirmed + LayinConfirmedConsumer →
handleLayinConfirmed: AWAITING_LAYIN → LAID_IN, план становится базой
(chainVersion++), конкуренты на пересекающемся окне гасятся в новый
терминальный статус SUPERSEDED. Гард ±10 мин (LAYIN_MIN_SEPARATION_MINUTES):
нельзя заложить план со стартом в пределах 10 мин от уже заложенного (409).
- «В полёте» считается из статусов планов (ISSUING/WAITING_DECISION), а не
из единственного active-слота; снят гард «идёт выдача другого плана».
IssueDuePlanWorker гейтится hasBlockingInFlight, базу нового плана берёт
как latestCommittedPlanId; grace больше не двигает базу.
- PlanProjectionService якорит по самому дальнему committed-окну
{ISSUING, WAITING_DECISION, AWAITING_LAYIN, LAID_IN}.
- REJECT ставит паузу только если по КА не осталось живых кандидатов.
- CreateDraftUseCase: replace-черновик наследует ПРЕДШЕСТВЕННИКА исходного
плана (base.basePlanId), а не сам план — коррекция занимает тот же слот;
fork-forward по-прежнему ссылается на базу. Идемпотентность черновиков —
по слоту (КА + окно), а не по basePlanId.
- Тест-контроллер: POST /test/tgu/plans/{id}/confirm-layin (через BFF
pcp-ui-service) — имитация события «план заложен».
- Док PCP_TGU_PLAN_STATUS_LIFECYCLE обновлён (LAID_IN-переход, SUPERSEDED).
157 lines
4.7 KiB
YAML
157 lines
4.7 KiB
YAML
spring:
|
|
boot:
|
|
admin:
|
|
client:
|
|
instance:
|
|
service-base-url: ${pcp.services.tgu}
|
|
service-path: /swagger/ui
|
|
management-base-url: ${pcp.services.tgu}
|
|
flyway:
|
|
enabled: true
|
|
baseline-on-migrate: true
|
|
locations: classpath:db/migration
|
|
|
|
camunda:
|
|
client:
|
|
mode: self-managed
|
|
grpc-address: http://camunda.k8s.265.nstart.local:30901
|
|
auth:
|
|
method: none
|
|
prefer-rest-over-grpc: false
|
|
|
|
management:
|
|
endpoints:
|
|
web:
|
|
exposure:
|
|
include: health,info,metrics,prometheus
|
|
|
|
# Возвращаем текст причины ошибки клиенту (reason из ResponseStatusException попадает в поле
|
|
# `message` тела ответа). Без этого UI видит только HTTP-фразу «Unprocessable Content» и не
|
|
# понимает, почему действие отклонено (напр. «план заложен — используйте fork-forward»).
|
|
server:
|
|
error:
|
|
include-message: always
|
|
|
|
springdoc:
|
|
swagger-ui:
|
|
path: /swagger/ui
|
|
|
|
planning:
|
|
notification-before-start-minutes: 263
|
|
target-plan-duration-minutes: 1440
|
|
target-plan-duration-delta-minutes: 240
|
|
external-update-enabled: true
|
|
external-points-lookahead-days: 10
|
|
in-memory-history-days: 14
|
|
external-update-fixed-delay-ms: 600000
|
|
notification-check-fixed-delay-ms: 30000
|
|
min-reissue-lead-minutes: 5
|
|
reissue-prep-minutes: 30
|
|
worker-lock-ttl-seconds: 300
|
|
waiting-decision-grace-minutes: 30
|
|
# Заморозка перед стартом: ручная replace-перевыдача плана в свой слот запрещена,
|
|
# если до старта осталось меньше этого числа минут (часть «точки невозврата»).
|
|
layin-freeze-minutes: 10
|
|
|
|
topics:
|
|
visibility-windows-changed: pcp.tgu.visibility-windows-changed.v1
|
|
satellite-plan-decision: pcp.tgu.satellite-plan-decision.v1
|
|
layin-failed: pcp.tgu.layin-failed.v1
|
|
layin-confirmed: pcp.tgu.layin-confirmed.v1
|
|
plan-not-accepted: pcp.tgu.plan-not-accepted.v1
|
|
station-params-changed: pcp.tgu.station-params-changed.v1
|
|
|
|
tgu:
|
|
test-controller:
|
|
enabled: true
|
|
|
|
classifier:
|
|
platforms-url: https://ordinis.nstart.cloud/api/v1/spacecraft/records
|
|
platforms-cache-ttl: 15m
|
|
allowed-platform-statuses:
|
|
- OPERATIONAL
|
|
|
|
---
|
|
spring:
|
|
config:
|
|
activate:
|
|
on-profile: local
|
|
datasource:
|
|
driver-class-name: org.postgresql.Driver
|
|
url: ${DB_URL:jdbc:postgresql://${pcp.infra.postgres.host}:${pcp.infra.postgres.port}/pcp_tgu}
|
|
username: ${DB_USERNAME:postgres}
|
|
password: ${DB_PASSWORD:password}
|
|
jpa:
|
|
hibernate:
|
|
ddl-auto: validate
|
|
properties:
|
|
hibernate:
|
|
dialect: org.hibernate.dialect.PostgreSQLDialect
|
|
jdbc:
|
|
lob:
|
|
non_contextual_creation: true
|
|
kafka:
|
|
bootstrap-servers: ${pcp.infra.kafka.host}:${pcp.infra.kafka.port}
|
|
consumer:
|
|
group-id: pcp-tgu-service
|
|
auto-offset-reset: earliest
|
|
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
|
|
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
|
|
properties:
|
|
spring.json.trusted.packages: "*"
|
|
producer:
|
|
key-serializer: org.apache.kafka.common.serialization.StringSerializer
|
|
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
|
|
|
|
external-api:
|
|
base-url: ${pcp.services.ballistics}
|
|
|
|
mission-planing:
|
|
base-url: ${pcp.services.mission}
|
|
|
|
server:
|
|
port: ${pcp.ports.tgu:7011}
|
|
|
|
camunda:
|
|
client:
|
|
grpc-address: ${CAMUNDA_GRPC_ADDRESS:http://localhost:26500}
|
|
|
|
---
|
|
spring:
|
|
config:
|
|
activate:
|
|
on-profile: dev
|
|
datasource:
|
|
driver-class-name: org.postgresql.Driver
|
|
url: ${DB_URL:jdbc:postgresql://${pcp.infra.postgres.host}:${pcp.infra.postgres.port}/pcp_tgu}
|
|
username: ${DB_USERNAME:postgres}
|
|
password: ${DB_PASSWORD:password}
|
|
jpa:
|
|
hibernate:
|
|
ddl-auto: validate
|
|
properties:
|
|
hibernate:
|
|
dialect: org.hibernate.dialect.PostgreSQLDialect
|
|
jdbc:
|
|
lob:
|
|
non_contextual_creation: true
|
|
kafka:
|
|
bootstrap-servers: ${pcp.infra.kafka.host}:${pcp.infra.kafka.port}
|
|
consumer:
|
|
group-id: pcp-tgu-service
|
|
auto-offset-reset: earliest
|
|
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
|
|
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
|
|
properties:
|
|
spring.json.trusted.packages: "*"
|
|
producer:
|
|
key-serializer: org.apache.kafka.common.serialization.StringSerializer
|
|
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
|
|
admin:
|
|
auto-create: true
|
|
|
|
external-api:
|
|
base-url: ${pcp.services.ballistics}
|
|
server:
|
|
port: ${pcp.ports.tgu:8080}
|