Skip to content

Commit 60dabe0

Browse files
authored
feat: 실행목표 자동 생성 로직 개발 (#456)
1 parent 2300eea commit 60dabe0

2 files changed

Lines changed: 58 additions & 7 deletions

File tree

layer-domain/src/main/java/org/layer/domain/analyze/entity/Analyze.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@ public AnalyzeDetail getTopCountAnalyzeDetailBy(AnalyzeDetailType analyzeDetailT
8080
.orElse(getEmptyAnalyzeDetail());
8181
}
8282

83+
public List<AnalyzeDetail> getAnalyzeDetailsBy(AnalyzeDetailType analyzeDetailType){
84+
List<AnalyzeDetail> filteredDetails = new ArrayList<>();
85+
for(AnalyzeDetail detail : analyzeDetails){
86+
if(detail.getAnalyzeDetailType().equals(analyzeDetailType)){
87+
filteredDetails.add(detail);
88+
}
89+
}
90+
return filteredDetails;
91+
}
92+
8393
private AnalyzeDetail getEmptyAnalyzeDetail(){
8494
return AnalyzeDetail.builder().build();
8595
}

layer-external/src/main/java/org/layer/ai/service/AIAnalyzeService.java

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.List;
88
import java.util.UUID;
99

10+
import org.layer.domain.actionItem.entity.ActionItem;
11+
import org.layer.domain.actionItem.repository.ActionItemRepository;
1012
import org.layer.domain.analyze.entity.Analyze;
1113
import org.layer.domain.analyze.entity.AnalyzeDetail;
1214
import org.layer.domain.analyze.enums.AnalyzeDetailType;
@@ -21,9 +23,11 @@
2123
import org.layer.domain.retrospect.entity.AnalysisStatus;
2224
import org.layer.domain.retrospect.entity.Retrospect;
2325
import org.layer.domain.retrospect.repository.RetrospectRepository;
26+
import org.layer.domain.space.entity.Space;
2427
import org.layer.domain.space.entity.Team;
2528
import org.layer.domain.space.repository.MemberSpaceRelationRepository;
2629
import org.layer.ai.dto.response.OpenAIResponse;
30+
import org.layer.domain.space.repository.SpaceRepository;
2731
import org.springframework.data.redis.core.RedisTemplate;
2832
import org.springframework.scheduling.annotation.Async;
2933
import org.springframework.stereotype.Service;
@@ -39,11 +43,13 @@ public class AIAnalyzeService {
3943
private static final int FIRST_RANK = 1;
4044
private static final String RETROSPECT_LOCK_KEY = "retrospect:lock:";
4145

46+
private final SpaceRepository spaceRepository;
4247
private final RetrospectRepository retrospectRepository;
4348
private final AnalyzeRepository analyzeRepository;
4449
private final QuestionRepository questionRepository;
4550
private final AnswerRepository answerRepository;
4651
private final MemberSpaceRelationRepository memberSpaceRelationRepository;
52+
private final ActionItemRepository actionItemRepository;
4753

4854
private final OpenAIService openAIService;
4955

@@ -74,8 +80,10 @@ public void createAnalyze(Long retrospectId) {
7480
retrospect.validateAnalysisStatusIsNotDone();
7581

7682
// 답변 조회
77-
Questions questions = new Questions(questionRepository.findAllByRetrospectIdOrderByQuestionOrder(retrospectId));
78-
Answers answers = new Answers(answerRepository.findAllByRetrospectIdAndAnswerStatus(retrospectId, AnswerStatus.DONE));
83+
Questions questions = new Questions(
84+
questionRepository.findAllByRetrospectIdOrderByQuestionOrder(retrospectId));
85+
Answers answers = new Answers(
86+
answerRepository.findAllByRetrospectIdAndAnswerStatus(retrospectId, AnswerStatus.DONE));
7987

8088
Long rangeQuestionId = questions.extractEssentialQuestionIdBy(QuestionType.RANGER);
8189
Long numberQuestionId = questions.extractEssentialQuestionIdBy(QuestionType.NUMBER);
@@ -85,9 +93,20 @@ public void createAnalyze(Long retrospectId) {
8593
OpenAIResponse aiResponse = openAIService.createAnalyze(totalAnswer);
8694
OpenAIResponse.Content content = aiResponse.parseContent();
8795

88-
Analyze teamAnalyze = getAnalyzeEntity(retrospectId, answers, rangeQuestionId, numberQuestionId, content, null, AnalyzeType.TEAM);
96+
Analyze teamAnalyze = getAnalyzeEntity(retrospectId, answers, rangeQuestionId, numberQuestionId, content,
97+
null, AnalyzeType.TEAM);
8998
analyzeRepository.save(teamAnalyze);
9099

100+
101+
// 팀 실행 목표 생성
102+
Space space = spaceRepository.findByIdOrThrow(retrospect.getSpaceId());
103+
104+
List<ActionItem> actionItems = createActionItemsFromAnalyzeDetails(
105+
teamAnalyze.getAnalyzeDetailsBy(AnalyzeDetailType.IMPROVEMENT),
106+
retrospect.getSpaceId(),
107+
retrospect.getId(), space.getLeaderId());
108+
actionItemRepository.saveAll(actionItems);
109+
91110
// 팀원 개인마다의 분석 요청
92111
Team team = new Team(memberSpaceRelationRepository.findAllBySpaceId(retrospect.getSpaceId()));
93112

@@ -96,7 +115,8 @@ public void createAnalyze(Long retrospectId) {
96115
String individualAnswer = answers.getIndividualAnswer(rangeQuestionId, numberQuestionId, memberId);
97116
OpenAIResponse aiIndividualResponse = openAIService.createAnalyze(individualAnswer);
98117
OpenAIResponse.Content individualContent = aiIndividualResponse.parseContent();
99-
return getAnalyzeEntity(retrospectId, answers, rangeQuestionId, numberQuestionId, individualContent, memberId, AnalyzeType.INDIVIDUAL);
118+
return getAnalyzeEntity(retrospectId, answers, rangeQuestionId, numberQuestionId, individualContent,
119+
memberId, AnalyzeType.INDIVIDUAL);
100120
})
101121
.toList();
102122
analyzeRepository.saveAll(individualAnalyzes);
@@ -126,11 +146,31 @@ private Analyze getAnalyzeEntity(Long retrospectId, Answers answers, Long rangeQ
126146
List<AnalyzeDetail> analyzeDetails = createAnalyzeDetails(content);
127147

128148
return createAnalyzeEntity(retrospectId, memberId, answers.getScoreCount(numberQuestionId, SCORE_ONE, memberId),
129-
answers.getScoreCount(numberQuestionId, SCORE_TWO, memberId), answers.getScoreCount(numberQuestionId, SCORE_THREE, memberId),
130-
answers.getScoreCount(numberQuestionId, SCORE_FOUR, memberId), answers.getScoreCount(numberQuestionId, SCORE_FIVE, memberId),
149+
answers.getScoreCount(numberQuestionId, SCORE_TWO, memberId),
150+
answers.getScoreCount(numberQuestionId, SCORE_THREE, memberId),
151+
answers.getScoreCount(numberQuestionId, SCORE_FOUR, memberId),
152+
answers.getScoreCount(numberQuestionId, SCORE_FIVE, memberId),
131153
answers.getGoalCompletionRate(rangeQuestionId), analyzeType, analyzeDetails);
132154
}
133155

156+
private List<ActionItem> createActionItemsFromAnalyzeDetails(List<AnalyzeDetail> analyzeDetails, Long spaceId,
157+
Long retrospectId, Long memberId) {
158+
List<ActionItem> actionItems = new ArrayList<>();
159+
int order = 1;
160+
for (AnalyzeDetail detail : analyzeDetails) {
161+
ActionItem actionItem = ActionItem.builder()
162+
.retrospectId(retrospectId)
163+
.spaceId(spaceId)
164+
.memberId(memberId)
165+
.content(detail.getContent())
166+
.actionItemOrder(order)
167+
.build();
168+
actionItems.add(actionItem);
169+
order++;
170+
}
171+
return actionItems;
172+
}
173+
134174
private List<AnalyzeDetail> createAnalyzeDetails(OpenAIResponse.Content content) {
135175
List<AnalyzeDetail> analyzeDetails = new ArrayList<>();
136176

@@ -162,7 +202,8 @@ private List<AnalyzeDetail> createAnalyzeDetail(List<OpenAIResponse.ContentDetai
162202
return analyzeDetails;
163203
}
164204

165-
private Analyze createAnalyzeEntity(Long retrospectId, Long memberId,int scoreOne, int scoreTwo, int scoreThree, int scoreFour,
205+
private Analyze createAnalyzeEntity(Long retrospectId, Long memberId, int scoreOne, int scoreTwo, int scoreThree,
206+
int scoreFour,
166207
int scoreFive, int goalCompletionRate, AnalyzeType analyzeType, List<AnalyzeDetail> analyzeDetails) {
167208

168209
return Analyze.builder()

0 commit comments

Comments
 (0)