@@ -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 ) {
0 commit comments