За последние 24 часа нас посетили 19808 программистов и 1393 робота. Сейчас ищут 1035 программистов ...

Редактирование продуктов заказа. Какой из вариантов?

Тема в разделе "PHP для новичков", создана пользователем виталий032, 6 сен 2018.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Здравствуйте.

    У меня есть панель редактирования продуктов заказа.
    [​IMG]
    Функционал кнопки "Сохранить" в данный момент отключен.

    Реализовал два варианта изменения продуктов заказа.

    Первый вариант.
    При нажатии на "+", "-" или добавить товар отправляется запрос на сервер в формате json. Например:
    Код (Text):
    1. POST http://localhost:8080/api/manager/order/product/amount/edit
    2. {
    3.   "amount" : "12",
    4.   "product_id" : "3",
    5.   "order_id" : "4"
    6. }
    Т.е. любое нажатие на клавишу сразу изменяет значение в БД.

    Есть другой вариант.
    На фронте стоит angular. Значение всех товаров заказа, которые на скрине, хранятся в js массиве, который по структуре совпадает со структурой Entity из базы данных.
    При изменении, например, количества товара мы изменяем кол-во в js массиве. Затем, по нажатию кнопки "Cохранить" передаем массив на сервер.
    Код (Text):
    1. POST http://localhost:8080/api/manager/order/3/products/edit
    2. [
    3. {
    4.   product: {
    5.      id: number,
    6.      title: string,
    7.      price: number
    8.   },
    9. amount: number
    10. },
    11. следующий продукт
    12. ]
    На сервере находим в БД товары заказа, это будет массив продуктов, затем сравниваем этот массив с тем, который пришел с фронтенда (куча for блоков) и исходя из ситуации делаем update или insert продукта в БД.


    Какой вариант лучше? Как бы сделали вы?
     
    #1 виталий032, 6 сен 2018
    Последнее редактирование: 6 сен 2018
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Например:

    0. Ордер у всех общий - отбрасываем. Значит входящие данные можно привести к массиву пар Продукт-Колво.
    1. Запрашиваем у субд Продукт,Колво по фильтру Продукт,Заказ.
    2. Итерирует результирующую таблицу.
    2.1. Если встретили Продукт - сравниваем Колво со входящими данными.
    2.1.1. Если изменилось - обновляем.
    2.2. Всегда удаляем Продукт из входящих данных.
    3. Для всех оставшихся входящих данных делаем вставку Продукт,Заказ,Колво.
     
    виталий032 нравится это.
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Я понял ход ваших мыслей, спасибо. Так, пожалуй, и сделаю.
     
  4. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Если кому-то вдруг интересно решение.
    Полный код класса
    Код (Javascript):
    1. @RequestMapping(value = "/order/{orderId}/products/edit", method = RequestMethod.POST)
    2.     public ResponseEntity<Boolean> updateOrderProducts(
    3.             @PathVariable("orderId") Integer orderId,
    4.             @RequestBody List<OrderProductReq> productsReq) {
    5.      
    6.         Order order = orderService.findById(orderId);
    7.      
    8.         List<OrderProduct> productsDB = order.getProducts();
    9.         for (OrderProduct productDB : productsDB) {
    10.             OrderProductReq productReq = productsReq.stream()
    11.                 .filter(product -> product.getProductId() == productDB.getProduct().getId())
    12.                 .findFirst().orElse(null);
    13.          
    14.             if (productReq == null) {
    15.                 this.deleteProduct(productDB, orderId);
    16.             }
    17.          
    18.             if (productReq != null && productReq.getAmount() != productDB.getAmount()) {
    19.                 this.updateProductAmount(productReq, orderId);
    20.             }
    21.          
    22.             if (productReq != null) {
    23.                 productsReq.remove(productReq);
    24.             }
    25.         }
    26.      
    27.         if (!productsReq.isEmpty()) {
    28.             for (OrderProductReq productReq: productsReq) {
    29.                 this.addProduct(productReq, orderId);
    30.             }
    31.         }
    32.         return ResponseEntity.ok(true);
    33.     }
    34.  
    35.     public Integer updateProductAmount(OrderProductReq productReq, int orderId) {
    36.         int orderProductId = orderProductService.updateProductAmountByOrderId(
    37.                 productReq.getAmount(),
    38.                 orderId,
    39.                 productReq.getProductId()
    40.         );
    41.         this.updateTotal(orderId);
    42.         return orderProductId;
    43.     }
    44.  
    45.     public ResponseEntity<Integer> addProduct(OrderProductReq productReq, int orderId) {
    46.         Product product = productService.findById(productReq.getProductId());
    47.         Order order = orderService.findById(orderId);
    48.         OrderProduct orderProduct = new OrderProduct(order, product, productReq.getAmount());
    49.         OrderProduct newRcd = orderProductService.save(orderProduct);
    50.         this.updateTotal(orderId);
    51.         return ResponseEntity.ok(newRcd.getId());
    52.     }
    53.  
    54.     public void deleteProduct(OrderProduct productDB, int orderId) {
    55.         orderProductService.deleteByOrderIdAndProductId(
    56.                 orderId,
    57.                 productDB.getProduct().getId()
    58.         );
    59.         this.updateTotal(orderId);
    60.     }
    Модель OrderProductReq. Модель OrderProduct.