fix : 카테고리, 제품등록, BOM등록 API (일부 개발 - BOM 추가 작업 필요)

This commit is contained in:
2025-08-25 17:46:34 +09:00
parent 6307fdc1dc
commit 52bf8527e2
16 changed files with 2591 additions and 80 deletions

View File

@@ -0,0 +1,105 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
// 1) child_product_id 를 NULL 허용으로 변경 (MySQL 원시 SQL 사용)
// (doctrine/dbal 없이 컬럼 수정)
DB::statement("
ALTER TABLE product_components
MODIFY child_product_id BIGINT UNSIGNED NULL COMMENT '하위 제품/부품 ID';
");
Schema::table('product_components', function (Blueprint $table) {
// 2) ref_type, material_id 추가
$table->enum('ref_type', ['PRODUCT', 'MATERIAL'])
->default('PRODUCT')
->after('parent_product_id')
->comment('참조 대상 타입(PRODUCT=제품, MATERIAL=자재)');
$table->unsignedBigInteger('material_id')
->nullable()
->after('child_product_id')
->comment('자재 ID');
$table->foreign('material_id')
->references('id')
->on('materials')
->nullOnDelete();
});
// 3) 기존 유니크 키 재정의:
// (tenant_id, parent_product_id, ref_type, child_product_id, material_id, sort_order)
// - 제품/자재 타입과 각각의 ID를 모두 포함하도록 변경
DB::statement("ALTER TABLE product_components DROP INDEX uq_component_row");
DB::statement("
ALTER TABLE product_components
ADD UNIQUE INDEX uq_component_row
(tenant_id, parent_product_id, ref_type, child_product_id, material_id, sort_order)
");
// 4) (선택) CHECK 제약: MySQL 8.0.16+ 에서만 유효
// ref_type=PRODUCT -> child_product_id NOT NULL AND material_id NULL
// ref_type=MATERIAL -> material_id NOT NULL AND child_product_id NULL
try {
$version = DB::selectOne('SELECT VERSION() AS v')->v ?? '';
// 매우 단순한 버전체크 (8.0 이상일 때 시도)
if (preg_match('/^8\./', $version)) {
DB::statement("
ALTER TABLE product_components
ADD CONSTRAINT chk_ref_type_consistency
CHECK (
(ref_type = 'PRODUCT' AND child_product_id IS NOT NULL AND material_id IS NULL) OR
(ref_type = 'MATERIAL' AND material_id IS NOT NULL AND child_product_id IS NULL)
)
");
}
} catch (\Throwable $e) {
// CHECK 미지원(DB버전/엔진)일 경우 무시하고 넘어갑니다.
}
}
public function down(): void
{
// CHECK 제약 삭제 (가능한 경우만)
try {
DB::statement("
ALTER TABLE product_components
DROP CHECK chk_ref_type_consistency
");
} catch (\Throwable $e) {
// 무시
}
// 유니크 키를 원래대로 복구
try {
DB::statement("ALTER TABLE product_components DROP INDEX uq_component_row");
} catch (\Throwable $e) {
// 무시
}
DB::statement("
ALTER TABLE product_components
ADD UNIQUE INDEX uq_component_row
(tenant_id, parent_product_id, child_product_id, sort_order)
");
Schema::table('product_components', function (Blueprint $table) {
// FK 우선 제거
$table->dropForeign(['material_id']);
// 컬럼 삭제
$table->dropColumn(['ref_type', 'material_id']);
});
// child_product_id 를 NOT NULL 로 되돌림
DB::statement("
ALTER TABLE product_components
MODIFY child_product_id BIGINT UNSIGNED NOT NULL COMMENT '하위 제품/부품 ID';
");
}
};