feat: complete legacy parity and modernize operator UI

This commit is contained in:
2026-07-22 12:34:46 +09:00
parent fc4007d676
commit 939c252d23
149 changed files with 26515 additions and 1736 deletions

View File

@@ -7,6 +7,11 @@ Designer가 구독하는 이벤트이며, 선언만 있고 구독되지 않은
Designer 구독은 186개이고, 같은 핸들러를 여러 컨트롤에 연결한 구독을 화면별로 합치면
171개다. 이 문서의 상세 목록은 그 171개를 한 번씩 모두 분류한다.
원본 `timerAliveChecker`는 Designer 구독이 아니다. `MainForm` 생성자 코드가 10초 interval의
WinForms Timer를 만들고 `timerAliveChecker_Tick`을 동적으로 구독한다. 따라서 186/171 집계에
억지로 더하지 않고 별도 활성 이벤트로 감사한다. 이 보충 경로도 현재 LegacyParityApp에
연결됐으므로, 현행 판정에는 미이관 Designer 이벤트나 미이관 동적 활성 이벤트가 없다.
## 분류 기준
- `IMPL`: 원본의 활성 업무 동작이 C# 소유 상태/워크플로, 엄격한 WebView 브리지 intent,
@@ -159,6 +164,26 @@ UC5는 20개 구독이 9개 핸들러를, UC7은 7개 구독이 6개 핸들러
`listView1_MouseDown@2349`, `listView1_MouseMove@2350`, `listView1_MouseUp@2351`
- `SAFETY (1)`: `MainForm_FormClosing@2469`
원본 PROGRAM 중 enabled 변경에는 입력 경로별 차이가 있다. `PlayList_CellClick``m_TakeIn`이면
checkbox 클릭을 거부하지만, `PlayList_KeyPress`의 Space와 `checkBox1_CheckedChanged`의 전체
변경은 같은 guard가 없어 다음 송출 행을 건너뛰는 데 쓰일 수 있다. 새 앱은 PROGRAM 중 이미
진행한 prefix와 현재 on-air 행을 고정하고 **미래 행만** Space/전체 enabled 변경을 허용한다.
원본의 운영 편의는 보존하면서 재생 이력과 현재 행을 바꾸지 않는 안전 적응이며 자동 계약 검증은
완료됐다. 이 변경을 포함한 최신 AppX의 물리 입력 재검증은 아직 대기 중이다.
## Designer 밖 동적 활성 이벤트
- 원본 `MainForm.cs:82-89``timerAliveChecker`는 10초마다 DB 연결 끊김·복구를 확인하고
상태 전이 때 로그를 남긴다. Designer 파일에 없다는 이유로 이전 186/171 집계에서 제외된
것이며, 비활성 코드가 아니다.
- 현재 `MainWindow.xaml.cs`는 창 초기화 뒤 `StartDatabaseHealthMonitor()`를 호출한다.
`MainWindow.DatabaseHealth.cs`는 같은 10초 첫 지연/주기를 사용해 Oracle/MariaDB를 점검하고
전이 때만 native operator log를 남긴다.
- 운영자 DB 입력·송출·자동 갱신이 시작되면 active health check를 취소하고 공용 DB activity
gate를 양보하며, 앱 종료 때 lifetime token과 active check를 모두 취소한다.
- 실제 DB 서버를 강제로 끊는 장애 주입은 하지 않았다. 수명주기·전이 중복 억제·priority gate·
cancellation은 자동 회귀로 고정한다.
## ThemeA `중복확인` 동등성
원본 `Form/ThemeA.cs:84-109`는 입력 이름과 현재 KRX/NXT 선택을 기준으로 정확히 같은