42 lines
2.3 KiB
PHP
42 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Business;
|
|
|
|
use Illuminate\Routing\Controller;
|
|
use Modules\EcommerceFinance\Services\SupplierAccessoryFreightMatcher;
|
|
use Modules\EcommerceFinance\View\SupplierAccessoryFreightPageData;
|
|
|
|
class SupplierAccessoryFreight extends Controller
|
|
{
|
|
public function export(SupplierAccessoryFreightPageData $data)
|
|
{
|
|
$filters = $data->filters();
|
|
$columns = $data->exportColumns();
|
|
$file = tmpfile();
|
|
abort_if($file === false, 500, '无法创建导出文件。');
|
|
try {
|
|
fwrite($file, "\xEF\xBB\xBF");
|
|
fputcsv($file, ['业务月份', '发货记录ID', '仓库', ...array_values($columns)]);
|
|
foreach ($data->rows($filters) as $row) {
|
|
if ($filters['state'] !== 'all' && $filters['state'] !== $row['state']) continue;
|
|
$cells = array_merge($row, ['courier' => ($row['express_name1'] ?? '') ?: ($row['express_name2'] ?? ''),
|
|
'freight' => $row['freight_cents'] === null ? '待核实' : number_format($row['freight_cents'] / 100, 2, '.', ''),
|
|
'state' => SupplierAccessoryFreightMatcher::STATES[$row['state']], 'deduction' => number_format($row['deduction_cents'] / 100, 2, '.', '')]);
|
|
$values = [$filters['month'], $row['source_id'], \Modules\EcommerceFinance\Services\AccessoryReshipMatcher::WAREHOUSE];
|
|
foreach ($columns as $key => $label) $values[] = $cells[$key];
|
|
fputcsv($file, array_map(static function ($value) {
|
|
$value = (string) $value;
|
|
// 纯数字标识保留文本,防止 Excel 截断长单号;同时阻止公式执行。
|
|
return preg_match('/^[=+\-@\t\r\n]|^\d{12,}$/u', $value) ? "'" . $value : $value;
|
|
}, $values));
|
|
}
|
|
rewind($file);
|
|
} catch (\Throwable $exception) {
|
|
fclose($file);
|
|
report($exception);
|
|
abort(503, '资料读取失败,未生成不完整的扣款明细,请稍后重试。');
|
|
}
|
|
return response()->streamDownload(function () use ($file) { fpassthru($file); fclose($file); }, SupplierAccessoryFreightPageData::TITLE . '-' . $filters['month'] . '.csv', ['Content-Type' => 'text/csv; charset=UTF-8']);
|
|
}
|
|
}
|