diff --git a/app/Http/Controllers/Business/Pages.php b/app/Http/Controllers/Business/Pages.php index 7fcc8c3d..870714ce 100644 --- a/app/Http/Controllers/Business/Pages.php +++ b/app/Http/Controllers/Business/Pages.php @@ -460,6 +460,88 @@ class Pages extends Controller ]); } + /** + * 商品月加权平均单价导出:按当前月份与筛选条件导出 CSV,列序跟随页面显示列。 + */ + public function exportMonthlyWeightedAveragePrice(Request $request): StreamedResponse + { + $connection = (string) config('upstream_mirrors.connection', 'business_mirror'); + $map = [ + 'month' => ['report_month', '月份'], + 'barcode_warehouse' => ['barcode_warehouse', '条码+仓库'], + 'warehouse_short_name' => ['warehouse_short_name', '仓库简称'], + 'supplier' => ['supplier', '供应商'], + 'product_code' => ['product_code', '商品编码'], + 'product_name' => ['product_name', '商品名称'], + 'opening_quantity' => ['opening_quantity', '原始数量'], + 'opening_unit_price' => ['opening_unit_price', '原始价格'], + 'opening_original_amount' => ['opening_original_amount', '原始期初金额'], + 'opening_adjusted_price' => ['adjusted_unit_price', '更改价格'], + 'opening_amount' => ['opening_amount', '期初金额'], + 'purchase_quantity' => ['purchase_quantity', '采购数量'], + 'purchase_unit_price' => ['purchase_unit_price', '采购单价'], + 'purchase_amount' => ['purchase_amount', '入库金额'], + 'weighted_average_unit_price' => ['weighted_average_unit_price', '加权平均单价'], + 'pricing_status' => ['pricing_status', '定价状态'], + ]; + + $months = DB::connection($connection)->table('product_monthly_weighted_average_states') + ->where('status', 'computed')->orderByDesc('report_month')->pluck('report_month') + ->map(static fn ($month): string => substr((string) $month, 0, 10))->all(); + $requested = substr(trim((string) $request->query('month', '')), 0, 10); + $month = in_array($requested, $months, true) ? $requested : ($months[0] ?? null); + + $query = DB::connection($connection)->table('product_monthly_weighted_average_rows'); + if ($month !== null) { + $query->where('report_month', $month); + } + $code = trim((string) $request->query('product_code', '')); + if ($code !== '') { + $query->where('product_code', $code); + } + $provider = trim((string) $request->query('warehouse_provider', '')); + if ($provider !== '') { + $query->where('warehouse_short_name', 'like', '%' . addcslashes($provider, '%_\\') . '%'); + } + $category = trim((string) $request->query('category', '')); + if ($category !== '') { + $query->where('product_name', 'like', '%' . addcslashes($category, '%_\\') . '%'); + } + + $selected = array_values(array_intersect( + array_filter(explode(',', (string) $request->query('columns', ''))), + array_keys($map), + )); + if ($selected === []) { + $selected = array_keys($map); + } + + $size = min(max((int) setting('default.list_limit', 25), 1), 50); + if ($request->query('scope') === 'page') { + $query->forPage(max((int) $request->query('page', 1), 1), $size); + } + + $filename = '商品月加权平均单价_' . ($month ?? 'all') . '.csv'; + + return response()->streamDownload(function () use ($query, $selected, $map): void { + $out = fopen('php://output', 'w'); + fwrite($out, "\xEF\xBB\xBF"); + fputcsv($out, array_map(static fn (string $key): string => $map[$key][1], $selected)); + $query->orderBy('warehouse_short_name')->orderBy('product_code') + ->chunk(1000, function ($rows) use ($out, $selected, $map): void { + foreach ($rows as $row) { + $line = []; + foreach ($selected as $key) { + $value = $row->{$map[$key][0]} ?? ''; + $line[] = is_string($value) ? $value : (string) $value; + } + fputcsv($out, $line); + } + }); + fclose($out); + }, $filename, ['Content-Type' => 'text/csv; charset=UTF-8']); + } + protected function viewData( array $section, ?array $page = null, diff --git a/resources/views/business/pages/partials/directory-table.blade.php b/resources/views/business/pages/partials/directory-table.blade.php index e0857fc4..779845e7 100644 --- a/resources/views/business/pages/partials/directory-table.blade.php +++ b/resources/views/business/pages/partials/directory-table.blade.php @@ -1322,7 +1322,7 @@ @@ -1342,7 +1342,7 @@ @endforeach - @if (($page['slug'] ?? '') === 'inventory-report') + @if (in_array(($page['slug'] ?? ''), ['inventory-report', 'monthly-weighted-average-price'], true)) - + @else
diff --git a/routes/admin.php b/routes/admin.php index 90441511..8cdd1afa 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -156,10 +156,18 @@ Route::get('workspace/product-inventory/online-daifa-price/export', 'Business\Pa ->middleware('business.page:product-inventory,online-daifa-price') ->name('business.product-inventory.online-daifa-price.export'); +Route::get('workspace/product-inventory/monthly-weighted-average-price/export', 'Business\Pages@exportMonthlyWeightedAveragePrice') + ->middleware('permission:read-business-pages') + ->name('business.product-inventory.monthly-weighted-average-price.export'); + Route::get('workspace/product-inventory/inventory-report/export', 'Business\Pages@exportInventoryReport') ->middleware('business.page:product-inventory,inventory-report') ->name('business.product-inventory.inventory-report.export'); +Route::get('workspace/product-inventory/monthly-weighted-average-price/export', 'Business\Pages@exportMonthlyWeightedAveragePrice') + ->middleware('business.page:product-inventory,monthly-weighted-average-price') + ->name('business.product-inventory.monthly-weighted-average-price.export'); + Route::prefix('workspace/product-inventory/inventory-report/warehouse-mappings') ->middleware('business.page:product-inventory,inventory-report') ->name('business.product-inventory.inventory-report.warehouse-mappings.')