From 57f784c448a293af6493d300252430c4222ca3b4 Mon Sep 17 00:00:00 2001 From: LHS-11 Date: Wed, 15 Nov 2023 21:59:54 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EC=A0=95=EC=B1=85=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=ED=81=B4=EB=A6=AD=EC=8B=9C=20=EB=82=98?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EC=A0=95=EC=B1=85=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/policy/api/PolicyController.java | 12 +-- .../policy/application/PolicyService.java | 80 +++++++++++++++++++ .../domain/policy/dao/PolicyRepository.java | 3 + .../domain/policy/domain/Policy.java | 32 +++++++- .../dto/RecommendPolicyInfoResponseDto.java | 44 +++++----- 5 files changed, 142 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/cmc/zenefitserver/domain/policy/api/PolicyController.java b/src/main/java/com/cmc/zenefitserver/domain/policy/api/PolicyController.java index 5d521dc..0c5939f 100644 --- a/src/main/java/com/cmc/zenefitserver/domain/policy/api/PolicyController.java +++ b/src/main/java/com/cmc/zenefitserver/domain/policy/api/PolicyController.java @@ -57,12 +57,12 @@ public CommonResponse> getPolicesBySearchDat return CommonResponse.success(result); } -// @GetMapping("/recommend") -// @Operation(summary = "지원 정책 유형에 따른 추천 정책 API",description = "로그인(회원가입)하고, 유저에게 정책을 추천할 때 사용합니다.") -// public CommonResponse recommend(@AuthUser User user){ -// RecommendPolicyInfoResponseDto result = policyService.recommendPolicy(user); -// return CommonResponse.success(result); -// } + @GetMapping("/recommend") + @Operation(summary = "지원 정책 유형에 따른 추천 정책 API",description = "로그인(회원가입)하고, 해당 유저에게 정책 카테고리를 클릭했을 때 정책 유형에 따른 정책을 추천합니다.") + public CommonResponse recommend(@AuthUser User user){ + RecommendPolicyInfoResponseDto result = policyService.getRecommendPolicyDummy(); + return CommonResponse.success(result); + } @GetMapping("/recommend/count") @Operation(summary = "지원할 수 있는 정책의 수 조회 API", description = "로그인시 해당 유저가 지원할 수 있는 정책의 수를 가져옵니다.") diff --git a/src/main/java/com/cmc/zenefitserver/domain/policy/application/PolicyService.java b/src/main/java/com/cmc/zenefitserver/domain/policy/application/PolicyService.java index 1adaf28..d51dfdd 100644 --- a/src/main/java/com/cmc/zenefitserver/domain/policy/application/PolicyService.java +++ b/src/main/java/com/cmc/zenefitserver/domain/policy/application/PolicyService.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -143,6 +144,31 @@ public List getPolicyListBySearchDate(User user, return result; } + public RecommendPolicyInfoResponseDto recommend(User user) { + + Map supportPolicyTypePolicyMap = policyRecommender.recommendPolicy(user); + + List recommendPolicyInfos = supportPolicyTypePolicyMap.keySet() + .stream() + .map(supportPolicyType -> { + Policy policy = supportPolicyTypePolicyMap.get(supportPolicyType); + RecommendPolicyInfoResponseDto.recommendPolicyInfo dto = RecommendPolicyInfoResponseDto.recommendPolicyInfo.builder() + .policyId(policy.getId()) + .policyName(policy.getPolicyName()) + .policyLogo(policy.getPolicyLogo()) + .policyAreaCode(policy.getAreaCode().getName()) + .policyCityCode(policy.getCityCode().getName()) + .policyIntroduction(policy.getPolicyIntroduction()) + .supportTypePolicyCnt(policyRepository.getPolicyCntBySupportPolicyType(supportPolicyType)) + .benefit(10000000) + .policyDateType(policy.getPolicyDateType().getDescription()) + .build(); + return dto; + }).collect(Collectors.toList()); + + return RecommendPolicyInfoResponseDto.builder().policyInfos(recommendPolicyInfos).build(); + } + public List recommendPolicy(User user) { Map supportPolicyTypePolicyMap = policyRecommender.recommendPolicy(user); @@ -168,5 +194,59 @@ public PolicyCountResponseDto getRecommendCountAndNickname(User user) { .policyCnt(policyRecommender.matchPolicy(user).size()) .build(); } + + public RecommendPolicyInfoResponseDto getRecommendPolicyDummy() { + Policy loansPolicy = policyRepository.findAllBySupportPolicyType(SupportPolicyType.LOANS).get(0); + Policy moneyPolicy = policyRepository.findAllBySupportPolicyType(SupportPolicyType.MONEY).get(0); + Policy socialServicePolicy = policyRepository.findAllBySupportPolicyType(SupportPolicyType.SOCIAL_SERVICE).get(0); + + List result = new ArrayList<>(); + result.add( + RecommendPolicyInfoResponseDto.recommendPolicyInfo.builder() + .supportTypeDescription(loansPolicy.getSupportPolicyType().getDescription()) + .supportType(loansPolicy.getSupportPolicyType()) + .policyId(loansPolicy.getId()) + .policyName(loansPolicy.getPolicyName()) + .policyLogo(loansPolicy.getPolicyLogo()) + .policyAreaCode(loansPolicy.getAreaCode().getName()) + .policyCityCode(loansPolicy.getCityCode().getName()) + .policyIntroduction(loansPolicy.getPolicyIntroduction()) + .supportTypePolicyCnt(policyRepository.getPolicyCntBySupportPolicyType(SupportPolicyType.LOANS)) + .benefit(10000000) + .policyDateType("기간 신청") + .build() + ); + result.add( + RecommendPolicyInfoResponseDto.recommendPolicyInfo.builder() + .supportType(moneyPolicy.getSupportPolicyType()) + .supportTypeDescription(moneyPolicy.getSupportPolicyType().getDescription()) + .policyId(moneyPolicy.getId()) + .policyName(moneyPolicy.getPolicyName()) + .policyLogo(moneyPolicy.getPolicyLogo()) + .policyAreaCode(moneyPolicy.getAreaCode().getName()) + .policyCityCode(moneyPolicy.getCityCode().getName()) + .policyIntroduction(moneyPolicy.getPolicyIntroduction()) + .supportTypePolicyCnt(policyRepository.getPolicyCntBySupportPolicyType(SupportPolicyType.MONEY)) + .benefit(10000000) + .policyDateType("상시") + .build() + ); + result.add( + RecommendPolicyInfoResponseDto.recommendPolicyInfo.builder() + .supportType(socialServicePolicy.getSupportPolicyType()) + .supportTypeDescription(socialServicePolicy.getSupportPolicyType().getDescription()) + .policyId(socialServicePolicy.getId()) + .policyName(socialServicePolicy.getPolicyName()) + .policyLogo(socialServicePolicy.getPolicyLogo()) + .policyAreaCode(socialServicePolicy.getAreaCode().getName()) + .policyCityCode(socialServicePolicy.getCityCode().getName()) + .policyIntroduction(socialServicePolicy.getPolicyIntroduction()) + .supportTypePolicyCnt(policyRepository.getPolicyCntBySupportPolicyType(SupportPolicyType.SOCIAL_SERVICE)) + .benefit(10000000) + .policyDateType("미정") + .build() + ); + return RecommendPolicyInfoResponseDto.builder().policyInfos(result).build(); + } } diff --git a/src/main/java/com/cmc/zenefitserver/domain/policy/dao/PolicyRepository.java b/src/main/java/com/cmc/zenefitserver/domain/policy/dao/PolicyRepository.java index a585e47..1c0eef0 100644 --- a/src/main/java/com/cmc/zenefitserver/domain/policy/dao/PolicyRepository.java +++ b/src/main/java/com/cmc/zenefitserver/domain/policy/dao/PolicyRepository.java @@ -49,4 +49,7 @@ public interface PolicyRepository extends JpaRepository { "AND :age between p.minAge and p.maxAge") List findByAreaCodeAndCityCodeAndAge(@Param("areaCode") AreaCode areaCode, @Param("central") AreaCode central, @Param("cityCode") CityCode cityCode, @Param("age") int age); + @Query("SELECT COUNT(p) FROM Policy p WHERE p.supportPolicyType = :supportPolicyType") + int getPolicyCntBySupportPolicyType(@Param("supportPolicyType") SupportPolicyType supportPolicyType); + } \ No newline at end of file diff --git a/src/main/java/com/cmc/zenefitserver/domain/policy/domain/Policy.java b/src/main/java/com/cmc/zenefitserver/domain/policy/domain/Policy.java index eb3bb61..57e29b4 100644 --- a/src/main/java/com/cmc/zenefitserver/domain/policy/domain/Policy.java +++ b/src/main/java/com/cmc/zenefitserver/domain/policy/domain/Policy.java @@ -10,7 +10,9 @@ import javax.persistence.*; import java.io.Serializable; import java.time.LocalDate; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; @ToString @@ -104,7 +106,6 @@ public class Policy implements Serializable { @Enumerated(EnumType.STRING) private Set supportPolicyTypes = new HashSet<>(); // 특화 분야 유형 - @Enumerated(EnumType.STRING) private PolicyCode policyCode; // 정책 유형 @@ -122,12 +123,19 @@ public class Policy implements Serializable { private LocalDate applyEndDate; // 신청 종료일 + private String remark; // 비고 + + @Enumerated(EnumType.STRING) + private PolicyDateType policyDateType; @OneToMany(mappedBy = "policy", fetch = FetchType.LAZY) private Set userPolicies = new HashSet<>(); private int benefit; // 수혜 금액 + @OneToMany(fetch = FetchType.LAZY) + private List applyPeriods = new ArrayList<>(); + public void updateAgeInfo(int minAge, int maxAge) { this.minAge = minAge; this.maxAge = maxAge; @@ -161,8 +169,25 @@ public void updateSupportType(SupportPolicyType supportPolicyType) { this.supportPolicyType = supportPolicyType; } + public void updateRemark(String remark) { + this.remark = remark; + } + + public void updateApplySttDateAndApplyEndDate(LocalDate applySttDate, LocalDate applyEndDate) { + this.applySttDate = applySttDate; + this.applyEndDate = applyEndDate; + } + + public void updateApplyPeriods(List applyPeriods) { + this.applyPeriods = applyPeriods; + } + + public void updateDateType(PolicyDateType policyDateType) { + this.policyDateType = policyDateType; + } + @Builder - public Policy(String bizId, String policyName, String policyIntroduction, String operatingAgencyName, String applicationPeriodContent, String organizationType, String supportContent, String ageInfo, String employmentStatusContent, String specializedFieldContent, String educationalRequirementContent, String residentialAndIncomeRequirementContent, String additionalClauseContent, String eligibilityTargetContent, String duplicatePolicyCode, String applicationSiteAddress, String referenceSiteUrlAddress, String applicationProcedureContent, String submissionDocumentContent, int minAge, int maxAge, AreaCode areaCode, CityCode cityCode, Set jobTypes, Set educationTypes, Set policySplzTypes, PolicyCode policyCode, SupportPolicyType supportPolicyType, String policyLogo, String policyApplyDenialReason, String applyStatus, LocalDate applySttDate, LocalDate applyEndDate, Set userPolicies, int benefit) { + public Policy(String bizId, String policyName, String policyIntroduction, String operatingAgencyName, String applicationPeriodContent, String organizationType, String supportContent, String ageInfo, String employmentStatusContent, String specializedFieldContent, String educationalRequirementContent, String residentialAndIncomeRequirementContent, String additionalClauseContent, String eligibilityTargetContent, String duplicatePolicyCode, String applicationSiteAddress, String referenceSiteUrlAddress, String applicationProcedureContent, String submissionDocumentContent, int minAge, int maxAge, AreaCode areaCode, CityCode cityCode, Set jobTypes, Set educationTypes, Set policySplzTypes, PolicyCode policyCode, SupportPolicyType supportPolicyType, String policyLogo, String policyApplyDenialReason, String applyStatus, LocalDate applySttDate, LocalDate applyEndDate, Set userPolicies, int benefit, String remark, List applyPeriods, PolicyDateType policyDateType) { this.bizId = bizId; this.policyName = policyName; this.policyIntroduction = policyIntroduction; @@ -195,6 +220,9 @@ public Policy(String bizId, String policyName, String policyIntroduction, String this.applyEndDate = applyEndDate; this.userPolicies = userPolicies; this.benefit = benefit; + this.remark = remark; + this.applyPeriods = applyPeriods; + this.policyDateType = policyDateType; } diff --git a/src/main/java/com/cmc/zenefitserver/domain/policy/dto/RecommendPolicyInfoResponseDto.java b/src/main/java/com/cmc/zenefitserver/domain/policy/dto/RecommendPolicyInfoResponseDto.java index cadf8b5..38ef32b 100644 --- a/src/main/java/com/cmc/zenefitserver/domain/policy/dto/RecommendPolicyInfoResponseDto.java +++ b/src/main/java/com/cmc/zenefitserver/domain/policy/dto/RecommendPolicyInfoResponseDto.java @@ -1,5 +1,7 @@ package com.cmc.zenefitserver.domain.policy.dto; +import com.cmc.zenefitserver.domain.policy.domain.enums.PolicyDateType; +import com.cmc.zenefitserver.domain.policy.domain.enums.SupportPolicyType; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Builder; @@ -15,15 +17,11 @@ @ApiModel(description = "추천 정책 정보 조회 API response") public class RecommendPolicyInfoResponseDto { - @ApiModelProperty(notes = "유저에 맞는 정책의 총 수",example = "56") - private int policyCnt; - @ApiModelProperty(notes = "추천 정책 정보") private List policyInfos; @Builder - public RecommendPolicyInfoResponseDto(int policyCnt, List policyInfos) { - this.policyCnt = policyCnt; + public RecommendPolicyInfoResponseDto(List policyInfos) { this.policyInfos = policyInfos; } @@ -31,48 +29,52 @@ public RecommendPolicyInfoResponseDto(int policyCnt, List p @NoArgsConstructor public static class recommendPolicyInfo { - @ApiModelProperty(notes = "정책 지원 유형",example = "현금, 대출, 사회서비스") - private String supportType; + @ApiModelProperty(notes = "정책 지원 유형", example = "MONEY, LOANS, SOCIAL_SERVICE") + private SupportPolicyType supportType; + + @ApiModelProperty(notes = "정책 지원 유형 이름", example = "현금, 대출, 사회서비스") + private String supportTypeDescription; - @ApiModelProperty(notes = "정책 ID",example = "24") + @ApiModelProperty(notes = "정책 ID", example = "24") private Long policyId; - @ApiModelProperty(notes = "정책 이름",example = "청년도약계좌") + @ApiModelProperty(notes = "정책 이름", example = "청년도약계좌") private String policyName; - @ApiModelProperty(notes = "정책 지역 로고",example = "24") + @ApiModelProperty(notes = "정책 지역 로고", example = "24") private String policyLogo; - @ApiModelProperty(notes = "정책 시/도 이름",example = "서울") + @ApiModelProperty(notes = "정책 시/도 이름", example = "서울") private String policyAreaCode; - @ApiModelProperty(notes = "정책 시/구 이름",example = "강서구") + @ApiModelProperty(notes = "정책 시/구 이름", example = "강서구") private String policyCityCode; - @ApiModelProperty(notes = "정책 소개",example = "월 70만원을 5년 납입하면 약 5,000만원을 적립할 수 있는 청년도약계좌") + @ApiModelProperty(notes = "정책 소개", example = "월 70만원을 5년 납입하면 약 5,000만원을 적립할 수 있는 청년도약계좌") private String policyIntroduction; - @ApiModelProperty(notes = "정책 신청 상태",example = "상시, 기간") - private String applyStatus; - - @ApiModelProperty(notes = "지원 정책 별 정책 수",example = "24") + @ApiModelProperty(notes = "지원 정책 별 정책 수", example = "24") private int supportTypePolicyCnt; - @ApiModelProperty(notes = "정책 수혜금액",example = "1560000") - private int benefit; + @ApiModelProperty(notes = "정책 수혜금액", example = "1560000") + private double benefit; + + @ApiModelProperty(notes = "정책 기간 타입", example = "1560000") + private String policyDateType; @Builder - public recommendPolicyInfo(String supportType, Long policyId, String policyName, String policyLogo, String policyAreaCode, String policyCityCode, String policyIntroduction, String applyStatus, int supportTypePolicyCnt, int benefit) { + public recommendPolicyInfo(SupportPolicyType supportType, String supportTypeDescription, Long policyId, String policyName, String policyLogo, String policyAreaCode, String policyCityCode, String policyIntroduction, int supportTypePolicyCnt, double benefit, String policyDateType) { this.supportType = supportType; + this.supportTypeDescription = supportTypeDescription; this.policyId = policyId; this.policyName = policyName; this.policyLogo = policyLogo; this.policyAreaCode = policyAreaCode; this.policyCityCode = policyCityCode; this.policyIntroduction = policyIntroduction; - this.applyStatus = applyStatus; this.supportTypePolicyCnt = supportTypePolicyCnt; this.benefit = benefit; + this.policyDateType = policyDateType; } public void upgradeCityCode(String name) {