From e4eaf275d0b02f67f9bfc43a48fcfdc95fb9a636 Mon Sep 17 00:00:00 2001 From: EunjinWoo Date: Sun, 21 Dec 2025 13:24:50 +0900 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20=EA=B3=B5=ED=86=B5=20=ED=8F=89?= =?UTF-8?q?=EA=B0=80=20=EA=B8=B0=EC=A4=80(organizationRole=EC=9D=B4=20null?= =?UTF-8?q?)=20+=20=ED=95=B4=EB=8B=B9=20=EC=A7=80=EC=9B=90=EC=84=9C?= =?UTF-8?q?=EC=9D=98=20organizationRole=EA=B3=BC=20=EC=9D=BC=EC=B9=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=8F=89=EA=B0=80=20=EA=B8=B0=EC=A4=80?= =?UTF-8?q?=EB=A7=8C=20=EC=A1=B0=ED=9A=8C=20#159?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ApplicationServiceImpl.java | 7 ++++-- .../EvaluationCriteriaRepository.java | 2 ++ .../EvaluationCriteriaRepositoryImpl.java | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/application/service/ApplicationServiceImpl.java b/src/main/java/KUSITMS/WITHUS/domain/application/application/service/ApplicationServiceImpl.java index cbcfdcb..8c97579 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/application/service/ApplicationServiceImpl.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/application/service/ApplicationServiceImpl.java @@ -206,10 +206,13 @@ public ApplicationResponseDTO.Detail getById(Long id, Long currentUserId) { applicantAvailabilityRepository.findByApplicationId(id); List evaluationList = evaluationRepository.findEvaluationsForApplication(id); + + // 공통 평가 기준(organizationRole이 null) + 해당 지원서의 organizationRole과 일치하는 평가 기준만 조회 List criteriaList = - evaluationCriteriaRepository.findByTypeAndRecruitment( + evaluationCriteriaRepository.findCommonAndByOrganizationRole( + recruitmentId, EvaluationType.DOCUMENT, - recruitmentId + app.getOrganizationRole() ); return assembler.toDetail( diff --git a/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepository.java b/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepository.java index 129b352..19de19a 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepository.java +++ b/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepository.java @@ -2,6 +2,7 @@ import KUSITMS.WITHUS.domain.evaluation.evaluationCriteria.entity.EvaluationCriteria; import KUSITMS.WITHUS.domain.evaluation.evaluationCriteria.enumerate.EvaluationType; +import KUSITMS.WITHUS.domain.organization.organizationRole.entity.OrganizationRole; import java.util.List; @@ -10,5 +11,6 @@ public interface EvaluationCriteriaRepository { List findByTypeAndRecruitment(EvaluationType type, Long recruitmentId); Long countByRecruitment_IdAndEvaluationType(Long recruitmentId, EvaluationType stage); List findByRecruitment_IdAndEvaluationType(Long recruitmentId, EvaluationType stage); + List findCommonAndByOrganizationRole(Long recruitmentId, EvaluationType type, OrganizationRole organizationRole); List findAllById(List criteriaIds); } diff --git a/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepositoryImpl.java b/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepositoryImpl.java index 26c497b..66b2f4e 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepositoryImpl.java +++ b/src/main/java/KUSITMS/WITHUS/domain/evaluation/evaluationCriteria/repository/EvaluationCriteriaRepositoryImpl.java @@ -2,18 +2,24 @@ import KUSITMS.WITHUS.domain.evaluation.evaluationCriteria.entity.EvaluationCriteria; import KUSITMS.WITHUS.domain.evaluation.evaluationCriteria.enumerate.EvaluationType; +import KUSITMS.WITHUS.domain.organization.organizationRole.entity.OrganizationRole; import KUSITMS.WITHUS.global.exception.CustomException; import KUSITMS.WITHUS.global.exception.ErrorCode; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; +import static KUSITMS.WITHUS.domain.evaluation.evaluationCriteria.entity.QEvaluationCriteria.evaluationCriteria; + @Repository @RequiredArgsConstructor public class EvaluationCriteriaRepositoryImpl implements EvaluationCriteriaRepository { private final EvaluationCriteriaJpaRepository evaluationCriteriaJpaRepository; + private final JPAQueryFactory queryFactory; @Override public EvaluationCriteria getById(Long id) { @@ -35,6 +41,23 @@ public List findByRecruitment_IdAndEvaluationType(Long recru return evaluationCriteriaJpaRepository.findByRecruitment_IdAndEvaluationType(recruitmentId, stage); } + @Override + public List findCommonAndByOrganizationRole(Long recruitmentId, EvaluationType type, OrganizationRole organizationRole) { + BooleanExpression roleFilter = organizationRole == null + ? evaluationCriteria.organizationRole.isNull() + : evaluationCriteria.organizationRole.isNull() + .or(evaluationCriteria.organizationRole.eq(organizationRole)); + + return queryFactory + .selectFrom(evaluationCriteria) + .where( + evaluationCriteria.recruitment.id.eq(recruitmentId) + .and(evaluationCriteria.evaluationType.eq(type)) + .and(roleFilter) + ) + .fetch(); + } + @Override public List findAllById(List criteriaIds) { return evaluationCriteriaJpaRepository.findAllById(criteriaIds); From 7cd4eb9aafabcf6f8434081e1d4e5a6c73633839 Mon Sep 17 00:00:00 2001 From: EunjinWoo Date: Sun, 21 Dec 2025 13:50:38 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=EA=B3=B5=ED=86=B5=20=ED=8C=8C?= =?UTF-8?q?=ED=8A=B8=20=ED=8F=89=EA=B0=80=EC=9E=90=20=EB=B6=84=EB=B0=B0=20?= =?UTF-8?q?/=20=EB=B6=84=EB=B0=B0=20=EB=82=B4=EC=97=AD=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20#159?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ApplicationJpaRepository.java | 1 + .../repository/ApplicationRepository.java | 1 + .../repository/ApplicationRepositoryImpl.java | 5 +++++ .../evaluator/EvaluatorAssignmentService.java | 11 +++++++---- .../dto/ApplicationEvaluatorRequestDTO.java | 3 +-- .../dto/DistributionRequestResponseDTO.java | 2 +- .../entity/DistributionAssignment.java | 2 +- .../DistributionRequestRepositoryImpl.java | 17 ++++++++++++++--- 8 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationJpaRepository.java b/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationJpaRepository.java index 1d3f656..a8705d5 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationJpaRepository.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationJpaRepository.java @@ -11,6 +11,7 @@ public interface ApplicationJpaRepository extends JpaRepository findByRecruitmentId(Long recruitmentId); List findByRecruitmentIdAndStatusIn(Long recruitmentId, List statuses); List findByRecruitment_IdAndOrganizationRole_Id(Long recruitmentId, Long organizationRoleId); + List findByRecruitment_IdAndOrganizationRoleIsNull(Long recruitmentId); Long countByRecruitment_IdAndOrganizationRole_Id(Long recruitmentId, Long organizationRoleId); List findDistinctByRecruitment_IdAndEvaluators_Evaluator_IdAndEvaluators_EvaluationType(Long recruitmentId, Long evaluatorId, EvaluationType evaluationType); Long countByRecruitmentIdAndStatusIn(Long recruitmentId, List statuses); diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepository.java b/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepository.java index e72af6f..b1fa244 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepository.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepository.java @@ -14,6 +14,7 @@ public interface ApplicationRepository { List findPassedByRecruitment(Long recruitmentId); List findByRecruitmentIdAndStatusIn(Long recruitmentId, List statuses); List findByRecruitment_IdAndOrganizationRole_Id(Long recruitmentId, Long organizationRoleId); + List findByRecruitment_IdAndOrganizationRoleIsNull(Long recruitmentId); Long countByRecruitment_IdAndOrganizationRole_Id(Long recruitmentId, Long organizationRoleId); List findAllById(List longs); List findDistinctByRecruitment_IdAndEvaluators_Evaluator_IdAndEvaluators_EvaluationType(Long recruitmentId, Long evaluatorId, EvaluationType evaluationType); diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepositoryImpl.java b/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepositoryImpl.java index a0fe64d..1e97e9c 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepositoryImpl.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/application/repository/ApplicationRepositoryImpl.java @@ -62,6 +62,11 @@ public List findByRecruitment_IdAndOrganizationRole_Id(Long recruit return applicationJpaRepository.findByRecruitment_IdAndOrganizationRole_Id(recruitmentId, organizationRoleId); } + @Override + public List findByRecruitment_IdAndOrganizationRoleIsNull(Long recruitmentId) { + return applicationJpaRepository.findByRecruitment_IdAndOrganizationRoleIsNull(recruitmentId); + } + @Override public Long countByRecruitment_IdAndOrganizationRole_Id(Long recruitmentId, Long organizationRoleId) { return applicationJpaRepository.countByRecruitment_IdAndOrganizationRole_Id(recruitmentId, organizationRoleId); diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/application/service/evaluator/EvaluatorAssignmentService.java b/src/main/java/KUSITMS/WITHUS/domain/application/application/service/evaluator/EvaluatorAssignmentService.java index 3797bde..b5f3529 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/application/service/evaluator/EvaluatorAssignmentService.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/application/service/evaluator/EvaluatorAssignmentService.java @@ -46,7 +46,9 @@ public void distributeEvaluators(ApplicationEvaluatorRequestDTO.Distribute reque // 요청 이력 dto -> 엔티티 매핑 List assignments = request.assignments().stream() .map(dto -> { - OrganizationRole role = organizationRoleRepository.getById(dto.organizationRoleId()); + OrganizationRole role = dto.organizationRoleId() != null + ? organizationRoleRepository.getById(dto.organizationRoleId()) + : null; return DistributionAssignment.builder() .organizationRole(role) .evaluationType(dto.evaluationType()) @@ -77,9 +79,10 @@ public void distributeEvaluators(ApplicationEvaluatorRequestDTO.Distribute reque throw new CustomException(ErrorCode.INSUFFICIENT_EVALUATORS); } - // 이 역할을 지원한 지원서 리스트 - List apps = applicationRepository - .findByRecruitment_IdAndOrganizationRole_Id(recruitmentId, part.organizationRoleId()); + // 이 역할을 지원한 지원서 리스트 (organizationRoleId가 null이면 공통(역할 미지정) 지원서 조회) + List apps = part.organizationRoleId() == null + ? applicationRepository.findByRecruitment_IdAndOrganizationRoleIsNull(recruitmentId) + : applicationRepository.findByRecruitment_IdAndOrganizationRole_Id(recruitmentId, part.organizationRoleId()); // 각 지원서마다 랜덤 n명 배정 for (Application app : apps) { diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/applicationEvaluator/dto/ApplicationEvaluatorRequestDTO.java b/src/main/java/KUSITMS/WITHUS/domain/application/applicationEvaluator/dto/ApplicationEvaluatorRequestDTO.java index cdf4434..dc7fa1c 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/applicationEvaluator/dto/ApplicationEvaluatorRequestDTO.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/applicationEvaluator/dto/ApplicationEvaluatorRequestDTO.java @@ -27,8 +27,7 @@ public record Distribute( ) { @Schema(description = "지원 역할(OrganizationRole)별 평가 담당자 배정 정보") public record PartAssignment( - @Schema(description = "지원 역할(OrganizationRole) ID - 지원서가 지원한 역할", example = "4") - @NotNull + @Schema(description = "지원 역할(OrganizationRole) ID - null이면 공통(역할 미지정 지원서) 대상", example = "4") Long organizationRoleId, @Schema(description = "평가 담당자 Role(OrganizationRole) ID - 평가를 담당할 역할", example = "7") diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/dto/DistributionRequestResponseDTO.java b/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/dto/DistributionRequestResponseDTO.java index 8a13b26..adbe0b3 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/dto/DistributionRequestResponseDTO.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/dto/DistributionRequestResponseDTO.java @@ -41,7 +41,7 @@ public record Assignment( ) { public static Assignment from(DistributionAssignment a) { return new Assignment( - a.getOrganizationRole().getName(), + a.getOrganizationRole() != null ? a.getOrganizationRole().getName() : "공통", a.getEvaluationType(), a.getCount() ); diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/entity/DistributionAssignment.java b/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/entity/DistributionAssignment.java index 2e5d798..d8d1f7c 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/entity/DistributionAssignment.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/entity/DistributionAssignment.java @@ -22,7 +22,7 @@ public class DistributionAssignment extends BaseEntity { private DistributionRequest request; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "ORGANIZATION_ROLE_ID", nullable = false) + @JoinColumn(name = "ORGANIZATION_ROLE_ID") private OrganizationRole organizationRole; @Enumerated(EnumType.STRING) diff --git a/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/repository/DistributionRequestRepositoryImpl.java b/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/repository/DistributionRequestRepositoryImpl.java index 93b3d9b..75afa73 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/repository/DistributionRequestRepositoryImpl.java +++ b/src/main/java/KUSITMS/WITHUS/domain/application/distributionRequest/repository/DistributionRequestRepositoryImpl.java @@ -1,18 +1,22 @@ package KUSITMS.WITHUS.domain.application.distributionRequest.repository; import KUSITMS.WITHUS.domain.application.distributionRequest.entity.DistributionRequest; -import KUSITMS.WITHUS.global.exception.CustomException; -import KUSITMS.WITHUS.global.exception.ErrorCode; +import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import java.util.List; +import static KUSITMS.WITHUS.domain.application.distributionRequest.entity.QDistributionRequest.distributionRequest; +import static KUSITMS.WITHUS.domain.application.distributionRequest.entity.QDistributionAssignment.distributionAssignment; +import static KUSITMS.WITHUS.domain.organization.organizationRole.entity.QOrganizationRole.organizationRole; + @Repository @RequiredArgsConstructor public class DistributionRequestRepositoryImpl implements DistributionRequestRepository { private final DistributionRequestJpaRepository distributionRequestJpaRepository; + private final JPAQueryFactory queryFactory; @Override public DistributionRequest findTopByRecruitmentIdOrderByCreatedAtDesc(Long recruitmentId) { @@ -31,7 +35,14 @@ public DistributionRequest save(DistributionRequest distributionRequest) { } public List findAllByRecruitmentIdOrderByCreatedAtDesc(Long recruitmentId) { - return distributionRequestJpaRepository.findAllByRecruitmentIdOrderByCreatedAtDesc(recruitmentId); + return queryFactory + .selectFrom(distributionRequest) + .distinct() + .leftJoin(distributionRequest.assignments, distributionAssignment).fetchJoin() + .leftJoin(distributionAssignment.organizationRole, organizationRole).fetchJoin() + .where(distributionRequest.recruitmentId.eq(recruitmentId)) + .orderBy(distributionRequest.createdAt.desc()) + .fetch(); } } From 8224fc00a4dc61592c7da70fa6999feb49b1bc7c Mon Sep 17 00:00:00 2001 From: EunjinWoo Date: Sun, 21 Dec 2025 13:59:37 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=ED=85=9C=ED=94=8C=EB=A6=BF=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20api=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EC=88=98=EC=A0=95/=EC=82=AD=EC=A0=9C=20=EC=8B=9C=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=ED=99=95=EC=9D=B8=20#159?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TemplateController.java | 17 ++++++++-- .../repository/TemplateRepository.java | 1 + .../repository/TemplateRepositoryImpl.java | 19 +++++++++-- .../template/service/TemplateService.java | 3 +- .../template/service/TemplateServiceImpl.java | 34 +++++++++++++++++-- .../WITHUS/global/exception/ErrorCode.java | 1 + 6 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/main/java/KUSITMS/WITHUS/domain/template/controller/TemplateController.java b/src/main/java/KUSITMS/WITHUS/domain/template/controller/TemplateController.java index bb83ab7..39885bd 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/template/controller/TemplateController.java +++ b/src/main/java/KUSITMS/WITHUS/domain/template/controller/TemplateController.java @@ -52,14 +52,25 @@ public SuccessResponse create( } @PutMapping("/{templateId}") - @Operation(summary = "문자/메일 템플릿 수정", description = "기존에 등록된 템플릿의 정보를 수정합니다.") + @Operation(summary = "문자/메일 템플릿 수정", description = "기존에 등록된 템플릿의 정보를 수정합니다. 자신이 속한 조직의 템플릿만 수정 가능합니다.") public SuccessResponse update( @PathVariable Long templateId, - @RequestBody @Valid TemplateRequestDTO.Update dto + @RequestBody @Valid TemplateRequestDTO.Update dto, + @CurrentUser User user ) { - TemplateResponseDTO.Detail updated = templateService.update(templateId, dto); + TemplateResponseDTO.Detail updated = templateService.update(templateId, dto, user); return SuccessResponse.ok(updated); } + @DeleteMapping("/{templateId}") + @Operation(summary = "문자/메일 템플릿 삭제", description = "등록된 템플릿을 삭제합니다. 자신이 속한 조직의 템플릿만 삭제 가능합니다.") + public SuccessResponse delete( + @PathVariable Long templateId, + @CurrentUser User user + ) { + templateService.delete(templateId, user); + return SuccessResponse.ok("템플릿이 삭제되었습니다."); + } + } diff --git a/src/main/java/KUSITMS/WITHUS/domain/template/repository/TemplateRepository.java b/src/main/java/KUSITMS/WITHUS/domain/template/repository/TemplateRepository.java index fa064f2..09bf1ad 100644 --- a/src/main/java/KUSITMS/WITHUS/domain/template/repository/TemplateRepository.java +++ b/src/main/java/KUSITMS/WITHUS/domain/template/repository/TemplateRepository.java @@ -9,4 +9,5 @@ public interface TemplateRepository { Template getById(Long templateId); List