feat: [bending] 품목코드 BD-XX-nn 자동 채번 + code 수정 불가 + prefixes API
This commit is contained in:
@@ -45,9 +45,23 @@ public function find(int $id): BendingItem
|
||||
|
||||
public function create(array $data): BendingItem
|
||||
{
|
||||
$code = $data['code'] ?? '';
|
||||
|
||||
// BD-XX 접두사가 있으면 순번 자동 채번
|
||||
if (preg_match('/^BD-([A-Z]{2})$/i', $code, $m)) {
|
||||
$code = $this->generateCode($m[1]);
|
||||
} elseif (preg_match('/^BD-([A-Z]{2})-\d+$/i', $code)) {
|
||||
// BD-XX-nn 완전한 코드 — 그대로 사용 (중복 검증)
|
||||
$exists = BendingItem::withoutGlobalScopes()->where('code', $code)->exists();
|
||||
if ($exists) {
|
||||
$prefix = substr($code, 3, 2);
|
||||
$code = $this->generateCode($prefix);
|
||||
}
|
||||
}
|
||||
|
||||
return BendingItem::create([
|
||||
'tenant_id' => $this->tenantId(),
|
||||
'code' => $data['code'],
|
||||
'code' => $code,
|
||||
'legacy_code' => $data['legacy_code'] ?? null,
|
||||
'legacy_bending_id' => $data['legacy_bending_id'] ?? null,
|
||||
'item_name' => $data['item_name'] ?? $data['name'] ?? '',
|
||||
@@ -76,8 +90,9 @@ public function update(int $id, array $data): BendingItem
|
||||
{
|
||||
$item = BendingItem::findOrFail($id);
|
||||
|
||||
// code는 수정 불가 (고유 품목코드)
|
||||
$columns = [
|
||||
'code', 'item_name', 'item_sep', 'item_bending',
|
||||
'item_name', 'item_sep', 'item_bending',
|
||||
'material', 'item_spec', 'model_name', 'model_UA',
|
||||
'rail_width', 'exit_direction', 'box_width', 'box_height',
|
||||
'front_bottom', 'inspection_door', 'length_code', 'length_mm',
|
||||
@@ -134,4 +149,53 @@ private function buildOptions(array $data): ?array
|
||||
'search_keyword', 'registration_date', 'author', 'memo',
|
||||
'parent_num', 'modified_by',
|
||||
];
|
||||
|
||||
/**
|
||||
* BD-{prefix}-{순번} 코드 자동 채번
|
||||
*/
|
||||
private function generateCode(string $prefix): string
|
||||
{
|
||||
$prefix = strtoupper($prefix);
|
||||
|
||||
$lastCode = BendingItem::withoutGlobalScopes()
|
||||
->where('code', 'like', "BD-{$prefix}-%")
|
||||
->orderByRaw('CAST(SUBSTRING(code, ?) AS UNSIGNED) DESC', [strlen("BD-{$prefix}-") + 1])
|
||||
->value('code');
|
||||
|
||||
$nextSeq = 1;
|
||||
if ($lastCode && preg_match('/BD-[A-Z]{2}-(\d+)$/', $lastCode, $m)) {
|
||||
$nextSeq = (int) $m[1] + 1;
|
||||
}
|
||||
|
||||
$pad = $nextSeq >= 100 ? 3 : 2;
|
||||
|
||||
return 'BD-'.$prefix.'-'.str_pad($nextSeq, $pad, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
/**
|
||||
* 사용 가능한 분류코드 접두사 목록
|
||||
*/
|
||||
public function prefixes(): array
|
||||
{
|
||||
return BendingItem::withoutGlobalScopes()
|
||||
->where('code', 'like', 'BD-%')
|
||||
->selectRaw('SUBSTRING(code, 4, 2) as prefix, COUNT(*) as cnt')
|
||||
->groupBy('prefix')
|
||||
->orderBy('prefix')
|
||||
->pluck('cnt', 'prefix')
|
||||
->toArray();
|
||||
}
|
||||
|
||||
/** 분류코드 접두사 정의 */
|
||||
public const PREFIX_LABELS = [
|
||||
'RS' => '가이드레일 SUS마감재', 'RM' => '가이드레일 본체/보강', 'RC' => '가이드레일 C형',
|
||||
'RD' => '가이드레일 D형', 'RE' => '가이드레일 측면마감', 'RT' => '가이드레일 절단판',
|
||||
'RH' => '가이드레일 뒷보강', 'RN' => '가이드레일 비인정',
|
||||
'CP' => '케이스 밑면판/점검구', 'CF' => '케이스 전면판', 'CB' => '케이스 후면코너/후면부',
|
||||
'CL' => '케이스 린텔', 'CX' => '케이스 상부덮개',
|
||||
'BS' => '하단마감재 SUS', 'BE' => '하단마감재 EGI', 'BH' => '하단마감재 보강평철',
|
||||
'TS' => '철재 하단마감재 SUS', 'TE' => '철재 하단마감재 EGI',
|
||||
'XE' => '마구리', 'LE' => 'L-BAR',
|
||||
'ZP' => '특수 밑면/점검구', 'ZF' => '특수 전면판', 'ZB' => '특수 후면',
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user