單個產品出庫扣減庫存
//單個產品出庫扣減庫存
public function reduceNumber()
{
$stockList = [];
for($i=1; $i<4; $i++){ //隨機生成庫存數據
$stockList[] = [
'id' => $i,
'number' => (int) ($i * 20 / 3), //庫存數據
'in_time' => 1734568 . rand(100, 999), //批次時間戳
'name' => '產品名', //產品名
//'product_code' => 'go31415926' //可以根據產品編碼確定是同一商品
];
}
$stockOutData = [
'number' => mt_rand(20, 60), //隨機出庫數量 [20, 60]
'name' => '產品名'
];
//排序庫存數據:根據時間升序,用於出庫,較早的商品先出庫
$times= array_column($stockList, 'in_time');
array_multisort($times, SORT_ASC, $stockList);
list($updateStock, $sockOutList) = $this->processStock($stockOutData, $stockList);
$this->myPrint($stockList, $stockOutData, $updateStock, $sockOutList);
die();
}
//扣減庫存
public function processStock($stockOutData, $stockList)
{
$updateStock = $sockOutList = [];
//判斷總庫存夠不夠
$number = $stockOutData['number']; //需要出庫的數量
$totalNumber = array_sum(array_column($stockList, 'number')); //總庫存數量
if($number > $totalNumber){
exit("庫存僅剩 [ {$totalNumber} ] 不足 [ {$number} ] ");
//return [$updateStock, $sockOutList];
}
//自動出庫:循環處理每個批次的number
foreach ($stockList as $value){
if($number <= 0){ //庫存扣減完成,結束循環
break;
}
$stockId = $value['id'];
$stockNumber = $value['number']; //單個批次的庫存
if($stockNumber <= $number){ //該批次庫存全部取出
$productNum = 0;
$outNumber = $stockNumber;
}else{ //該批次庫存部分取出
$productNum = $stockNumber-$number;
$outNumber = $number;
}
//扣減後的庫存數據
$updateStock[] = [
'id' => $stockId,
'number' => $productNum //還剩多少庫存
];
//出庫記錄
$sockOutList[] = [
'stock_id' => $stockId, //庫存ID
'name' => $value['name'], //產品名
'out_number' => $outNumber //出庫數量
];
$number -= $outNumber; //待出庫 = 待出庫 - 已出庫
}
return [$updateStock, $sockOutList];
}
//打印結果
public function myPrint($stockList, $stockOutData, $updateStock, $sockOutList)
{
echo '<pre>【庫存表數據】' . PHP_EOL;
print_r($stockList);
echo PHP_EOL . '【要出庫的數據】' . PHP_EOL;
print_r($stockOutData);
echo PHP_EOL . '【扣減後的庫存數據】' . PHP_EOL;
print_r($updateStock);
echo PHP_EOL . '【出庫記錄數據】' . PHP_EOL;
print_r($sockOutList);
echo '</pre>';
}