Skip to content

Commit 3dfb907

Browse files
authored
Merge pull request #66 from Block-Guard/feat/#63/fraud-survey-scoring-ignore-other
[Feat] 사기분석설문 로직 변경 & 기타 키워드 제외 & 진행중인 긴급 대응 조회 API 응답변경
2 parents 16d7855 + 38a8a24 commit 3dfb907

File tree

3 files changed

+50
-26
lines changed

3 files changed

+50
-26
lines changed

src/main/java/com/blockguard/server/domain/analysis/application/FraudAnalysisService.java

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ public FraudAnalysisResponse fraudAnalysis(FraudAnalysisRequest fraudAnalysisReq
5555

5656
// ai 서버 호출
5757
GptResponse gptResponse = gptApiClient.analyze(gptRequest);
58-
score = Math.min(100, score + gptResponse.getScore());
58+
59+
60+
// 최종 점수 계산
61+
score = Math.min(100, score + getSurveyScore(fraudAnalysisRequest) + gptResponse.getScore());
5962

6063
// 사기 분석 기록 저장
6164
RiskLevel riskLevel = RiskLevel.fromScore(score);
@@ -81,6 +84,15 @@ public FraudAnalysisResponse fraudAnalysis(FraudAnalysisRequest fraudAnalysisReq
8184
.build();
8285
}
8386

87+
private static int getSurveyScore(FraudAnalysisRequest fraudAnalysisRequest) {
88+
int addionalScore = 0;
89+
if (Boolean.TRUE.equals(fraudAnalysisRequest.getPressuredInfo()) || Boolean.TRUE.equals(fraudAnalysisRequest.getAuthorityPressure()))
90+
addionalScore += 5;
91+
if (Boolean.TRUE.equals(fraudAnalysisRequest.getThirdPartyConnect()) || Boolean.TRUE.equals(fraudAnalysisRequest.getAccountOrLinkRequest()))
92+
addionalScore += 5;
93+
return addionalScore;
94+
}
95+
8496
private double addFraudPhoneNumberScore(FraudAnalysisRequest fraudAnalysisRequest, double score) {
8597
if (StringUtils.hasText(fraudAnalysisRequest.getSuspiciousPhoneNumbers())) {
8698
// 전화번호 위험이면 score 10점 추가
@@ -128,26 +140,30 @@ private String extractOcrText(List<MultipartFile> imageFiles) {
128140
}
129141

130142
private static void extractKeywordsFromRequest(FraudAnalysisRequest request, List<String> keywords) {
131-
if (StringUtils.hasText(request.getContactMethod()))
132-
keywords.add(request.getContactMethod());
133-
if (StringUtils.hasText(request.getCounterpart()))
134-
keywords.add(request.getCounterpart());
135-
if (request.getRequestedAction() != null && !request.getRequestedAction().isEmpty())
136-
keywords.addAll(request.getRequestedAction());
137-
if (request.getRequestedInfo() != null && !request.getRequestedInfo().isEmpty())
138-
keywords.addAll(request.getRequestedInfo());
139-
if (StringUtils.hasText(request.getLinkType()))
140-
keywords.add(request.getLinkType());
141-
if (Boolean.TRUE.equals(request.getPressuredInfo()))
142-
keywords.add("개인정보 유출/범죄 연루 언급 등 심리적 압박");
143-
if (Boolean.TRUE.equals(request.getAppOrLinkRequest()))
144-
keywords.add("앱 설치/링크 접속 유도");
145-
if (Boolean.TRUE.equals(request.getThirdPartyConnect()))
146-
keywords.add("제3자(수사관 등) 연결 시도");
147-
if (Boolean.TRUE.equals(request.getAuthorityPressure()))
148-
keywords.add("직책 강조 및 권위적 태도 보임");
149-
if (Boolean.TRUE.equals(request.getAccountOrLinkRequest()))
150-
keywords.add("계좌이체/현금인출 유도");
143+
addIfKeyword(request.getContactMethod(), keywords);
144+
addIfKeyword(request.getCounterpart(), keywords);
145+
addAllIfKeyword(request.getRequestedAction(), keywords);
146+
addAllIfKeyword(request.getRequestedInfo(), keywords);
147+
addIfKeyword(request.getLinkType(), keywords);
148+
}
149+
150+
private static void addIfKeyword(String v, List<String> keywords) {
151+
if (StringUtils.hasText(v) && isNotEtc(v))
152+
keywords.add(v);
153+
}
154+
155+
private static void addAllIfKeyword(List<String> vlist, List<String> keywords) {
156+
if (vlist == null || vlist.isEmpty()) return;
157+
vlist.stream()
158+
.filter(StringUtils::hasText)
159+
.filter(FraudAnalysisService::isNotEtc)
160+
.forEach(keywords::add);
161+
}
162+
163+
private static boolean isNotEtc(String v) {
164+
String t = v.trim().replaceAll("\\s+", "");
165+
if (t.isEmpty()) return false;
166+
return !t.equals("기타");
151167
}
152168

153169
private static GptRequest buildGptRequest(FraudAnalysisRequest fraudAnalysisRequest, List<String> keywords, String additionalDescription, String imageContent) {

src/main/java/com/blockguard/server/domain/report/application/ReportRecordService.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
import org.springframework.stereotype.Service;
1919
import org.springframework.transaction.annotation.Transactional;
2020

21+
import java.time.LocalDateTime;
2122
import java.util.Comparator;
2223
import java.util.List;
24+
import java.util.Objects;
2325
import java.util.Optional;
2426

2527
@Service
@@ -51,11 +53,17 @@ public CurrentReportRecordResponse getCurrentRecord(User user) {
5153
ReportStepProgress lastProgress = record.getProgressList().stream()
5254
.max(Comparator.comparing(ReportStepProgress::getStep))
5355
.orElseThrow();
54-
int stepNum = lastProgress.getStep().getStepNumber();
56+
57+
LocalDateTime lastUpdatedAt = lastProgress.getCheckboxes().stream()
58+
.map(ReportStepCheckbox::getUpdatedAt)
59+
.filter(Objects::nonNull)
60+
.max(Comparator.naturalOrder())
61+
.orElse(lastProgress.getUpdatedAt());
62+
5563
return CurrentReportRecordResponse.builder()
5664
.reportId(record.getId())
57-
.createdAt(String.valueOf(record.getCreatedAt()))
58-
.step(stepNum)
65+
.updatedAt(lastUpdatedAt.toString())
66+
.step(lastProgress.getStep().getStepNumber())
5967
.build();
6068

6169
});
@@ -194,7 +202,7 @@ private ReportRecordStepResponse buildReportRecordStepResponse(Long reportId, in
194202
.step(stepNumber)
195203
.checkBoxes(resultRequiredCheckboxes)
196204
.recommendedCheckBoxes(resultRecommendedCheckboxes)
197-
.createdAt(String.valueOf(record.getCreatedAt()))
205+
.createdAt(String.valueOf(progress.getCreatedAt()))
198206
.isCompleted(progress.isCompleted())
199207
.build();
200208
}

src/main/java/com/blockguard/server/domain/report/dto/response/CurrentReportRecordResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88
public class CurrentReportRecordResponse {
99
private Long reportId;
1010
private int step;
11-
private String createdAt;
11+
private String updatedAt;
1212
}

0 commit comments

Comments
 (0)