140 lines
5.7 KiB
PHP
140 lines
5.7 KiB
PHP
<?php
|
|
|
|
namespace Modules\EcommerceFinance\Http\Controllers;
|
|
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Routing\Controller;
|
|
use Modules\EcommerceFinance\Repositories\DingProcessDetailMirrorRepository;
|
|
use Modules\EcommerceFinance\Services\DingProcessDetailMirrorImporter;
|
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
|
use Throwable;
|
|
|
|
class ProcessDetails extends Controller
|
|
{
|
|
public function __construct(
|
|
private readonly DingProcessDetailMirrorRepository $repository,
|
|
) {}
|
|
|
|
public function show(Request $request)
|
|
{
|
|
$filters = $this->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<string,string> */
|
|
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),
|
|
];
|
|
}
|
|
}
|