@@ -60,8 +60,26 @@ public FamilyTemperatureResponse getFamilyTemperatureSummary(String familyId) {
6060 // 가족 온도 = 기본값 + 전체 기여 합
6161 double familyTemperature = BASE_TEMPERATURE + contributedSum ;
6262
63- // userId별로 온도 기여 합계 집계
63+ // 가족 전체 단위 온도 변화 증가/감소 계산
64+ double totalFamilyIncreaseTemperature = temperatures .stream ()
65+ .filter (t -> t .getUserId ().equals (FAMILY_WIDE_USER_ID ) && t .getTemperature () > 0 )
66+ .mapToDouble (Temperature ::getTemperature )
67+ .sum ();
68+
69+ double totalFamilyDecreaseTemperature = temperatures .stream ()
70+ .filter (t -> t .getUserId ().equals (FAMILY_WIDE_USER_ID ) && t .getTemperature () < 0 )
71+ .mapToDouble (Temperature ::getTemperature )
72+ .sum ();
73+
74+ // 구성원별 증가 온도만 계산 (가족 전체 온도 제외)
75+ double totalMemberIncreaseTemperature = temperatures .stream ()
76+ .filter (t -> t .getTemperature () > 0 && !t .getUserId ().equals (FAMILY_WIDE_USER_ID ))
77+ .mapToDouble (Temperature ::getTemperature )
78+ .sum ();
79+
80+ // userId별로 온도 기여 합계 집계 (가족 전체 온도 제외)
6481 Map <UUID , Double > userTemperatures = temperatures .stream ()
82+ .filter (t -> !t .getUserId ().equals (FAMILY_WIDE_USER_ID ))
6583 .collect (Collectors .groupingBy (
6684 Temperature ::getUserId ,
6785 Collectors .summingDouble (Temperature ::getTemperature )
@@ -73,13 +91,13 @@ public FamilyTemperatureResponse getFamilyTemperatureSummary(String familyId) {
7391 .collect (Collectors .toMap (User ::getUuid , user -> user ));
7492
7593 // 각 구성원별 기여도 및 퍼센트 계산
76- List <FamilyTemperatureResponse .MemberTemperatureInfo > memberTemperatures = userTemperatures .entrySet ().stream ()
94+ List <FamilyTemperatureResponse .MemberTemperatureInfo > memberIncreaseTemperatures = userTemperatures .entrySet ().stream ()
7795 .map (entry -> {
7896 UUID userId = entry .getKey ();
7997 Double contributedTemperature = entry .getValue ();
8098 User user = users .get (userId );
8199 // 전체 기여 합이 0일 때는 0%, 아니면 비율 계산
82- double percentage = contributedSum > 0 ? (contributedTemperature / contributedSum ) * 100 : 0.0 ;
100+ double percentage = totalMemberIncreaseTemperature > 0 ? (contributedTemperature / totalMemberIncreaseTemperature ) * 100 : 0.0 ;
83101 percentage = BigDecimal .valueOf (percentage ).setScale (2 , RoundingMode .HALF_UP ).doubleValue ();
84102 return FamilyTemperatureResponse .MemberTemperatureInfo .builder ()
85103 .userId (userId )
@@ -92,8 +110,10 @@ public FamilyTemperatureResponse getFamilyTemperatureSummary(String familyId) {
92110
93111 return FamilyTemperatureResponse .builder ()
94112 .familyTemperature (round (familyTemperature , 1 ))
95- .totalContributedTemperature (round (contributedSum , 1 ))
96- .memberTemperatures (memberTemperatures )
113+ .totalFamilyDecreaseTemperature (round (totalFamilyDecreaseTemperature , 1 ))
114+ .totalFamilyIncreaseTemperature (round (totalFamilyIncreaseTemperature , 1 ))
115+ .totalMemberIncreaseTemperature (round (totalMemberIncreaseTemperature , 1 ))
116+ .memberIncreaseTemperatures (memberIncreaseTemperatures )
97117 .build ();
98118 }
99119
@@ -279,7 +299,7 @@ public void increaseTemperatureForChildExerciseView(UUID userId, String familyId
279299
280300
281301 // 매일 23:59:59에 당일의 가족별 보너스 온도 상승 처리
282- @ Scheduled (cron = "59 37 15 * * *" )
302+ @ Scheduled (cron = "59 59 23 * * *" )
283303 @ Transactional
284304 public void processFamilyBonusTemperature () {
285305 var families = familyRepository .findAll ();
@@ -343,21 +363,22 @@ private void processStepGoalBonus(ongi.family.entity.Family family, String famil
343363 @ Transactional
344364 public void processWeeklyTemperatureDecrease () {
345365 var families = familyRepository .findAll ();
366+ java .time .LocalDate targetDate = getToday ();
346367 for (var family : families ) {
347368 String familyId = family .getCode ();
348- decreaseTemperatureForInactiveParent (familyId );
349- decreaseTemperatureForInactiveChild (familyId );
369+ decreaseTemperatureForInactiveParent (familyId , targetDate );
370+ decreaseTemperatureForInactiveChild (familyId , targetDate );
350371 }
351372 }
352373 // 부모 1명 이상 일주일 동안 아무 활동 없을 시 온도 하락
353- public void decreaseTemperatureForInactiveParent (String familyId ) {
374+ public void decreaseTemperatureForInactiveParent (String familyId , LocalDate targetDate ) {
354375
355376 List <UUID > memberIds = familyRepository .findById (familyId ).get ().getMembers ();
356377 List <User > users = userRepository .findAllById (memberIds );
357378 List <User > parents = users .stream ()
358379 .filter (User ::getIsParent )
359380 .toList ();
360- LocalDateTime since = LocalDateTime . now (). minusDays ( 6 );
381+ LocalDateTime since = targetDate . minusDays ( 6 ). atStartOfDay ( );
361382 boolean parentInactive = parents .stream ()
362383 .anyMatch (parent -> !temperatureRepository .existsByUserIdAndFamilyIdAndCreatedAtAfter (parent .getUuid (), familyId , since ));
363384
@@ -372,14 +393,14 @@ public void decreaseTemperatureForInactiveParent(String familyId) {
372393 }
373394 }
374395 // 자녀 1명 이상 일주일 동안 아무 활동 없을 시 온도 하락
375- public void decreaseTemperatureForInactiveChild (String familyId ) {
396+ public void decreaseTemperatureForInactiveChild (String familyId , LocalDate targetDate ) {
376397
377398 List <UUID > memberIds = familyRepository .findById (familyId ).get ().getMembers ();
378399 List <User > users = userRepository .findAllById (memberIds );
379400 List <User > children = users .stream ()
380401 .filter (u -> !u .getIsParent ())
381402 .toList ();
382- LocalDateTime since = LocalDateTime . now (). minusDays ( 6 );
403+ LocalDateTime since = targetDate . minusDays ( 6 ). atStartOfDay ( );
383404 boolean childInactive = children .stream ()
384405 .anyMatch (child -> !temperatureRepository .existsByUserIdAndFamilyIdAndCreatedAtAfter (child .getUuid (), familyId , since ));
385406 if (childInactive ) {
@@ -399,15 +420,16 @@ public void decreaseTemperatureForInactiveChild(String familyId) {
399420 @ Transactional
400421 public void processDailyTemperatureDecrease () {
401422 var families = familyRepository .findAll ();
423+ LocalDate targetDate = getToday ();
402424 for (var family : families ) {
403425 String familyId = family .getCode ();
404- decreaseTemperatureForNoLogin (familyId );
426+ decreaseTemperatureForNoLogin (familyId , targetDate );
405427 }
406428 }
407429 // 하루 동안 아무도 활동 없을 시 온도 하락
408- public void decreaseTemperatureForNoLogin (String familyId ) {
430+ public void decreaseTemperatureForNoLogin (String familyId , LocalDate targetDate ) {
409431
410- LocalDateTime since = LocalDate . now (). atStartOfDay (); // 오늘 00:00~
432+ LocalDateTime since = targetDate . atStartOfDay (); // 타겟 날짜 00:00~
411433 // 만보기(STEP_GOAL)를 제외한 가족 전체 활동 체크
412434 boolean noLogin = !temperatureRepository .existsByFamilyIdAndCreatedAtAfter (familyId , since );
413435 if (noLogin ) {
0 commit comments