diff --git a/app/Http/Controllers/OrderController.php b/app/Http/Controllers/OrderController.php index 572ffe1..f7f7d5f 100644 --- a/app/Http/Controllers/OrderController.php +++ b/app/Http/Controllers/OrderController.php @@ -229,6 +229,19 @@ public function batchAudit(Request $request) continue; } + // 驳回时解锁库存 + if ($request->action === 'reject') { + $stockService = app(\App\Services\StockService::class); + foreach ($order->items as $item) { + $stockService->unlockStock( + $item->sku_code ?? $item->erp_sku_id, + $order->warehouse_id, + $item->quantity, + $order->id + ); + } + } + $order->update([ 'audit_status' => $request->action === 'approve' ? 'approved' : 'rejected', 'audit_comment' => $request->comment, @@ -284,6 +297,19 @@ public function auditOrder(Request $request, string $id) ], 400); } + // 驳回时解锁库存 + if ($request->action === 'reject') { + $stockService = app(\App\Services\StockService::class); + foreach ($order->items as $item) { + $stockService->unlockStock( + $item->sku_code ?? $item->erp_sku_id, + $order->warehouse_id, + $item->quantity, + $order->id + ); + } + } + $order->update([ 'audit_status' => $request->action === 'approve' ? 'approved' : 'rejected', 'audit_comment' => $request->comment, diff --git a/app/Services/StockService.php b/app/Services/StockService.php index 883a383..4e72b62 100644 --- a/app/Services/StockService.php +++ b/app/Services/StockService.php @@ -38,6 +38,37 @@ public function lock($skuCode, $warehouseId, $quantity, $orderId) }); } + /** + * 解锁库存(驳回订单时调用) + */ + public function unlockStock($skuCode, $warehouseId, $quantity, $orderId) + { + if ($quantity <= 0) { + throw new \InvalidArgumentException('解锁数量必须为正数'); + } + + return DB::transaction(function () use ($skuCode, $warehouseId, $quantity, $orderId) { + $stock = $this->getStock($skuCode, $warehouseId); + + if ($stock->locked_quantity < $quantity) { + throw new \Exception("商品 {$skuCode} 锁定库存不足,当前锁定{$stock->locked_quantity},需解锁{$quantity}"); + } + + $stock->decrement('locked_quantity', $quantity); + + StockLog::create([ + 'sku_code' => $skuCode, + 'warehouse_id' => $warehouseId, + 'change_quantity' => -$quantity, + 'type' => 'unlock', + 'order_id' => $orderId, + 'remark' => "解锁库存,订单ID {$orderId}", + ]); + + return $stock; + }); + } + /** * 获取指定SKU在仓库的可用库存 */ diff --git a/routes/api.php b/routes/api.php index 7f4a7d1..e8dd9e2 100644 --- a/routes/api.php +++ b/routes/api.php @@ -95,5 +95,25 @@ Route::delete('/{id}', [GoodsController::class, 'destroy']); }); -// 商品模块(ERP SKU) +// 仓库模板绑定 +Route::middleware('auth:sanctum')->prefix('warehouse')->group(function () { + Route::get('/bindings', [WarehouseTemplateBindingController::class, 'index']); + Route::post('/bindings', [WarehouseTemplateBindingController::class, 'store']); + Route::put('/bindings/{id}', [WarehouseTemplateBindingController::class, 'update']); + Route::delete('/bindings/{id}', [WarehouseTemplateBindingController::class, 'destroy']); +}); + +// 操作日志 +Route::middleware('auth:sanctum')->prefix('operation-logs')->group(function () { + Route::get('/', [OperationLogController::class, 'index']); + Route::get('/export', [OperationLogController::class, 'export']); +}); + +// 发货管理 - 统一路径 +Route::middleware('auth:sanctum')->prefix('delivery')->group(function () { + Route::get('/pending', [DeliveryController::class, 'pending']); + Route::get('/pending-delivery', [DeliveryController::class, 'pending']); // 兼容旧路径 + Route::get('/reprint/{id}', [DeliveryController::class, 'reprint']); + Route::post('/reprint', [DeliveryController::class, 'reprintBatch']); // 批量重打 +});