Files
kjs 4d6783e508 feat: Implement automatic serial number generation and reference handling in mold management
- Enhanced the `createMoldSerial` function to automatically generate serial numbers based on defined numbering rules when the serial number is not provided.
- Integrated error handling for the automatic numbering process, ensuring robust logging for success and failure cases.
- Updated the `NumberingRuleService` to support reference column handling, allowing for dynamic prefix generation based on related data.
- Modified the frontend components to accommodate new reference configurations, improving user experience in managing numbering rules.

These changes significantly enhance the mold management functionality by automating serial number generation and improving the flexibility of numbering rules.
2026-03-09 15:34:31 +09:00

181 lines
6.3 KiB
TypeScript

/**
* 코드 채번 규칙 컴포넌트 타입 정의
* Shadcn/ui 가이드라인 기반
*/
/**
* 코드 파트 유형 (5가지)
*/
export type CodePartType =
| "sequence" // 순번 (자동 증가 숫자)
| "number" // 숫자 (고정 자릿수)
| "date" // 날짜 (다양한 날짜 형식)
| "text" // 문자 (텍스트)
| "category" // 카테고리 (카테고리 값에 따른 형식)
| "reference"; // 참조 (다른 컬럼의 값을 가져옴, 마스터-디테일 분번용)
/**
* 생성 방식
*/
export type GenerationMethod =
| "auto" // 자동 생성
| "manual"; // 직접 입력
/**
* 날짜 형식
*/
export type DateFormat =
| "YYYY" // 2025
| "YY" // 25
| "YYYYMM" // 202511
| "YYMM" // 2511
| "YYYYMMDD" // 20251104
| "YYMMDD"; // 251104
/**
* 카테고리 값별 형식 매핑
* 예: 가스켓 → ITM, 벌브 → VLV
*/
export interface CategoryFormatMapping {
categoryValueId: number; // 카테고리 값 ID
categoryValueCode?: string; // 카테고리 값 코드 (V2Select에서 valueCode 사용 시 매칭용)
categoryValueLabel: string; // 카테고리 값 라벨 (표시용)
categoryValuePath?: string; // 전체 경로 (예: "원자재/벌크/가스켓")
format: string; // 생성할 형식 (예: "ITM", "VLV")
}
/**
* 단일 규칙 파트
*/
export interface NumberingRulePart {
id: string; // 고유 ID
order: number; // 순서 (1-6)
partType: CodePartType; // 파트 유형
generationMethod: GenerationMethod; // 생성 방식
// 이 파트 뒤에 붙을 구분자 (마지막 파트는 무시됨)
separatorAfter?: string;
// 자동 생성 설정
autoConfig?: {
// 순번용
sequenceLength?: number; // 순번 자릿수 (예: 3 → 001)
startFrom?: number; // 시작 번호 (기본: 1)
// 숫자용
numberLength?: number; // 숫자 자릿수 (예: 4 → 0001)
numberValue?: number; // 숫자 값
// 날짜용
dateFormat?: DateFormat; // 날짜 형식
useColumnValue?: boolean; // 컬럼 값 기준 생성 여부
sourceTableName?: string; // 소스 테이블명
sourceColumnName?: string; // 소스 컬럼명 (날짜 컬럼)
// 문자용
textValue?: string; // 텍스트 값 (예: "PRJ", "CODE")
// 카테고리용
categoryKey?: string; // 카테고리 키 (테이블.컬럼 형식, 예: "item_info.type")
categoryMappings?: CategoryFormatMapping[]; // 카테고리 값별 형식 매핑
// 참조용 (마스터-디테일 분번)
referenceColumnName?: string; // 참조할 컬럼명 (FK 컬럼 등, 해당 컬럼의 값을 코드에 포함)
};
// 직접 입력 설정
manualConfig?: {
value: string; // 입력값
placeholder?: string; // 플레이스홀더
};
// 생성된 값 (미리보기용)
generatedValue?: string;
}
/**
* 전체 채번 규칙
*/
export interface NumberingRuleConfig {
ruleId: string; // 규칙 ID
ruleName: string; // 규칙명
description?: string; // 설명
parts: NumberingRulePart[]; // 규칙 파트 배열
// 설정
separator?: string; // 구분자 (기본: "-")
resetPeriod?: "none" | "daily" | "monthly" | "yearly";
currentSequence?: number; // 현재 시퀀스
// 적용 범위
scopeType?: "global" | "menu"; // 적용 범위 (전역/메뉴별)
menuObjid?: number; // 적용할 메뉴 OBJID (상위 메뉴 기준)
// 적용 대상
tableName?: string; // 적용할 테이블명
columnName?: string; // 적용할 컬럼명
// 카테고리 조건 (특정 카테고리 값일 때만 이 규칙 적용)
categoryColumn?: string; // 카테고리 조건 컬럼명 (예: 'type', 'material')
categoryValueId?: number; // 카테고리 값 ID (category_values.value_id)
categoryValueLabel?: string; // 카테고리 값 라벨 (조회 시 조인)
// 메타 정보
companyCode?: string;
createdAt?: string;
updatedAt?: string;
createdBy?: string;
}
/**
* UI 옵션 상수
*/
export const CODE_PART_TYPE_OPTIONS: Array<{ value: CodePartType; label: string; description: string }> = [
{ value: "sequence", label: "순번", description: "자동 증가 순번 (1, 2, 3...)" },
{ value: "number", label: "숫자", description: "고정 자릿수 숫자 (001, 002...)" },
{ value: "date", label: "날짜", description: "날짜 형식 (2025-11-04)" },
{ value: "text", label: "문자", description: "텍스트 또는 코드" },
{ value: "category", label: "카테고리", description: "카테고리 값에 따른 형식" },
{ value: "reference", label: "참조", description: "다른 컬럼 값 참조 (마스터 키 분번)" },
];
export const DATE_FORMAT_OPTIONS: Array<{ value: DateFormat; label: string; example: string }> = [
{ value: "YYYY", label: "연도 (4자리)", example: "2025" },
{ value: "YY", label: "연도 (2자리)", example: "25" },
{ value: "YYYYMM", label: "연도+월", example: "202511" },
{ value: "YYMM", label: "연도(2)+월", example: "2511" },
{ value: "YYYYMMDD", label: "연월일", example: "20251104" },
{ value: "YYMMDD", label: "연(2)+월일", example: "251104" },
];
export const RESET_PERIOD_OPTIONS: Array<{
value: "none" | "daily" | "monthly" | "yearly";
label: string;
}> = [
{ value: "none", label: "초기화 안함" },
{ value: "daily", label: "일별 초기화" },
{ value: "monthly", label: "월별 초기화" },
{ value: "yearly", label: "연별 초기화" },
];
/**
* 구분자 옵션
* - 규칙과 규칙 사이에 들어가는 문자
* - "none"은 구분자 없음
* - "custom"은 직접 입력 (최대 2자)
*/
export type SeparatorType = "none" | "-" | "_" | "." | "/" | "custom";
export const SEPARATOR_OPTIONS: Array<{
value: SeparatorType;
label: string;
displayValue: string;
}> = [
{ value: "none", label: "없음", displayValue: "" },
{ value: "-", label: "하이픈 (-)", displayValue: "-" },
{ value: "_", label: "언더스코어 (_)", displayValue: "_" },
{ value: ".", label: "점 (.)", displayValue: "." },
{ value: "/", label: "슬래시 (/)", displayValue: "/" },
{ value: "custom", label: "직접입력", displayValue: "" },
];