鲜花2.0-库存盘点和批量导入+订单库存扣减乐观锁和重试机制

This commit is contained in:
杨建炊 2024-07-30 17:41:02 +08:00
parent 91e4e5342e
commit ab03594786
5 changed files with 53 additions and 17 deletions

View File

@ -34,7 +34,17 @@ class BusinessOrdersUpdate
{ {
$this->businessGoodSku = $businessGoodSku->toArray(); $this->businessGoodSku = $businessGoodSku->toArray();
$this->num = $num; $this->num = $num;
$this->updateStock(); $updateResult = false;
//暂时设定重试5次
for ($i = 0; $i < 5; $i++) {
if ($this->updateStock()) {
$updateResult = true;
break;
}
}
if (!$updateResult) {
Log::error("sku 业务更新失败", (array)$this->businessGoodSku);
}
} }
private function updateStock() private function updateStock()
@ -45,18 +55,20 @@ class BusinessOrdersUpdate
if (is_null($this->goodsSku)) { if (is_null($this->goodsSku)) {
return false; return false;
} }
$oldStock = $this->goodsSku->stock;
$stock = $this->goodsSku->stock + $this->num; $stock = $this->goodsSku->stock + $this->num;
$saleStock = $this->goodsSku->sale_stock + $this->num; $saleStock = $this->goodsSku->sale_stock + $this->num;
$updateParam = ["stock" => $stock, "sale_stock" => $saleStock];
if (0 >= $saleStock) { if (0 >= $saleStock) {
$this->goodsSku->status = GoodsSku::$STATUS_DOWN; $updateParam['status'] = GoodsSku::$STATUS_DOWN;
} else { } else {
$this->goodsSku->status = GoodsSku::$STATUS_ON_SALE; $updateParam['status'] = GoodsSku::$STATUS_ON_SALE;
} }
$this->goodsSku->sale_stock = $saleStock; Log::info("sku 业务订单库存更新", $updateParam);
$this->goodsSku->stock = $stock; //乐观锁更新
Log::info("sku 业务订单库存更新", (array)$this->goodsSku); return GoodsSku::query()->where('external_sku_id', $this->businessGoodSku['external_sku_id'])->
$this->goodsSku->save(); where("stock", "=", $oldStock)->update($updateParam);
} }
/** /**

View File

@ -30,10 +30,10 @@ class DailyStockRecordController extends Controller
public function index(Request $request) public function index(Request $request)
{ {
$build = DailyStockRecord::query()->filter()->with("goodsSku:id,title"); $build = DailyStockRecord::query()->filter()->with("goodsSku:id,name");
if (!empty($request->title)) { if (!empty($request->title)) {
$build->whereHas('goodsSku', function ($query) use ($request) { $build->whereHas('goodsSku', function ($query) use ($request) {
$query->where('title', 'like', '%' . $request->title . '%'); $query->where('name', 'like', '%' . $request->title . '%');
}); });
} }
if (!empty($request->get('external_sku_id'))) { if (!empty($request->get('external_sku_id'))) {

View File

@ -25,13 +25,13 @@ class LossRecordController extends Controller
public function index(Request $request) public function index(Request $request)
{ {
$builder = LossRecords::query()->filter()->with("goodsSku:title,external_sku_id"); $builder = LossRecords::query()->filter()->with("goodsSku:name,external_sku_id");
if (!empty($request->start_time) && !empty($request->end_time)) { if (!empty($request->start_time) && !empty($request->end_time)) {
$builder->whereBetween('created_at', [$request->start_time, $request->end_time]); $builder->whereBetween('created_at', [$request->start_time, $request->end_time]);
} }
if (!empty($request->title)) { if (!empty($request->title)) {
$builder->whereHas('goodsSku', function ($query) use ($request) { $builder->whereHas('goodsSku', function ($query) use ($request) {
$query->where('title', 'like', '%' . $request->title . '%'); $query->where('name', 'like', '%' . $request->title . '%');
}); });
} }
$dailyStockRecord = $builder->paginate($request->get('per_page')); $dailyStockRecord = $builder->paginate($request->get('per_page'));
@ -114,7 +114,8 @@ class LossRecordController extends Controller
return response($this->res, $this->res['httpCode']); return response($this->res, $this->res['httpCode']);
} }
public function lossBatchStore(Request $request){ public function lossBatchStore(Request $request)
{
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'lossOrders' => 'required|array', 'lossOrders' => 'required|array',
'lossOrders.*.external_sku_id' => 'required|string', 'lossOrders.*.external_sku_id' => 'required|string',
@ -135,7 +136,7 @@ class LossRecordController extends Controller
$content .= "以上sku编码数据库中不存在"; $content .= "以上sku编码数据库中不存在";
return response($content, $this->res['httpCode']); return response($content, $this->res['httpCode']);
} }
$goodsSkuMap = $goodsSku->pluck(null,'external_sku_id')->toArray(); $goodsSkuMap = $goodsSku->pluck(null, 'external_sku_id')->toArray();
$updateIds = []; $updateIds = [];
//开始保存数据 //开始保存数据
foreach ($lossOrders as $v) { foreach ($lossOrders as $v) {
@ -150,7 +151,7 @@ class LossRecordController extends Controller
$lossRecords->reason = $v['reason'] ?? ''; $lossRecords->reason = $v['reason'] ?? '';
$lossRecords->save(); $lossRecords->save();
$updateIds = GoodSkuService::computeSkuStock($goodsSkuItem,['num'=>0-$v['num'],"cost"=>$v['cost']]); $updateIds = GoodSkuService::computeSkuStock($goodsSkuItem, ['num' => 0 - $v['num'], "cost" => $v['cost']]);
} }
@ -185,5 +186,4 @@ class LossRecordController extends Controller
return response($this->res, $this->res['httpCode']); return response($this->res, $this->res['httpCode']);
} }
} }

View File

@ -29,13 +29,13 @@ class PurchaseRecordController extends Controller
public function index(Request $request) public function index(Request $request)
{ {
$builder = PurchaseRecords::query()->filter()->with("goodsSku:id,title,external_sku_id"); $builder = PurchaseRecords::query()->filter()->with("goodsSku:id,name,external_sku_id");
if (!empty($request->start_time) && !empty($request->end_time)) { if (!empty($request->start_time) && !empty($request->end_time)) {
$builder->whereBetween('created_at', [$request->start_time, $request->end_time]); $builder->whereBetween('created_at', [$request->start_time, $request->end_time]);
} }
if (!empty($request->title)) { if (!empty($request->title)) {
$builder->whereHas('goodsSku', function ($query) use ($request) { $builder->whereHas('goodsSku', function ($query) use ($request) {
$query->where('title', 'like', '%' . $request->title . '%'); $query->where('name', 'like', '%' . $request->title . '%');
}); });
} }
$dailyStockRecord = $builder->paginate($request->get('per_page')); $dailyStockRecord = $builder->paginate($request->get('per_page'));

View File

@ -0,0 +1,24 @@
<?php
use App\Models\BusinessGoodsSku;
use App\Models\BusinessOrderItem;
use App\Models\GoodsSku;
use Illuminate\Support\Facades\Log;
use Tests\TestCase;
class BusinessOrderUpdateTest extends TestCase
{
use \Illuminate\Foundation\Testing\RefreshDatabase;
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
}
}