105 lines
3.6 KiB
PHP
105 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Mini;
|
|
|
|
use App\Exceptions\RepositoryException;
|
|
use App\Models\PurchaseOrderItemModel;
|
|
use App\Models\PurchaseOrderModel;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Modules\AnnoRoute\Attribute\GetRoute;
|
|
use Modules\AnnoRoute\Attribute\PutRoute;
|
|
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
|
|
|
/**
|
|
* 小程序供应商端(接收采购单 / 明细 / 确认接单)
|
|
*/
|
|
#[RequestAttribute('/mini', 'mini', authGuard: 'users')]
|
|
class SupplierController extends BaseMiniController
|
|
{
|
|
/** 收到的采购单:含本供应商 is_sent=1 明细的采购单(去重) */
|
|
#[GetRoute('/supplier/purchases', authorize: true)]
|
|
public function purchases(Request $request): JsonResponse
|
|
{
|
|
$user = $this->currentUser($request);
|
|
$supplier = $this->ensureSupplierBound($user);
|
|
|
|
$purchaseIds = PurchaseOrderItemModel::query()
|
|
->where('supplier_id', $supplier->id)
|
|
->where('is_sent', PurchaseOrderItemModel::SENT)
|
|
->distinct()
|
|
->pluck('purchase_id');
|
|
|
|
$data = PurchaseOrderModel::query()
|
|
->whereIn('id', $purchaseIds)
|
|
->orderBy('purchase_date', 'desc')
|
|
->orderBy('id', 'desc')
|
|
->paginate((int) $request->input('pageSize', 10))
|
|
->toArray();
|
|
|
|
return $this->success($data);
|
|
}
|
|
|
|
/** 采购单明细:仅本供应商且已发送的明细行 */
|
|
#[GetRoute('/supplier/purchases/{id}', authorize: true, where: ['id' => '[0-9]+'])]
|
|
public function detail(int $id, Request $request): JsonResponse
|
|
{
|
|
$user = $this->currentUser($request);
|
|
$supplier = $this->ensureSupplierBound($user);
|
|
|
|
$purchase = PurchaseOrderModel::find($id);
|
|
if ($purchase === null) {
|
|
throw new RepositoryException('采购单不存在');
|
|
}
|
|
|
|
$items = $purchase->items()
|
|
->where('supplier_id', $supplier->id)
|
|
->where('is_sent', PurchaseOrderItemModel::SENT)
|
|
->get();
|
|
if ($items->isEmpty()) {
|
|
throw new RepositoryException('该采购单无贵司的采购明细');
|
|
}
|
|
|
|
return $this->success([
|
|
'id' => $purchase->id,
|
|
'purchase_no' => $purchase->purchase_no,
|
|
'purchase_date' => $purchase->purchase_date?->toDateString(),
|
|
'remark' => $purchase->remark,
|
|
'items' => $items->toArray(),
|
|
]);
|
|
}
|
|
|
|
/** 确认接单:本供应商已发送明细批量记录 supplier_confirmed_at(幂等) */
|
|
#[PutRoute('/supplier/purchases/{id}/confirm', authorize: true, where: ['id' => '[0-9]+'])]
|
|
public function confirm(int $id, Request $request): JsonResponse
|
|
{
|
|
$user = $this->currentUser($request);
|
|
$supplier = $this->ensureSupplierBound($user);
|
|
|
|
$purchase = PurchaseOrderModel::find($id);
|
|
if ($purchase === null) {
|
|
throw new RepositoryException('采购单不存在');
|
|
}
|
|
|
|
$items = $purchase->items()
|
|
->where('supplier_id', $supplier->id)
|
|
->where('is_sent', PurchaseOrderItemModel::SENT)
|
|
->get();
|
|
if ($items->isEmpty()) {
|
|
throw new RepositoryException('该采购单无贵司的采购明细');
|
|
}
|
|
|
|
$now = now();
|
|
$confirmed = 0;
|
|
foreach ($items as $item) {
|
|
if ($item->supplier_confirmed_at === null) {
|
|
$item->supplier_confirmed_at = $now;
|
|
$item->save();
|
|
$confirmed++;
|
|
}
|
|
}
|
|
|
|
return $this->success(['confirmed' => $confirmed], '已确认接单');
|
|
}
|
|
}
|