service()->lookupInboundByInboundNo($this->inboundNo($request))); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('入库匹配失败', 500, ['detail' => $e->getMessage()]); } } public function inboundReceive(Request $request) { try { return api_success($this->service()->receiveInbound( $this->inboundNo($request), (string)$request->input('internal_tag_no', ''), $request, $request->input('inbound_attachments', []) ), '入库完成'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('入库失败', 500, ['detail' => $e->getMessage()]); } } public function uploadInboundEvidenceFile(Request $request) { $evidenceService = new AppraisalEvidenceService(); try { $asset = $evidenceService->upload($request); if (!in_array((string)($asset['file_type'] ?? ''), ['image', 'video'], true)) { $evidenceService->delete((string)($asset['file_url'] ?? '')); return api_error('拆包附件仅支持上传图片或视频', 422); } return api_success($asset); } catch (\Throwable $e) { return api_error($e->getMessage(), 422); } } public function uploadReturnPackingFile(Request $request) { $evidenceService = new AppraisalEvidenceService(); try { $asset = $evidenceService->upload($request); if (!in_array((string)($asset['file_type'] ?? ''), ['image', 'video'], true)) { $evidenceService->delete((string)($asset['file_url'] ?? '')); return api_error('打包装箱附件仅支持上传图片或视频', 422); } return api_success($asset); } catch (\Throwable $e) { return api_error($e->getMessage(), 422); } } public function zhongjianLookup(Request $request) { try { return api_success($this->service()->lookupZhongjianTransfer((string)$request->input('internal_tag_no', ''))); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('中检流转查询失败', 500, ['detail' => $e->getMessage()]); } } public function zhongjianOutbound(Request $request) { try { return api_success($this->service()->zhongjianOutbound((string)$request->input('internal_tag_no', ''), $request), '送检出库完成'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('送检出库失败', 500, ['detail' => $e->getMessage()]); } } public function zhongjianInbound(Request $request) { try { return api_success($this->service()->zhongjianInbound((string)$request->input('internal_tag_no', ''), $request), '送检入库完成'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('送检入库失败', 500, ['detail' => $e->getMessage()]); } } public function returnLookup(Request $request) { try { return api_success($this->service()->lookupReturn((string)$request->input('internal_tag_no', ''), $request)); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('寄回查询失败', 500, ['detail' => $e->getMessage()]); } } public function verifyReturnMaterialTag(Request $request) { try { return api_success($this->service()->verifyReturnMaterialTag( (string)$request->input('internal_tag_no', ''), (string)$request->input('qr_input', ''), $request ), '验真吊牌匹配通过,请核对报告'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('验真吊牌确认失败', 500, ['detail' => $e->getMessage()]); } } public function confirmZhongjianReturn(Request $request) { try { return api_success($this->service()->confirmZhongjianReturn((string)$request->input('internal_tag_no', ''), $request), '中检报告已确认'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('中检报告确认失败', 500, ['detail' => $e->getMessage()]); } } public function confirmReturnReport(Request $request) { try { return api_success($this->service()->confirmReturnReport( (string)$request->input('internal_tag_no', ''), (int)$request->input('report_id', 0), $request ), '报告已确认,可填写回寄运单'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('报告确认失败', 500, ['detail' => $e->getMessage()]); } } public function shipReturn(Request $request) { try { return api_success($this->service()->shipReturn( (string)$request->input('internal_tag_no', ''), (string)$request->input('express_company', ''), (string)$request->input('tracking_no', ''), $request, $request->input('packing_attachments', []) ), '回寄运单已登记'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } catch (\Throwable $e) { return api_error('回寄运单登记失败', 500, ['detail' => $e->getMessage()]); } } private function service(): FulfillmentFlowService { return new FulfillmentFlowService(); } private function inboundNo(Request $request): string { $inboundNo = $this->requestString($request, 'inbound_no'); if ($inboundNo !== '') { return $inboundNo; } return $this->requestString($request, 'tracking_no'); } private function requestString(Request $request, string $key): string { foreach ([$request->get($key, null), $request->post($key, null), $request->input($key, null)] as $value) { $text = trim((string)($value ?? '')); if ($text !== '') { return $text; } } return ''; } }