Browse Source

2019/07/30

x1ongzhu 6 years ago
parent
commit
5dccc70cb1

+ 12 - 11
src/main/java/com/izouma/walkchina/constant/Strings.java

@@ -1,21 +1,22 @@
 package com.izouma.walkchina.constant;
 package com.izouma.walkchina.constant;
 
 
 public interface Strings {
 public interface Strings {
-    String MSG_JOURNEY_PROGRESS = "你正在从 %s 向 %s 前进,你今日步数%s步,已行走%s天,共%d步,已完成进度%d%%";
+    String MSG_JOURNEY_PROGRESS = "你正在从 <b>%s</b> 向 <b>%s</b> 前进," +
+            "你今日步数<span style=\"color:#FF9500;font-weight:bold\">%s</span>步," +
+            "已行走<span style=\"color:#FF9500;font-weight:bold\">%s</span>天," +
+            "共<span style=\"color:#FF9500;font-weight:bold\">%d</span>步," +
+            "已完成进度<span style=\"color:#FF9500;font-weight:bold\">%d%%</span>";
 
 
-    String MSG_HIRE = "你使用%.2f商城币雇佣了%s";
+    String MSG_HIRED = "%s使用<span style=\"color:#FF9500;font-weight:bold\">%.2f</span>商城币雇佣了你";
 
 
-    String MSG_HIRED = "%s使用%.2f商城币雇佣了你";
+    String MSG_MEMBER_GRABBED = "你的队员<span style=\"color:#FF9500;font-weight:bold\">%s</span>," +
+            "被<span style=\"color:#FF9500;font-weight:bold\">%s</span>抢走了";
 
 
-    String MSG_MEMBER_GRABBED = "你的队员%s,被%s抢走了";
+    String MSG_AWARD_STOLEN = "<span style=\"color:#FF9500;font-weight:bold\">%s</span>" +
+            "偷了你<span style=\"color:#FF9500;font-weight:bold\">%s</span>商城币";
 
 
-    String MSG_RECEIVE_STAGE_AWARD = "你领取了%s商城币";
-
-    String MSG_STEAL_AWARD = "你偷了%s%s商城币";
-
-    String MSG_AWARD_STOLEN = "%s偷了你%s商城币";
-
-    String MSG_BE_REWARD = "%s打赏了你%s商城币";
+    String MSG_BE_REWARD = "<span style=\"color:#FF9500;font-weight:bold\">%s</span>" +
+            "打赏了你<span style=\"color:#FF9500;font-weight:bold\">%s</span>商城币";
 
 
     String REMARK_HIRE = "雇佣队员";
     String REMARK_HIRE = "雇佣队员";
 
 

+ 2 - 0
src/main/java/com/izouma/walkchina/domain/Message.java

@@ -31,6 +31,8 @@ public class Message {
 
 
     private Long userId;
     private Long userId;
 
 
+    @Lob
+    @Column(length = 100000)
     private String content;
     private String content;
 
 
     @Builder.Default
     @Builder.Default

+ 19 - 0
src/main/java/com/izouma/walkchina/dto/RankInfo.java

@@ -0,0 +1,19 @@
+package com.izouma.walkchina.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class RankInfo {
+
+    private Long   userId;
+    private String nickname;
+    private String avatar;
+    private int    walkCities;
+    private int    level;
+}

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

@@ -12,7 +12,7 @@ public interface TeamMemberRepository extends JpaRepository<TeamMember, Long> {
 
 
     @Query("select t from TeamMember t where t.userId = ?1 " +
     @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")
             "and ((t.startDate <= ?2 and t.endDate >= ?2) or t.startDate > ?2) order by t.startDate desc")
-    TeamMember findActive(Long userId, Date date);
+    TeamMember findCurrent(Long userId, Date date);
 
 
     @Query("select new com.izouma.walkchina.dto.UserDTO(t.userId, u.nickname, u.avatar, u.totalSteps) " +
     @Query("select new com.izouma.walkchina.dto.UserDTO(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")
             "from TeamMember t join UserInfo u on u.id = t.userId where t.leader = ?1 and t.grabbed = 0")

+ 7 - 0
src/main/java/com/izouma/walkchina/repo/UserInfoRepository.java

@@ -1,6 +1,7 @@
 package com.izouma.walkchina.repo;
 package com.izouma.walkchina.repo;
 
 
 import com.izouma.walkchina.domain.UserInfo;
 import com.izouma.walkchina.domain.UserInfo;
+import com.izouma.walkchina.dto.RankInfo;
 import com.izouma.walkchina.dto.UserMarker;
 import com.izouma.walkchina.dto.UserMarker;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -18,4 +19,10 @@ public interface UserInfoRepository extends JpaRepository<UserInfo, Long>, JpaSp
     @Query("select new com.izouma.walkchina.dto.UserMarker(u.id, u.nickname, u.latitude, u.longitude) from UserInfo u " +
     @Query("select new com.izouma.walkchina.dto.UserMarker(u.id, u.nickname, u.latitude, u.longitude) from UserInfo u " +
             "where u.latitude > ?2 and u.latitude < ?4 and u.longitude > ?3 and u.longitude < ?5 and u.id <> ?1")
             "where u.latitude > ?2 and u.latitude < ?4 and u.longitude > ?3 and u.longitude < ?5 and u.id <> ?1")
     List<UserMarker> findInRegion(Long userId, double lat1, double lng1, double lat2, double lng2);
     List<UserMarker> findInRegion(Long userId, double lat1, double lng1, double lat2, double lng2);
+
+    @Query("select new com.izouma.walkchina.dto.RankInfo(u.id, u.nickname, u.avatar, u.walkCities, u.level) from UserInfo u " +
+            "where u.id in " +
+            "(select f.friendId from FriendInfo f where f.userId = ?1) or u.id = ?1 " +
+            "order by u.totalSteps desc")
+    List<RankInfo> findFriendByRank(Long userId);
 }
 }

+ 0 - 16
src/main/java/com/izouma/walkchina/service/AwardService.java

@@ -64,14 +64,6 @@ public class AwardService {
                     .remark(Strings.REMARK_RECEIVE_STAGE_AWARD)
                     .remark(Strings.REMARK_RECEIVE_STAGE_AWARD)
                     .type(AppConstants.CoinRecordType.STAGE)
                     .type(AppConstants.CoinRecordType.STAGE)
                     .build());
                     .build());
-
-            Message msg = Message.builder()
-                    .userId(userId)
-                    .content(String.format(Strings.MSG_RECEIVE_STAGE_AWARD, stageAward.getCoin()))
-                    .isRead(false)
-                    .active(true)
-                    .build();
-            messageRepository.save(msg);
         } else {
         } else {
             userCoinRecordRepository.save(UserCoinRecord.builder()
             userCoinRecordRepository.save(UserCoinRecord.builder()
                     .userId(receiver.getId())
                     .userId(receiver.getId())
@@ -81,14 +73,6 @@ public class AwardService {
                     .type(AppConstants.CoinRecordType.STEAL)
                     .type(AppConstants.CoinRecordType.STEAL)
                     .build());
                     .build());
 
 
-            Message stealMsg = Message.builder()
-                    .userId(userId)
-                    .content(String.format(Strings.MSG_STEAL_AWARD, owner.getNickname(), stageAward.getCoin()))
-                    .isRead(false)
-                    .active(true)
-                    .build();
-            messageRepository.save(stealMsg);
-
             Message stolenMsg = Message.builder()
             Message stolenMsg = Message.builder()
                     .userId(stageAward.getUserId())
                     .userId(stageAward.getUserId())
                     .content(String.format(Strings.MSG_AWARD_STOLEN, receiver.getNickname(), stageAward.getCoin()))
                     .content(String.format(Strings.MSG_AWARD_STOLEN, receiver.getNickname(), stageAward.getCoin()))

+ 30 - 0
src/main/java/com/izouma/walkchina/service/FriendInfoService.java

@@ -0,0 +1,30 @@
+package com.izouma.walkchina.service;
+
+import com.izouma.walkchina.domain.FriendInfo;
+import com.izouma.walkchina.repo.FriendInfoRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class FriendInfoService {
+
+    @Autowired
+    private FriendInfoRepository friendInfoRepository;
+
+    public void saveFriend(Long userId1, Long userId2) {
+        try {
+            friendInfoRepository.save(FriendInfo.builder()
+                    .userId(userId1)
+                    .friendId(userId2).build());
+        } catch (Exception ignored) {
+        }
+        try {
+            friendInfoRepository.save(FriendInfo.builder()
+                    .userId(userId2)
+                    .friendId(userId1).build());
+        } catch (Exception ignored) {
+        }
+    }
+}

+ 11 - 13
src/main/java/com/izouma/walkchina/service/JourneyService.java

@@ -157,19 +157,17 @@ public class JourneyService {
         latestStage.setProgress(progress);
         latestStage.setProgress(progress);
         journeyStageRepository.save(latestStage);
         journeyStageRepository.save(latestStage);
 
 
-        if (progress == 1) {
-            Message msg = Message.builder()
-                    .userId(userId)
-                    .content(String.format(Strings.MSG_JOURNEY_PROGRESS,
-                            latestStage.getOrigin().getName(),
-                            latestStage.getDestination().getName(),
-                            (todayWalkData != null ? todayWalkData.getSteps() : 0),
-                            calcDays(latestStage.getCreatedAt(), new Date()),
-                            steps,
-                            Math.round(progress * 100)))
-                    .build();
-            messageRepository.save(msg);
-        }
+        Message msg = Message.builder()
+                .userId(userId)
+                .content(String.format(Strings.MSG_JOURNEY_PROGRESS,
+                        latestStage.getOrigin().getName(),
+                        latestStage.getDestination().getName(),
+                        (todayWalkData != null ? todayWalkData.getSteps() : 0),
+                        calcDays(latestStage.getCreatedAt(), new Date()),
+                        steps,
+                        Math.round(progress * 100)))
+                .build();
+        messageRepository.save(msg);
     }
     }
 
 
     private int calcDays(Date start, Date end) {
     private int calcDays(Date start, Date end) {

+ 31 - 4
src/main/java/com/izouma/walkchina/service/TeamService.java

@@ -58,7 +58,7 @@ public class TeamService {
         Date now = new Date();
         Date now = new Date();
         UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
         UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
         UserInfo targetUserInfo = userInfoRepository.findById(target).orElseThrow(new ServiceException("用户不存在"));
         UserInfo targetUserInfo = userInfoRepository.findById(target).orElseThrow(new ServiceException("用户不存在"));
-        TeamMember teamMember = teamMemberRepository.findActive(target, now);
+        TeamMember teamMember = teamMemberRepository.findCurrent(target, now);
         if (teamMember != null) {
         if (teamMember != null) {
             if (teamMember.getLeader().equals(userId)) {
             if (teamMember.getLeader().equals(userId)) {
                 throw new ServiceException("Ta已经是你的队员");
                 throw new ServiceException("Ta已经是你的队员");
@@ -89,8 +89,7 @@ public class TeamService {
             throw new ServiceException("雇佣失败,商城币不足");
             throw new ServiceException("雇佣失败,商城币不足");
         }
         }
 
 
-        coinService.balanceChange(userInfo, price.negate(), AppConstants.CoinRecordType.HIRE, Strings.REMARK_HIRE,
-                String.format(Strings.MSG_HIRE, price, targetUserInfo.getNickname()));
+        coinService.balanceChange(userInfo, price.negate(), AppConstants.CoinRecordType.HIRE, Strings.REMARK_HIRE, null);
 
 
         coinService.balanceChange(targetUserInfo, price, AppConstants.CoinRecordType.BE_HIRED, Strings.REMARK_BE_HIRED,
         coinService.balanceChange(targetUserInfo, price, AppConstants.CoinRecordType.BE_HIRED, Strings.REMARK_BE_HIRED,
                 String.format(Strings.MSG_HIRED, userInfo.getNickname(), price));
                 String.format(Strings.MSG_HIRED, userInfo.getNickname(), price));
@@ -111,7 +110,7 @@ public class TeamService {
             return false;
             return false;
         }
         }
         Date now = new Date();
         Date now = new Date();
-        TeamMember teamMember = teamMemberRepository.findActive(target, now);
+        TeamMember teamMember = teamMemberRepository.findCurrent(target, now);
         if (teamMember != null) {
         if (teamMember != null) {
             return !teamMember.getLeader().equals(userId);
             return !teamMember.getLeader().equals(userId);
         }
         }
@@ -237,4 +236,32 @@ public class TeamService {
                 null, formId, templateData, null);
                 null, formId, templateData, null);
         wxMaService.getMsgService().sendTemplateMsg(msg);
         wxMaService.getMsgService().sendTemplateMsg(msg);
     }
     }
+
+    public void recruit(Long userId, Long target) {
+        Date now = new Date();
+        UserInfo userInfo = userInfoRepository.findById(userId).orElseThrow(new ServiceException("用户不存在"));
+        UserInfo targetUserInfo = userInfoRepository.findById(target).orElseThrow(new ServiceException("用户不存在"));
+        TeamMember teamMember = teamMemberRepository.findCurrent(target, now);
+        if (teamMember != null) {
+            return;
+        }
+
+        BigDecimal price = BigDecimal.valueOf(Optional.ofNullable(targetUserInfo.getTotalSteps()).orElse(0L))
+                .multiply(BigDecimal.valueOf(AppConstants.HIRE_PRICE_RATE))
+                .setScale(1, RoundingMode.FLOOR);
+
+        if (price.compareTo(BigDecimal.ZERO) > 0) {
+            return;
+        }
+
+        TeamMember newTeamMember = TeamMember.builder()
+                .userId(target)
+                .leader(userId)
+                .hireDate(now)
+                .startDate(DateUtils.addDays(now, 1))
+                .endDate(AppConstants.FOREVER)
+                .active(true)
+                .build();
+        teamMemberRepository.save(newTeamMember);
+    }
 }
 }

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

@@ -6,6 +6,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import com.izouma.walkchina.constant.AppConstants;
 import com.izouma.walkchina.constant.AppConstants;
 import com.izouma.walkchina.domain.FriendInfo;
 import com.izouma.walkchina.domain.FriendInfo;
 import com.izouma.walkchina.domain.UserInfo;
 import com.izouma.walkchina.domain.UserInfo;
+import com.izouma.walkchina.dto.RankInfo;
 import com.izouma.walkchina.dto.UserWalkStats;
 import com.izouma.walkchina.dto.UserWalkStats;
 import com.izouma.walkchina.exception.ServiceException;
 import com.izouma.walkchina.exception.ServiceException;
 import com.izouma.walkchina.repo.FriendInfoRepository;
 import com.izouma.walkchina.repo.FriendInfoRepository;
@@ -23,6 +24,7 @@ import org.springframework.stereotype.Service;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Date;
+import java.util.List;
 import java.util.UUID;
 import java.util.UUID;
 
 
 
 
@@ -39,6 +41,10 @@ public class UserInfoService implements UserDetailsService {
     private FriendInfoRepository friendInfoRepository;
     private FriendInfoRepository friendInfoRepository;
     @Autowired
     @Autowired
     private WalkDataRepository   walkDataRepository;
     private WalkDataRepository   walkDataRepository;
+    @Autowired
+    private FriendInfoService    friendInfoService;
+    @Autowired
+    private TeamService          teamService;
 
 
     @Override
     @Override
     public UserInfo loadUserByUsername(String username) {
     public UserInfo loadUserByUsername(String username) {
@@ -184,4 +190,15 @@ public class UserInfoService implements UserDetailsService {
                 .teamSteps(walkDataRepository.sumTeamWalkSteps(userId, now, now).orElse(0L))
                 .teamSteps(walkDataRepository.sumTeamWalkSteps(userId, now, now).orElse(0L))
                 .build();
                 .build();
     }
     }
+
+    public void acceptInvite(Long userId, Long inviter, boolean recruit) {
+        friendInfoService.saveFriend(userId, inviter);
+        if (recruit) {
+            teamService.recruit(inviter, userId);
+        }
+    }
+
+    public List<RankInfo> friendRank(Long userId) {
+        return userInfoRepository.findFriendByRank(userId);
+    }
 }
 }

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

@@ -94,4 +94,15 @@ public class UserInfoController {
         }
         }
         return Result.ok(userInfoService.getUserWalkStats(userId));
         return Result.ok(userInfoService.getUserWalkStats(userId));
     }
     }
+
+    @GetMapping("/acceptInvite")
+    public Result acceptInvite(@RequestParam("inviter") Long inviter, @RequestParam(value = "recruit", required = false, defaultValue = "false") boolean recruit) {
+        userInfoService.acceptInvite(SecurityUtils.getAuthenticatedUser().getId(), inviter, recruit);
+        return Result.ok();
+    }
+
+    @GetMapping("/friendRank")
+    public Result friendRank() {
+        return Result.ok(userInfoService.friendRank(SecurityUtils.getAuthenticatedUser().getId()));
+    }
 }
 }

+ 3 - 0
src/main/resources/application.yaml

@@ -29,6 +29,9 @@ spring:
     multipart:
     multipart:
       max_file_size: 100MB
       max_file_size: 100MB
       max_request_size: 100MB
       max_request_size: 100MB
+  jackson:
+    serialization:
+      write-dates-as-timestamps: true
 jwt:
 jwt:
   secret: XvAD0kboD76Dpebm
   secret: XvAD0kboD76Dpebm
 wx:
 wx: