From b60e44ea3aaaa951327c53ec39673fb38f58561a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Tue, 17 Mar 2026 14:20:36 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[bending]=20=EB=8B=B4=EB=8B=B9=EC=9E=90?= =?UTF-8?q?=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20+=20=EC=9B=90=EC=9E=90?= =?UTF-8?q?=EC=9E=AC=20LOT=20=EC=A1=B0=ED=9A=8C=20API=20+=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20=EB=B3=B5=EC=9B=90=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - STOCK 주문 생성 시 담당자(manager_name) 미입력이면 로그인 사용자명 자동 설정 - GET /bending/material-lots?material={재질}: 수입검사 완료 입고의 LOT 목록 조회 - 취소→등록 복원은 기존 CANCELLED→DRAFT 전환으로 이미 지원됨 (프론트 UI만 필요) --- .../Controllers/Api/V1/BendingController.php | 40 +++++++++++++++++++ app/Services/OrderService.php | 12 +++++- routes/api/v1/production.php | 1 + 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/V1/BendingController.php b/app/Http/Controllers/Api/V1/BendingController.php index 6fc75229..9bbc3775 100644 --- a/app/Http/Controllers/Api/V1/BendingController.php +++ b/app/Http/Controllers/Api/V1/BendingController.php @@ -4,6 +4,7 @@ use App\Helpers\ApiResponse; use App\Http\Controllers\Controller; +use App\Models\Tenants\Receiving; use App\Services\BendingCodeService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -48,6 +49,45 @@ public function resolveItem(Request $request): JsonResponse }, __('message.fetched')); } + /** + * 원자재 LOT 목록 조회 (수입검사 완료 입고 기준) + * + * 재질(material)이 일치하는 입고 LOT 목록 반환 + */ + public function materialLots(Request $request): JsonResponse + { + return ApiResponse::handle(function () use ($request) { + $material = $request->query('material'); + + $query = Receiving::where('status', 'completed') + ->whereNotNull('lot_no') + ->where('lot_no', '!=', ''); + + // 재질(item_name 또는 specification)으로 필터링 + if ($material) { + $query->where(function ($q) use ($material) { + $q->where('item_name', 'LIKE', "%{$material}%") + ->orWhere('specification', 'LIKE', "%{$material}%"); + }); + } + + return $query->select([ + 'id', + 'lot_no', + 'supplier_lot', + 'item_name', + 'specification', + 'receiving_qty', + 'receiving_date', + 'supplier', + 'options', + ]) + ->orderByDesc('receiving_date') + ->limit(50) + ->get(); + }, __('message.fetched')); + } + /** * LOT 번호 생성 (프리뷰 + 일련번호 확정) */ diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index 45798fc6..d182f206 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -182,9 +182,19 @@ public function store(array $data) $data['status_code'] = $data['status_code'] ?? Order::STATUS_DRAFT; $data['order_type_code'] = $data['order_type_code'] ?? Order::TYPE_ORDER; - // 재고생산: 현장명 자동 설정 + // 재고생산: 현장명 + 담당자 자동 설정 if ($isStock) { $data['site_name'] = '재고생산'; + + // 담당자(manager_name)가 비어 있으면 로그인 사용자 이름으로 설정 + $options = $data['options'] ?? []; + if (empty($options['manager_name'])) { + $user = \App\Models\Members\User::find($userId); + if ($user) { + $options['manager_name'] = $user->name; + $data['options'] = $options; + } + } } $items = $data['items'] ?? []; diff --git a/routes/api/v1/production.php b/routes/api/v1/production.php index 0f5cbc04..18c33f16 100644 --- a/routes/api/v1/production.php +++ b/routes/api/v1/production.php @@ -131,6 +131,7 @@ Route::get('/code-map', [BendingController::class, 'codeMap'])->name('v1.bending.code-map'); Route::get('/resolve-item', [BendingController::class, 'resolveItem'])->name('v1.bending.resolve-item'); Route::post('/generate-lot', [BendingController::class, 'generateLotNumber'])->name('v1.bending.generate-lot'); + Route::get('/material-lots', [BendingController::class, 'materialLots'])->name('v1.bending.material-lots'); }); // Bending Item API (절곡품 기초관리)