slambb пре 4 година
родитељ
комит
abf1c7987a

+ 162 - 12
src/main/java/com/YuyeTech/TPlat/controller/UserInfoController.java

@@ -3,7 +3,9 @@ package com.YuyeTech.TPlat.controller;
 import com.YuyeTech.TPlat.VO.FriendInfoVO;
 import com.YuyeTech.TPlat.dataobject.*;
 import com.YuyeTech.TPlat.dto.FriendInfoDTO;
+import com.YuyeTech.TPlat.dto.SignInDTO;
 import com.YuyeTech.TPlat.dto.UserDTO;
+import com.YuyeTech.TPlat.enums.ResultEnum;
 import com.YuyeTech.TPlat.enums.UserEnum;
 import com.YuyeTech.TPlat.exception.UserException;
 import com.YuyeTech.TPlat.service.*;
@@ -30,6 +32,10 @@ import javax.validation.Valid;
 import java.io.File;
 import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -63,6 +69,9 @@ public class UserInfoController {
     @Autowired
     private UserWalletsService userWalletsService;
 
+    @Autowired
+    private SignInService signInService;
+
 
     @Value("${RSA.friendId.publicKey}")
     private String friendIdPublicKey;
@@ -496,17 +505,17 @@ public class UserInfoController {
                 ex.printStackTrace();
             }
             return new FriendInfoDTO(
-                        e.getUsername(),
-                        e.getGender(),
-                        e.getSignature(),
-                        aliyunOSSUtil.addDomainName(e.getAvatarUrl()),
-                        e.getCityCode(),
-                        e.getHeight(),
-                        e.getWeight(),
-                        e.getBirthday(),
-                        friendInfo != null ? true : false,
-                        encodedData
-                );
+                    e.getUsername(),
+                    e.getGender(),
+                    e.getSignature(),
+                    aliyunOSSUtil.addDomainName(e.getAvatarUrl()),
+                    e.getCityCode(),
+                    e.getHeight(),
+                    e.getWeight(),
+                    e.getBirthday(),
+                    friendInfo != null ? true : false,
+                    encodedData
+            );
         }).collect(Collectors.toList());
         //处理关注状态。比如已关注之类的
 
