我有一个脚本返回仓库的ID(4,1,2,10,9),以便它们与客户的距离。
$warehouse_rank = array('0'=>4,'1'=>1, '2'=>2, '3'=>10, '4'=>9);
当我从数据库中查找产品时,我会返回哪些仓库有库存和数量的明细。像这样:
$product_breakdown = array(
'storage'=>array(
'10001'=>array(
'total_stock'=>89,
'breakdown'=>array(
'4'=>0,
'1'=>89,
'2'=>0,
'10'=>0,
'9'=>0
)
)
)
);
10001 is the product ID in this case.
我做了这个循环来确定哪个仓库有所需的数量,所以我可以订购它:
foreach ($warehouse_rank as $key => $warehouse_id){
if($product_breakdown['storage'][$product_id['output']]['breakdown'][$warehouse_id] >= $posted->order->quantity) {
}
}
但问题是,这只会检测仓库中所需数量是否完整可用。
当所要求的数量在多个仓库中展开时,我无法理解如何处理。
例如:
他们要求20件。
并且分布如下'4'=>5pc, '1'=>5pc, '2'=>1pc, '10'=>8pc, '9'=>10pc
。
因此,理想情况下,仓库将被分配如下:WID:4=5pc, WID:1=5pc, WID:9=10pc.
有两个因素,仓库有多近;但也可以用最少的仓库来完成分配。
任何想法,建议如何处理这个?
仓库的数量是动态的,可能有更多或更少的仓库。而且我想从最近的仓库中取出尽可能多的数量。这就是为什么我有$warehouse_rank
。
PS。我不是在寻求如何制作实际订单的帮助。只是每个仓库的数量分配。
更改数据库查询,以便添加生成的列。让它计算从每个仓库到客户的距离。在此总额中添加统一费率加权值,以补偿添加到供应链中的每个额外仓库。
将结果除以库存量,以获得每个仓库的每单位供应成本。从顶部订购此列选择的数据库查询,直到您有足够的订单库存。
所以你有一个这样的表:
CREATE TABLE IF NOT EXISTS `stock` (
`warehouse` char(11),
`stock` int(10),
`distance` int(10)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `stock` (`warehouse`, `stock`,
`distance`)
VALUES
('A', 4, 3),
('B', 6, 8),
('C', 10, 10);
你这样查询,其中stock + 15
中的15是你想要添加的加权值:
SELECT *, ((stock + 15) / distance) AS per_unit
FROM stock
ORDER BY stock DESC, per_unit ASC
试试这个。
它将首先检查是否有足够的数量。否则回声不够。 但你必须以某种方式处理这个问题。 然后它将使用密钥作为仓库进行循环,并且故障是该房屋中的数量。 减去可能的金额或订单剩余的金额,并按可变顺序存储订单。
$orderqt = 25;
if($orderqt <= $product_breakdown['storage']['10001']['total_stock']){
foreach($product_breakdown['storage']['10001']['breakdown'] as $key => &$breakdown){
if($orderqt>0){
$possibleWarehouses = array_filter(
$product_breakdown['storage']['10001']['breakdown'],
function ($value) use($orderqt) {
return ($value >= $orderqt);
}
);
if(count($possibleWarehouses) != 0){
$house = key($possibleWarehouses);
$order[$house] = $orderqt;
$product_breakdown['storage']['10001']['breakdown'][$house] -= $orderqt;
$orderqt = 0;
}elseif($orderqt >= $breakdown){
$orderqt -= $breakdown;
$order[$key] = $breakdown;
$breakdown = 0;
}else{
$order[$key] = $orderqt;
$orderqt = 0;
$breakdown -= $orderqt;
}
}else{
break;
}
}
}else{
echo "not enough";
}
var_dump($order,$product_breakdown);
添加了array_filter以查看是否有任何仓库的订单数量超过订单数量。 $ possibleWarehouses是一个数组,可以存放可以满足订购数量剩余数量的仓库。在这种情况下,它将为NULL,NULL,然后仓库9,数量为10。 https://3v4l.org/ZeUrt