feat(upload): 매핑 UI 4가지 보강 — 자동 채우기 + Select 옵션 + 미리보기 + 좌우 정렬

엑셀 컬럼 매핑이 더 직관적이도록:

Backend:
- TargetFieldMetaService 신규: 9개 target_table 의 사용 가능 필드 메타데이터
  (recruit_ledger 15 / maintain_ledger 11 / contract 10 / agent 10 /
   commission_rate 7 / payout_rule 7 / chargeback_rule 6 / exception_ledger 6 /
   payment 6) — field/label/type/required
- UploadService.extractHeaders(file, headerRow, sheetIndex, previewRows):
  StreamingReader 로 첫 행 헤더 + N행 미리보기 추출, A/B/C 컬럼 라벨 생성
- UploadController 에 3개 엔드포인트 추가:
  · POST /api/upload-templates/excel-headers (multipart) → ExcelHeaderResp
  · GET  /api/upload-templates/target-fields/{targetTable}
  · GET  /api/upload-templates/target-tables

Frontend:
- api/uploadTemplate.ts: extractHeaders / targetFields / targetTables 함수 추가
  + ExcelHeaderResp / TargetFieldMeta 타입
- ColumnEditor 보강:
  1) "샘플 엑셀로 자동 채우기" 버튼 — 사용자가 샘플 파일 올리면 헤더 추출 후
     sourceColumn(A,B,C) + sourceHeader(헤더명) 자동 채움 (기존 매핑 있으면
     Modal.confirm 으로 덮어쓰기 확인)
  2) 대상 필드 Input → Select (target_table 별 메타 옵션) — showSearch +
     선택 시 targetType 자동 설정 (필드 메타의 type 으로)
  3) 헤더에 target_table tag 표시 (→ recruit_ledger)
  4) 자동 채우기 후 첫 5행 샘플 데이터 테이블이 매핑 편집기 위에 표시됨

검증: tsc -b 통과, ga-api 재기동 후 /target-fields 200 (15필드 응답)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
GA Pro
2026-05-11 00:14:45 +09:00
parent 87e4e3d1da
commit 2136b38e1b
5 changed files with 411 additions and 7 deletions
+35
View File
@@ -104,6 +104,21 @@ export interface PreviewRowResp {
[field: string]: unknown;
}
/** 샘플 엑셀 헤더 추출 응답 */
export interface ExcelHeaderResp {
columns: string[]; // ['A','B','C',...]
headers: string[]; // ['증권번호','설계사명',...]
samples: string[][]; // 첫 N행
}
/** target_table 별 사용 가능한 컬럼 메타 */
export interface TargetFieldMeta {
field: string; // policy_no
label: string; // 증권번호
type: string; // STRING/NUMBER/DECIMAL/DATE/INTEGER
required: boolean;
}
export const uploadTemplateApi = {
list: (params: UploadTemplateQueryParams) =>
unwrap<PageResponse<UploadTemplateResp>>(api.get('/api/upload-templates', { params })),
@@ -148,4 +163,24 @@ export const uploadTemplateApi = {
}),
);
},
/** 샘플 엑셀 → 헤더 + 미리보기 행 자동 추출 (등록 전 매핑 자동 채우기용) */
extractHeaders: (file: File, headerRow = 1, sheetIndex = 0, previewRows = 5) => {
const fd = new FormData();
fd.append('file', file);
return unwrap<ExcelHeaderResp>(
api.post('/api/upload-templates/excel-headers', fd, {
headers: { 'Content-Type': 'multipart/form-data' },
params: { headerRow, sheetIndex, previewRows },
}),
);
},
/** target_table 별 사용 가능한 DB 컬럼 (target_field Select 옵션) */
targetFields: (targetTable: string) =>
unwrap<TargetFieldMeta[]>(api.get(`/api/upload-templates/target-fields/${targetTable}`)),
/** 사용 가능한 target_table 목록 */
targetTables: () =>
unwrap<string[]>(api.get('/api/upload-templates/target-tables')),
};