feat: [품질관리] 품질관리서/실적신고/검사 API

- QualityDocument CRUD + 수주 연결 + 개소별 데이터 저장
- PerformanceReport 실적신고 확인/메모 API
- Inspection 검사 설정 + product_code 전파 수정
- 수주선택 API에 client_name 필드 추가
- 절곡 검사 프로파일 분리 (S1/S2/S3)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 02:57:48 +09:00
parent 091719e81b
commit f9cd219f67
29 changed files with 2495 additions and 10 deletions

View File

@@ -321,7 +321,7 @@ public function store(array $data): Quote
// 제품 정보
'product_category' => $data['product_category'] ?? Quote::CATEGORY_SCREEN,
'product_id' => $data['product_id'] ?? null,
'product_code' => $data['product_code'] ?? null,
'product_code' => $data['product_code'] ?? $this->extractProductCodeFromInputs($data),
'product_name' => $data['product_name'] ?? null,
// 규격 정보
'open_size_width' => $data['open_size_width'] ?? null,
@@ -418,7 +418,7 @@ public function update(int $id, array $data): Quote
// 제품 정보
'product_category' => $data['product_category'] ?? $quote->product_category,
'product_id' => $data['product_id'] ?? $quote->product_id,
'product_code' => $data['product_code'] ?? $quote->product_code,
'product_code' => $data['product_code'] ?? $this->extractProductCodeFromInputs($data) ?? $quote->product_code,
'product_name' => $data['product_name'] ?? $quote->product_name,
// 규격 정보
'open_size_width' => $data['open_size_width'] ?? $quote->open_size_width,
@@ -799,6 +799,22 @@ private function resolveLocationIndex(QuoteItem $quoteItem, array $productItems)
return 0;
}
/**
* calculation_inputs에서 첫 번째 개소의 productCode 추출
* 다중 개소 시 첫 번째를 대표값으로 사용
*/
private function extractProductCodeFromInputs(array $data): ?string
{
$inputs = $data['calculation_inputs'] ?? null;
if (! $inputs || ! is_array($inputs)) {
return null;
}
$items = $inputs['items'] ?? [];
return $items[0]['productCode'] ?? null;
}
/**
* 수주번호 생성
* 형식: ORD-YYMMDD-NNN (예: ORD-260105-001)