boolean('refresh_current')) { return $this->requestRefresh($request); } if ($request->filled('refresh_status')) { return $this->refreshStatus((string) $request->query('refresh_status')); } $pageData = app(ProcessDetailsPageData::class)->page($request); return view('business.pages.financial-operations.process-details', [ ...$pageData, 'section' => ['slug' => 'process-data', 'title' => '流程数据'], 'page' => ['slug' => 'oa-process', 'title' => 'OA流程'], 'pageUrl' => url('/' . company_id() . '/workspace/process-data/oa-process'), ]); } public function approvalSummary(Request $request) { $pageData = app(ProcessDetailsPageData::class)->approvalSummaryPage($request); $backFilters = array_filter( $pageData['filters'], static fn (mixed $value): bool => $value !== '' && $value !== null, ); $backUrl = url('/' . company_id() . '/workspace/process-data/oa-process') . ($backFilters === [] ? '' : '?' . http_build_query($backFilters)); return view('business.pages.financial-operations.process-details', [ ...$pageData, 'section' => ['slug' => 'process-data', 'title' => '流程数据'], 'page' => ['slug' => 'oa-process', 'title' => 'OA流程'], 'pageUrl' => url('/' . company_id() . '/workspace/process-data/oa-process/approval-summary'), 'backUrl' => $backUrl, ]); } public function export(Request $request): StreamedResponse { $filters = ProcessDetailsPageData::normalizeFilters($request); return response()->streamDownload(function () use ($filters): void { $stream = fopen('php://output', 'wb'); fwrite($stream, "\xEF\xBB\xBF"); $headers = DingProcessDetailMirrorImporter::HEADERS; array_splice($headers, 2, 0, ['发起人部门']); fputcsv($stream, [...$headers, '付款状态', '付款差额']); $number = 0; foreach ($this->repository->exportRows($filters) as $row) { $number++; fputcsv($stream, [ $number, (string) ($row['business_id'] ?? ''), (string) ($row['originator_department'] ?? ''), (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'] ?? ''), (string) ($row['payment_state'] ?? ''), isset($row['payment_difference']) ? number_format((float) $row['payment_difference'], 2, '.', '') : '', ]); } fclose($stream); }, 'OA流程_' . now()->format('Ymd_His') . '.csv', [ 'Content-Type' => 'text/csv; charset=UTF-8', ]); } public function requestRefresh(Request $request): JsonResponse { $businessIds = $request->input('business_ids', $request->query('business_ids', [])); if (is_string($businessIds)) { $businessIds = array_values(array_filter(array_map('trim', explode(',', $businessIds)))); } $request->merge(['business_ids' => $businessIds]); $validated = $request->validate([ 'business_ids' => ['required', 'array', 'min:1', 'max:50'], 'business_ids.*' => ['required', 'string', 'max:32', 'regex:/^[A-Za-z0-9_-]+$/'], ]); $activeBusinessIds = $this->repository->activeBusinessIds($validated['business_ids']); $requestState = $this->refreshQueue->enqueue( $activeBusinessIds, (int) company_id(), (int) user_id(), ); return response() ->json([ 'success' => true, ...$requestState, 'message' => $requestState['queued'] ? '当前页进行中的流程已进入刷新队列。' : '当前页没有审批中的流程需要刷新。', ]) ->header('Cache-Control', 'no-store'); } public function refreshStatus(string $token): JsonResponse { $status = $this->refreshQueue->status( $token, (int) company_id(), (int) user_id(), ); abort_if($status === null, 404); return response() ->json(['success' => true, 'refresh' => $status]) ->header('Cache-Control', 'no-store'); } }