- P&ID: 연결 분석 API, Prefix 규칙 관리, 카테고리 분류, DXF 그래프 빌드 - LLM: 대화 요약, tool card 영구 보존, 시계열 차트(uPlot), 에이전트 모드 - KB: 청크 미리보기, Field Instrument Inference, 인증/Qdrant 클라이언트 - MCP: 서버 기능 확장, 파이프라인 수정, timeout 개선 - Frontend: P&ID UI, LLM UI, KB UI, OPC UA Write 탭 추가 - 설정: AGENTS.md, plant_context, README, opencode.json 업데이트 - 정리: 진단 체크리스트 문서 삭제
71 lines
4.7 KiB
Markdown
71 lines
4.7 KiB
Markdown
# 카테고리삽입코딩.md
|
|
|
|
## 1. 개요 (Context)
|
|
현재 P&ID 엑셀 내보내기 로직에서 카테고리 분류가 부족하며, 시트 순서가 고정되어 있습니다. 사용자가 검토하기 용이하도록 `Pipings` 카테고리를 추가하고, 분류되지 않은 항목(`Unmatched`)을 항상 시트의 마지막에 배치하여 데이터의 가독성과 정렬 규칙을 확립합니다.
|
|
|
|
## 2. 변경 목표 (Objectives)
|
|
- `PidEquipment` 도메인 모델에 `Pipings` 카테고리 상수 추가.
|
|
- `PidExtractorService`의 엑셀 생성 로직에서 시트 생성 순서 및 명칭 조정.
|
|
- `Unmatched` 항목이 항상 엑셀의 가장 마지막 시트로 출력되도록 보장.
|
|
|
|
## 3. 상세 구현 계획 (Implementation Plan)
|
|
|
|
### 🛠 STEP 1: 도메인 모델 수정
|
|
**대상 파일**: `src/Core/Domain/Entities/PidEquipment.cs`
|
|
- `CategoryPipings` 상수 추가: `public const string CategoryPipings = "pipings";`
|
|
- `AllCategories` 배열에 신규 상수 포함.
|
|
|
|
### 🛠 STEP 2: 서비스 로직 수정
|
|
**대상 파일**: `src/Core/Application/Services/PidExtractorService.cs`
|
|
- `sheetOrder` 배열 수정:
|
|
- 기존: `[Instrument, Power, Storage, Process, Utility, "__unmatched__"]`
|
|
- 변경: `[Instrument, Power, Storage, Process, Utility, "pipings", "__unmatched__"]`
|
|
- `sheetNames` 딕셔너리 수정:
|
|
- `[PidEquipment.CategoryPipings] = "Pipings"` 추가.
|
|
|
|
### 🛠 STEP 3: 검증 (Verification)
|
|
- `dotnet test`를 실행하여 엑셀 생성 관련 유닛 테스트가 통과하는지 확인.
|
|
- (필요 시) 엑셀 파일 생성 테스트 코드를 추가하여 시트 순서(Sheet Index)를 검증.
|
|
|
|
## 4. `diagnosis-checklist.md` 준수 사항 (Quality Assurance)
|
|
|
|
| 체크 항목 | 준수 계획 |
|
|
| :--- | :--- |
|
|
| **동시성 / 비동기** | `ExportToExcelAsync`가 이미 `Task.Run`으로 오프로드되어 있으므로, 기존의 비동기 흐름을 깨뜨리지 않고 상수 추가만 수행하여 이벤트 루프 블로킹 방지. |
|
|
| **에러 처리** | 새로운 카테고리 추가 시 `null` 또는 `empty` 카테고리에 대한 예외 처리가 기존 `__unmatched__` 로직을 통해 안전하게 처리됨을 확인. |
|
|
| **리소스 관리** | `using var package` 블록 내에서 모든 시트 생성이 완료되므로 메모리 누수 없음. |
|
|
| **코드 구조** | 하드코딩된 문자열 대신 `PidEquipment`에 정의된 `const`를 사용하여 유지보수성 확보. |
|
|
|
|
## 5. 영향도 분석 (Impact Analysis)
|
|
- **DB**: `category` 컬럼은 `string` 타입이므로 새로운 값(`pipings`) 저장에 영향 없음.
|
|
- **UI**: 기존 UI는 카테고리 값에 의존하지 않고 엑셀을 다운로드하므로 하위 호환성 유지됨.
|
|
|
|
## 6. 진단 결과 (Diagnosis) — diagnosis-checklist.md 기준
|
|
|
|
### [1]. `PidEquipment.CategoryPipings` 상수 누락 (HIGH)
|
|
|
|
**문제**: `CategoryPipings` 상수가 정의되지 않아 Prefix Rule 생성 시 `pipings` 카테고리를 선택하면 Controller에서 validation 실패 (`AllCategories`에 없음).
|
|
**근거**: `src/Core/Domain/Entities/PidEquipment.cs:54-62` — 상수 및 `AllCategories` 배열에 `pipings` 없음
|
|
**영향**: 운전원이 `pipings` 카테고리를 가진 Prefix Rule을 생성하면 HTTP 400 BadRequest 반환
|
|
**수정**: 상수 추가 + `AllCategories` 배열에 포함
|
|
|
|
### [2]. Excel Export 시트 누락 (MED)
|
|
|
|
**문제**: `sheetOrder`와 `sheetNames`에 `pipings`가 없어 Excel 내보내기 시 piping 항목이 `Unmatched` 시트로 섞임.
|
|
**근거**: `src/Core/Application/Services/PidExtractorService.cs:345-363` — `sheetOrder` 배열과 `sheetNames` 딕셔너리에 `pipings` 누락
|
|
**영향**: Excel에서 `pipings` 항목이 별도의 시트로 분리되지 않고 `Unmatched`에 포함됨
|
|
**수정**: `sheetOrder`에 `PidEquipment.CategoryPipings` 추가, `sheetNames`에 `[PidEquipment.CategoryPipings] = "Pipings"` 추가
|
|
|
|
### [3]. Frontend `CATEGORY_META` / `CATEGORY_ORDER` 누락 (MED)
|
|
|
|
**문제**: JS 측 `CATEGORY_META`와 `CATEGORY_ORDER`에 `pipings`가 없어 UI에서 필터링·정렬·badge 표시가 깨짐.
|
|
**근거**: `src/Web/wwwroot/js/app.js:3268-3275` — `CATEGORY_META`와 `CATEGORY_ORDER`에 `pipings` 누락
|
|
**영향**: `pipings` 카테고리 항목의 badge가 빈 문자열로 렌더링, 카테고리 순서가 무작위
|
|
**수정**: `CATEGORY_META`에 `pipings` 항목 추가, `CATEGORY_ORDER` 배열에 포함
|
|
|
|
### [4]. `PidController` validation — 교차 검증 결과 (Q2 통과)
|
|
|
|
**문제**: `PidController.cs:266-279`에서 `AllCategories`로 category 유효성 검증
|
|
**교차 검증 Q2**: 다른 레이어에서 처리되는가? → `AllCategories` 배열에 `CategoryPipings` 포함 시 Controller 검증도 자동으로 통과하므로 별도 수정 불필요
|
|
**결론**: [1]에서 `AllCategories` 수정 시 함께 해결됨
|