что-то есть, но не правильно работает (возможно я слишком много придумал) сделал сумму в строке заказа, сделал добавление строк заказа в заказ, но это не правильно работает, по сути я создаю новою строку в самом заказе

This commit is contained in:
Алексей Крюков 2024-04-09 23:57:40 +04:00
parent 176d2bbbb4
commit 80fee84170
36 changed files with 196 additions and 89 deletions

Binary file not shown.

Binary file not shown.

View File

@ -19,6 +19,9 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
implementation 'org.modelmapper:modelmapper:3.2.0'
implementation 'javax.persistence:javax.persistence-api:2.2'
implementation 'javax.persistence:javax.persistence-api:2.2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

View File

@ -1,5 +1,7 @@
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.slf4j.Logger;
@ -8,6 +10,7 @@ import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.orders.service.OrderService;
import com.example.demo.products.model.ProductEntity;
@ -61,8 +64,11 @@ public class DemoApplication implements CommandLineRunner {
userService.create(new UserEntity(null, "Oleg", "Zyngin", "@mail.ru", "password"));
log.info("Create default orders values");
@SuppressWarnings({ "rawtypes", "unchecked" })
List<OrderLineEntity> lines = new ArrayList();
lines.add(new OrderLineEntity(null, null, 3, null));
final var user1 = userService.create(new UserEntity(null, "Alex", "Kryukov", "akryu@mail.ru", "password"));
orderService.create(new OrderEntity(null, user1, "31-03-2024"));
orderService.create(new OrderEntity(null, user1, lines));
}
}
}

View File

