Skip to content

Commit c559c07

Browse files
authored
fix: 온도 기여 퍼센트 정책 수정 & 스케줄러 오류 수정 (#152)
1 parent 6df4f8a commit c559c07

File tree

4 files changed

+43
-18
lines changed

4 files changed

+43
-18
lines changed

backend/ongi/src/main/java/ongi/temperature/dto/FamilyTemperatureResponse.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
@AllArgsConstructor
1515
public class FamilyTemperatureResponse {
1616
private Double familyTemperature;
17-
private Double totalContributedTemperature;
18-
private List<MemberTemperatureInfo> memberTemperatures;
17+
private Double totalFamilyDecreaseTemperature;
18+
private Double totalFamilyIncreaseTemperature;
19+
private Double totalMemberIncreaseTemperature;
20+
private List<MemberTemperatureInfo> memberIncreaseTemperatures;
1921

2022
@Getter
2123
@Builder

backend/ongi/src/main/java/ongi/temperature/entity/Temperature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
@GeneratedValue(strategy = GenerationType.IDENTITY)
2828
private Long id;
2929

30-
@Column(name = "user_id", nullable = false)
30+
@Column(name = "user_id", nullable = true)
3131
private UUID userId;
3232

3333
@Column(name = "family_id", nullable = false)

backend/ongi/src/main/java/ongi/temperature/service/TemperatureService.java

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

backend/ongi/src/main/resources/application.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ spring.datasource.username=${DB_USERNAME}
55
spring.datasource.password=${DB_PASSWORD}
66
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
77
spring.jpa.hibernate.ddl-auto=update
8+
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
89

910
logging.level.root=INFO
1011
logging.level.org.springframework=DEBUG

0 commit comments

Comments
 (0)