|
| 1 | +package carbonneutral.academy.api.service.ocr.OcrService; |
| 2 | + |
| 3 | +import carbonneutral.academy.api.controller.ocr.dto.response.PostOcrRes; |
| 4 | +import carbonneutral.academy.api.converter.time.TimeConverter; |
| 5 | +import carbonneutral.academy.api.converter.use.UseConverter; |
| 6 | +import carbonneutral.academy.api.service.use.UseService; |
| 7 | +import carbonneutral.academy.api.service.user.UserService; |
| 8 | +import carbonneutral.academy.common.exceptions.BaseException; |
| 9 | +import carbonneutral.academy.domain.location.Location; |
| 10 | +import carbonneutral.academy.domain.location.repository.LocationJpaRepository; |
| 11 | +import carbonneutral.academy.domain.point.Point; |
| 12 | +import carbonneutral.academy.domain.point.repository.PointJpaRepository; |
| 13 | +import carbonneutral.academy.domain.use.Use; |
| 14 | +import carbonneutral.academy.domain.use.enums.UseStatus; |
| 15 | +import carbonneutral.academy.domain.use.repository.UseJpaRepository; |
| 16 | +import carbonneutral.academy.domain.use_statistics.repository.UseStatisticsJpaRepository; |
| 17 | +import carbonneutral.academy.domain.user.User; |
| 18 | +import carbonneutral.academy.utils.clova.ClovaOCR; |
| 19 | +import carbonneutral.academy.utils.s3.S3Provider; |
| 20 | +import carbonneutral.academy.utils.s3.dto.S3UploadRequest; |
| 21 | +import lombok.RequiredArgsConstructor; |
| 22 | +import lombok.extern.slf4j.Slf4j; |
| 23 | +import org.springframework.stereotype.Service; |
| 24 | +import org.springframework.transaction.annotation.Transactional; |
| 25 | +import org.springframework.web.multipart.MultipartFile; |
| 26 | + |
| 27 | +import java.time.LocalDateTime; |
| 28 | + |
| 29 | +import static carbonneutral.academy.common.BaseEntity.State.ACTIVE; |
| 30 | +import static carbonneutral.academy.common.code.status.ErrorStatus.*; |
| 31 | + |
| 32 | +@Service |
| 33 | +@RequiredArgsConstructor |
| 34 | +@Slf4j |
| 35 | +@Transactional |
| 36 | +public class OcrServiceImpl implements OcrService { |
| 37 | + |
| 38 | + private final S3Provider s3Provider; |
| 39 | + private final ClovaOCR clovaOCR; |
| 40 | + private final UseJpaRepository useJpaRepository; |
| 41 | + private final LocationJpaRepository locationJpaRepository; |
| 42 | + private final UseStatisticsJpaRepository useStatisticsJpaRepository; |
| 43 | + private final PointJpaRepository pointJpaRepository; |
| 44 | + |
| 45 | + @Override |
| 46 | + public PostOcrRes ocrImage(User user, MultipartFile receipt) { |
| 47 | + String receiptUrl = s3Provider.multipartFileUpload(receipt, S3UploadRequest.builder().userId(user.getId()).dirName("receipt").build()); |
| 48 | + log.info("receiptUrl : {}", receiptUrl); |
| 49 | + String result = clovaOCR.OCRParse(receiptUrl); |
| 50 | + //결과에 컵 할인 없으면 예외 던지기 |
| 51 | + if (!result.contains("컵 할인")) { |
| 52 | + throw new BaseException(NOT_FIND_CUP_DISCOUNT); |
| 53 | + } |
| 54 | + Location location = locationJpaRepository.findByIdAndState(3, ACTIVE) |
| 55 | + .orElseThrow(() -> new BaseException(NOT_FIND_LOCATION)); |
| 56 | + Use use = Use.builder() |
| 57 | + .useAt(LocalDateTime.now()) |
| 58 | + .point(100) |
| 59 | + .returnTime(LocalDateTime.now()) |
| 60 | + .multiUseContainerId(5) |
| 61 | + .rentalLocation(location) |
| 62 | + .returnLocation(location) |
| 63 | + .status(UseStatus.RETURNED) |
| 64 | + .user(user) |
| 65 | + .build(); |
| 66 | + useJpaRepository.save(use); |
| 67 | + Point point = pointJpaRepository.findByUserId(user.getId()).orElseThrow(() -> new BaseException(NOT_FIND_POINT)); |
| 68 | + point.addPoint(100); |
| 69 | + useStatisticsJpaRepository.findById(user.getId()).orElseThrow(() -> new BaseException(NOT_FIND_USE_STATISTICS)).addTotalUseCount(); |
| 70 | + useStatisticsJpaRepository.findById(user.getId()).orElseThrow(() -> new BaseException(NOT_FIND_USE_STATISTICS)).addTotalReturnCount(); |
| 71 | + return PostOcrRes.builder() |
| 72 | + .useTime(TimeConverter.toFormattedDate(use.getUseAt())) |
| 73 | + .currentPoint(point.getAccumulatedPoint() - point.getUtilizedPoint()) |
| 74 | + .acquiredPoint(use.getPoint()) |
| 75 | + .useLocationId(location.getId()) |
| 76 | + .useLocationName(location.getName()) |
| 77 | + .useLocationAddress(location.getAddress()) |
| 78 | + .useLocationImageUrl(location.getImageUrl()) |
| 79 | + .userId(user.getId()) |
| 80 | + .build(); |
| 81 | + } |
| 82 | + |
| 83 | + |
| 84 | + |
| 85 | +} |
0 commit comments