@ -15,8 +15,6 @@ import org.springframework.web.bind.annotation.RestController;
import com.example.demo.core.configuration.Constants;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.order_lines.service.OrderLineService;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.orders.service.OrderService;
import com.example.demo.products.model.ProductEntity;
import com.example.demo.products.service.ProductService;
@ -25,14 +23,12 @@ import jakarta.validation.Valid;
@RestController
@RequestMapping(Constants.API_URL + "/orderLine")
public class OrderLineController {
private final OrderService orderService;
private final OrderLineService orderLineService;
private final ProductService productService;
private final ModelMapper modelMapper;
public OrderLineController(OrderLineService orderLineService, OrderService orderService,
public OrderLineController(OrderLineService orderLineService,
ProductService productService, ModelMapper modelMapper) {
this.orderService = orderService;
this.orderLineService = orderLineService;
this.productService = productService;
this.modelMapper = modelMapper;
@ -44,15 +40,12 @@ public class OrderLineController {
private OrderLineEntity toEntity(OrderLineDto dto) {
// Получаем заказ и товар из соответствующих сервисов по их идентификаторам из
// OrderLineDto
OrderEntity order = orderService.get(dto.getOrderId());
ProductEntity product = productService.get(dto.getProductId());
// Создаем новый экземпляр OrderLineEntity с помощью модельного маппера
OrderLineEntity entity = modelMapper.map(dto, OrderLineEntity.class);
// Устанавливаем полученные заказ и товар в OrderLineEntity
entity.setOrder(order);
entity.setProduct(product);
return entity;
@ -70,7 +63,26 @@ public class OrderLineController {
@PostMapping
public OrderLineDto create(@RequestBody @Valid OrderLineDto dto) {
return toDto(orderLineService.create(toEntity(dto)));
// Получаем информацию о продукте по его ID
ProductEntity product = productService.get(dto.getProductId());
// Рассчитываем общую сумму строки заказа
double totalPrice = product.getPrice() * dto.getCount();
// Создаем новую сущность строки заказа
OrderLineEntity orderLineEntity = toEntity(dto);
// Устанавливаем общую сумму в сущность строки заказа
orderLineEntity.setTotalPrice(totalPrice);
// Создаем строку заказа
OrderLineEntity createdOrderLine = orderLineService.create(orderLineEntity);
// Преобразуем созданную строку заказа в DTO
OrderLineDto createdOrderLineDto = toDto(createdOrderLine);
// Возвращаем созданную строку заказа в виде DTO с заполненным полем totalPrice
return createdOrderLineDto;
}
@PutMapping("/{id}")

View File

@ -7,17 +7,24 @@ import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
public class OrderLineDto {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
@NotNull
@Min(1)
private Long orderId;
@NotNull
@Min(1)
private Long productId;
@NotBlank
private Integer count;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Double totalPriceLine;
public Double getTotalPriceLine() {
return totalPriceLine;
}
public void setTotalPriceLine(Double totalPriceLine) {
this.totalPriceLine = totalPriceLine;
}
public Long getId() {
return id;
}
@ -26,14 +33,6 @@ public class OrderLineDto {
this.id = id;
}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public Integer getCount() {
return count;
}

View File

@ -2,25 +2,33 @@ package com.example.demo.order_lines.model;
import java.util.Objects;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import com.example.demo.core.model.BaseEntity;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.products.model.ProductEntity;
import com.fasterxml.jackson.annotation.JsonBackReference;
public class OrderLineEntity extends BaseEntity {
private OrderEntity order;
private Integer count;
private ProductEntity product;
private Double totalPrice;
@ManyToOne
@JoinColumn(name = "order_id")
@JsonBackReference // Это свойство не управляется родительским объектом
private OrderEntity order;
public OrderLineEntity() {
}
public OrderLineEntity(Long id, OrderEntity order, ProductEntity product, Integer count) {
public OrderLineEntity(Long id, ProductEntity product, Integer count, Double totalPrice) {
super(id);
this.order = order;
this.count = count;
this.product = product;
this.count = count;
this.totalPrice = totalPrice;
}
public ProductEntity getProduct() {
@ -31,14 +39,6 @@ public class OrderLineEntity extends BaseEntity {
this.product = product;
}
public OrderEntity getOrder() {
return order;
}
public void setOrder(OrderEntity order) {
this.order = order;
}
public Integer getCount() {
return count;
}
@ -47,9 +47,17 @@ public class OrderLineEntity extends BaseEntity {
this.count = count;
}
public Double getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(Double totalPrice) {
this.totalPrice = totalPrice;
}
@Override
public int hashCode() {
return Objects.hash(id, order, product, count);
return Objects.hash(id, product, count);
}
@SuppressWarnings("unlikely-arg-order-product")
@ -61,7 +69,6 @@ public class OrderLineEntity extends BaseEntity {
return false;
final OrderLineEntity other = (OrderLineEntity) obj;
return Objects.equals(other.getId(), id)
&& Objects.equals(other.getOrder(), order)
&& Objects.equals(other.getProduct(), product)
&& Objects.equals(other.getCount(), count);
}

View File

@ -22,9 +22,7 @@ public class OrderLineService {
if (Objects.equals(orderLineId, 0L)) {
return repository.getAll();
}
return repository.getAll().stream()
.filter(orderLine -> orderLine.getOrder().getId().equals(orderLineId))
.toList();
return repository.getAll();
}
public OrderLineEntity get(Long id) {
@ -38,7 +36,6 @@ public class OrderLineService {
public OrderLineEntity update(Long id, OrderLineEntity entity) {
final OrderLineEntity existsEntity = get(id);
existsEntity.setOrder(entity.getOrder());
existsEntity.setProduct(entity.getProduct());
existsEntity.setCount(entity.getCount());
return repository.update(existsEntity);

View File

@ -1,7 +1,8 @@
package com.example.demo.orders.api;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.modelmapper.ModelMapper;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@ -13,10 +14,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.core.configuration.Constants;
import com.example.demo.order_lines.api.OrderLineDto;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.order_lines.service.OrderLineService;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.orders.service.OrderService;
import com.example.demo.users.service.UserService;
import jakarta.validation.Valid;
@RestController
@ -25,26 +28,54 @@ public class OrderController {
private final OrderService orderService;
private final UserService userService;
private final ModelMapper modelMapper;
private final OrderLineService orderLineService;
public OrderController(OrderService orderService, UserService userService, ModelMapper modelMapper) {
public OrderController(OrderService orderService, UserService userService, ModelMapper modelMapper,
OrderLineService orderLineService) {
this.orderService = orderService;
this.userService = userService;
this.modelMapper = modelMapper;
this.orderLineService = orderLineService;
}
private OrderDto toDto(OrderEntity entity) {
return modelMapper.map(entity, OrderDto.class);
var dto = new OrderDto();
dto.setId(entity.getId());
dto.setUserId(entity.getUser().getId());
// Преобразование каждой сущности OrderLineEntity в OrderLineDto и добавление их
// в список lines
for (OrderLineEntity orderLineEntity : entity.getLines()) {
OrderLineDto orderLineDto = new OrderLineDto();
orderLineDto.setId(orderLineEntity.getId());
orderLineDto.setProductId(orderLineEntity.getProduct().getId());
orderLineDto.setCount(orderLineEntity.getCount());
orderLineDto.setTotalPriceLine(orderLineEntity.getTotalPrice());
dto.addOrderLine(orderLineDto);
}
dto.setDate(new Date(System.currentTimeMillis()));
return dto;
}
private OrderEntity toEntity(OrderDto dto) {
public OrderEntity toEntity(OrderDto dto) {
final OrderEntity entity = modelMapper.map(dto, OrderEntity.class);
entity.setUser(userService.get(dto.getUserId()));
if (dto.getUserId() != null) {
entity.setUser(userService.get(dto.getUserId()));
}
// устанавливаем связь между заказом и строками заказа
entity.getLines().clear();
for (OrderLineDto lineDto : dto.getLines()) {
OrderLineEntity orderLineEntity = modelMapper.map(lineDto, OrderLineEntity.class);
entity.addOrderLine(orderLineEntity);
}
return entity;
}
@GetMapping
public List<OrderDto> getAll(@RequestParam(name = "userId", defaultValue = "0") Long userId) {
return orderService.getAll(userId).stream().map(this::toDto).toList();
public List<OrderDto> getAll(@RequestParam(name = "userId", defaultValue = "0") Long userId,
@RequestParam(name = "lines", defaultValue = "") List<Long> lines) {
return orderService.getAll(userId, lines).stream().map(this::toDto).toList();
}
@GetMapping("/{id}")
@ -54,7 +85,8 @@ public class OrderController {
@PostMapping
public OrderDto create(@RequestBody @Valid OrderDto dto) {
return toDto(orderService.create(toEntity(dto)));
OrderEntity orderEntity = toEntity(dto);
return toDto(orderService.create(orderEntity));
}
@PutMapping("/{id}")

View File

@ -1,20 +1,26 @@
package com.example.demo.orders.api;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import com.example.demo.order_lines.api.OrderLineDto;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
public class OrderDto {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
@NotNull
@Min(1)
private Long userId;
@NotBlank
private String date;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Date date = getDate();
@NotNull
private final List<OrderLineDto> lines = new ArrayList<>();
public Long getId() {
return id;
}
@ -31,11 +37,21 @@ public class OrderDto {
this.userId = userId;
}
public String getDate() {
return date;
}
public void setDate(String date) {
public void setDate(Date date) {
this.date = date;
}
public List<OrderLineDto> getLines() {
return lines;
}
// метод для добавленя строк заказа
public void addOrderLine(OrderLineDto orderLine) {
this.lines.add(orderLine);
}
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
public Date getDate() {
return date;
}
}

View File

@ -1,22 +1,28 @@
package com.example.demo.orders.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import com.example.demo.core.model.BaseEntity;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.users.model.UserEntity;
import com.fasterxml.jackson.annotation.JsonManagedReference;
public class OrderEntity extends BaseEntity {
private UserEntity user;
private String date;
@JsonManagedReference
private final List<OrderLineEntity> lines = new ArrayList<>();
public OrderEntity() {
// Пустой конструктор
super();
}
public OrderEntity(Long id, UserEntity user, String date) {
public OrderEntity(Long id, UserEntity user, List<OrderLineEntity> lines) {
super(id);
this.user = user;
this.date = date;
this.lines.clear();
this.lines.addAll(lines);
}
public UserEntity getUser() {
@ -27,17 +33,17 @@ public class OrderEntity extends BaseEntity {
this.user = user;
}
public String getDate() {
return date;
public List<OrderLineEntity> getLines() {
return lines;
}
public void setDate(String date) {
this.date = date;
public void setLines(OrderLineEntity line) {
this.lines.add(line);
}
@Override
public int hashCode() {
return Objects.hash(id, user, date);
return Objects.hash(id, user, lines);
}
@SuppressWarnings("unlikely-arg-user")
@ -50,6 +56,11 @@ public class OrderEntity extends BaseEntity {
final OrderEntity other = (OrderEntity) obj;
return Objects.equals(other.getId(), id)
&& Objects.equals(other.getUser(), user)
&& Objects.equals(other.getDate(), date);
&& Objects.equals(other.getLines(), lines);
}
// метод добавления строк заказа в заказ
public void addOrderLine(OrderLineEntity orderLine) {
this.lines.add(orderLine);
}
}

View File

@ -1,5 +1,6 @@
package com.example.demo.orders.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@ -7,24 +8,40 @@ import java.util.Optional;
import org.springframework.stereotype.Service;
import com.example.demo.core.error.NotFoundException;
import com.example.demo.order_lines.service.OrderLineService;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.orders.repository.OrderRepository;
@Service
public class OrderService {
private final OrderRepository repository;
private final OrderLineService orderLineService;
public OrderService(OrderRepository repository) {
public OrderService(OrderRepository repository, OrderLineService orderLineService) {
this.repository = repository;
this.orderLineService = orderLineService;
}
public List<OrderEntity> getAll(Long userId) {
if (Objects.equals(userId, 0L)) {
return repository.getAll();
public List<OrderEntity> getAll(Long userId, List<Long> lines) {
var linesEnt = new ArrayList<>();
for (var lineid : lines) {
linesEnt.add(orderLineService.get(lineid));
}
return repository.getAll().stream()
.filter(order -> order.getUser().getId().equals(userId))
.toList();
if (!Objects.equals(userId, 0L) && !Objects.equals(linesEnt.size(), 0)) {
return repository.getAll().stream()
.filter(line -> line.getUser().getId().equals(
userId) && line.getLines().containsAll(linesEnt))
.toList();
}
if (Objects.equals(userId, 0L) && !Objects.equals(linesEnt.size(), 0)) {
return repository.getAll().stream().filter(line -> line.getLines().containsAll(linesEnt)).toList();
}
if (!Objects.equals(userId, 0L) && Objects.equals(linesEnt.size(), 0)) {
return repository.getAll().stream().filter(line -> line.getUser().getId().equals(userId)).toList();
}
return repository.getAll();
}
public OrderEntity get(Long id) {
@ -37,10 +54,14 @@ public class OrderService {
}
public OrderEntity update(Long id, OrderEntity entity) {
final OrderEntity existsEntity = get(id);
existsEntity.setUser(entity.getUser());
existsEntity.setDate(entity.getDate());
return repository.update(existsEntity);
final OrderEntity existEntity = get(id);
existEntity.setUser(entity.getUser());
existEntity.getLines().clear(); // Очищаем существующие строки заказа
var lines = entity.getLines();
for (var line : lines) {
existEntity.setLines(line);
}
return repository.update(existEntity);
}
public OrderEntity delete(Long id) {

View File

@ -26,7 +26,7 @@ class OrderLineServiceTests {
@Order(1)
void createTest() {
// Создаем тестовую сущность OrderLineEntity
OrderLineEntity testOrderLine = new OrderLineEntity(null, null, null, 5);
OrderLineEntity testOrderLine = new OrderLineEntity(null, null, 5, null);
// Вызываем метод create() и сохраняем созданную сущность
OrderLineEntity createdOrderLine = orderLineService.create(testOrderLine);
// Проверяем, что метод create() вернул не null

View File

@ -1,5 +1,8 @@
package com.example.demo;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
@ -8,6 +11,7 @@ import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.example.demo.core.error.NotFoundException;
import com.example.demo.order_lines.model.OrderLineEntity;
import com.example.demo.orders.model.OrderEntity;
import com.example.demo.orders.service.OrderService;
@ -25,16 +29,21 @@ class OrderServiceTests {
@Test
@Order(1)
void createTest() {
orderService.create(new OrderEntity(null, null, null));
@SuppressWarnings({ "rawtypes", "unchecked" })
List<OrderLineEntity> lines = new ArrayList();
lines.add(new OrderLineEntity(null, null, 4, null));
lines.add(new OrderLineEntity(null, null, 5, null));
lines.add(new OrderLineEntity(null, null, 6, null));
lines.add(new OrderLineEntity(null, null, 7, null));
// Создаем тестовую сущность OrderEntity
OrderEntity testOrder = new OrderEntity(null, null, "2024-04-01");
OrderEntity testOrder = new OrderEntity(null, null, lines);
// Вызываем метод create() и сохраняем созданную сущность
OrderEntity createdOrder = orderService.create(testOrder);
// Проверяем, что метод create() вернул не null
Assertions.assertNotNull(createdOrder);
// Проверяем, что созданная сущность имеет назначенный ID
Assertions.assertNotNull(createdOrder.getId());
// Проверяем, что созданная сущность соответствует той, которую мы передали
Assertions.assertEquals(testOrder.getDate(), createdOrder.getDate());
}
@Test
@ -42,16 +51,10 @@ class OrderServiceTests {
void updateTest() {
// Получаем сущность OrderEntity для обновления
OrderEntity existingOrder = orderService.get(1L);
// Создаем новую дату для обновления
String newDate = "2024-04-02";
// Устанавливаем новую дату в сущность OrderEntity
existingOrder.setDate(newDate);
// Вызываем метод update() и сохраняем обновленную сущность
OrderEntity updatedOrder = orderService.update(1L, existingOrder);
// Проверяем, что метод update() вернул не null
Assertions.assertNotNull(updatedOrder);
// Проверяем, что обновленная сущность имеет ту же дату, что и заданная
Assertions.assertEquals(newDate, updatedOrder.getDate());
}
@Test