Уменьшение на складе в mysql - PullRequest
0 голосов
/ 12 марта 2020

Добрый день, я создал скрипт для решения 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, как бы я go о написании кода, который оставит item_id [1] нетронутым (поскольку его item_quantity равен <1), возьмет все количество из item_id [3] и из item_id [4] и уменьшит поле количества item_id [5] на 1 <code>(14 = 6+7+1) в объектно-ориентированном подходе? Я думал об использовании для каждого l oop, но все, что я получил, это уменьшил поле количества по всем строкам - так что, возможно, я не пишу это правильно. Кроме того, я подумал о том, чтобы рассматривать item_quantity как сумму, поэтому группировать по SKU, суммировать поле item_quantity, а затем вычитать sold_quantity из этой суммы, но тогда как бы мне go снова распределить количества в строках базы данных? Я действительно застрял здесь, и этот вопрос сводит меня с ума с вечера понедельника. Любая помощь будет оценена. 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 ]

0 голосов
/ 14 марта 2020
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));
        }

Кажется, я забыл базовые c алгоритмы и циклы с тех пор, как в прошлый раз мне пришлось делать это еще в колледже ...

0 голосов
/ 13 марта 2020

Лог c:

  1. Начать транзакцию.
  2. Получить все строки для данного item_sku, где item_quantity > 0 упорядочено по item_quantity по возрастанию.
  3. Инициализируйте remaining_to_sell количеством для продажи
  4. Перебирайте строки, вычитая min(remaining_to_sell, row.item_quantity из item_quantity и сохраняя строку. Уменьшите это количество с remaining_to_sell
  5. Продолжайте итерацию до тех пор, пока remaining_to_sell не станет равным нулю.
  6. Если в конце строк remaining_to_sell не равен нулю, у вас недостаточно запасов, поэтому откат сделку и выкинь ошибку. В противном случае, передайте его

Я скоро отредактирую ответ с фактическим кодом. Я сейчас на мобильном телефоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...