# MNG 시뮬레이터 UI 개선 계획 > **작성일**: 2025-12-30 > **목적**: MNG 시뮬레이터를 Design 자동 견적 산출과 동일하게 개선 > **기준 문서**: `design/src/components/QuoteAutoCalculation.tsx` > **상태**: 🔄 진행중 (Serena ID: simulator-ui-state) --- ## 📍 현재 진행 상태 | 항목 | 내용 | |------|------| | **마지막 완료 작업** | Phase 1 UI 레이아웃 수정 (단일행) | | **다음 작업** | Phase 2 제품 드롭다운 데이터 로드 수정 | | **진행률** | 6/10 (60%) | | **마지막 업데이트** | 2025-12-30 19:00 | ### 🚨 현재 이슈 | 이슈 | 설명 | 상태 | |------|------|------| | 제품 드롭다운 비어있음 | FG 제품이 로드되지 않음 | ⏳ 조사 필요 | --- ## 1. 개요 ### 1.1 배경 Design 자동 견적 산출(`localhost:3002` > 판매관리 > 견적관리 > 견적등록 > 자동 견적 산출)과 MNG 시뮬레이터(`mng.sam.kr/quote-formulas/simulator`)가 동일한 결과를 도출해야 함. **현재 차이점:** - Design: 프론트엔드에서 자체 계산 (`eval()`) - MNG: 백엔드 API에서 계산 (`FormulaEvaluatorService`) **목표:** MNG 시뮬레이터 UI를 Design과 동일하게 맞추고, 동일한 입력에 동일한 결과가 나오도록 개선. ### 1.2 기준 원칙 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 🎯 핵심 원칙 │ ├─────────────────────────────────────────────────────────────────┤ │ 1. Design QuoteAutoCalculation UI를 MNG Blade로 구현 │ │ 2. 동일 입력 → 동일 결과 (Design과 MNG) │ │ 3. DB 데이터 기반 동적 제품 로드 │ │ 4. 기존 FormulaEvaluatorService 계산 로직 활용 │ └─────────────────────────────────────────────────────────────────┘ ``` ### 1.3 변경 승인 정책 | 분류 | 예시 | 승인 | |------|------|------| | ✅ 즉시 가능 | UI 필드 추가, 드롭다운 옵션, CSS 스타일 | 불필요 | | ⚠️ 컨펌 필요 | 백엔드 API 변경, 계산 로직 수정 | **필수** | | 🔴 금지 | DB 스키마 변경, 기존 API 삭제 | 별도 협의 | --- ## 2. Design vs MNG 비교 분석 ### 2.1 입력 필드 비교 | 필드 | Design 변수명 | Design | MNG 현재 | MNG 목표 | |------|--------------|:------:|:--------:|:--------:| | 제품 선택 | selectedProductId | ✅ | ✅ | ✅ | | 폭 | width | ✅ | ✅ (W0) | ✅ | | 높이 | height | ✅ | ✅ (H0) | ✅ | | 수량 | quantity | ✅ | ✅ (QTY) | ✅ | ### 2.2 Design 코드 분석 **파일**: `design/src/components/QuoteAutoCalculation.tsx` ```javascript // 입력 상태 const [selectedProductId, setSelectedProductId] = useState(""); const [inputValues, setInputValues] = useState>({ width: 1000, height: 2000, quantity: 1 }); // 제품 목록 (FG 타입만 필터링) const products = useMemo(() => { return itemMasters.filter(item => item.itemType === 'FG'); }, [itemMasters]); ``` ### 2.3 계산 방식 비교 | 항목 | Design | MNG | |------|--------|-----| | 계산 위치 | 프론트엔드 (`eval()`) | 백엔드 (`FormulaEvaluatorService`) | | 데이터 소스 | `useData()` Context | DB API | | BOM 규칙 | `formulaRules` | `quote_formulas` 테이블 | | 단가 | `pricing` Context | DB 단가 테이블 | --- ## 3. 대상 범위 ### 3.1 Phase 1: UI 입력 필드 (Design 기준) | # | 작업 항목 | 상태 | 비고 | |---|----------|:----:|------| | 1.1 | 제품 선택 드롭다운 | ✅ | FG 타입 제품 | | 1.2 | 폭(width) 입력 필드 | ✅ | 기본값: 1000 | | 1.3 | 높이(height) 입력 필드 | ✅ | 기본값: 2000 | | 1.4 | 수량(quantity) 입력 필드 | ✅ | 기본값: 1 | | 1.5 | UI 레이아웃 단일행 수정 | ✅ | flex-wrap | ### 3.2 Phase 2: 제품 데이터 로드 수정 | # | 작업 항목 | 상태 | 비고 | |---|----------|:----:|------| | 2.1 | FG 제품 API 호출 확인 | ⏳ | 현재 빈 배열 반환 | | 2.2 | tenant_id 확인 | ⏳ | 세션 기반 | | 2.3 | 제품 드롭다운 데이터 바인딩 | ⏳ | - | ### 3.3 Phase 3: 계산 결과 검증 | # | 작업 항목 | 상태 | 비고 | |---|----------|:----:|------| | 3.1 | Design과 동일 입력으로 테스트 | ⏳ | width=1200, height=2400, qty=10 | | 3.2 | BOM 구성 결과 비교 | ⏳ | 품목/수량 일치 여부 | | 3.3 | 금액 계산 결과 비교 | ⏳ | 단가/총액 일치 여부 | --- ## 4. 상세 작업 내용 ### 4.1 수정 대상 파일 | 파일 | 수정 내용 | |------|----------| | `simulator.blade.php` | UI 입력 필드 (Design 기준) | | `FormulaEvaluatorService.php` | 계산 로직 (필요시) | | `QuoteFormulaController.php` | API 파라미터 (필요시) | ### 4.2 UI 레이아웃 (Design 기준) ``` ┌─────────────────────────────────────────────────────────────────┐ │ 완제품 BOM 시뮬레이션 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ [제품 선택 ▼] [폭 width] [높이 height] [수량] [실행] │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## 5. 컨펌 대기 목록 | # | 항목 | 변경 내용 | 영향 범위 | 상태 | |---|------|----------|----------|------| | 1 | 기존 추가 필드 제거 | PC, GT, MP, CT, WS, INSP 필드가 Design에 없음 | UI | ⚠️ 컨펌 필요 | --- ## 6. 변경 이력 | 날짜 | 항목 | 변경 내용 | 파일 | 승인 | |------|------|----------|------|------| | 2025-12-30 | 초안 | 계획 문서 작성 | - | - | | 2025-12-30 | Phase 1 | UI 입력 필드 추가 (PC, GT, MP, CT, WS, INSP) | simulator.blade.php | ✅ | | 2025-12-30 | Phase 2 | 백엔드 변수 처리 및 디버그 로깅 개선 | FormulaEvaluatorService.php | ✅ | | 2025-12-30 | 수정 | UI 레이아웃 단일행으로 변경 | simulator.blade.php | ✅ | | 2025-12-30 | 수정 | 기준 문서 변경 (React → Design) | 계획 문서 | ✅ | --- ## 7. 참고 문서 - **Design 원본**: `design/src/components/QuoteAutoCalculation.tsx` - **Design 가이드**: `design/src/QUOTE_AUTO_CALCULATION_GUIDE.md` - **기존 시뮬레이터 계획**: `docs/dev_plans/simulator-calculation-logic-mapping.md` - **품질 체크리스트**: `docs/standards/quality-checklist.md` --- ## 8. 세션 및 메모리 관리 정책 ### 8.1 Serena 메모리 구조 - `simulator-ui-state`: { phase, progress, next_step, last_decision } - `simulator-ui-snapshot`: 현재까지의 코드 변경점 요약 ### 8.2 세션 시작 시 ``` read_memory("simulator-ui-state") read_memory("simulator-ui-snapshot") 계획 문서 읽기 ``` ### 8.3 세션 종료 시 ``` write_memory("simulator-ui-state") 계획 문서 업데이트 ``` --- ## 9. 검증 결과 > 작업 완료 후 이 섹션에 검증 결과 추가 ### 9.1 테스트 케이스 | 입력값 | 예상 결과 | 실제 결과 | 상태 | |--------|----------|----------|------| | 스크린 제품, W=1200, H=2400, Q=10 | Design과 동일 | - | ⏳ | ### 9.2 성공 기준 달성 현황 | 기준 | 달성 | 비고 | |------|------|------| | Design과 동일한 입력 필드 | ⏳ | 제품/폭/높이/수량 | | 제품 드롭다운 데이터 로드 | ❌ | 현재 비어있음 | | Design과 동일한 계산 결과 | ⏳ | 검증 필요 | --- *이 문서는 /sc:plan 스킬로 생성되었습니다.*