11package ongi .step .service ;
22
33import java .time .temporal .TemporalAdjusters ;
4+ import java .util .Comparator ;
45import java .util .Optional ;
56import lombok .RequiredArgsConstructor ;
67import ongi .exception .EntityNotFoundException ;
78import ongi .family .entity .Family ;
89import ongi .family .repository .FamilyRepository ;
9- import ongi .step .dto .FamilyStepRankingResponse ;
10+ import ongi .step .dto .FamilyStepRankResponse ;
1011import ongi .step .dto .FamilyStepResponse ;
1112import ongi .step .dto .FamilyStepResponse .MemberStepInfo ;
1213import ongi .step .dto .StepUpsertRequest ;
@@ -50,21 +51,21 @@ public void upsertStep(User user, StepUpsertRequest request) {
5051 }
5152 }
5253
54+ @ Transactional
5355 public FamilyStepResponse getFamilySteps (User user , LocalDate date ) {
5456 Family family = familyRepository .findByMembersContains (user .getUuid ())
5557 .orElseThrow (() -> new EntityNotFoundException ("가족을 찾을 수 없습니다." ));
5658
5759 List <Step > familySteps = stepRepository .findByFamilyAndDate (family , date );
5860 Integer totalSteps = stepRepository .getTotalStepsByFamilyAndDate (family , date );
5961
60-
6162 List <MemberStepInfo > memberSteps = family .getMembers ().stream ().map (uuid ->
6263 new MemberStepInfo (uuid , userRepository .findByUuid (uuid ).get ().getName (),
63- familySteps .stream ()
64- .filter (step -> step .getCreatedBy ().getUuid ().equals (uuid ))
65- .findFirst ()
66- .map (Step ::getSteps )
67- .orElse (0 ))).toList ();
64+ familySteps .stream ()
65+ .filter (step -> step .getCreatedBy ().getUuid ().equals (uuid ))
66+ .findFirst ()
67+ .map (Step ::getSteps )
68+ .orElse (0 ))).toList ();
6869
6970 return new FamilyStepResponse (
7071 totalSteps ,
@@ -73,26 +74,25 @@ public FamilyStepResponse getFamilySteps(User user, LocalDate date) {
7374 );
7475 }
7576
76-
77- /// TODO ///
78- public List <FamilyStepRankingResponse > getFamilyStepRanking (User user , LocalDate date ) {
79- Family family = familyRepository .findByMembersContains (user .getUuid ())
77+ @ Transactional
78+ public List <FamilyStepRankResponse > getFamilyStepRank (User user , LocalDate date ) {
79+ Family ourFamily = familyRepository .findByMembersContains (user .getUuid ())
8080 .orElseThrow (() -> new EntityNotFoundException ("가족을 찾을 수 없습니다." ));
8181
82- // TODO
83- return null ;
84- }
85-
86- private int get7DaysAverageSteps ( Family family ) {
87- LocalDate today = LocalDate . now ();
88- List < Step > familySteps = stepRepository . findByFamilyAndDateBetween ( family , today ,
89- getThisWeekMonday ( today ));
90-
91- int totalSteps = familySteps . stream ( )
92- . mapToInt ( Step :: getSteps )
93- . sum ();
94-
95- return totalSteps / family . getMembers (). size ();
82+ return stepRepository . findStepsAndSizeBetween ( getThisWeekMonday ( date ), date ). stream ()
83+ . map ( v -> {
84+ long cnt = v . getMemberCount ();
85+ long total = v . getTotalSteps () ;
86+ int perMemberWeeklyTotal = ( cnt == 0 ) ? 0 : ( int ) Math . round (( double ) total / cnt );
87+
88+ return new FamilyStepRankResponse (
89+ v . getFamilyName (),
90+ perMemberWeeklyTotal ,
91+ v . getFamilyCode (). equals ( ourFamily . getCode () )
92+ );
93+ })
94+ . sorted ( Comparator . comparingInt ( FamilyStepRankResponse :: averageSteps ). reversed ())
95+ . toList ();
9696 }
9797
9898 public LocalDate getThisWeekMonday (LocalDate date ) {
0 commit comments