瀏覽代碼

2019/07/26

x1ongzhu 6 年之前
父節點
當前提交
2cb7e6e12b

+ 8 - 3
src/main/java/com/izouma/walkchina/constant/AppConstants.java

@@ -5,9 +5,14 @@ import java.util.Date;
 public interface AppConstants {
     String DEFAULT_AVATAR = "https://microball.oss-cn-hangzhou.aliyuncs.com/awesomeAdmin/user.png";
 
-    double STEP_TO_DISTANCE_RATE = 1;  // 1步=多少米
-    double DISTANCE_TO_COIN_RATE = 0.01; // 1米=多少商城币
-    double HIRE_PRICE_RATE       = 0.00001; // 1步=多少身价
+    // 1步=多少米
+    double STEP_TO_DISTANCE_RATE = 1;
+
+    // 1米=多少商城币
+    double DISTANCE_TO_COIN_RATE = 0.01;
+
+    // 1步=多少身价
+    double HIRE_PRICE_RATE = 0.00001;
 
     Date FOREVER = new Date(32472115200000L);
 

+ 2 - 0
src/main/java/com/izouma/walkchina/constant/Strings.java

@@ -22,4 +22,6 @@ public interface Strings {
     String REMARK_RECEIVE_STAGE_AWARD = "领取阶段奖金";
 
     String REMARK_STEAL_STAGE_AWARD = "偷奖金";
+
+    String GRAB_FAIL = "很遗憾,Ta已经被别人抢走了~";
 }

+ 4 - 0
src/main/java/com/izouma/walkchina/domain/TeamMember.java

@@ -41,6 +41,10 @@ public class TeamMember {
     @Temporal(TemporalType.DATE)
     private Date endDate;
 
+    @Column(columnDefinition = "bit default 0", nullable = false)
+    @Builder.Default
+    private Boolean grabbed = false;
+
     @Column(columnDefinition = "bit default 1", nullable = false)
     @Builder.Default
     public Boolean active = true;

+ 22 - 0
src/main/java/com/izouma/walkchina/dto/MyFriend.java

@@ -0,0 +1,22 @@
+package com.izouma.walkchina.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class MyFriend {
+    private Long    userId;
+    private String  nickname;
+    private String  avatar;
+    private Long    todaySteps;
+    private Long    totalSteps;
+    private Boolean hired;
+
+    public MyFriend(Long userId, String nickname, String avatar, Long totalSteps) {
+        this.userId = userId;
+        this.nickname = nickname;
+        this.avatar = avatar;
+        this.totalSteps = totalSteps;
+    }
+}

+ 0 - 7
src/main/java/com/izouma/walkchina/dto/UserMap.java

@@ -20,13 +20,6 @@ public class UserMap {
     private City             destination;
     private Double           progress;
     private List<StageAward> stageAwards;
-    private Long             todaySteps;
-    private Long             teamSteps;
     private Long             currentSteps;
     private Integer          days;
-    private String           nickname;
-    private String           avatar;
-    private Integer          level;
-    private Long             totalSteps;
-    private Integer          walkCities;
 }

+ 7 - 7
src/main/java/com/izouma/walkchina/dto/UserTeamMember.java

@@ -6,17 +6,17 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 public class UserTeamMember {
-    private Long   userId;
-    private String nickname;
-    private String avatar;
-    private Long   todaySteps;
-    private Long   totalSteps;
+    private Long    userId;
+    private String  nickname;
+    private String  avatar;
+    private Long    todaySteps;
+    private Long    totalSteps;
+    private boolean shouldWake;
 
-    public UserTeamMember(Long userId, String nickname, String avatar, Long todaySteps, Long totalSteps) {
+    public UserTeamMember(Long userId, String nickname, String avatar, Long todaySteps) {
         this.userId = userId;
         this.nickname = nickname;
         this.avatar = avatar;
         this.todaySteps = todaySteps;
-        this.totalSteps = totalSteps;
     }
 }

+ 20 - 0
src/main/java/com/izouma/walkchina/dto/UserWalkStats.java

@@ -0,0 +1,20 @@
+package com.izouma.walkchina.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class UserWalkStats {
+    private String  nickname;
+    private String  avatar;
+    private Integer level;
+    private Long    todaySteps;
+    private Long    totalSteps;
+    private Long    teamSteps;
+    private Integer walkCities;
+}

+ 4 - 2
src/main/java/com/izouma/walkchina/repo/TeamMemberRepository.java

@@ -10,9 +10,11 @@ import java.util.List;
 
 public interface TeamMemberRepository extends JpaRepository<TeamMember, Long> {
 
-    @Query("select t from TeamMember t where t.userId = ?1 and t.startDate <= ?2 and t.endDate >= ?2")
+    @Query("select t from TeamMember t where t.userId = ?1 " +
+            "and ((t.startDate <= ?2 and t.endDate >= ?2) or t.startDate > ?2) order by t.startDate desc")
     TeamMember findActive(Long userId, Date date);
 
-    @Query("select new com.izouma.walkchina.dto.UserTeamMember(t.userId, u.nickname, u.avatar, u.totalSteps, 0L) from TeamMember t join UserInfo u on u.id = t.userId where t.leader = ?1")
+    @Query("select new com.izouma.walkchina.dto.UserTeamMember(t.userId, u.nickname, u.avatar, u.totalSteps) " +
+            "from TeamMember t join UserInfo u on u.id = t.userId where t.leader = ?1 and t.grabbed = 0")
     List<UserTeamMember> findUserTeam(Long userId);
 }

+ 10 - 0
src/main/java/com/izouma/walkchina/repo/UserFriendRepository.java

@@ -2,7 +2,17 @@ package com.izouma.walkchina.repo;
 
 import com.izouma.walkchina.domain.UserFriend;
 import com.izouma.walkchina.domain.UserFriendKey;
+import com.izouma.walkchina.dto.MyFriend;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.Date;
+import java.util.List;
 
 public interface UserFriendRepository extends JpaRepository<UserFriend, UserFriendKey> {
+
+    @Query("select new com.izouma.walkchina.dto.MyFriend(uf.friendId, u.nickname, u.avatar, u.totalSteps) from UserFriend uf " +
+            "join UserInfo u on uf.friendId = u.id join WalkData w on uf.friendId = w.userId " +
+            "where uf.userId = ?1 and w.date = ?2")
+    List<MyFriend> findMyFriend(Long userId, Date date);
 }

+ 0 - 1
src/main/java/com/izouma/walkchina/repo/WalkDataRepository.java

@@ -26,5 +26,4 @@ public interface WalkDataRepository extends JpaRepository<WalkData, Long> {
 
     @Query(value = "SELECT SUM(steps) FROM walk_data WHERE user_id = ?1 AND date >= DATE(?2) AND date <= DATE(?3)", nativeQuery = true)
     Optional<Long> sumUserWalkSteps(Long userId, Date start, Date end);
-
 }

+ 0 - 7
src/main/java/com/izouma/walkchina/service/MapService.java

@@ -86,11 +86,6 @@ public class MapService {
                 .polyline(minifyPolyline(userJourney.getPolyline()))
                 .origin(origin)
                 .destination(destination)
-                .nickname(userInfo.getNickname())
-                .avatar(userInfo.getAvatar())
-                .totalSteps(userInfo.getTotalSteps())
-                .walkCities(userInfo.getWalkCities())
-                .level(userInfo.getLevel())
                 .build();
         List<Double> progressPolyline = new ArrayList<>();
         List<JourneyStage> stages = journeyStageRepository.findAllByJourneyIdOrderById(userJourney.getId());
@@ -100,8 +95,6 @@ public class MapService {
         JourneyStage latestStage = stages.get(stages.size() - 1);
 
         userMap.setProgress(latestStage.getProgress());
-        userMap.setTeamSteps(walkDataRepository.sumTeamWalkSteps(userId, new Date(), new Date()).orElse(0L));
-        userMap.setTodaySteps(walkDataRepository.sumUserWalkSteps(userId, new Date(), new Date()).orElse(0L));
         userMap.setCurrentSteps(latestStage.getCurrentSteps());
         userMap.setStageAwards(stageAwardRepository.findAllByUserIdAndStageId(userId, latestStage.getId()));
         userMap.setDays(Days.daysBetween(LocalDate.fromDateFields(latestStage.getCreatedAt()), LocalDate.fromDateFields(new Date())).getDays());

+ 21 - 7
src/main/java/com/izouma/walkchina/service/TeamService.java

@@ -1,11 +1,8 @@
 package com.izouma.walkchina.service;
 
-import com.izouma.walkchina.constant.Strings;
-import com.izouma.walkchina.domain.Message;
-import com.izouma.walkchina.domain.TeamMember;
-import com.izouma.walkchina.domain.UserCoinRecord;
-import com.izouma.walkchina.domain.UserInfo;
 import com.izouma.walkchina.constant.AppConstants;
+import com.izouma.walkchina.constant.Strings;
+import com.izouma.walkchina.domain.*;
 import com.izouma.walkchina.dto.UserTeamMember;
 import com.izouma.walkchina.exception.ServiceException;
 import com.izouma.walkchina.repo.*;
@@ -15,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -43,7 +41,12 @@ public class TeamService {
                 throw new ServiceException("Ta已经是你的队员");
             }
 
+            if (teamMember.getStartDate().after(now)) {
+                throw new ServiceException(Strings.GRAB_FAIL);
+            }
+
             teamMember.setEndDate(now);
+            teamMember.setGrabbed(true);
             teamMemberRepository.save(teamMember);
             Message grabMsg = Message.builder()
                     .userId(teamMember.getLeader())
@@ -55,7 +58,9 @@ public class TeamService {
             messageRepository.save(grabMsg);
         }
 
-        BigDecimal price = BigDecimal.valueOf(Optional.ofNullable(targetUserInfo.getTotalSteps()).orElse(0L)).multiply(BigDecimal.valueOf(AppConstants.HIRE_PRICE_RATE));
+        BigDecimal price = BigDecimal.valueOf(Optional.ofNullable(targetUserInfo.getTotalSteps()).orElse(0L))
+                .multiply(BigDecimal.valueOf(AppConstants.HIRE_PRICE_RATE))
+                .setScale(1, RoundingMode.FLOOR);
         BigDecimal balance = Optional.ofNullable(userInfo.getCoin()).orElse(BigDecimal.ZERO);
         if (balance.compareTo(price) < 0) {
             throw new ServiceException("雇佣失败,商城币不足");
@@ -112,6 +117,9 @@ public class TeamService {
     }
 
     public boolean canHire(Long userId, Long target) {
+        if (userId.equals(target)) {
+            return false;
+        }
         Date now = new Date();
         TeamMember teamMember = teamMemberRepository.findActive(target, now);
         if (teamMember != null) {
@@ -124,7 +132,13 @@ public class TeamService {
         List<UserTeamMember> list = teamMemberRepository.findUserTeam(userId);
         Date now = new Date();
         for (UserTeamMember userTeamMember : list) {
-            userTeamMember.setTodaySteps(walkDataRepository.sumUserWalkSteps(userTeamMember.getUserId(), now, now).orElse(0L));
+            WalkData walkData = walkDataRepository.findByUserIdAndDate(userTeamMember.getUserId(), now);
+            if (walkData != null) {
+                userTeamMember.setTodaySteps(walkData.getSteps());
+            } else {
+                userTeamMember.setTodaySteps(0L);
+                userTeamMember.setShouldWake(true);
+            }
         }
         return list;
     }

+ 18 - 0
src/main/java/com/izouma/walkchina/service/UserInfoService.java

@@ -6,9 +6,11 @@ import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import com.izouma.walkchina.constant.AppConstants;
 import com.izouma.walkchina.domain.UserFriend;
 import com.izouma.walkchina.domain.UserInfo;
+import com.izouma.walkchina.dto.UserWalkStats;
 import com.izouma.walkchina.exception.ServiceException;
 import com.izouma.walkchina.repo.UserFriendRepository;
 import com.izouma.walkchina.repo.UserInfoRepository;
+import com.izouma.walkchina.repo.WalkDataRepository;
 import com.izouma.walkchina.service.storage.StorageService;
 import com.izouma.walkchina.utils.ImageUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -35,6 +37,8 @@ public class UserInfoService implements UserDetailsService {
     private StorageService       storageService;
     @Autowired
     private UserFriendRepository userFriendRepository;
+    @Autowired
+    private WalkDataRepository   walkDataRepository;
 
     @Override
     public UserInfo loadUserByUsername(String username) {
@@ -166,4 +170,18 @@ public class UserInfoService implements UserDetailsService {
             log.error("upload marker", e);
         }
     }
+
+    public UserWalkStats getUserWalkStats(Long userId) {
+        UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
+        Date now = new Date();
+        return UserWalkStats.builder()
+                .nickname(userInfo.getNickname())
+                .avatar(userInfo.getAvatar())
+                .level(userInfo.getLevel())
+                .totalSteps(userInfo.getTotalSteps())
+                .walkCities(userInfo.getWalkCities())
+                .todaySteps(walkDataRepository.sumUserWalkSteps(userId, now, now).orElse(0L))
+                .teamSteps(walkDataRepository.sumTeamWalkSteps(userId, now, now).orElse(0L))
+                .build();
+    }
 }

+ 5 - 5
src/main/java/com/izouma/walkchina/web/TeamController.java

@@ -14,17 +14,17 @@ public class TeamController {
     @Autowired
     private TeamService teamService;
 
-    @GetMapping("/hire")
-    public Result hire(@RequestParam("userId") Long target) {
+    @PostMapping("/hire")
+    public Result hire(@RequestParam("userId") Long userId) {
         UserInfo userInfo = SecurityUtils.getAuthenticatedUser();
-        teamService.hire(userInfo.getId(), target);
+        teamService.hire(userInfo.getId(), userId);
         return Result.ok();
     }
 
     @GetMapping("/canHire")
-    public Result canHire(@RequestParam("target") Long target) {
+    public Result canHire(@RequestParam("userId") Long userId) {
         UserInfo userInfo = SecurityUtils.getAuthenticatedUser();
-        if (teamService.canHire(userInfo.getId(), target)) {
+        if (teamService.canHire(userInfo.getId(), userId)) {
             return Result.ok();
         }
         return Result.error();

+ 9 - 0
src/main/java/com/izouma/walkchina/web/UserInfoController.java

@@ -5,6 +5,7 @@ import com.izouma.walkchina.domain.UserInfo;
 import com.izouma.walkchina.exception.ServiceException;
 import com.izouma.walkchina.repo.UserInfoRepository;
 import com.izouma.walkchina.service.UserInfoService;
+import com.izouma.walkchina.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
 import org.springframework.data.domain.PageRequest;
@@ -85,4 +86,12 @@ public class UserInfoController {
         return Result.ok();
     }
 
+    @GetMapping("/walkStats")
+    public Result walkStats(Long userId) {
+        if (userId == null) {
+            UserInfo userInfo = SecurityUtils.getAuthenticatedUser();
+            userId = userInfo.getId();
+        }
+        return Result.ok(userInfoService.getUserWalkStats(userId));
+    }
 }

+ 7 - 0
src/test/java/com/izouma/walkchina/CommonTest.java

@@ -1,6 +1,7 @@
 package com.izouma.walkchina;
 
 import com.izouma.walkchina.utils.ImageUtils;
+import org.apache.commons.lang3.time.DateUtils;
 import org.joda.time.Days;
 import org.joda.time.LocalDate;
 import org.junit.Test;
@@ -37,4 +38,10 @@ public class CommonTest {
         System.out.println(message);
         System.out.println(String.format("%.2f", BigDecimal.valueOf(1.11111)));
     }
+
+    @Test
+    public void a() {
+        System.out.println(Days.daysBetween(LocalDate.fromDateFields(new Date()),
+                LocalDate.fromDateFields(DateUtils.addDays(new Date(), -2))).getDays());
+    }
 }