单个产品出库扣减库存

                                                                                    单个产品出库扣减库存

//单个产品出库扣减库存
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>';
}
发布了223 篇原创文章 · 获赞 36 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_36025814/article/details/104864409
今日推荐