@@ -584,7 +593,7 @@ public class UserInfoController {
 
         try {
 //            friendInfoService.deleteById(id);
-            friendInfoService.deleteFriendInfo(userId,RSAUtils.privateDecrypt(friendRSA, RSAUtils.getPrivateKey(friendIdPrivateKey)));
+            friendInfoService.deleteFriendInfo(userId, RSAUtils.privateDecrypt(friendRSA, RSAUtils.getPrivateKey(friendIdPrivateKey)));
             Map tempMap = new HashMap();
             tempMap.put("isFriend", false);
             tempMap.put("msg", "已删除好友信息");
@@ -615,4 +624,145 @@ public class UserInfoController {
 
     }
 
+    /**
+     * 签到部分,获取已经签到的列表
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("/get_sign_in_list")
+    public ResultVO getSignInList(@RequestParam(value = "userId") String userId) {
+        Boolean isNewList = true;
+        Boolean isSignIn = false;
+        SignIn signIn = signInService.findByUserId(userId);
+        List<SignInDTO> list = new ArrayList<>(7);
+        Integer _filterDay = 7;
+        List<SignInReward> signInRewards = signInService.getSignInRewardList().stream().filter(e -> e.getDays() <= _filterDay).collect(Collectors.toList());
+        //如果没有对象,或者对应对象时间为0
+        if (null != signIn) {
+            Integer continueDays = signIn.getContinueDays();
+            // 判断最后签到日期与当前日期是否超过一天
+            LocalDate signInTime = signIn.getUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            LocalDate currTime = LocalDate.now();
+            long daysDiff = ChronoUnit.DAYS.between(signInTime, currTime);
+            if (daysDiff > 1) {
+                // 超过一天, 把连续签到的天数重置为 0,并记录到数据库,
+                // 这一步是重置数据操作
+                signIn.setContinueDays(0);
+                signIn.setUpdateTime(new Date());
+                signInService.addSignIn(signIn);
+            } else {
+                //如果小于或者等于0,判断为当天为签到
+                if(daysDiff <=0){
+                    isSignIn = true;
+                }
+
+                if (continueDays > 7) {
+                    //不是默认的list
+                    isNewList = false;
+                    Integer currentDays = continueDays % _filterDay;
+                    currentDays = currentDays == 0 ? _filterDay : currentDays;
+                    Integer extraDays = continueDays / _filterDay;
+                    for (int i = 0; i < signInRewards.size(); i++) {
+                        SignInReward temp = signInRewards.get(i);
+                        if (i < currentDays) {
+                            list.add(new SignInDTO(i + 1 + extraDays * signInRewards.size(), temp.getDays(), 1, temp.getGold(), temp.getDiamond()));
+                        } else {
+                            list.add(new SignInDTO(i + 1 + (extraDays - 1) * signInRewards.size(), temp.getDays(), 0, temp.getGold(), temp.getDiamond()));
+                        }
+                    }
+                }
+            }
+        }
+        /**
+         * isNewList 的情况下,continueDays 是小于7的。此时处理flag不需要考虑往后的数值
+         */
+        if (isNewList) {
+            Integer continueDays = 0;
+            if (null != signIn) {
+                continueDays = signIn.getContinueDays();
+            }
+            // 没有签过到
+            for (int i = 0; i < signInRewards.size(); i++) {
+                SignInReward temp = signInRewards.get(i);
+                list.add(new SignInDTO(i + 1, temp.getDays(), i < continueDays ? 1 : 0, temp.getGold(), temp.getDiamond()));
+            }
+        }
+
+        Collections.sort(list, new Comparator<SignInDTO>() {
+            @Override
+            public int compare(SignInDTO u1, SignInDTO u2) {
+                int diff = u1.getDayType() - u2.getDayType();
+                if (diff > 0) {
+                    return 1;
+                } else if (diff < 0) {
+                    return -1;
+                }
+                return 0; //相等为0
+            }
+        }); // 按天数排序
+        Map map = new HashMap();
+        map.put("signInList",list);
+        map.put("isSignIn",isSignIn);
+        return ResultVOUtil.success(map);
+
+    }
+
+
+    @GetMapping("/user_sign_in")
+    @Transactional(rollbackFor = Exception.class)
+    public ResultVO setUserSignIn(@RequestParam(value = "userId") String userId) {
+
+        SignIn signIn = signInService.findByUserId(userId);
+
+        if (null == signIn) {
+            signIn = new SignIn();
+            signIn.setUserId(userId);
+            signIn.setContinueDays(1);
+            signIn.setUpdateTime(new Date());
+            signInService.addSignIn(signIn);
+        } else {/*签过到*/
+            // 判断最后签到日期与当前日期是否超过一天
+            LocalDate signInTime = signIn.getUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            LocalDate currTime = LocalDate.now();
+            long daysDiff = ChronoUnit.DAYS.between(signInTime, currTime);
+            if (daysDiff <= 0) {
+                return ResultVOUtil.error(ResultEnum.SIGN_IN_REPEAT.getCode(), ResultEnum.SIGN_IN_REPEAT.getMessage());
+            }
+            if (daysDiff > 1) {
+                // 1, 超过一天, 把连续签到的天数重置为 1
+                signIn.setContinueDays(1);
+            } else {
+                // 2, 没有超过一天, 把连续签到的天数+1
+                signIn.setContinueDays(signIn.getContinueDays() + 1);
+            }
+            signIn.setUpdateTime(new Date());
+            signInService.addSignIn(signIn);
+
+
+        }
+
+        /**
+         * 根据当前签到的天数,返回对应的奖励,奖励由数据库定义
+         */
+        Integer currentDays = signIn.getContinueDays() % 7;
+        currentDays = currentDays == 0 ? 7 : currentDays;
+        SignInReward signInReward = signInService.getSignInRewardByDays(currentDays);
+        SignInDTO signInDTO = new SignInDTO();
+        signInDTO.setDayType(currentDays);
+        signInDTO.setDay(signIn.getContinueDays());
+        signInDTO.setFlag(1);
+        signInDTO.setGold(signInReward.getGold());
+        signInDTO.setDiamond(signInReward.getDiamond());
+
+        //todo 奖励用户相应信息
+        UserWallets userWallets = userWalletsService.modifyGoldAndDiamondInUserWallets(userId, signInReward.getGold(), signInReward.getDiamond(), true);
+        Map map = new HashMap();
+        map.put("signIn", signInDTO);
+        map.put("userGold", userWallets.getGold());
+        map.put("userDiamond", userWallets.getDiamond());
+        return ResultVOUtil.success(map);
+
+    }
+
 }

+ 28 - 0
src/main/java/com/YuyeTech/TPlat/dataobject/SignIn.java

@@ -0,0 +1,28 @@
+package com.YuyeTech.TPlat.dataobject;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2021/9/02
+ */
+@Data
+@Entity
+public class SignIn {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    private String userId;
+
+    private Integer continueDays;
+
+    private Date updateTime;
+}

+ 28 - 0
src/main/java/com/YuyeTech/TPlat/dataobject/SignInReward.java

@@ -0,0 +1,28 @@
+package com.YuyeTech.TPlat.dataobject;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.util.Date;
+
+/**
+ * @author:slambb
+ * @date:2021/9/02
+ */
+@Data
+@Entity
+public class SignInReward {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Integer id;
+
+    private Integer days;
+
+    private Integer gold;
+
+    private Integer diamond;
+}

+ 36 - 0
src/main/java/com/YuyeTech/TPlat/dto/SignInDTO.java

