Как создать поиск, который использует штрих-код - PullRequest
0 голосов
/ 28 марта 2019

Я создаю поисковую систему для торговой точки, которая использует штрих-коды для поиска товаров. Когда пользователь сканирует штрих-код, продукт с соответствующим штрих-кодом добавляется в корзину. Я передаю штрих-код в контроллер с помощью Ajax. Проблема в том, что полученный запрос выполняется дважды, удваивая объем заказа, когда товар добавляется в корзину. Я не знаю, почему это происходит.

Панель просмотра / поиска

<div class="frmSearch">
    <input type="text" id="search" name="search" class="form-control" placeholder="Type Product Name..."
           onmouseover="this.focus();"/>
</div>

<script type="text/javascript">
    $('#search').on('keyup', function () {
        $value = $(this).val();
        $.ajax({
            type: 'get',
            url: '{{URL::to('search')}}',
            data: {'search': $value},
            success: function (data) {
                window.location.href = "/addsale/" + data;
            }
        });
    });
</script>

Контроллер

public function search(Request $request)
{
    if ($request->ajax()) {
        $raws = DB::table('items_masters')->where('bcode', '=', $request->search)->first();

        if ($raws) {
            $output = $product->id;
        }

        return Response($output);
    }
}

Способ добавления товара в корзину

public function add($id)
{
    $userid = Auth::user()->id;
    $shop = Auth::user()->shop_id;
    $product_id = $id;

    $tdo = item_quantity::getQuery('item_quantities')->where([
        ['shop_id', '=', $shop],
        ['item_id', '=', $product_id]
    ])->get();
    foreach ($tdo as $key => $tad) {
        $product_quantity = $tad->quantity;
    }

    if (empty($product_quantity)) {
        session()->flash('message', 'Item Not In Your Shop');
        return redirect('/sales_area');
    } elseif ($product_quantity <= 0) {
        session()->flash('message', 'Item Out Of Stock');
        return redirect('/sales_area');
    } else {
        $todo = tblcart::getQuery('tblcarts')->where([
            ['product_id', '=', $id], ['shop_id', '=', $shop],
            ['member_id', '=', $uid]
        ])->get();
        foreach ($todo as $key => $tada) {
            $cart_id = $tada->id;
        }
        if (empty($cart_id)) {
            $tem = new tblcart;
            $tem->product_id = $product_id;
            $tem->quantity = 1;
            $tem->shop_id = $shop;
            $tem->member_id = $userid;
            $tem->save();
            return redirect('/sales_area');
        } else {
            $tem = tblcart::find($cid);
            $tem->quantity = $tem->quantity + 1;
            $tem->save();
            return redirect('/sales_area');
        }
    }
}

В настоящее время, когда пользователь добавляет товар в корзину, объем заказа удваивается, поэтому вместо одного он получает два. Если пользователь снова добавляет тот же продукт, он получает четыре вместо двух. Как я могу разобраться в этом?

1 Ответ

0 голосов
/ 28 марта 2019

Похоже, что проблема синхронизации, в зависимости от , если , метод add вызывается непосредственно из поиска. С keyup вы рискуете вызвать функцию поиска, по крайней мере, один раз, и, возможно, более одного раза, основываясь на том, что пользователь все еще печатает нужный продукт, даже после того, как исходный запрос ajax был отправлен на основе предыдущего символа, набранного в панель поиска.

Рекомендуется добавить задержку для функции keyup или в вашем поисковом коде. Скажите что-то вроде (псевдокод) в контроллере

if($timeOfLastTransaction < 30 seconds && $productId == $previousProductId)
 // cancel this duplicate
else
  set $timeOfLastTransaction 
  set $previousProductId

Я до сих пор не уверен, что вызывает метод add(), и это было бы хорошим началом для поиска ошибок при удвоении ошибки.

Но, глядя на этот код в методе add(), есть ряд вещей, которые вы можете слегка очистить - и могут решить вашу проблему. Предложите назвать переменную $id $product_id непосредственно в параметрах метода, а не переименовывать ее в верхней части - вы используете два разных аргумента для одной и той же вещи в нескольких местах, и это немного сбивает с толку.

Немного большая проблема заключается в том, что вы потенциально можете переназначить одну и ту же переменную в нескольких местах после извлечения коллекции из базы данных:

$tdo = item_quantity::getQuery('item_quantities')->where( [['shop_id', '=', $shop],
['item_id', '=', $product_id]])->get();
foreach ($tdo as $key => $tad) {
    $product_quantity=$tad->quantity;
}

Эта строка и следующая БД, расположенная под ней, циклически перебирают коллекцию и повторно назначают / перезаписывают $product_quantity в этом случае и $cart_id в следующем. Почему бы не использовать ->first() и пропустить цикл? Я думаю, что это может уменьшить любые непредвиденные ошибки, а также

...