采购单优化

This commit is contained in:
liu
2026-08-13 00:11:44 +08:00
parent 0211e5e98d
commit 6c794d0732
6 changed files with 362 additions and 19 deletions
@@ -259,6 +259,84 @@ class PurchaseOrderController extends BaseController
]);
}
/**
* 门店购买详情:采购单内指定门店的采购汇总(按商品聚合)
* 单价为加权平均口径(Σ金额÷Σ数量),保证 单价×数量=预计金额
*/
#[GetRoute(route: '/{id}/store', authorize: 'query', where: ['id' => '[0-9]+'])]
public function storeSummary(int $id, Request $request): JsonResponse
{
$storeId = (int) $request->query('store_id', 0);
if ($storeId <= 0) {
throw new RepositoryException('缺少门店参数');
}
$purchase = PurchaseOrderModel::find($id);
if (empty($purchase)) {
throw new RepositoryException('采购单不存在');
}
$items = StoreOrderItemModel::query()
->join('store_order', 'store_order.id', '=', 'store_order_item.order_id')
->where('store_order_item.purchase_id', $purchase->id)
->where('store_order_item.store_id', $storeId)
->whereNull('store_order.deleted_at')
->select('store_order_item.*')
->orderBy('store_order_item.id')
->get();
// 排序键:分类 sort → 商品 sort(与明细矩阵同序)
$products = ProductModel::withTrashed()
->with('category:id,sort')
->whereIn('id', $items->pluck('product_id')->unique())
->get()
->keyBy('id');
$rows = [];
foreach ($items->groupBy('product_id') as $productId => $group) {
$product = $products->get((int) $productId);
$first = $group->first();
// 采购总数量(包数)
$quantity = 0;
// 预计金额 = Σ 明细 amount
$amount = '0';
// 总重量
$weight = '0';
foreach ($group as $item) {
$weight = bcadd($weight, (string) $item->weight, 3);
$quantity += (int) $item->quantity;
$amount = bcadd($amount, (string) $item->amount, 2);
}
$rows[] = [
'product_id' => (int) $productId,
'product_name' => $first->product_name,
'product_spec' => $first->product_spec, // 包规
'unit' => $first->unit, // 单位
'price' => $quantity > 0 // 加权平均单价
? bcdiv($amount, (string) $quantity, 2)
: (string) $first->price,
'quantity' => $quantity,
'amount' => $amount,
'weight' => $weight,
'category_sort' => (int) ($product->category->sort ?? 9999),
'product_sort' => (int) ($product->sort ?? 9999),
];
}
usort($rows, static fn (array $a, array $b): int =>
[$a['category_sort'], $a['product_sort'], $a['product_id']]
<=> [$b['category_sort'], $b['product_sort'], $b['product_id']]);
$store = StoreModel::withTrashed()->find($storeId);
return $this->success([
'store' => $store ? ['id' => $store->id, 'name' => $store->name] : null,
'items' => array_map(static function (array $row): array {
unset($row['category_sort'], $row['product_sort']);
return $row;
}, $rows),
]);
}
/**
* 商品行修改:品名/供应商/包规/单位/成本
* @throws Throwable