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:
@@ -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')),
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user