Здравствуйте. У меня есть панель редактирования продуктов заказа. Функционал кнопки "Сохранить" в данный момент отключен. Реализовал два варианта изменения продуктов заказа. Первый вариант. При нажатии на "+", "-" или добавить товар отправляется запрос на сервер в формате json. Например: Код (Text): POST http://localhost:8080/api/manager/order/product/amount/edit { "amount" : "12", "product_id" : "3", "order_id" : "4" } Т.е. любое нажатие на клавишу сразу изменяет значение в БД. Есть другой вариант. На фронте стоит angular. Значение всех товаров заказа, которые на скрине, хранятся в js массиве, который по структуре совпадает со структурой Entity из базы данных. При изменении, например, количества товара мы изменяем кол-во в js массиве. Затем, по нажатию кнопки "Cохранить" передаем массив на сервер. Код (Text): POST http://localhost:8080/api/manager/order/3/products/edit [ { product: { id: number, title: string, price: number }, amount: number }, следующий продукт ] На сервере находим в БД товары заказа, это будет массив продуктов, затем сравниваем этот массив с тем, который пришел с фронтенда (куча for блоков) и исходя из ситуации делаем update или insert продукта в БД. Какой вариант лучше? Как бы сделали вы?
Например: 0. Ордер у всех общий - отбрасываем. Значит входящие данные можно привести к массиву пар Продукт-Колво. 1. Запрашиваем у субд Продукт,Колво по фильтру Продукт,Заказ. 2. Итерирует результирующую таблицу. 2.1. Если встретили Продукт - сравниваем Колво со входящими данными. 2.1.1. Если изменилось - обновляем. 2.2. Всегда удаляем Продукт из входящих данных. 3. Для всех оставшихся входящих данных делаем вставку Продукт,Заказ,Колво.
Если кому-то вдруг интересно решение. Полный код класса Код (Javascript): @RequestMapping(value = "/order/{orderId}/products/edit", method = RequestMethod.POST) public ResponseEntity<Boolean> updateOrderProducts( @PathVariable("orderId") Integer orderId, @RequestBody List<OrderProductReq> productsReq) { Order order = orderService.findById(orderId); List<OrderProduct> productsDB = order.getProducts(); for (OrderProduct productDB : productsDB) { OrderProductReq productReq = productsReq.stream() .filter(product -> product.getProductId() == productDB.getProduct().getId()) .findFirst().orElse(null); if (productReq == null) { this.deleteProduct(productDB, orderId); } if (productReq != null && productReq.getAmount() != productDB.getAmount()) { this.updateProductAmount(productReq, orderId); } if (productReq != null) { productsReq.remove(productReq); } } if (!productsReq.isEmpty()) { for (OrderProductReq productReq: productsReq) { this.addProduct(productReq, orderId); } } return ResponseEntity.ok(true); } public Integer updateProductAmount(OrderProductReq productReq, int orderId) { int orderProductId = orderProductService.updateProductAmountByOrderId( productReq.getAmount(), orderId, productReq.getProductId() ); this.updateTotal(orderId); return orderProductId; } public ResponseEntity<Integer> addProduct(OrderProductReq productReq, int orderId) { Product product = productService.findById(productReq.getProductId()); Order order = orderService.findById(orderId); OrderProduct orderProduct = new OrderProduct(order, product, productReq.getAmount()); OrderProduct newRcd = orderProductService.save(orderProduct); this.updateTotal(orderId); return ResponseEntity.ok(newRcd.getId()); } public void deleteProduct(OrderProduct productDB, int orderId) { orderProductService.deleteByOrderIdAndProductId( orderId, productDB.getProduct().getId() ); this.updateTotal(orderId); } Модель OrderProductReq. Модель OrderProduct.