基于PHP的多仓库不均匀产品分配算法

问题描述 投票:-1回答:2

我有一个脚本返回仓库的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。我不是在寻求如何制作实际订单的帮助。只是每个仓库的数量分配。

php
2个回答
2
投票

更改数据库查询,以便添加生成的列。让它计算从每个仓库到客户的距离。在此总额中添加统一费率加权值,以补偿添加到供应链中的每个额外仓库。

将结果除以库存量,以获得每个仓库的每单位供应成本。从顶部订购此列选择的数据库查询,直到您有足够的订单库存。

所以你有一个这样的表:

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

继承人demo sqlfiddle


1
投票

试试这个。

它将首先检查是否有足够的数量。否则回声不够。 但你必须以某种方式处理这个问题。 然后它将使用密钥作为仓库进行循环,并且故障是该房屋中的数量。 减去可能的金额或订单剩余的金额,并按可变顺序存储订单。

$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

© www.soinside.com 2019 - 2024. All rights reserved.