filters($request); $page = max((int) $request->query('page', 1), 1); $perPage = 50; try { $result = $this->repository->paginate($filters, $page, $perPage); $options = $this->repository->filterOptions(); return view('business.pages.financial-operations.process-details', [ 'section' => ['slug' => 'financial-operations', 'title' => '财务经营报表'], 'page' => ['slug' => 'process-details', 'title' => '流程明细'], 'processRows' => new LengthAwarePaginator( $result['data'], $result['total'], $perPage, $page, ['path' => $request->url(), 'query' => $request->except('page')], ), 'filters' => $filters, 'summary' => $result['summary'], 'months' => $options['months'], 'documentTypes' => $options['document_types'], 'statuses' => $options['statuses'], 'mirrorStatus' => $result['status'], 'mirrorSyncedAt' => $result['last_synced_at'], 'scope' => $result['scope'], 'error' => null, ]); } catch (Throwable $exception) { report($exception); return view('business.pages.financial-operations.process-details', [ 'section' => ['slug' => 'financial-operations', 'title' => '财务经营报表'], 'page' => ['slug' => 'process-details', 'title' => '流程明细'], 'processRows' => new LengthAwarePaginator([], 0, $perPage, $page, [ 'path' => $request->url(), 'query' => $request->except('page'), ]), 'filters' => $filters, 'summary' => [ 'rows' => 0, 'approvals' => 0, 'amount_total' => 0.0, 'bank_amount_total' => 0.0, ], 'months' => [], 'documentTypes' => [], 'statuses' => [], 'mirrorStatus' => 'unavailable', 'mirrorSyncedAt' => null, 'scope' => $this->repository->scope(), 'error' => '流程明细镜像尚未完成导入,请稍后重试。', ]); } } public function export(Request $request): StreamedResponse|RedirectResponse { if (! $this->repository->ready()) { return redirect() ->route('business.pages.show', [ 'section' => 'financial-operations', 'page' => 'process-details', ]) ->withErrors(['export' => '流程明细镜像尚未完成导入,暂时不能导出。']); } $filters = $this->filters($request); return response()->streamDownload(function () use ($filters): void { $stream = fopen('php://output', 'wb'); fwrite($stream, "\xEF\xBB\xBF"); fputcsv($stream, DingProcessDetailMirrorImporter::HEADERS); $number = 0; foreach ($this->repository->exportRows($filters) as $row) { $number++; fputcsv($stream, [ $number, (string) ($row['business_id'] ?? ''), (string) ($row['originator_name'] ?? ''), (string) ($row['status'] ?? ''), (string) ($row['document_type'] ?? ''), (string) ($row['purpose'] ?? ''), (int) ($row['line_no'] ?? 0), (string) ($row['account_code'] ?? ''), (string) ($row['account_name'] ?? ''), $row['amount'] ?? '', (string) ($row['bank_account_code'] ?? ''), (string) ($row['bank_account_name'] ?? ''), $row['bank_amount'] ?? '', (string) ($row['payment_method'] ?? ''), (string) ($row['paid_at'] ?? ''), ]); } fclose($stream); }, '流程明细_' . now()->format('Ymd_His') . '.csv', [ 'Content-Type' => 'text/csv; charset=UTF-8', ]); } /** @return array */ private function filters(Request $request): array { $month = trim((string) $request->query('month', '')); $status = trim((string) $request->query('status', '')); return [ 'month' => preg_match('/^\d{4}-\d{2}$/', $month) === 1 ? $month : '', 'document_type' => mb_substr(trim((string) $request->query('document_type', '')), 0, 100), 'status' => mb_substr($status, 0, 20), 'business_id' => mb_substr(trim((string) $request->query('business_id', '')), 0, 32), 'originator_name' => mb_substr(trim((string) $request->query('originator_name', '')), 0, 100), 'keyword' => mb_substr(trim((string) $request->query('keyword', '')), 0, 100), ]; } }