feat: 카테고리 기반 코드 생성 로직 추가 및 로깅 개선

- NumberingRuleService에서 카테고리 파트를 처리하여 올바른 템플릿을 생성하도록 개선하였습니다.
- allocateCode 함수에서 카테고리 기반 코드 생성을 위한 로직을 추가하고, 관련 로깅을 강화하여 디버깅을 용이하게 하였습니다.
- EditModal 및 V2Input 컴포넌트에서 formData를 로깅하여 채번 규칙 할당 시의 상태를 명확히 기록하도록 하였습니다.
- V2CategoryManagerComponent에서 스크롤 가능하도록 UI를 개선하여 사용자 경험을 향상시켰습니다.
This commit is contained in:
kjs
2026-02-05 15:39:59 +09:00
parent 9f3437d499
commit 77fcf1a35a
4 changed files with 127 additions and 17 deletions

View File

@@ -1038,6 +1038,7 @@ class NumberingRuleService {
if (manualParts.length > 0 && userInputCode) {
// 프리뷰 코드를 생성해서 ____ 위치 파악
// 🔧 category 파트도 처리하여 올바른 템플릿 생성
const previewParts = rule.parts
.sort((a: any, b: any) => a.order - b.order)
.map((part: any) => {
@@ -1054,6 +1055,35 @@ class NumberingRuleService {
return autoConfig.textValue || "";
case "date":
return "DATEPART"; // 날짜 자리 표시
case "category": {
// 카테고리 파트: formData에서 실제 값을 가져와서 매핑된 형식 사용
const categoryKey = autoConfig.categoryKey;
const categoryMappings = autoConfig.categoryMappings || [];
if (!categoryKey || !formData) {
return "CATEGORY"; // 폴백
}
const columnName = categoryKey.includes(".")
? categoryKey.split(".")[1]
: categoryKey;
const selectedValue = formData[columnName];
if (!selectedValue) {
return "CATEGORY"; // 폴백
}
const selectedValueStr = String(selectedValue);
const mapping = categoryMappings.find(
(m: any) => {
if (m.categoryValueId?.toString() === selectedValueStr) return true;
if (m.categoryValueLabel === selectedValueStr) return true;
return false;
}
);
return mapping?.format || "CATEGORY";
}
default:
return "";
}
@@ -1165,6 +1195,68 @@ class NumberingRuleService {
return autoConfig.textValue || "TEXT";
}
case "category": {
// 카테고리 기반 코드 생성 (allocateCode용)
const categoryKey = autoConfig.categoryKey; // 예: "item_info.material"
const categoryMappings = autoConfig.categoryMappings || [];
if (!categoryKey || !formData) {
logger.warn("allocateCode: 카테고리 키 또는 폼 데이터 없음", { categoryKey, hasFormData: !!formData });
return "";
}
// categoryKey에서 컬럼명 추출 (예: "item_info.material" -> "material")
const columnName = categoryKey.includes(".")
? categoryKey.split(".")[1]
: categoryKey;
// 폼 데이터에서 해당 컬럼의 값 가져오기
const selectedValue = formData[columnName];
logger.info("allocateCode: 카테고리 파트 처리", {
categoryKey,
columnName,
selectedValue,
formDataKeys: Object.keys(formData),
mappingsCount: categoryMappings.length
});
if (!selectedValue) {
logger.warn("allocateCode: 카테고리 값이 선택되지 않음", { columnName, formDataKeys: Object.keys(formData) });
return "";
}
// 카테고리 매핑에서 해당 값에 대한 형식 찾기
const selectedValueStr = String(selectedValue);
const mapping = categoryMappings.find(
(m: any) => {
// ID로 매칭
if (m.categoryValueId?.toString() === selectedValueStr) return true;
// 라벨로 매칭
if (m.categoryValueLabel === selectedValueStr) return true;
return false;
}
);
if (mapping) {
logger.info("allocateCode: 카테고리 매핑 적용", {
selectedValue,
format: mapping.format,
categoryValueLabel: mapping.categoryValueLabel
});
return mapping.format || "";
}
logger.warn("allocateCode: 카테고리 매핑을 찾을 수 없음", {
selectedValue,
availableMappings: categoryMappings.map((m: any) => ({
id: m.categoryValueId,
label: m.categoryValueLabel
}))
});
return "";
}
default:
logger.warn("알 수 없는 파트 타입", { partType: part.partType });
return "";