$this->service()->listBatches([ 'keyword' => $request->input('keyword', ''), 'qr_url' => $request->input('qr_url', ''), 'verify_code' => $request->input('verify_code', ''), 'date_start' => $request->input('date_start', ''), 'date_end' => $request->input('date_end', ''), ]), ]); } public function detail(Request $request) { $id = (int)$request->input('id', 0); if ($id <= 0) { return api_error('物料批次 ID 不能为空', 422); } try { return api_success($this->service()->detail($id, trim((string)$request->input('keyword', '')))); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 404); } } public function create(Request $request) { $count = (int)$request->input('count', 0); $remark = trim((string)$request->input('remark', '')); $adminId = (int)$request->header('x-admin-id', 0); $adminName = trim((string)$request->header('x-admin-name', '')); try { return api_success($this->service()->createBatch($count, $remark, $adminId, $adminName), '物料批次已生成'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\Throwable $e) { return api_error('物料批次生成失败', 500, ['detail' => $e->getMessage()]); } } public function download(Request $request) { $file = $this->resolveDownloadFile($request); if ($file instanceof \support\Response) { return $file; } return redirect($file['url'], 302); } public function downloadLink(Request $request) { $file = $this->resolveDownloadFile($request); if ($file instanceof \support\Response) { return $file; } return api_success([ 'filename' => $file['filename'], 'url' => $file['url'], 'size' => $file['size'], ], '下载链接已生成'); } private function resolveDownloadFile(Request $request): array|\support\Response { $id = (int)$request->input('id', 0); if ($id <= 0) { return api_error('物料批次 ID 不能为空', 422); } try { $file = $this->service()->downloadBatch($id, $request); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 500); } catch (\Throwable $e) { return api_error('物料批次下载失败', 500, ['detail' => $e->getMessage()]); } return $file; } public function invalidateBatch(Request $request) { $id = (int)$request->input('id', 0); if ($id <= 0) { return api_error('物料批次 ID 不能为空', 422); } try { return api_success($this->service()->invalidateBatch($id, $request), '物料批次已失效'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 500); } catch (\Throwable $e) { return api_error('物料批次失效失败', 500, ['detail' => $e->getMessage()]); } } public function invalidateTag(Request $request) { $id = (int)$request->input('id', 0); if ($id <= 0) { return api_error('物料条码 ID 不能为空', 422); } try { return api_success($this->service()->invalidateTag($id, $request), '物料条码已失效'); } catch (\InvalidArgumentException $e) { return api_error($e->getMessage(), 422); } catch (\RuntimeException $e) { return api_error($e->getMessage(), $e->getCode() ?: 500); } catch (\Throwable $e) { return api_error('物料条码失效失败', 500, ['detail' => $e->getMessage()]); } } private function service(): MaterialTagService { return new MaterialTagService(); } }