单个产品出库扣减库存
//单个产品出库扣减库存
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>';
}