qcast-api/doc/OUTPUT_HANDOVER.md
2026-05-06 15:39:34 +09:00

231 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 견적서 / 발전시뮬레이션 / Excel·PDF 출력 인수인계서
> 작성일: 2026-05-06
> 대상: 후임 AI 엔지니어 또는 개발 관리자
> 작업 브랜치: `dev_ysCha`
> **이 문서의 범위**: Excel/PDF 출력물 관련 작업만 다룹니다.
> 다른 트랙은 `HANDOVER_INDEX.md` 참조.
---
## 0. 한 줄 요약
견적서·중량 시트·구조도·계통도 등 **출력물에서 보이는 거의 모든 이슈**가 이 트랙으로 들어옵니다. 정렬·파일명·이미지·전각문자·도면 비율·폰트 등이 반복적으로 나오는 영역이며, **Excel(jxls + POI)****PDF(iText html2pdf)** 두 출력 경로를 동시에 봐야 합니다.
---
## 1. 출력 시스템 개요
### 1.1 두 가지 출력 경로
| 출력 종류 | 사용 라이브러리 | 템플릿 위치 |
|----------|----------------|-------------|
| **Excel** | Apache POI + jxls | `src/main/resources/template/excel/` |
| **PDF** | iText html2pdf | (HTML 템플릿 → PDF 변환) |
> **중요**: 같은 견적서라도 Excel과 PDF는 **별도 경로**입니다. 한쪽만 고치면 다른 쪽이 어긋납니다. "정렬을 왼쪽으로" 같은 표시 변경은 양쪽을 함께 손대야 합니다.
### 1.2 자주 나오는 출력 종류
- 견적서 (Quotation)
- 발전시뮬레이션 결과
- 중량 계산 시트
- 배치도 / 계통도 / 구조도
---
## 2. 정렬 (Alignment) 변경 작업
### 2.1 한 일
| 티켓 | 내용 | 커밋 |
|------|------|------|
| `[1508]` | 견적서 [품명][형번] 가운데 → **왼쪽 정렬** (Excel + PDF 둘 다) | `11d2acb2` |
| `[2133]` | 중량 계산 시트 [품명][모델명] **왼쪽 정렬** (Excel) | `1c22880c` |
### 2.2 주의
- 정렬은 사용자 가독성에 직접 영향. 변경 전 항상 **현 상태 스크린샷**을 떠 두세요.
- Excel만 바꾸고 PDF를 안 바꿔서 보고가 들어오는 경우가 잦습니다.
---
## 3. 파일명 / 다운로드명 포맷
### 3.1 한 일
| 티켓 | 내용 | 커밋 |
|------|------|------|
| `[2133]` | 다운로드 파일명 포맷에 `planNo` 추가 → `objectNo_planNo_날짜` (견적서/발전시뮬레이션 통일) | `fc6655f9` |
### 3.2 정책
- 파일명 포맷은 견적서·발전시뮬레이션이 **동일 규칙**으로 가야 함 (사용자 요청).
- 새 다운로드를 추가할 때도 같은 패턴을 따르세요.
---
## 4. 전각문자 / unknown 처리
### 4.1 한 일
| 티켓 | 내용 | 커밋 |
|------|------|------|
| `[1827]` | 엑셀/PDF 다운로드 시 파일명이 `unknown` 으로 나오는 문제 — **전각문자 처리** | `dd2b3e4d` |
### 4.2 배경
- 일본어 전각문자(예: ``)가 파일명/HTTP 헤더에 들어가면 인코딩 문제로 `unknown` 으로 떨어집니다.
- 파일명 인코딩 단계에서 전각 → 반각 변환 또는 URL 인코딩 강화로 처리.
### 4.3 일반화 가능한 교훈
- **이 시스템은 일본어 환경**입니다. 새 출력에서 파일명을 만들 때 항상 전각문자 가능성을 의심하세요.
---
## 5. 등록상표 ® 처리 (카카오 시리즈)
### 5.1 한 일
PDF 출력 시 등록상표 기호 `®``?` 로 깨지는 문제. 단계별로 변경:
| 단계 | 내용 | 커밋 |
|------|------|------|
| 1차 | `®``Ⓡ` 로 치환 | `47f18b50` |
| 2차 | `®``(R)` + PDF 폰트 변경 | `57d52c7c` |
| 3차 | PDF 폰트 복구 | `33555619` |
### 5.2 교훈
- PDF 폰트는 **글리프 지원 범위**를 항상 확인. 안 되는 글리프는 텍스트 치환으로 우회하는 게 안전.
- 폰트를 바꾸면 다른 글자(특히 한자/일본어)가 깨지는 부작용이 생기므로, **폰트 변경은 최후의 수단**.
---
## 6. 도면 비율 / 화질 개선
### 6.1 한 일
| 티켓 | 내용 | 커밋 |
|------|------|------|
| `[1427]` | 출력한 견적서 도면의 가로/세로 비율이 화면과 다른 문제 (+ 로컬 실행 가능 조정) | `3048076d` |
| `[1470]` | 배치도·계통도·구조도 화질 개선 (cell 이미지 추가) | `4468d3f9`, `1a4becd1`, `512cdd5c` 등 다수 |
| `[1268][1295]` | PDF 출력 세로 → 가로 혼합 | `abf1f91a`, `3612c50d` |
### 6.2 주의
- 화질 개선 작업은 같은 티켓에 여러 커밋이 따라옵니다(이미지 교체 반복). 한 번에 안 되는 게 정상.
- 도면 비율은 **DPI / 픽셀 단위 / mm 단위** 가 섞여 있어 한 곳만 고치면 다른 출력이 어긋납니다.
---
## 7. 견적서 주소 (가장 험난했던 시리즈) — `[1379]`
### 7.1 무슨 일이 있었나
견적서 주소 표시 조건을 바꿨다가 → 원복 → 다시 수정 → 또 원복 → 재수정 의 반복이 있었습니다.
| 단계 | 커밋 |
|------|------|
| 견적서 주소 수정 | `a430ce64` |
| 견적서 출력 쿼리 수정 | `c28eeee2` |
| 1차 원복 | `1fcd2dac` |
| 2차 원복 | `32e6237f` |
| 3/9 이전 원복 | `35584228` |
| 최초 원복 | `c735263d` |
| 최초 원시 원복 | `150b64b0` |
| 재수정 | `b5e3012d` |
### 7.2 경고
- **이 영역은 손대기 전에 반드시 사용자에게 현재 정책을 재확인**하세요.
- 견적서 주소는 일본 거래처별로 표시 요건이 다를 수 있어 케이스가 많습니다.
---
## 8. 지붕/사 각도 출력 관련
| 티켓 | 내용 | 커밋 |
|------|------|------|
| `[1765]` | 출력한 견적서 지붕 면이 이중 표시 | `9dce727f`, `dc7eb154` |
| `[1480]` | 사(斜)의 각도 설정을 "각도"로 했을 때 출력물 문제 | `709b1f1f`, `f407079f`, `3e64d8a2` |
지붕·각도 관련 출력은 프론트(qcast-front)의 SK(Straight Skeleton) 트랙과 맞물립니다. 프론트의 `SK_MOVEMENT_HANDOVER.md` 도 같이 보세요.
---
## 9. 핵심 파일 / 위치
| 위치 | 역할 |
|------|------|
| `src/main/resources/template/excel/` | Excel 템플릿(jxls) |
| `src/main/resources/mappers/` | 출력에 쓰이는 SQL 매퍼 |
| `com.interplug.qcast.biz.quotation.*` | 견적서 도메인 (Controller/Service/Mapper/DTO) |
| `com.interplug.qcast.biz.simulation.*` | 발전시뮬레이션 도메인 |
| (PDF 관련) Service/Util 클래스 | iText html2pdf 변환 로직 |
> 파일 경로는 패키지 변경 가능성이 있으므로 항상 현재 트리에서 다시 확인하세요.
---
## 10. 인수 직후 권장 절차
1. 이 문서 통독.
2. `template/excel/` 폴더 안 템플릿 한두 개 열어 jxls 태그 사용법 확인.
3. 견적서 도메인 Controller → Service → Mapper → 템플릿 한 번 따라가 보기.
4. 로컬에서 견적서 Excel/PDF 한 번 출력해보고 결과 확인.
---
## 11. 미해결 / 추적 중
- `[1379]` 견적서 주소 정책은 **여전히 변동 가능성** 있음. 추가 요청 들어오면 신중히.
- 화질 개선(`[1470]`) 은 일단락됐지만 같은 종류의 이미지 깨짐 보고가 또 들어올 수 있음.
---
## 12. 旧見積書書式(EXCEL2) 출력 시트 정책 — 2026-05-06
### 12.1 무슨 일이 있었나
일본에서 다음 요청이 옴.
> 旧見積書書式 선택 시에도 [図面/シミュレーションファイルを含む] 옵션이면 `割付図・系統図`/`架台図`/`発電シミュレーション` 시트를, [架台重量表付き] 옵션이면 `重量算出シート` 시트를 함께 출력해 달라. 결국 **신(통상) 견적서와 동일한 시트 출력 사양**으로 통일 요구.
기존 코드(`EstimateService.java` `excelDownload()``EXCEL2` 분기)는 旧見積書書式 선택 시 **schDrawingFlg/schWeightFlg 옵션과 무관하게** 부속 시트를 모두 강제 제거하고 `見積書.` 한 장만 남기고 있었음.
### 12.2 한 일
`EstimateService.java` 1915~1925 (수정 후) 영역을 다음 정책으로 단순화.
- `schDrawingFlg`/`schWeightFlg`로 시트를 골라내는 1단계 분기는 그대로 유지 (= 신 양식과 동일하게 작동).
- 양식 분기는 **견적서 시트만 교체** 책임으로 축소:
- `EXCEL2` (旧書式) → `見積書` 제거 + `見積書.`을 첫 번째 시트로 이동
- 그 외 (신 양식) → `見積書.` 제거
- `特異事項` 시트는 두 양식 모두 항상 제거.
결과적으로 旧書式 출력 순서:
```
見積書. → 発電シミュレーション → 割付図・系統図 → 架台図 → 重量算出シート → P1 → P2
```
(옵션에 따라 일부 시트 빠짐)
### 12.3 견적서 시트 두 종류 차이 (혼동 주의)
| 항목 | `見積書` (신/통상) | `見積書.` (구) |
|---|---|---|
| 템플릿 sheet 번호 | sheet1.xml | sheet7.xml |
| 영역 | A1:AP46 (가로) | A1:V104 (세로 길쭉) |
| 병합셀 | 61 | 343 |
| 아이템 출력 | 인덱스 고정 (`list[0]~list[26]`) | JXLS each 반복 (`item.itemName`) |
→ "이름이 거의 같으니 같은 시트 아니냐"라는 인상과 달리 **레이아웃·바인딩 키가 완전히 다른 별개 양식**. 한쪽 손볼 때 다른 쪽도 자동 적용된다고 착각하지 말 것.
### 12.4 후속 확인 포인트 (다음 작업 시 체크)
1. **프론트(qcast-front)** 가 旧書式 선택 시 `schDrawingFlg`/`schWeightFlg` 값을 함께 전송하는지 확인. 안 보내면 백엔드만 고쳐도 효과 없음.
2. `EstimateRequest.schWeightFlg` 필드는 정의되어 있으나 분기에서는 `schDrawingFlg.indexOf("4")`만 보고 있음. 프론트가 별도 키로 보내는 경우 백엔드 분기 조건도 함께 손봐야 함.
3. 旧書式 템플릿(`excel_download_quotation_detail_template2.xlsx`) 시트 구성은 신 양식 템플릿(`excel_download_quotation_detail_template.xlsx`)과 동일. 旧書式 전용으로 부속 시트 디자인을 다르게 가져갈 일이 생기면 템플릿 자체를 분리해야 함.
### 12.5 활성 시트
`setSheetOrder("見積書.", 0)`로 옮겨도 POI는 active sheet 인덱스를 자동 보정하지 않을 수 있음. 열었을 때 다른 시트가 먼저 보이면 `workbook.setActiveSheet(0)` 한 줄을 추가.
끝.