중간저장 04.20

This commit is contained in:
2026-04-20 20:06:18 +09:00
parent 210b546130
commit 7cedeef5a9
180 changed files with 36496 additions and 918 deletions

View File

@@ -1,8 +1,24 @@
# 2026-04-17 현재 구현 상태 정리
# 2026-04-18 현재 구현 상태 정리
이 문서는 2026-04-17 기준으로 Tornado3 2026 Election 프로젝트에 실제 반영된 구현 사항과 검증 결과를 한 번에 확인하기 위한 현행화 문서다.
이 문서는 2026-04-18 기준으로 Tornado3 2026 Election 프로젝트에 실제 반영된 구현 사항과 운영 기준을 한 번에 확인하기 위한 현행화 문서다.
## 1. 데이터 화면
## 1. 화면 구성
- 메인 네비게이션은 아래 페이지를 제공한다.
- `통합 스케줄`
- `노멀`
- `좌상단`
- `하단`
- `비디오월`
- `사전데이터`
- `데이터`
- `컷리스트`
- `설정`
- `로그`
- `사전데이터` 페이지는 저장형 역대 데이터 조회/수정/저장 전용 화면이다.
- `컷리스트` 페이지는 전체 컷 목록, 채널 필터, 컷 시간, 썸네일 현황을 관리하는 운영 화면이다.
## 2. 데이터 화면
- 데이터 화면에서 원본 JSON 형태로 보여주던 `데이터 시트`는 제거했다.
- 현재 데이터 화면에는 아래 두 시트만 남겨두었다.
@@ -12,158 +28,162 @@
- `전체보기` 선택 시, 현재 수신 가능한 지역 데이터를 작은 카드 형태로 한 번에 볼 수 있도록 바꿨다.
- 표시 형식: `지역명 - 개표율`
- 목적: 전체 데이터 수신 상태를 빠르게 확인하기 위한 개요 화면
- 데이터 탭에는 `선거구명`, `지역 코드` 외에 `시도명`, `송출 선거구명`, `StatusText`를 함께 표시한다.
## 2. 후보/개표 데이터 처리 규칙
## 3. SBS API 실연동 범위
- 현재 실연동 대상 선거 종류는 아래와 같다.
- `광역단체장`
- `교육감`
- `기초단체장`
- `광역단체장`
- 개표: 지원
- 사전 투표율: 지원
- `교육감`
- 개표: 지원
- 사전 투표율: SBS API 미지원
- `기초단체장`
- 개표: 지원
- 사전 투표율: SBS API 미지원
- `교육감`, `기초단체장`의 사전 방송 데이터는 저장형 사전 데이터(JSON)로 보완한다.
## 4. 저장형 사전데이터
- 저장형 사전데이터는 `Tornado3_2026Election/Assets/Data/pre_election_history.json`에 보관한다.
- 2026-04-18 기준 저장 건수는 아래와 같다.
- `광역단체장`: 전국 17개 시도
- `교육감`: 전국 17개 시도
- `기초단체장`: 전국 262개 선거구
- 커버리지 요약:
- `광역단체장` 당선자: 1995~2022
- `광역단체장` 투표율: 2002~2022
- `교육감`: 직선제 기준 2010~2022
- `기초단체장`: 공식 API 기준 2002~2022
- `사전데이터` 페이지에서 아래 기능을 제공한다.
- 선거 종류별 레코드 선택
- 지역별 역대 투표율 카드 보기
- 지역별 역대 당선자 카드 보기
- 엑셀형 편집 그리드에서 직접 수정
- `사전데이터 저장` 버튼으로 JSON 반영
- `사전_역대당선자`, `사전_역대당선자_교육감`, `사전_역대당선자_기초단체장` 편집 행에는 `ColorParty` 콤보박스가 있다.
- 표기 정당명은 그대로 두고
- 송출용 색상 포맷 정당만 별도로 지정할 수 있다.
- 예: 표기 `한나라당`, 색상 포맷 `국민의힘`
- 사전데이터 편집 화면에서는 개별 항목의 `SourceUrl`을 노출하지 않는다.
## 5. 사전 컷 연동 규칙
- `사전_역대당선자*` 계열은 `사전``개표` 양쪽 단계에서 모두 사용할 수 있다.
- `사전_역대투표율*` 계열은 `사전` 단계 전용이다.
- 사전 컷 송출 시에는 저장형 사전데이터의 `TurnoutHistory`, `WinnerHistory`를 사용한다.
- 역사 정당명은 색상 포맷 선택과 별개로 아래 별칭을 함께 처리한다.
- `민주자유당`, `신한국당`, `한나라당`, `새누리당`, `자유한국당` -> `국민의힘`
- `민주당`, `새천년민주당`, `열린우리당`, `새정치민주연합` -> `더불어민주당`
- `무소속` -> `무기타`, `무소속기타`
## 6. 후보/개표 데이터 처리 규칙
- 후보가 나오는 데이터는 개표 데이터 기준으로 처리한다.
- 개표 데이터에는 반드시 `개표율`도 함께 표시되도록 맞췄다.
- 개표율 텍스트는 단순 숫자가 아니라 아래 형식으로 송출되도록 수정했다.
- 개표율 텍스트는 아래 형식으로 송출다.
- 예: `개표 98.7%`
- 광역단체장 컷에서는 지역명 대신 실제 직함이 나오도록 보정했다.
- 예: `부산광역시` -> `부산시장`
- 예: `경기도` -> `경기도지사`
## 3. 당선/유력/확정 코드 반영
SBS API 판정 코드는 아래 기준으로 반영되어 있다.
- `40`: 유력
- `50`: 확정
- `60`: 개표중 당선
- `80`: 무투표 당선
- `90`: 개표마감 당선
추가 반영 사항:
- `80` 무투표 당선 케이스도 실제 발생 가능한 값으로 보고 정상 처리하도록 반영했다.
- 수동 판정값이 있으면 수동 판정을 우선 적용하고, 없으면 API 판정값을 사용한다.
- SBS API 판정 코드는 아래 기준으로 반영한다.
- `40`: 유력
- `50`: 확정
- `60`: 개표중 당선
- `80`: 무투표 당선
- `90`: 개표마감 당선
## 4. 유확당 변수 처리 규칙
## 7. 직함 표기 규칙
`유확당` 계열 변수는 전 컷 공통으로 아래 순서로 처리하도록 정리했다.
- `광역단체장`, `교육감`, `기초단체장`은 전 컷 공통으로 지역명 대신 직함 기준 표기를 사용한다.
- 적용 대상은 컷 종류를 가리지 않고 executive 계열 전체다.
- 예시:
- `서울특별시` -> `서울시장`
- `전라남도` -> `전라남도지사`
- `부산광역시` -> `부산광역시교육감`
- `경상남도 창원시` -> `창원시장`
- 송출 시 `선거구명`, `시도명`, `RegionName`, `ElectionDistrictName`, `DistrictName` 계열 값에 같은 규칙을 적용한다.
1. 해당 컷에 존재하는 `유확당*` 변수들을 먼저 모두 `visible=false`로 숨긴다.
## 8. 유확당 변수 처리 규칙
`유확당` 계열 변수는 전 컷 공통으로 아래 순서로 처리한다.
1. 해당 컷에 존재하는 `유확당*` 변수를 먼저 모두 `visible=false`로 숨긴다.
2. 실제 판정 이미지가 필요한 후보에게만 `SetValue(...)`를 넣는다.
3. 값이 들어간 변수만 다시 `visible=true`로 켠다.
적용 범위:
- 1위/2위/3위 후보 슬롯 공통
- `1-2위`, `1-3위`, `당선`, `모든후보`, `접전`, `실시간` 계열 포함
- `1-2위`
- `1-3위`
- `당선`
- `모든후보`
- `접전`
- `초접전`
- `이시각1위`
검증 결과:
- 최신 전체 스캔 기준 `유확당` 변수를 사용하는 컷은 총 69개
- 전체 변수 스캔 리포트: `TSCN_VARIABLE_DISCOVERY_ELECT2026_NORMAL.md`
- 라이브 검증 리포트: `LIVE_VALIDATE_1-2위_ani_광역단체장_judgement_visibility.md`
## 5. RGB / 정당 색상 매핑
정당 색상은 아래 경로의 RGB 텍스트 기준으로 매핑한다.
- `E:\김의연\지역민방\T3_Cut\Elect2026_Normal_민방\RGB\`
현재 적용 규칙:
## 9. RGB / 정당 색상 매핑
- 정당 색상은 RGB txt 기준으로 매핑한다.
- RGB txt에 `style > ... > color` 지시가 있으면 이미지 교체보다 `SetStyleColor(...)`를 우선 사용한다.
- style color 지시가 없는 항목만 기존 asset 기반 `SetValue(...)` 경로를 사용한다.
- `사전_역대당선자*` 계열도 `ColorParty` 또는 정당 별칭을 기준으로 동일한 색상 자산 해석을 사용한다.
- 상세 매핑은 `RGB_SPEC_CUT_MAPPING.md`를 기준으로 관리한다.
특히 `1-2위_ani_광역단체장.txt` 기준으로 아래 항목을 실제 style color 변경 방식으로 맞췄다.
## 10. 컷 카탈로그 / 실제 디자인 매칭
- 정당판: `style > face > color`
- 득표율: `style > edge > color`
- 정당바: `style > face > color`
- 컷 목록은 폴더 스캔이 아니라 `FormatCatalogService`의 하드코딩 카탈로그 기준으로 관리한다.
- 2026-04-18 기준 현재 카탈로그는 실제 `.tscn` 파일 기준으로 정리되어 있다.
- `Elect2026_Bottom_민방`: 15컷
- `Elect2026_Normal_민방`: 63컷
- `Elect2026_Top_민방`: 11컷
- 총 89컷
- 실제 `.tscn` 파일이 없는 오래된 별칭(`_L`, `_END`, `_7680` 등)은 현재 카탈로그에서 제거했다.
- 다만 기존 저장 상태/큐 복원을 위해 예전 `FormatId`는 내부 별칭 맵으로 현재 실제 컷 이름에 자동 연결한다.
- 2026-04-18 전수 감사 기준:
- 카탈로그 등록 컷 중 실제 씬 누락 `0건`
관련 구현 사항:
## 11. 썸네일 운영
- RGB txt에서 style color 대상을 파싱하도록 `PartyColorCatalog`를 보완했다.
- Karisma 적용 단계에서 `IKAStyle.SetStyleColor`를 호출하도록 처리 경로를 추가했다.
- style color 대상에는 잘못된 이미지 값이 들어가지 않도록 분기 처리했다.
- 썸네일 저장 위치는 `Assets/Thumbnail/<template.Id>.png` 규칙을 사용한다.
- 콤보박스에서 컷을 선택하면 해당 썸네일을 즉시 프리뷰에 표시한다.
- 로딩 우선순위:
1. 프로젝트 내부 `Assets/Thumbnail`
2. 번들된 앱 내부 `Assets/Thumbnail`
3. 기본 앱 아이콘
- `컷리스트` 페이지에서는 전체 컷 썸네일 보유 현황과 채널별 컷 목록을 함께 확인할 수 있다.
- `썸네일 생성` 기능은 Karisma에 씬을 로드한 뒤 320x180 PNG를 저장한다.
검증 문서:
## 12. 설정 저장 및 복원
- 컷별 RGB 매핑 문서: `RGB_SPEC_CUT_MAPPING.md`
- style color 검증 리포트: `LIVE_VALIDATE_1-2위_ani_광역단체장_style.md`
- 설정은 변경 즉시 자동 저장한다.
- 자동 저장 대상에는 아래 항목들이 포함된다.
- API 자동 갱신 ON/OFF
- API 갱신 주기
- 데이터 관련 주요 선택 상태
- 채널별 큐 상태
- 컷별 재생 시간
- 방송사 지역 필터
- 저장된 큐에 예전 컷 ID가 들어 있어도 복원 시 현재 canonical 컷으로 자동 정규화한다.
## 6. 후보 슬롯 수 처리
## 13. 검증 상태
- 실제 컷에 존재하는 후보 슬롯 수만큼만 값을 넣도록 보정했다.
- 예를 들어 후보가 2명까지 있는 컷에서는 `후보명03`, `유확당03` 같은 존재하지 않는 변수를 억지로 쓰지 않도록 수정했다.
- 최신 변수 카탈로그를 우선 참조해서 컷별 실제 변수 개수를 판단한다.
- `dotnet build .\Tornado3_2026Election\Tornado3_2026Election.csproj` 통과
- 2026-04-18 컷 감사 결과 `MISSING_SCENES=0`
- 현재 남아 있는 빌드 경고는 아래와 같다.
- `WindowsBase` 참조 충돌 경고
- MSIX 인증서 경고
- `MockTornado3Adapter.ConnectionChanged` 미사용 경고
우선순위:
## 14. 참고 문서
1. `TSCN_VARIABLE_DISCOVERY_ELECT2026_NORMAL.md`
2. `TSCN_VARIABLE_DISCOVERY_E_DRIVE.md`
3. 기타 `TSCN_VARIABLE_DISCOVERY*.md`
추가 사항:
- 변수 카탈로그 파일들은 실행 출력 폴더와 `AppX` 배포 폴더에도 함께 복사되도록 정리했다.
## 7. 설정 저장 및 API 주기
- API 자동 갱신 기본값을 `60초`로 변경했다.
- 설정 변경 시 별도 저장 버튼 없이 자동 저장되도록 반영했다.
자동 저장 대상에는 아래 항목들이 포함된다.
- API 자동 갱신 ON/OFF
- API 갱신 주기
- 데이터 관련 주요 선택 상태
- 앱 재시작 후 복원이 필요한 주요 설정
관련 구현 파일:
- 상태 저장 모델: `Tornado3_2026Election/Persistence/AppState.cs`
- 자동 저장 루프: `Tornado3_2026Election/ViewModels/MainViewModel.cs`
## 8. 데이터/라벨 관련 라이브 검증 결과
- `LIVE_VALIDATE_1-2위_ani_광역단체장.md`
- 기본 변수 송출 검증
- `LIVE_VALIDATE_1-2위_ani_광역단체장_labels.md`
- `개표 99.9%` 형식, 광역장 직함 표기 검증
- `LIVE_VALIDATE_1-2위_ani_광역단체장_style.md`
- style color 적용 검증
- `LIVE_VALIDATE_1-2위_ani_광역단체장_judgement_visibility.md`
- `유확당` visible 처리 검증
- `SYSTEM_SPEC.md`
- `INTEGRATION_NOTES_2026-04-15.md`
- `RGB_SPEC_CUT_MAPPING.md`
- `TSCN_VARIABLE_DISCOVERY_ELECT2026_NORMAL.md`
- Elect2026_Normal_민방 전체 컷 변수 스캔 결과
## 9. 스케줄 지역 선택 송출
- 스케줄 추가 시 컷만 고르는 방식에서 `컷 + 지역 범위`를 함께 고르는 방식으로 확장했다.
- 스케줄 제어 패널에 지역 선택 콤보박스를 추가했다.
- 지역 콤보박스 구성은 아래와 같다.
- 첫 번째: `전체`
- 두 번째: `선택권역`
- 이후: 개별 지역 목록
- 개별 지역 선택 시 해당 지역 데이터만 송출한다.
- `전체` 선택 시 현재 포맷에 대응되는 지역 데이터 전체를 순서대로 송출한다.
- `선택권역` 선택 시 방송사 설정에 잡혀 있는 권역만 순서대로 송출한다.
- `전체``선택권역`은 데이터 순서에 따라 송출 가능한 지역만 순차적으로 처리한다.
- 스케줄 큐 항목에는 지역 범위 정보가 함께 저장되며, 앱 상태 저장/복원에도 포함된다.
- 송출 중에는 큐 카드와 현재/다음 표시에서 실제 송출 중인 지역명이 함께 보이도록 반영했다.
구현 범위:
- 스케줄 UI 콤보박스 추가
- 스케줄 아이템에 지역 범위 저장
- 스케줄 상태 저장/복원 반영
- 송출 시 지역별 API 재조회 후 순차 송출
## 10. 현재 기준 운영 요약
- 데이터 화면은 `개표율 시트 + 후보 시트 + 전체보기 카드` 기준으로 동작한다.
- 후보 데이터는 개표 데이터 기준으로 처리되고, 개표율이 함께 표시된다.
- 개표율은 항상 `개표 x.x%` 형식으로 송출한다.
- 광역단체장 컷의 지역 표기는 지역명이 아니라 실제 직함 기준으로 보정한다.
- 정당 색상은 RGB txt 기준으로 매핑하며, style color 지시가 있으면 이미지보다 style color를 우선 적용한다.
- `유확당` 변수는 전 컷 공통으로 먼저 숨긴 뒤 필요한 경우에만 값을 넣고 다시 보이게 한다.
- 설정은 변경 즉시 자동 저장되며, API 기본 갱신 주기는 60초다.
- 스케줄은 `전체 / 선택권역 / 개별 지역` 기준으로 지역별 순차 송출이 가능하다.
## 11. 참고
이 문서는 완료된 구현 사항 위주로 정리했다. 이후 추가 변경이 생기면 같은 문서를 기준으로 계속 현행화한다.
- `LIVE_VALIDATE_1-2위_ani_광역단체장.md`
- `LIVE_VALIDATE_1-2위_ani_광역단체장_labels.md`
- `LIVE_VALIDATE_1-2위_ani_광역단체장_style.md`
- `LIVE_VALIDATE_1-2위_ani_광역단체장_judgement_visibility.md`