Files
xin-procurement/app/Exports/PurchaseSupplierExport.php
T
2026-08-27 14:20:09 +08:00

78 lines
2.8 KiB
PHP

<?php
namespace App\Exports;
use App\Exceptions\RepositoryException;
use App\Models\PurchaseOrderModel;
use App\Models\StoreOrderItemModel;
use App\Models\SupplierModel;
use App\Services\PurchaseItemService;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
/**
* 供应商采购明细导出:多供应商合并为一个 XLSX,按「供应商 × 市场」拆分工作表
* (工作表名=供应商·市场,市场取商品档案,未设置市场归入「未设置」);
* 构造传入 supplierId 时仅导出该供应商
*/
class PurchaseSupplierExport implements WithMultipleSheets
{
/**
* @param PurchaseOrderModel $purchase 采购单
* @param int $supplierId 单供应商导出(0=全部供应商)
*/
public function __construct(
private readonly PurchaseOrderModel $purchase,
private readonly int $supplierId = 0,
) {
}
/**
* @return array<int, PurchaseSupplierSheet>
*/
public function sheets(): array
{
// 本采购单内有明细的供应商(按订货明细快照 supplier_id 归集)
$query = StoreOrderItemModel::query()
->join('store_order', 'store_order.id', '=', 'store_order_item.order_id')
->where('store_order_item.purchase_id', $this->purchase->id)
->whereNull('store_order.deleted_at')
->where('store_order_item.supplier_id', '>', 0);
if ($this->supplierId > 0) {
$query->where('store_order_item.supplier_id', $this->supplierId);
}
$supplierIds = $query->distinct()->pluck('store_order_item.supplier_id');
if ($supplierIds->isEmpty()) {
throw new RepositoryException(
$this->supplierId > 0 ? '该供应商在此采购单中无采购明细' : '该采购单无供应商采购明细,无法导出'
);
}
$suppliers = SupplierModel::withTrashed()
->whereIn('id', $supplierIds)
->orderBy('id')
->get(['id', 'name']);
$service = app(PurchaseItemService::class);
$usedNames = [];
$sheets = [];
foreach ($suppliers as $supplier) {
// 按市场拆分工作表
$matrix = $service->supplierMarketMatrix($this->purchase->id, (int) $supplier->id);
foreach ($matrix['markets'] as $market => $rows) {
$marketLabel = $market === '' ? '未设置' : $market;
$sheets[] = new PurchaseSupplierSheet(
$this->purchase,
$supplier,
$marketLabel,
$rows,
$matrix['stores'],
SheetName::make($supplier->name . '·' . $marketLabel, (int) $supplier->id, $usedNames),
);
}
}
return $sheets;
}
}