Add RFP coverage tracking
This commit is contained in:
@@ -43,6 +43,7 @@ namespace TornadoAce_CJOnStyle.ViewModels
|
||||
LoadPipelineSteps();
|
||||
LoadFieldMappings();
|
||||
LoadEndpoints();
|
||||
LoadRequirementCoverage();
|
||||
LoadInspectionQueue(initialInspectionSummary.Results);
|
||||
}
|
||||
|
||||
@@ -123,6 +124,8 @@ namespace TornadoAce_CJOnStyle.ViewModels
|
||||
|
||||
public ObservableCollection<IntegrationEndpointViewModel> Endpoints { get; } = [];
|
||||
|
||||
public ObservableCollection<PocRequirementViewModel> RequirementCoverage { get; } = [];
|
||||
|
||||
public ObservableCollection<InspectionQueueItemViewModel> InspectionQueue { get; } = [];
|
||||
|
||||
public string LoginOperatorName
|
||||
@@ -241,6 +244,16 @@ namespace TornadoAce_CJOnStyle.ViewModels
|
||||
Endpoints.Add(new IntegrationEndpointViewModel("LLM 검수", "POST /api/inspection/llm", "Internal LLM", "정책 확인", Brush(0xFFB48CFF)));
|
||||
}
|
||||
|
||||
private void LoadRequirementCoverage()
|
||||
{
|
||||
RequirementCoverage.Add(new PocRequirementViewModel("RFP-01", "큐시트 API 연동", "PoC", "샘플 큐시트 선택", Brush(0xFF45D6D1)));
|
||||
RequirementCoverage.Add(new PocRequirementViewModel("RFP-02", "ERP 편성 연동", "대기", "엔드포인트 자리", Brush(0xFFFFB547)));
|
||||
RequirementCoverage.Add(new PocRequirementViewModel("RFP-03", "Data Field Mapping", "PoC", "Scene 스냅샷 생성", Brush(0xFF37D67A)));
|
||||
RequirementCoverage.Add(new PocRequirementViewModel("RFP-04", "Tornado Scene API", "PoC", "Text/Image 추출 샘플", Brush(0xFF37D67A)));
|
||||
RequirementCoverage.Add(new PocRequirementViewModel("RFP-05", "관리자 매핑 기능", "초안", "매핑표 UI", Brush(0xFFB48CFF)));
|
||||
RequirementCoverage.Add(new PocRequirementViewModel("RFP-06", "1·2단계 자동 검수", "PoC", "Diff + LLM 후보", Brush(0xFF45D6D1)));
|
||||
}
|
||||
|
||||
private void LoadInspectionQueue(IEnumerable<InspectionResult> results)
|
||||
{
|
||||
InspectionQueue.Clear();
|
||||
|
||||
@@ -60,6 +60,13 @@ namespace TornadoAce_CJOnStyle.ViewModels
|
||||
public string OwnerAndStatus => $"{Owner} / {Status}";
|
||||
}
|
||||
|
||||
public sealed record PocRequirementViewModel(
|
||||
string RequirementId,
|
||||
string Title,
|
||||
string Status,
|
||||
string Evidence,
|
||||
SolidColorBrush StatusBrush);
|
||||
|
||||
public sealed record InspectionQueueItemViewModel(
|
||||
string ProgramTitle,
|
||||
string SceneName,
|
||||
|
||||
@@ -350,40 +350,90 @@
|
||||
BorderBrush="{StaticResource PanelStrokeBrush}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="8">
|
||||
<StackPanel Spacing="14">
|
||||
<TextBlock Style="{StaticResource SectionTitleTextStyle}" Text="연동 엔드포인트" />
|
||||
<ItemsControl ItemsSource="{x:Bind ViewModel.Endpoints, Mode=OneWay}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:IntegrationEndpointViewModel">
|
||||
<Grid
|
||||
Margin="0,0,0,10"
|
||||
ColumnSpacing="10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Ellipse
|
||||
Width="10"
|
||||
Height="10"
|
||||
Margin="0,5,0,0"
|
||||
Fill="{x:Bind StatusBrush}" />
|
||||
<StackPanel Grid.Column="1" Spacing="3">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" VerticalScrollMode="Auto">
|
||||
<StackPanel Spacing="14">
|
||||
<TextBlock Style="{StaticResource SectionTitleTextStyle}" Text="연동 엔드포인트" />
|
||||
<ItemsControl ItemsSource="{x:Bind ViewModel.Endpoints, Mode=OneWay}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:IntegrationEndpointViewModel">
|
||||
<Grid
|
||||
Margin="0,0,0,10"
|
||||
ColumnSpacing="10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="*" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<Ellipse
|
||||
Width="10"
|
||||
Height="10"
|
||||
Margin="0,5,0,0"
|
||||
Fill="{x:Bind StatusBrush}" />
|
||||
<StackPanel Grid.Column="1" Spacing="3">
|
||||
<TextBlock
|
||||
FontFamily="Bahnschrift SemiBold"
|
||||
Foreground="{StaticResource TextPrimaryBrush}"
|
||||
Text="{x:Bind Name}" />
|
||||
<TextBlock
|
||||
Style="{StaticResource MonoTextStyle}"
|
||||
Text="{x:Bind Endpoint}" />
|
||||
<TextBlock
|
||||
Style="{StaticResource LabelTextStyle}"
|
||||
Text="{x:Bind OwnerAndStatus}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
|
||||
<Border
|
||||
Height="1"
|
||||
Background="{StaticResource PanelStrokeBrush}" />
|
||||
|
||||
<TextBlock Style="{StaticResource SectionTitleTextStyle}" Text="RFP 커버리지" />
|
||||
<ItemsControl ItemsSource="{x:Bind ViewModel.RequirementCoverage, Mode=OneWay}">
|
||||
<ItemsControl.ItemTemplate>
|
||||
<DataTemplate x:DataType="vm:PocRequirementViewModel">
|
||||
<Grid
|
||||
Margin="0,0,0,10"
|
||||
ColumnSpacing="10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="56" />
|
||||
<ColumnDefinition Width="*" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock
|
||||
FontFamily="Bahnschrift SemiBold"
|
||||
Foreground="{StaticResource TextPrimaryBrush}"
|
||||
Text="{x:Bind Name}" />
|
||||
<TextBlock
|
||||
Style="{StaticResource MonoTextStyle}"
|
||||
Text="{x:Bind Endpoint}" />
|
||||
<TextBlock
|
||||
Style="{StaticResource LabelTextStyle}"
|
||||
Text="{x:Bind OwnerAndStatus}" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</StackPanel>
|
||||
FontFamily="Cascadia Mono"
|
||||
FontSize="12"
|
||||
Foreground="{StaticResource TextMutedBrush}"
|
||||
Text="{x:Bind RequirementId}" />
|
||||
<StackPanel Grid.Column="1" Spacing="2">
|
||||
<TextBlock
|
||||
FontFamily="Bahnschrift SemiBold"
|
||||
Foreground="{StaticResource TextPrimaryBrush}"
|
||||
Text="{x:Bind Title}"
|
||||
TextTrimming="CharacterEllipsis" />
|
||||
<TextBlock
|
||||
Style="{StaticResource LabelTextStyle}"
|
||||
Text="{x:Bind Evidence}"
|
||||
TextTrimming="CharacterEllipsis" />
|
||||
</StackPanel>
|
||||
<Border
|
||||
Grid.Column="2"
|
||||
Padding="8,3"
|
||||
Background="{x:Bind StatusBrush}"
|
||||
CornerRadius="8">
|
||||
<TextBlock
|
||||
FontFamily="Bahnschrift SemiBold"
|
||||
FontSize="12"
|
||||
Foreground="#071013"
|
||||
Text="{x:Bind Status}" />
|
||||
</Border>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ItemsControl.ItemTemplate>
|
||||
</ItemsControl>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
|
||||
<Border
|
||||
|
||||
39
docs/poc-requirements.md
Normal file
39
docs/poc-requirements.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# CJ OnStyle CG 제작 자동화 PoC 요구사항
|
||||
|
||||
출처: `C:\Users\MD\Downloads\Attach (2)\CG제작자동화시스템_RFP.pptx`
|
||||
|
||||
## RFP 핵심 목적
|
||||
|
||||
- 큐시트 플랫폼과 연계한 CG 제작 자동화 솔루션을 개발한다.
|
||||
- 수기 작업을 줄이고, 자동 검수 시스템으로 업무 효율과 휴먼에러 리스크를 개선한다.
|
||||
- Tornado2 기반으로 개발하되, 추후 Tornado3 도입 시 버전 업데이트 기술 지원을 전제로 한다.
|
||||
- LLM은 사내 구축 서버 또는 승인된 외부 LLM 서비스를 검토한다.
|
||||
|
||||
## 구축 범위 추적
|
||||
|
||||
| ID | RFP 요구사항 | 초기 PoC 반영 상태 | 현재 구현 근거 |
|
||||
| --- | --- | --- | --- |
|
||||
| RFP-01 | 신규 큐시트 플랫폼 API 연동 | Mock 데이터 수신 흐름 구현 | `AutomationWorkspace.CueSheets`, `RefreshCueSheetCommand` |
|
||||
| RFP-02 | ERP 편성데이터 연동 | 연동 엔드포인트 자리 표시 | `IntegrationEndpointViewModel` |
|
||||
| RFP-03 | CG 포맷 제작 자동화, Data Field Mapping | 큐시트 필드와 Scene 객체 매핑 구현 | `SceneTemplateDefinition`, `PocAutomationEngine.GenerateScene` |
|
||||
| RFP-04 | Tornado Scene API | Scene visible Text/Image 스냅샷 샘플 구현 | `SceneDataSnapshot.ToPreviewJson` |
|
||||
| RFP-05 | 큐시트 데이터와 Tornado Scene 연동 관리자 기능 | 매핑표 UI 초안 구현 | `FieldMappings` 화면 |
|
||||
| RFP-06 | 자동 검수 1단계 Text Diffing | 문자열 정규화/유사도 기반 비교 구현 | `PocAutomationEngine.InspectWorkspace` |
|
||||
| RFP-07 | 자동 검수 2단계 LLM 중요도 피드백 | LLM 검토 후보 분류와 정책 문구 구현 | 검수 결과 `Severity`, `Decision`, LLM 정책 패널 |
|
||||
| RFP-08 | 제작자가 결과를 볼 수 있는 GUI | WinUI 3 운영 콘솔 초안 구현 | `MainPage.xaml` |
|
||||
|
||||
## 초기 PoC 완료 기준
|
||||
|
||||
1. Windows 데스크톱 앱으로 실행 가능한 WinUI 3 빌드가 유지된다.
|
||||
2. CJ OnStyle/TornadoAce 정체성이 드러나는 로그인 도입 화면과 앱 아이콘이 적용된다.
|
||||
3. 큐시트 샘플 선택, Scene 스냅샷 생성, 자동 검수 결과 갱신이 버튼 흐름으로 동작한다.
|
||||
4. RFP 구축 범위가 화면 또는 문서에서 추적 가능해야 한다.
|
||||
5. 추후 실제 큐시트 API, ERP API, Tornado SDK, LLM 서비스로 교체할 인터페이스 경계가 유지된다.
|
||||
|
||||
## 다음 구현 후보
|
||||
|
||||
- 큐시트/ERP Mock 데이터를 JSON 파일로 분리하여 실제 API 응답 구조와 맞춘다.
|
||||
- Tornado2/Tornado3 어댑터를 동일 인터페이스로 유지하고, 버전별 구현체를 분리한다.
|
||||
- Scene 내부 비노출 객체를 구분할 메타데이터 규칙을 정의한다.
|
||||
- 1차 검수 실패 사유를 필드 단위로 화면에 표시한다.
|
||||
- LLM 요청/응답 스키마와 감사 로그 보관 정책을 별도 모델로 둔다.
|
||||
Reference in New Issue
Block a user