diff --git a/src/main/java/com/example/api/account/repository/AccountRepository.java b/src/main/java/com/example/api/account/repository/AccountRepository.java index cef6eae2..4622727f 100644 --- a/src/main/java/com/example/api/account/repository/AccountRepository.java +++ b/src/main/java/com/example/api/account/repository/AccountRepository.java @@ -1,11 +1,13 @@ package com.example.api.account.repository; import com.example.api.domain.Account; +import com.example.api.offeremployment.dto.StarPointAndWorkCountRequest; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.repository.query.Param; +import org.springframework.security.core.parameters.P; import java.util.Optional; @@ -22,7 +24,15 @@ public interface AccountRepository extends JpaRepository { @Query("SELECT a.profileImage FROM Account a WHERE a.accountId = :accountId") Optional findProfileImageByAccountId(@Param("accountId") Long accountId); - @Query("update Account a set a.profileImage = :profileImage where a.accountId = :accountId") @Modifying + @Query("update Account a set a.profileImage = :profileImage where a.accountId = :accountId") void updateProfileImageByAccountId(@Param("profileImage") String profileImage, @Param("accountId") Long accountId); + + @Modifying + @Query("update Account a " + + "set a.starPoint = ((a.starPoint * a.workCount) + :newStarPoint) / (a.workCount+1), " + + "a.workCount = a.workCount + 1 " + + "where a.accountId in " + + "(select oe.employee.accountId From OfferEmployment oe where oe.suggestId = :suggestId)") + void updateWorkCountBySuggestId(@Param("suggestId") Long suggestId, @Param("starPoint") Integer newStarPoint); } \ No newline at end of file diff --git a/src/main/java/com/example/api/domain/OfferEmployment.java b/src/main/java/com/example/api/domain/OfferEmployment.java index b46b4c66..87197867 100644 --- a/src/main/java/com/example/api/domain/OfferEmployment.java +++ b/src/main/java/com/example/api/domain/OfferEmployment.java @@ -47,6 +47,9 @@ public class OfferEmployment { @Column(name = "SUGGEST_REGISTER_TIME") private LocalDateTime suggestRegisterTime; + @Column(name = "SUGGEST_FINISHED", columnDefinition = "boolean DEFAULT false") + private boolean suggestFinished; + public static OfferEmployment fromCommand(OfferEmploymentCommand offerEmploymentCommand, Account employee, Business business) { return new OfferEmployment( business, diff --git a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java index 89382a52..99b89712 100644 --- a/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java +++ b/src/main/java/com/example/api/domain/repository/OfferEmploymentRepository.java @@ -2,7 +2,9 @@ import com.example.api.board.dto.response.InnerCareerDTO; import com.example.api.domain.OfferEmployment; +import jakarta.validation.constraints.NotNull; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -28,4 +30,10 @@ public interface OfferEmploymentRepository extends JpaRepository findSuggestByOfferEmploymentId(@Param("OfferEmploymentId")long OfferEmploymentId); -} + + @Modifying + @Query("update OfferEmployment oe " + + "set oe.suggestFinished = true, oe.suggestEndTime = CURRENT_TIMESTAMP " + + "where oe.suggestFinished = :suggestId") + void updateSuggestStatusToFinishedBySuggestId(@Param("suggestId") Long suggestId); +} \ No newline at end of file diff --git a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java index 37f3853a..32dc5790 100644 --- a/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java +++ b/src/main/java/com/example/api/offeremployment/OfferEmploymentService.java @@ -6,9 +6,8 @@ import com.example.api.domain.Business; import com.example.api.domain.OfferEmployment; import com.example.api.domain.repository.OfferEmploymentRepository; -import com.example.api.offeremployment.dto.OfferEmploymentCommand; -import com.example.api.offeremployment.dto.OfferEmploymentRequest; -import com.example.api.offeremployment.dto.OfferEmploymentResponse; +import com.example.api.offeremployment.dto.*; +import com.example.api.review.ReviewRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,6 +18,7 @@ public class OfferEmploymentService { private final OfferEmploymentRepository offerEmploymentRepository; private final AccountRepository accountRepository; private final BusinessRepository businessRepository; + private final ReviewRepository reviewRepository; @Transactional public OfferEmploymentResponse sendOfferEmployment(final OfferEmploymentRequest offerEmploymentRequest) { @@ -35,4 +35,14 @@ public OfferEmploymentResponse sendOfferEmployment(final OfferEmploymentRequest final OfferEmployment savedOfferEmployment = offerEmploymentRepository.save(offerEmployment); return OfferEmploymentResponse.fromEntity(savedOfferEmployment); } + + @Transactional + public void completeOfferEmployment(OfferEmploymentCompleteRequest completeRequest) { + // offerEmployment를 종료로 변경, 종료 시간 업뎃 + offerEmploymentRepository.updateSuggestStatusToFinishedBySuggestId(completeRequest.suggestId()); + // 알바생 평점 조정 + Integer reviewScore = reviewRepository.findReviewStarPointBySuggestId(completeRequest.suggestId()); + // 알바 횟수 count + 1 + accountRepository.updateWorkCountBySuggestId(completeRequest.suggestId(), reviewScore); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java b/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java index 10789e30..b4923e1f 100644 --- a/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java +++ b/src/main/java/com/example/api/offeremployment/controller/OfferEmploymentController.java @@ -1,9 +1,12 @@ package com.example.api.offeremployment.controller; import com.example.api.offeremployment.OfferEmploymentService; +import com.example.api.offeremployment.dto.OfferEmploymentCompleteRequest; import com.example.api.offeremployment.dto.OfferEmploymentRequest; import com.example.api.offeremployment.dto.OfferEmploymentResponse; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,4 +26,12 @@ public ResponseEntity sendOfferEmployment( final OfferEmploymentResponse offerEmploymentResponse = offerEmploymentService.sendOfferEmployment(offerEmploymentRequest); return ResponseEntity.ok(offerEmploymentResponse); } + + @PostMapping + public ResponseEntity completeOfferEmployment( + @RequestBody final OfferEmploymentCompleteRequest completeRequest + ) { + offerEmploymentService.completeOfferEmployment(completeRequest); + return ResponseEntity.ok("성공적으로 종료되었습니다."); + } } \ No newline at end of file diff --git a/src/main/java/com/example/api/offeremployment/dto/OfferEmploymentCompleteRequest.java b/src/main/java/com/example/api/offeremployment/dto/OfferEmploymentCompleteRequest.java new file mode 100644 index 00000000..cd96ecd2 --- /dev/null +++ b/src/main/java/com/example/api/offeremployment/dto/OfferEmploymentCompleteRequest.java @@ -0,0 +1,9 @@ +package com.example.api.offeremployment.dto; + +import jakarta.validation.constraints.NotNull; + +public record OfferEmploymentCompleteRequest( + @NotNull Long suggestId, + @NotNull Long employeeId +) { +} \ No newline at end of file diff --git a/src/main/java/com/example/api/offeremployment/dto/StarPointAndWorkCountRequest.java b/src/main/java/com/example/api/offeremployment/dto/StarPointAndWorkCountRequest.java new file mode 100644 index 00000000..ef4a670a --- /dev/null +++ b/src/main/java/com/example/api/offeremployment/dto/StarPointAndWorkCountRequest.java @@ -0,0 +1,9 @@ +package com.example.api.offeremployment.dto; + +import jakarta.validation.constraints.NotNull; + +public record StarPointAndWorkCountRequest( + @NotNull float starPoint, + @NotNull int workCount +) { +} diff --git a/src/main/java/com/example/api/review/ReviewRepository.java b/src/main/java/com/example/api/review/ReviewRepository.java index 07776345..98a21b28 100644 --- a/src/main/java/com/example/api/review/ReviewRepository.java +++ b/src/main/java/com/example/api/review/ReviewRepository.java @@ -1,7 +1,9 @@ package com.example.api.review; import com.example.api.domain.Review; +import jakarta.validation.constraints.NotNull; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -28,6 +30,9 @@ public interface ReviewRepository extends JpaRepository { List findReviewsByAccountIdWithDetails(@Param("accountId") Long accountId); List findReviewsByEmployee_AccountId(Long accountId); + + @Query("select r.reviewStarPoint from Review r where r.reviewId = :suggestId") + Integer findReviewStarPointBySuggestId(@Param("suggestId") Long suggestId); }