'decimal:2', 'sort_order' => 'integer', 'options' => 'array', ]; // ────────────────────────────────────────────────────────────── // 관계 // ────────────────────────────────────────────────────────────── /** * 작업지시 */ public function workOrder(): BelongsTo { return $this->belongsTo(WorkOrder::class); } /** * 품목 */ public function item(): BelongsTo { return $this->belongsTo(Item::class); } // ────────────────────────────────────────────────────────────── // 스코프 // ────────────────────────────────────────────────────────────── /** * 정렬 순서 */ public function scopeOrdered($query) { return $query->orderBy('sort_order'); } /** * 완료된 품목만 필터 */ public function scopeCompleted($query) { return $query->where('status', self::STATUS_COMPLETED); } /** * 작업 결과가 있는 품목만 필터 */ public function scopeHasResult($query) { return $query->whereNotNull('options->result'); } // ────────────────────────────────────────────────────────────── // 헬퍼 메서드 // ────────────────────────────────────────────────────────────── /** * 작업 결과 데이터 가져오기 */ public function getResult(): ?array { return $this->options['result'] ?? null; } /** * 작업 결과 데이터 설정 */ public function setResult(array $result): void { $options = $this->options ?? []; $options['result'] = array_merge($options['result'] ?? [], $result); $this->options = $options; } /** * 작업 완료 처리 (결과 데이터 저장) */ public function completeWithResult(array $resultData = []): void { $this->status = self::STATUS_COMPLETED; $result = [ 'completed_at' => now()->toDateTimeString(), 'good_qty' => $resultData['good_qty'] ?? $this->quantity, 'defect_qty' => $resultData['defect_qty'] ?? 0, 'lot_no' => $resultData['lot_no'] ?? null, 'is_inspected' => $resultData['is_inspected'] ?? false, 'is_packaged' => $resultData['is_packaged'] ?? false, 'worker_id' => $resultData['worker_id'] ?? null, 'memo' => $resultData['memo'] ?? null, ]; // 불량률 자동 계산 $totalQty = $result['good_qty'] + $result['defect_qty']; $result['defect_rate'] = $totalQty > 0 ? round(($result['defect_qty'] / $totalQty) * 100, 2) : 0; $this->setResult($result); $this->save(); } }