From 0fbecedef435d16400a436cb4efb6d4470662f86 Mon Sep 17 00:00:00 2001 From: shinmj Date: Fri, 29 Oct 2021 16:23:23 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=20fixed=20reservation=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/reserve/ReserveApiController.java | 2 +- .../domain/reserve/Reserve.java | 5 ++- .../domain/reserve/ReserveRepositoryImpl.java | 5 +++ .../service/reserve/ReserveService.java | 40 +++++++++++++------ .../api/ReserveApiControllerTest.java | 39 ++++++++++++++++++ .../api/ReserveApiController.java | 3 +- .../domain/ReserveRepositoryImpl.java | 1 + .../service/ReserveService.java | 18 ++++++++- .../api/ReserveApiControllerTest.java | 1 + .../src/components/Reserve/ReserveEdit.tsx | 40 ++++++++++++++----- 10 files changed, 126 insertions(+), 28 deletions(-) diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java index 0e3c9c4..2885120 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/api/reserve/ReserveApiController.java @@ -168,7 +168,7 @@ public class ReserveApiController { public Mono countInventory(@PathVariable Long reserveItemId, @RequestParam(name = "startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate, @RequestParam(name = "endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) { - return reserveService.countInventory(reserveItemId,startDate.atTime(1,1), endDate.atTime(1,1)); + return reserveService.countInventory(reserveItemId,startDate.atTime(0,0), endDate.atTime(23, 59)); } } diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java index 66076b4..c258e9a 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/Reserve.java @@ -197,7 +197,10 @@ public class Reserve extends BaseEntity { * @return */ public Reserve conversionReserveQty() { - this.reserveQty = (this.reserveQty * -1); + if (this.reserveQty != null) { + this.reserveQty = (this.reserveQty * -1); + } + return this; } } diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java index de835ad..21fc308 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/domain/reserve/ReserveRepositoryImpl.java @@ -2,7 +2,9 @@ package org.egovframe.cloud.reservechecksevice.domain.reserve; import static org.springframework.data.relational.core.query.Criteria.*; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.ArrayList; import java.util.List; @@ -174,6 +176,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{ .matching(Query.query(where("reserve_item_id").is(reserveItemId) .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .all(); } @@ -194,6 +197,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{ .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) .and("reserve_id").not(reserveId) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .all(); } @@ -214,6 +218,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom{ .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) .and("reserve_id").not(reserveId) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .count(); } diff --git a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java index 5f6a236..ee29be4 100644 --- a/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java +++ b/backend/reserve-check-service/src/main/java/org/egovframe/cloud/reservechecksevice/service/reserve/ReserveService.java @@ -1,5 +1,6 @@ package org.egovframe.cloud.reservechecksevice.service.reserve; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.ArrayList; @@ -534,17 +535,16 @@ public class ReserveService extends ReactiveAbstractService { if (!Category.EDUCATION.isEquals(reserve1.getCategoryId())) { return Mono.just(reserve1); } -// return reserveItemServiceClient.updateInventory(reserve.getReserveItemId(), reserve.getReserveQty()) -// .transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME))) -// .onErrorResume(throwable -> Mono.just(false)) -// .flatMap(isSuccess -> { -// if (isSuccess) { -// return Mono.just(reserve); -// } -// //재고 업데이트에 실패했습니다. -// return Mono.error(new BusinessMessageException(getMessage("msg.inventory_failed"))); -// }); - return null; + return reserveItemServiceClient.updateInventory(reserve.getReserveItemId(), reserve.getReserveQty()) + .transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME))) + .onErrorResume(throwable -> Mono.just(false)) + .flatMap(isSuccess -> { + if (isSuccess) { + return Mono.just(reserve); + } + //재고 업데이트에 실패했습니다. + return Mono.error(new BusinessMessageException(getMessage("msg.inventory_failed"))); + }); }); } @@ -561,6 +561,7 @@ public class ReserveService extends ReactiveAbstractService { .transform(CircuitBreakerOperator.of(circuitBreakerRegistry.circuitBreaker(RESERVE_ITEM_CIRCUIT_BREAKER_NAME))) .onErrorResume(throwable -> Mono.empty()) .zipWith(getMaxByReserveDate(reserveItemId, startDate, endDate)) + .log("countinventory") .flatMap(tuple -> Mono.just(tuple.getT1().getTotalQty() - tuple.getT2())); } @@ -607,20 +608,33 @@ public class ReserveService extends ReactiveAbstractService { } long between = ChronoUnit.DAYS.between(startDate, endDate); + + if (between == 0) { + return reserveFlux.map(reserve -> { + if (startDate.isAfter(reserve.getReserveStartDate()) + || startDate.isBefore(reserve.getReserveEndDate()) + || startDate.isEqual(reserve.getReserveStartDate()) || startDate.isEqual(reserve.getReserveEndDate())) { + return reserve.getReserveQty(); + } + return 0; + }).reduce(0, (x1, x2) -> x1 + x2); + } + return Flux.fromStream(IntStream.iterate(0, i -> i + 1) .limit(between) .mapToObj(i -> startDate.plusDays(i))) .flatMap(localDateTime -> reserveFlux.map(findReserve -> { if (localDateTime.isAfter(findReserve.getReserveStartDate()) - || localDateTime.isBefore(findReserve.getReserveEndDate())) { + || localDateTime.isBefore(findReserve.getReserveEndDate()) + || localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate())) { return findReserve.getReserveQty(); } return 0; }).reduce(0, (x1, x2) -> x1 + x2)) .groupBy(integer -> integer) .flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2)) - .last(); + .last(0); } } diff --git a/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java b/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java index 2b5471c..2282eb5 100644 --- a/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java +++ b/backend/reserve-check-service/src/test/java/org/egovframe/cloud/reservechecksevice/api/ReserveApiControllerTest.java @@ -34,6 +34,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.reactive.server.WebTestClient; @@ -58,6 +59,9 @@ public class ReserveApiControllerTest { @Autowired private WebTestClient webTestClient; + @Autowired + private R2dbcEntityTemplate entityTemplate; + private static final String API_URL = "/api/v1/reserves"; private UserResponseDto user; @@ -527,4 +531,39 @@ public class ReserveApiControllerTest { ; } + @Test + public void 물품재고조회_성공() throws Exception { + + BDDMockito.when(reserveItemServiceClient.findById(ArgumentMatchers.anyLong())) + .thenReturn(Mono.just(ReserveItemResponseDto.builder().reserveItem(reserveItem).build())); + + Reserve inventoryreserve = Reserve.builder() + .reserveId("1") + .reserveItemId(reserveItem.getReserveItemId()) + .reserveQty(50) + .reservePurposeContent("test") + .reserveStatusId("request") + .reserveStartDate(LocalDateTime.of(2021, 9, 9, 0, 0)) + .reserveEndDate(LocalDateTime.of(2021, 9, 9, 0, 0)) + .userId(user.getUserId()) + .userEmail("user@email.com") + .userContactNo("contact") + .build(); + inventoryreserve.setReserveItem(reserveItem); + inventoryreserve.setUser(user); + Reserve saved = reserveRepository.insert(inventoryreserve).block(); + assertNotNull(saved); + + Integer responseBody = webTestClient.get() + .uri("/api/v1/reserves/" + reserveItem.getReserveItemId() + + "/inventories?startDate=2021-09-09&endDate=2021-09-09") + .exchange() + .expectStatus().isOk() + .expectBody(Integer.class) + .returnResult().getResponseBody(); + + assertThat(responseBody).isEqualTo(50); + + } + } diff --git a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java index 7782e1f..7a0ffdc 100644 --- a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java +++ b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiController.java @@ -84,7 +84,8 @@ public class ReserveApiController { @PostMapping("/api/v1/requests") @ResponseStatus(HttpStatus.CREATED) public Mono save(@RequestBody Mono saveRequestDtoMono) { - return saveRequestDtoMono.flatMap(saveRequestDto -> { + return saveRequestDtoMono + .flatMap(saveRequestDto -> { if (Category.EDUCATION.isEquals(saveRequestDto.getCategoryId())) { return reserveService.saveForEvent(saveRequestDto); } diff --git a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java index 99b6a0f..0e919d2 100644 --- a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java +++ b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/domain/ReserveRepositoryImpl.java @@ -78,6 +78,7 @@ public class ReserveRepositoryImpl implements ReserveRepositoryCustom { .matching(Query.query(where("reserve_item_id").is(reserveItemId) .and ("reserve_start_date").lessThanOrEquals(endDate) .and("reserve_end_date").greaterThanOrEquals(startDate) + .and("reserve_status_id").not(ReserveStatus.CANCEL.getKey()) )) .count(); } diff --git a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java index e1cf582..76274f9 100644 --- a/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java +++ b/backend/reserve-request-service/src/main/java/org/egovframe/cloud/reserverequestservice/service/ReserveService.java @@ -278,20 +278,34 @@ public class ReserveService extends ReactiveAbstractService { } long between = ChronoUnit.DAYS.between(startDate, endDate); + + if (between == 0) { + return reserveFlux.map(reserve -> { + if (startDate.isAfter(reserve.getReserveStartDate()) + || startDate.isBefore(reserve.getReserveEndDate()) + || startDate.isEqual(reserve.getReserveStartDate()) || startDate.isEqual(reserve.getReserveEndDate())) { + return reserve.getReserveQty(); + } + return 0; + }).reduce(0, (x1, x2) -> x1 + x2); + } + return Flux.fromStream(IntStream.iterate(0, i -> i + 1) .limit(between) .mapToObj(i -> startDate.plusDays(i))) .flatMap(localDateTime -> reserveFlux.map(findReserve -> { if (localDateTime.isAfter(findReserve.getReserveStartDate()) - || localDateTime.isBefore(findReserve.getReserveEndDate())) { + || localDateTime.isBefore(findReserve.getReserveEndDate()) + || localDateTime.isEqual(findReserve.getReserveStartDate()) || localDateTime.isEqual(findReserve.getReserveEndDate()) + ) { return findReserve.getReserveQty(); } return 0; }).reduce(0, (x1, x2) -> x1 + x2)) .groupBy(integer -> integer) .flatMap(group -> group.reduce((x1,x2) -> x1 > x2?x1:x2)) - .last(); + .last(0); } /** diff --git a/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java b/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java index 935a53c..a7ae064 100644 --- a/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java +++ b/backend/reserve-request-service/src/test/java/org/egovframe/cloud/reserverequestservice/api/ReserveApiControllerTest.java @@ -3,6 +3,7 @@ package org.egovframe.cloud.reserverequestservice.api; import static org.assertj.core.api.Assertions.*; import java.time.LocalDateTime; +import java.time.ZoneId; import org.egovframe.cloud.common.domain.Role; import org.egovframe.cloud.reserverequestservice.api.dto.ReserveResponseDto; diff --git a/frontend/portal/src/components/Reserve/ReserveEdit.tsx b/frontend/portal/src/components/Reserve/ReserveEdit.tsx index c9dc544..def2b79 100644 --- a/frontend/portal/src/components/Reserve/ReserveEdit.tsx +++ b/frontend/portal/src/components/Reserve/ReserveEdit.tsx @@ -66,7 +66,9 @@ const ReserveEdit = (props: ReserveEditProps) => { reserveItem.inventoryQty || null, ) - const [reserve, setReserve] = useState(undefined) + const [reserve, setReserve] = useState< + { reserve: IReserve; category: string } | undefined + >(undefined) const [isEvent, setEvents] = useState(false) const methods = useForm() @@ -129,14 +131,20 @@ const ReserveEdit = (props: ReserveEditProps) => { const successCallback = useCallback(() => { setComplete({ done: true, - reserveId: reserve.reserveId, + reserveId: reserve.reserve.reserveId, }) setLoading(false) }, [reserve]) + useEffect(() => { + if (reserve && reserve.category !== 'education') { + successCallback() + } + }, [reserve]) + const errorCallback = useCallback( (errors: any, attachmentCode: string) => { - setErrorState({ errors }) + setErrorState(errors) setLoading(false) if (attachmentCode) { uploadRef.current.rollback(attachmentCode) @@ -152,7 +160,10 @@ const ReserveEdit = (props: ReserveEditProps) => { try { const result = await reserveService.createAudit(formData) if (result) { - successCallback() + setReserve({ + reserve: result.data, + category: formData.categoryId, + }) } else { errorCallback( { message: DEFAULT_ERROR_MESSAGE }, @@ -160,7 +171,7 @@ const ReserveEdit = (props: ReserveEditProps) => { ) } } catch (error) { - errorCallback(error, formData.attachmentCode) + errorCallback({ error }, formData.attachmentCode) } } @@ -171,11 +182,12 @@ const ReserveEdit = (props: ReserveEditProps) => { try { const result = await reserveService.create(formData) if (result) { - setReserve(result.data) + setReserve({ + reserve: result.data, + category: formData.categoryId, + }) if (formData.categoryId === 'education') { setEvents(true) - } else { - successCallback() } } else { errorCallback( @@ -184,7 +196,7 @@ const ReserveEdit = (props: ReserveEditProps) => { ) } } catch (error) { - errorCallback(error, formData.attachmentCode) + errorCallback({ error }, formData.attachmentCode) } } @@ -221,6 +233,14 @@ const ReserveEdit = (props: ReserveEditProps) => { draft.attachmentCode = attachmentCode draft.userId = user.userId draft.userEmail = user.email + draft.reserveStartDate = convertStringToDateFormat( + draft.reserveStartDate, + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + ) + draft.reserveEndDate = convertStringToDateFormat( + draft.reserveEndDate, + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", + ) }) if ( @@ -372,7 +392,7 @@ const ReserveEdit = (props: ReserveEditProps) => { {reserve && isEvent && (