为了账号安全,请及时绑定邮箱和手机立即绑定

减少mysql中的库存项目

减少mysql中的库存项目

PHP
狐的传说 2022-10-28 15:40:54
美好的一天,我为 ERP 解决方案创建了一个脚本,该解决方案将项目保存在一个库存表中,同一个 SKU 以不同的数量和批次多次出现。当我销售商品时,我希望将库存数量视为具有相同 SKU 的所有商品的总和,例如:|item_id     |item_sku|   item_quantity|         lot||1           |10101001|   0            |    xyz     ||2           |10101002|   5            |    012     ||3           |10101001|   6            |    123     ||4           |10101001|   7            |    456     ||5           |10101001|   8            |    yf3     |如果我出售 14 件 10101001,我将如何编写不影响 item_id[1] 的代码(因为它的 item_quantity 小于 1),从 item_id[3] 和 item_id[4] 中获取所有数量并减少 item_id [5](14 = 6+7+1)在面向对象的方法中的数量场减 1?我考虑过使用 for each 循环,但我得到的只是减少所有行的数量字段 - 所以也许我没有以正确的方式编写它。另外,我考虑将 item_quantity 视为一个总和,因此按 SKU 分组,对 item_quantity 字段求和,然后从该总和中减去 sold_quantity,但是我将如何再次将数量分布在数据库行中?我真的被困在这里,从周一晚上开始,这个问题就让我发疯了。任何帮助将不胜感激。LE:这是我的代码:$toSell = $value['sales_quantity'];        $sum = StockDetail::where('sku', $product['sku'])->sum('stock_quantity');        $updatedStock = $sum - $toSell;//        StockDetail::where('sku', $product['sku'])->update(['stock_quantity' => $updatedStock]); // doesn't work for lots        foreach($salesProduct as $key => $value) {//// more code here which is irrelevant to the issue I'm facing//            foreach($stockNotNull as $stock => $product) {                if($toSell === 0) {                    return;                }                do {                    $product->stock_quantity->decrement();                    $toSell--;                    if ($product->stock_quantity === 0) {                        continue;                    }                } while($product->stock_quantity > 0 && $toSell > 0);            }        }
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

逻辑是:

  1. 开始交易。

  2. 获取给定的所有行,item_skuitem_quantity > 0升序排列item_quantity

  3. remaining_to_sell使用要出售的数量进行初始化

  4. 遍历行,减去min(remaining_to_sell, row.item_quantityitem_quantity保存行。减少该数量remaining_to_sell

  5. 继续迭代直到remaining_to_sell变为零。

  6. 如果在行尾remaining_to_sell不为零,则您没有足够的库存,因此回滚事务并引发错误。否则,提交

我将很快用实际代码编辑答案。我现在在手机上。


查看完整回答
反对 回复 2022-10-28
?
波斯汪

TA贡献1811条经验 获得超4个赞

foreach ($stockNotNull as $key => $value) {

            if ($toSell < 1) {

                return;

            }

            do {

                --$stockNotNull[$key]->stock_quantity;

                --$toSell;

                StockDetail::where('stock_id', $stockNotNull[$key]->stock_id)

                    ->update(['stock_quantity' => $stockNotNull[$key]->stock_quantity]);

            } while(($toSell != 0) && ($stockNotNull[$key]->stock_quantity != 0));

        }

看来我忘记了基本的算法和循环,因为上次我不得不在大学做这件事......


查看完整回答
反对 回复 2022-10-28
  • 2 回答
  • 0 关注
  • 196 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号