Skip to content

Commit 8eb34a2

Browse files
committed
refactor/화장품 추가 시 productscorepertype에서 궁합 정보 불러올 수 있도록 추가
1 parent 962621a commit 8eb34a2

5 files changed

Lines changed: 67 additions & 11 deletions

File tree

src/main/java/medilux/aquabe/domain/compatibility/entity/ProductScorePerTypeEntity.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,46 @@ public class ProductScorePerTypeEntity {
3636
@Column(nullable = false)
3737
private CompatibilityRatio compatibilityRatio; // 적합도 (Enum)
3838

39+
@Transient
40+
private Integer totalProductsInType; // 같은 typeName을 가진 제품 개수 (DB에 저장X)
41+
42+
3943
@Builder
4044
public ProductScorePerTypeEntity(String typeName, ProductEntity product,
41-
Integer compatibilityScore, Integer ranking, CompatibilityRatio compatibilityRatio) {
45+
Integer compatibilityScore, Integer ranking,
46+
Integer totalProductsInType) {
4247
this.typeName = typeName;
4348
this.product = product;
4449
this.compatibilityScore = compatibilityScore;
4550
this.ranking = ranking;
46-
this.compatibilityRatio = compatibilityRatio;
51+
this.totalProductsInType = totalProductsInType;
4752

4853
// ProductEntity에서 category_id 가져오기
4954
this.categoryId = (product != null && product.getCategory() != null)
5055
? product.getCategory().getCategoryId()
5156
: null;
57+
58+
this.compatibilityRatio = determineCompatibilityRatio();
59+
}
60+
61+
private CompatibilityRatio determineCompatibilityRatio() {
62+
if (totalProductsInType == null || totalProductsInType == 0) {
63+
return CompatibilityRatio.NORMAL; // 기본값
64+
}
65+
66+
double ratio = (double) ranking / totalProductsInType; // 랭킹 비율
67+
68+
if (ratio <= 0.1) {
69+
return CompatibilityRatio.VERY_SUITABLE; // 상위 10% 이내
70+
} else if (ratio <= 0.3) {
71+
return CompatibilityRatio.SUITABLE; // 상위 10% ~ 30%
72+
} else if (ratio <= 0.7) {
73+
return CompatibilityRatio.NORMAL; // 상위 30% ~ 70%
74+
} else if (ratio <= 0.9) {
75+
return CompatibilityRatio.UNSUITABLE; // 상위 70% ~ 90%
76+
} else {
77+
return CompatibilityRatio.VERY_UNSUITABLE; // 상위 90% ~ 100%
78+
}
5279
}
5380

5481
@Getter

src/main/java/medilux/aquabe/domain/compatibility/repository/ProductScorePerTypeRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22

33
import medilux.aquabe.domain.compatibility.entity.ProductScorePerTypeEntity;
44
import medilux.aquabe.domain.compatibility.entity.ProductScorePerTypeEntity.ProductScorePerTypeId;
5+
import medilux.aquabe.domain.product.entity.ProductEntity;
56
import org.springframework.data.jpa.repository.JpaRepository;
67
import org.springframework.stereotype.Repository;
78

9+
import java.util.Optional;
810
import java.util.UUID;
911

1012
@Repository
1113
public interface ProductScorePerTypeRepository extends JpaRepository<ProductScorePerTypeEntity, ProductScorePerTypeEntity.ProductScorePerTypeId> {
1214

1315
ProductScorePerTypeEntity findByTypeNameAndProduct_ProductId(String typeName, UUID productId);
16+
17+
Optional<ProductScorePerTypeEntity> findByProductAndTypeName(ProductEntity product, String typeName);
1418
}
1519

src/main/java/medilux/aquabe/domain/vanity/dto/AddProductRequest.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,4 @@
1111
@NoArgsConstructor
1212
public class AddProductRequest {
1313
private UUID productId;
14-
private Integer compatibilityScore;
15-
// private String skinType;
1614
}

src/main/java/medilux/aquabe/domain/vanity/entity/VanityProductsEntity.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import lombok.Getter;
77
import lombok.NoArgsConstructor;
88
import medilux.aquabe.domain.product.entity.ProductEntity;
9+
import medilux.aquabe.domain.compatibility.entity.CompatibilityRatio;
910

1011
import java.io.Serializable;
1112
import java.util.UUID;
@@ -26,14 +27,23 @@ public class VanityProductsEntity {
2627
@JoinColumn(name = "product_id", nullable = false)
2728
private ProductEntity product;
2829

30+
@Column(nullable = false)
31+
private Integer categoryId; // 카테고리 ID 추가
32+
2933
@Column(nullable = false)
3034
private Integer compatibilityScore;
3135

36+
@Enumerated(EnumType.STRING)
37+
@Column(nullable = false)
38+
private CompatibilityRatio compatibilityRatio; // ProductScorePerType에서 가져온 값 저장
39+
3240
@Builder
33-
public VanityProductsEntity(UUID userId, ProductEntity product, Integer compatibilityScore) {
41+
public VanityProductsEntity(UUID userId, ProductEntity product, Integer categoryId ,Integer compatibilityScore, CompatibilityRatio compatibilityRatio) {
3442
this.userId = userId;
3543
this.product = product;
44+
this.categoryId = categoryId;
3645
this.compatibilityScore = compatibilityScore;
46+
this.compatibilityRatio = compatibilityRatio;
3747
}
3848

3949
@Getter

src/main/java/medilux/aquabe/domain/vanity/service/VanityService.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import lombok.RequiredArgsConstructor;
44
import medilux.aquabe.common.error.exceptions.BadRequestException;
5+
import medilux.aquabe.domain.compatibility.entity.CompatibilityRatio;
6+
import medilux.aquabe.domain.compatibility.entity.ProductScorePerTypeEntity;
7+
import medilux.aquabe.domain.compatibility.repository.ProductScorePerTypeRepository;
58
import medilux.aquabe.domain.product.entity.ProductEntity;
69
import medilux.aquabe.domain.product.entity.ProductUsedFrequencyEntity;
710
import medilux.aquabe.domain.product.repository.ProductRepository;
@@ -36,6 +39,7 @@ public class VanityService {
3639
private final ProductRepository productRepository;
3740
private final UserRepository userRepository;
3841
private final ProductUsedFrequencyRepository productUsedFrequencyRepository;
42+
private final ProductScorePerTypeRepository productScorePerTypeRepository;
3943

4044
// 모든 화장대 제품 조회
4145
@Transactional(readOnly = true)
@@ -59,31 +63,43 @@ public List<VanityProductsEntity> getProductsByCategory(String loginEmail, Integ
5963
// 화장대에 제품 추가
6064
@Transactional
6165
public List<VanityProductsEntity> addProducts(String loginEmail, List<AddProductRequest> requests) {
62-
// SkinType 조회
63-
UUID userId = userRepository.findUserIdByEmail(loginEmail).orElseThrow(() -> new IllegalArgumentException());
66+
// User ID 조회
67+
UUID userId = userRepository.findUserIdByEmail(loginEmail)
68+
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 사용자입니다."));
69+
6470
String skinType = skinTypeService.getSkinType(loginEmail).getSkinType();
6571

6672
List<VanityProductsEntity> addedProducts = new ArrayList<>();
6773

68-
// 리스트에 모든 제품 저장
6974
for (AddProductRequest request : requests) {
7075
// 제품 존재 여부 확인
7176
ProductEntity product = productRepository.findById(request.getProductId())
7277
.orElseThrow(() -> new BadRequestException(ROW_DOES_NOT_EXIST, "존재하지 않는 제품입니다."));
7378

74-
// 화장대에 제품 추가
79+
// ✅ `ProductScorePerTypeEntity`에서 해당 product_id에 대한 정보 가져오기
80+
ProductScorePerTypeEntity productScore = productScorePerTypeRepository.findByProductAndTypeName(product, skinType)
81+
.orElseThrow(() -> new BadRequestException(ROW_DOES_NOT_EXIST, "해당 제품의 점수 데이터가 없습니다."));
82+
83+
Integer categoryId = productScore.getCategoryId(); // ✅ 카테고리 ID 가져오기
84+
Integer compatibilityScore = productScore.getCompatibilityScore(); // ✅ 제품 궁합 점수 가져오기
85+
CompatibilityRatio compatibilityRatio = productScore.getCompatibilityRatio(); // ✅ 적합도 가져오기
86+
87+
// ✅ 화장대에 제품 추가
7588
VanityProductsEntity vanityProduct = VanityProductsEntity.builder()
7689
.userId(userId)
7790
.product(product)
78-
.compatibilityScore(request.getCompatibilityScore())
91+
.categoryId(categoryId)
92+
.compatibilityScore(compatibilityScore) // 자동 설정된 점수 사용
93+
.compatibilityRatio(compatibilityRatio) // 자동 설정된 적합도 사용
7994
.build();
95+
8096
vanityProductsRepository.save(vanityProduct);
8197

8298
// 제품 화장대 저장 횟수 업데이트
8399
updateProductFrequency(request.getProductId(), skinType);
84100

85101
// 사용자 화장대 점수 업데이트
86-
updateVanityScore(userId, request.getCompatibilityScore());
102+
updateVanityScore(userId, compatibilityScore);
87103

88104
addedProducts.add(vanityProduct);
89105
}
@@ -92,6 +108,7 @@ public List<VanityProductsEntity> addProducts(String loginEmail, List<AddProduct
92108
}
93109

94110

111+
95112
// ProductUsedFrequency 테이블에 빈도 업데이트
96113
private void updateProductFrequency(UUID productId, String skinType) {
97114
Optional<ProductUsedFrequencyEntity> existingEntry = productUsedFrequencyRepository.findByProductIdAndTypeName(productId, skinType);

0 commit comments

Comments
 (0)