@@ -0,0 +1,36 @@
+package com.YuyeTech.TPlat.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author:slambb
+ * @date:2020/9/01
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class SignInDTO implements Serializable {
+    /**
+     * 表示签到的天数
+     */
+    private Integer day;
+
+    /**
+     * 当天天数类型,1,2,3...
+     */
+    private Integer dayType;
+
+    /**
+     * 1表示已经签到, 0表示未签到
+     */
+    private Integer flag;
+
+    // 如果还有其他业务字段就加在后面, 如积分, 如金币
+
+    private Integer gold;
+    private Integer diamond;
+}

+ 3 - 0
src/main/java/com/YuyeTech/TPlat/enums/ResultEnum.java

@@ -47,6 +47,9 @@ public enum ResultEnum {
     ASSOCIATED_LEVEL_NO_UNLOCKED(803,"关联关卡没有解锁或者limitLevel未设置"),
     OTHER_LEVEL_NO_UNLOCKED(804,"todo其他关卡解锁失败操作"),
     MUST_PASS_FIRST_LEVEL(805,"先通过第一个关卡"),
+
+    //signIn
+    SIGN_IN_REPEAT(901,"重复签到"),
     ;
     private Integer code;
 

+ 16 - 0
src/main/java/com/YuyeTech/TPlat/repository/SignInRepository.java

@@ -0,0 +1,16 @@
+package com.YuyeTech.TPlat.repository;
+
+import com.YuyeTech.TPlat.dataobject.SignIn;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+/**
+ * @author:slambb
+ * @date:2021/8/5
+ */
+public interface SignInRepository extends JpaRepository<SignIn,Integer> {
+
+    Optional<SignIn> findByUserId(String userId);
+
+}

+ 15 - 0
src/main/java/com/YuyeTech/TPlat/repository/SignInRewardRepository.java

@@ -0,0 +1,15 @@
+package com.YuyeTech.TPlat.repository;
+
+import com.YuyeTech.TPlat.dataobject.SignInReward;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.Optional;
+
+
+/**
+ * @author:slambb
+ * @date:2021/8/5
+ */
+public interface SignInRewardRepository extends JpaRepository<SignInReward,Integer> {
+    Optional<SignInReward>  findByDays(Integer days);
+}

+ 22 - 0
src/main/java/com/YuyeTech/TPlat/service/SignInService.java

@@ -0,0 +1,22 @@
+package com.YuyeTech.TPlat.service;
+
+import com.YuyeTech.TPlat.dataobject.SignIn;
+import com.YuyeTech.TPlat.dataobject.SignInReward;
+import com.YuyeTech.TPlat.dataobject.UserWallets;
+
+import java.util.List;
+
+/**
+ * @author:slambb
+ * @date:2021/8/5
+ */
+public interface SignInService {
+
+   SignIn findByUserId(String userId);
+
+   void addSignIn(SignIn signIn);
+
+   SignInReward getSignInRewardByDays(Integer days);
+
+   List<SignInReward> getSignInRewardList();
+}

+ 59 - 0
src/main/java/com/YuyeTech/TPlat/service/impl/SignInServiceImpl.java

@@ -0,0 +1,59 @@
+package com.YuyeTech.TPlat.service.impl;
+
+import com.YuyeTech.TPlat.dataobject.SignIn;
+import com.YuyeTech.TPlat.dataobject.SignInReward;
+import com.YuyeTech.TPlat.dataobject.UserWallets;
+import com.YuyeTech.TPlat.enums.ResultEnum;
+import com.YuyeTech.TPlat.exception.UserException;
+import com.YuyeTech.TPlat.repository.SignInRepository;
+import com.YuyeTech.TPlat.repository.SignInRewardRepository;
+import com.YuyeTech.TPlat.repository.UserWalletsRepository;
+import com.YuyeTech.TPlat.service.SignInService;
+import com.YuyeTech.TPlat.service.UserWalletsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.redis.connection.SortParameters;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 用户信息
+ *
+ * @author:slambb
+ * @date:2021/8/5
+ */
+@Service
+public class SignInServiceImpl implements SignInService {
+
+    @Autowired
+    private SignInRepository signInRepository;
+
+    @Autowired
+    private SignInRewardRepository signInRewardRepository;
+
+    @Override
+    public SignIn findByUserId(String userId) {
+        return signInRepository.findByUserId(userId).orElse(null);
+    }
+
+    @Override
+    public void addSignIn(SignIn signIn) {
+        signInRepository.save(signIn);
+    }
+
+
+    @Override
+    public SignInReward getSignInRewardByDays(Integer days) {
+        return signInRewardRepository.findByDays(days).orElse(null);
+    }
+
+    @Override
+    public List<SignInReward> getSignInRewardList() {
+        return signInRewardRepository.findAll(Sort.by(Sort.Direction.ASC,"days"));
+    }
+}
+