單個產品出庫扣減庫存

                                                                                    單個產品出庫扣減庫存

//單個產品出庫扣減庫存
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>';
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章