66 lines
2.1 KiB
PHP
66 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Exports;
|
|
|
|
use App\Exceptions\RepositoryException;
|
|
use App\Models\PurchaseOrderModel;
|
|
use App\Models\StoreModel;
|
|
use App\Models\StoreOrderItemModel;
|
|
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
|
|
|
|
/**
|
|
* 门店购买详情导出:多门店合并为一个 XLSX(每门店一个工作表,工作表名=门店名称);
|
|
* 构造传入 storeId 时仅导出该门店(单工作表)
|
|
*/
|
|
class PurchaseStoreExport implements WithMultipleSheets
|
|
{
|
|
/**
|
|
* @param PurchaseOrderModel $purchase 采购单
|
|
* @param int $storeId 单门店导出(0=全部门店)
|
|
*/
|
|
public function __construct(
|
|
private readonly PurchaseOrderModel $purchase,
|
|
private readonly int $storeId = 0,
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @return array<int, PurchaseStoreSheet>
|
|
*/
|
|
public function sheets(): array
|
|
{
|
|
// 本采购单内有明细的门店(含软删除,保证历史单据可导出)
|
|
$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');
|
|
if ($this->storeId > 0) {
|
|
$query->where('store_order_item.store_id', $this->storeId);
|
|
}
|
|
$storeIds = $query->distinct()->pluck('store_order_item.store_id');
|
|
|
|
if ($storeIds->isEmpty()) {
|
|
throw new RepositoryException(
|
|
$this->storeId > 0 ? '该门店在此采购单中无采购商品' : '该采购单无门店采购明细,无法导出'
|
|
);
|
|
}
|
|
|
|
$stores = StoreModel::withTrashed()
|
|
->whereIn('id', $storeIds)
|
|
->orderBy('id')
|
|
->get(['id', 'name']);
|
|
|
|
$usedNames = [];
|
|
$sheets = [];
|
|
foreach ($stores as $store) {
|
|
$sheets[] = new PurchaseStoreSheet(
|
|
$this->purchase,
|
|
$store,
|
|
SheetName::make((string) $store->name, (int) $store->id, $usedNames),
|
|
);
|
|
}
|
|
|
|
return $sheets;
|
|
}
|
|
}
|