From 0c51a577db337520452022d9d6a22b720ef858d4 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期二, 31 十二月 2024 14:13:01 +0800
Subject: [PATCH] 全部代码、数据库提交

---
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java |  935 +++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 575 insertions(+), 360 deletions(-)

diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java
index 82ea0cb..64a35c5 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java
@@ -6,23 +6,30 @@
 import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xinquan.common.core.constant.CacheConstants;
 import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.exception.ServiceException;
 import com.xinquan.common.core.utils.WebUtils;
 import com.xinquan.common.core.utils.page.BeanUtils;
 import com.xinquan.common.core.utils.page.CollUtils;
 import com.xinquan.common.core.utils.page.PageDTO;
 import com.xinquan.common.core.web.domain.BaseModel;
+import com.xinquan.common.redis.service.RedisService;
 import com.xinquan.common.security.service.TokenService;
 import com.xinquan.common.security.utils.SecurityUtils;
 import com.xinquan.course.api.domain.Course;
 import com.xinquan.course.api.domain.CourseCategory;
 import com.xinquan.course.api.domain.CourseDTO;
+import com.xinquan.course.api.domain.OrderCourseVO;
+import com.xinquan.meditation.api.domain.Meditation;
 import com.xinquan.order.api.feign.RemoteOrderService;
 import com.xinquan.system.api.RemoteBannerService;
 import com.xinquan.system.api.RemoteUserService;
 import com.xinquan.system.api.domain.*;
 import com.xinquan.system.api.domain.vo.*;
+import com.xinquan.system.api.feignClient.SysUserClient;
 import com.xinquan.system.api.model.LoginUser;
 import com.xinquan.user.api.domain.dto.AppUserManagementDTO;
 import com.xinquan.user.api.domain.dto.OrderListDTO;
@@ -52,9 +59,11 @@
 import java.time.LocalDateTime;
 import java.time.Month;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import io.swagger.models.auth.In;
 import lombok.RequiredArgsConstructor;
@@ -113,7 +122,189 @@
     private RemoteOrderService remoteOrderService;
     @Resource
     private RemoteUserService remoteUserService;
+    @Resource
+    private NoticeRecordService noticeRecordService;
+    @Resource
+    private AppUserBlackService appUserBlackService;
 
+    /**
+     * 远程调用 查询当前登陆人拉黑列表
+     * @param appUserId
+     */
+    @PostMapping("/getUserBlackList/{appUserId}")
+    public R<List<Long>> getUserBlackList(@PathVariable("appUserId") Long appUserId){
+        List<Long> collect = appUserBlackService.lambdaQuery().eq(AppUserBlack::getAppUserId, appUserId).list()
+                .stream().map(AppUserBlack::getBlackId).collect(Collectors.toList());
+        return R.ok(collect);
+    }
+    @PostMapping("/blackUser")
+    @ApiOperation(value = "取消拉黑功能", tags = "IOS拉黑列表--用于上架")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "被拉黑用户id", name = "appUserId", required = true, dataType = "Long"),
+    })
+    public R blackUser(Long appUserId) {
+        LoginUser loginUser = tokenService.getLoginUser();
+        if (loginUser==null){
+            return R.tokenError("登录失效");
+        }
+        AppUserBlack one = appUserBlackService.lambdaQuery().eq(AppUserBlack::getAppUserId, loginUser.getAppUserId())
+                .eq(AppUserBlack::getBlackId, appUserId).one();
+        if (one==null){
+            // 拉黑
+            AppUserBlack appUserBlack = new AppUserBlack();
+            appUserBlack.setAppUserId(loginUser.getAppUserId());
+            appUserBlack.setBlackId(appUserId);
+            appUserBlackService.save(appUserBlack);
+        }else {
+            // 取消拉黑
+            appUserBlackService.removeById(one.getId());
+        }
+        return R.ok();
+    }
+    @GetMapping("/blackList")
+    @ApiOperation(value = "IOS拉黑列表", tags = "IOS拉黑列表--用于上架")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
+            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
+    })
+    public R<PageDTO<AppUser>> blackList(Integer pageCurr, Integer pageSize) {
+        LoginUser loginUser = tokenService.getLoginUser();
+        if (loginUser==null){
+            return R.tokenError("登录失效");
+        }
+        List<Long> collect = appUserBlackService.lambdaQuery().eq(AppUserBlack::getAppUserId, loginUser.getAppUserId()).list()
+                .stream().map(AppUserBlack::getBlackId).collect(Collectors.toList());
+        if (collect.isEmpty()){
+            collect.add(-1L);
+        }
+        Page<AppUser> page = appUserService.lambdaQuery().in(AppUser::getId, collect).page(new Page<>(pageCurr, pageSize));
+        if (CollUtils.isEmpty(page.getRecords())){
+            PageDTO<AppUser> empty = PageDTO.empty(page);
+            return R.ok(empty);
+        }
+        return R.ok(PageDTO.of(page, AppUser.class));
+    }
+
+    @PostMapping("/subVipExpireTime/{appUserId}/{type}")
+    public void subVipExpireTime(@PathVariable("appUserId") Long appUserId,@PathVariable("type") Integer type){
+        AppUser byId = appUserService.getById(appUserId);
+        switch (type){
+            case 1:
+                LocalDateTime localDateTime = byId.getVipExpireTime().minusDays(30);
+                byId.setVipExpireTime(localDateTime);
+                break;
+            case 2:
+                LocalDateTime localDateTime1 = byId.getVipExpireTime().minusDays(90);
+                byId.setVipExpireTime(localDateTime1);
+                break;
+            case 3:
+                LocalDateTime localDateTime2 = byId.getVipExpireTime().minusDays(365);
+                byId.setVipExpireTime(localDateTime2);
+                break;
+        }
+        appUserService.updateById(byId);
+    }
+    @ApiOperation(value = "会员临期", tags = "会员临期")
+    @PostMapping("/testVip")
+    public void testVip() {
+        LocalDateTime now = LocalDateTime.now();
+        List<AppUser> list = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3).list();
+        for (AppUser appUser : list) {
+            if (appUser.getVipExpireTime()!=null && appUser.getVipExpireTime().isAfter(now)){
+                // 计算两个now和time的天数差
+                long between = ChronoUnit.DAYS.between(now,appUser.getVipExpireTime());
+                if (between<=7 &&between>=0){
+                    NoticeRecord noticeRecord = new NoticeRecord();
+                    noticeRecord.setAppUserId(appUser.getId());
+                    noticeRecord.setReadStatus(1);
+                    noticeRecord.setNoticeType(1);
+                    noticeRecord.setTitle("【会员临期通知】");
+                    noticeRecord.setContent("尊敬的泉疗愈会员你好,你的会员即将在"
+                            +appUser.getVipExpireTime().toLocalDate()+"到期,到期后将不再享受会员权益,请及时续费");
+                    noticeRecordService.save(noticeRecord);
+                }
+            }
+
+        }
+    }
+    @GetMapping("/deleteBalance/{id}/{amount}")
+    public R deleteBalance(@PathVariable("id")String id,@PathVariable("amount")String amount) {
+        AppUser byId = appUserService.getById(id);
+        if (byId!=null){
+            BigDecimal subtract = byId.getBalance().subtract(new BigDecimal(amount));
+            if (subtract.compareTo(BigDecimal.ZERO)<0){
+                byId.setBalance(BigDecimal.ZERO);
+            }
+        }
+        return R.ok();
+    }
+    @GetMapping("/testNotice")
+    @ApiOperation(value = "测试通知", tags = "测试通知")
+    public R testNotice() {
+        LocalDateTime now = LocalDateTime.now();
+        List<AppUser> list = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3).list();
+        for (AppUser appUser : list) {
+            if (appUser.getVipExpireTime()!=null && appUser.getVipExpireTime().isAfter(now)){
+                // 计算两个now和time的天数差
+                long between = Math.abs(ChronoUnit.DAYS.between(appUser.getVipExpireTime(), now));
+                if (between<=7){
+                    NoticeRecord noticeRecord = new NoticeRecord();
+                    noticeRecord.setAppUserId(appUser.getId());
+                    noticeRecord.setReadStatus(1);
+                    noticeRecord.setNoticeType(1);
+                    noticeRecord.setTitle("【会员临期通知】");
+                    noticeRecord.setContent("尊敬的泉疗愈会员你好,你的会员即将在"
+                            +appUser.getVipExpireTime().toLocalDate()+"到期,到期后将不再享受会员权益,请及时续费");
+                    noticeRecordService.save(noticeRecord);
+                }
+            }
+            AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, appUser.getId())
+                    .eq(AppUserTree::getSowAgain, 2).one();
+            if(one!=null && (one.getTaskOne()==2||one.getTaskTwo()==2)){
+                NoticeRecord noticeRecord = new NoticeRecord();
+                noticeRecord.setAppUserId(appUser.getId());
+                noticeRecord.setReadStatus(1);
+                noticeRecord.setNoticeType(1);
+                noticeRecord.setTitle("【冥想通知】");
+                noticeRecord.setContent("你今天的冥想任务还未完成,完成冥想后可获得能量值奖励,快去冥想吧!");
+                noticeRecordService.save(noticeRecord);
+            }
+        }
+        return R.ok();
+    }
+
+
+
+    @GetMapping("/getUserByPhone/{phone}")
+    public R<AppUser> getUserByPhone(@PathVariable("phone")String phone) {
+        AppUser one = appUserService.lambdaQuery().eq(AppUser::getCellPhone, phone).ne(AppUser::getUserStatus, 3)
+                .one();
+        return R.ok(one);
+    }
+    @GetMapping("/getAllUserList")
+    public R<List<AppUser>> getAllUserList() {
+        List<AppUser> list = appUserService.list();
+        return R.ok(list);
+    }
+    @PostMapping("/bindVx")
+    @ApiOperation(value = "绑定微信号", tags = "个人中心")
+    public R bindVx(String openId,String wxName) {
+        LoginUser loginUser = tokenService.getLoginUser();
+        if (loginUser==null){
+            return R.tokenError("登录失效");
+        }
+        AppUser byId = appUserService.getById(loginUser.getUserid());
+        AppUser one = appUserService.lambdaQuery().eq(AppUser::getWxOpenId, openId)
+                .isNotNull(AppUser::getCellPhone)
+                .ne(AppUser::getUserStatus, 3).one();
+        if (one!=null){
+            return R.fail("当前微信号已绑定其他账号");
+        }
+        byId.setWxOpenId(openId);
+        byId.setWxName(wxName);
+        appUserService.updateById(byId);
+        return R.ok();
+    }
     public static void main(String[] args) {
         // 获取当前年份
         int currentYear = LocalDate.now().getYear();
@@ -263,105 +454,7 @@
         stringBuilder.append(year);
         return R.ok(stringBuilder.toString());
     }
-//    public static void main(String[] args) {
-//        // 收件人电子邮箱,TODO 换成自己的收件箱
-//        String to = "443237572@qq.com";
-//        // 发件人电子邮箱,TODO 换成自己的发件箱
-//        String from = "13281306557@163.com";
-//        // 指定发送邮件的主机为
-//        String host = "smtp.163.com";
-//        Properties properties = new Properties();
-//        // 设置邮件服务器
-//        properties.setProperty("mail.smtp.host", host);
-//        // 邮件发送协议
-//        properties.setProperty("mail.transport.protocol", "smtp");
-//        //是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
-//        properties.setProperty("mail.debug","true");
-//        properties.setProperty("mail.smtp.auth", "true");
-//        // 获取默认session对象
-//        Session session = Session.getDefaultInstance(properties,new Authenticator(){
-//            @Override
-//            public PasswordAuthentication getPasswordAuthentication()
-//            {
-//                //发件人邮件用户名、授权码,换成自己的发件箱及授权码
-//                return new PasswordAuthentication("13281306557@163.com", "NUSdxDQqadYvVek2");
-//            }
-//        });
-//
-//        try{
-//            // 创建默认的 MimeMessage 对象
-//            MimeMessage message = new MimeMessage(session);
-//            // Set From,设置发件人
-//            InternetAddress fromMail = new InternetAddress(from);
-//            //设置发件人名称,TODO 换成自己的发件箱
-//            fromMail.setPersonal(MimeUtility.encodeText("明星电力<13281306557@163.com>"));
-//            message.setFrom(fromMail);
-//            // Set To: 设置收件人
-//            InternetAddress toMail = new InternetAddress(to);
-//            // TODO 换成自己的收件箱
-//            InternetAddress toMail2 = new InternetAddress("443237572@qq.com");
-//            //发一个邮箱
-////            message.setRecipient(Message.RecipientType.TO, toMail);
-//            //发多个邮箱
-//            Address[] allRecipients = {toMail, toMail2};
-//            message.setRecipients(Message.RecipientType.TO, allRecipients);
-//            // Set Subject: 邮件主体
-//            message.setSubject("明星电力");
-//            // 设置消息体
-//            message.setSentDate(new Date());
-//            // 指定为混合关系
-//            MimeMultipart msgMultipart = new MimeMultipart("mixed");
-//            message.setContent(msgMultipart);
-//            // 邮件信息组装
-//            //组装的顺序非常重要,一定要先组装文本域,再组装文件
-//            MimeBodyPart htmlPart = new MimeBodyPart();
-//            // 组装内容
-//            htmlPart.setContent("This is message content", "text/html;charset=UTF-8");
-//            msgMultipart.addBodyPart(htmlPart);
-//            // 组装附件
-//            MimeBodyPart filePart = new MimeBodyPart();
-//            String imageUrl = "https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/xinquan/b176cf9af35d4773a276e55b7afe3b63.mp4";
-//            try {
-//                // 下载数据
-//                URL url = new URL(imageUrl);
-//                InputStream inputStream = url.openStream();
-//                byte[] imageBytes = IOUtils.toByteArray(inputStream);
-//                // 创建临时文件
-//                // 截取imageUrl后缀名
-//                String fileExtension = imageUrl.substring(imageUrl.lastIndexOf("."));
-//                File tempFile = File.createTempFile("tempImage", fileExtension);
-//                try (FileOutputStream fos = new FileOutputStream(tempFile)) {
-//                    fos.write(imageBytes);
-//                }
-//                // 创建 FileDataSource
-//                FileDataSource fileDataSource = new FileDataSource(tempFile);
-//                System.out.println("FileDataSource created: " + fileDataSource.getName());
-//                // 如果需要,可以使用 DataHandler 进行进一步处理
-//                DataHandler dh = new DataHandler(fileDataSource);
-//                // 清理:删除临时文件(如果不再需要)
-//                 tempFile.deleteOnExit(); // 可根据需要保留或删除
-////                DataHandler dh = new DataHandler(dataSource);
-//                filePart.setDataHandler(dh);
-//                // 附件区别内嵌内容的一个特点是有文件名,为防止中文乱码要编码
-//                filePart.setFileName(MimeUtility.encodeText(dh.getName()));
-//                msgMultipart.addBodyPart(filePart);
-//
-//                message.saveChanges();
-//                //发送
-//                //Transport.send(message, message.getAllRecipients());
-//                Transport.send(message);
-//                System.out.println("Sent mail successfully....");
-//            } catch (Exception e) {
-//                e.printStackTrace();
-//            }
-//            //TODO 换成自己的附件地址
-//
-//        }catch (MessagingException | UnsupportedEncodingException mex) {
-//            mex.printStackTrace();
-//        } catch (Exception e) {
-//            throw new RuntimeException(e);
-//        }
-//    }
+
 
     @PostMapping("/userDetail")
     @ApiOperation(value = "用户详情-基础信息", tags = "管理后台-用户管理")
@@ -375,23 +468,11 @@
         }else{
             byId.setIsVip(1);
         }
-        List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, byId.getId())
-                .list();
-        // 查询用户等级最高的那颗树苗
-        AppUserTree tree = list1.stream().max((o1, o2) -> {
-            if (o1.getTreeLevelType() > o2.getTreeLevelType()) {
-                return 1;
-            } else if (o1.getTreeLevelType() < o2.getTreeLevelType()) {
-                return -1;
-            } else {
-                return 0;
-            }
-        }).orElse(null);
+        AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, uid)
+                .eq(AppUserTree::getSowAgain,2)
+                .one();
         // 查询疗愈等级 名称 图标
-        int level = 1;
-        if (tree != null){
-            level = tree.getTreeLevelType();
-        }
+        int level = list1.getTreeLevelType();
         // 根据等级查询疗愈名称和图标
         UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData();
         byId.setLevel(level);
@@ -424,17 +505,19 @@
             appUserQuestions.add(appUserQuestion);
         }
         List<Tag> list1 = tagService.lambdaQuery().eq(Tag::getTagType,2).list();
-        String[] split = tagId.split(",");
-        List<String> list2 = Arrays.asList(split);
-        if (!list2.isEmpty()){
-            for (Tag tag : list1) {
-                if (list2.contains(tag.getId().toString())){
-                    tag.setIsCheck(1);
+        if (org.springframework.util.StringUtils.hasLength(tagId)){
+            String[] split = tagId.split(",");
+            List<String> list2 = Arrays.asList(split);
+            if (!list2.isEmpty()){
+                for (Tag tag : list1) {
+                    if (list2.contains(tag.getId().toString())){
+                        tag.setIsCheck(1);
+                    }
                 }
             }
         }else{
             for (Tag tag : list1) {
-                    tag.setIsCheck(2);
+                tag.setIsCheck(2);
             }
         }
         viewReport.setQuestions(appUserQuestions);
@@ -451,15 +534,17 @@
         byId.setFreezingTime(LocalDateTime.now());
         byId.setFreezingReason(dto.getFreezingReason());
         byId.setUserStatus(2);
-        byId.setFreezingOperator(tokenService.getLoginUser().getUserid()+"");
+        Long userid = tokenService.getLoginUser().getUserid();
+        SysUser data = remoteUserService.getSysUserById(userid + "").getData();
+        byId.setFreezingOperator(data.getNickName()+"("+data.getUserName()+")");
         appUserService.updateById(byId);
+        String cacheList = redisService.getCacheObject(byId.getId() + "");
+        redisService.deleteObject(cacheList);
+
         return R.ok();
     }
     @GetMapping("/detail")
     @ApiOperation(value = "用户详情", tags = "管理后台-用户管理")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "uid", value = "uid", dataType = "String", required = true),
-    })
     public R<AppUser> detail(String uid) {
         AppUser byId = appUserService.getById(uid);
         List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, byId.getId())
@@ -485,6 +570,12 @@
         if (data!=null){
             byId.setLevelName(data.getLevelName());
             byId.setLevelIcon(data.getLevelIcon());
+        }
+        if (org.springframework.util.StringUtils.hasLength(byId.getTagId())){
+            List<String> list = Arrays.asList(byId.getTagId().split(","));
+            List<String> collect = tagService.lambdaQuery().in(Tag::getId, list).list().stream()
+                    .map(Tag::getTagName).collect(Collectors.toList());
+            byId.setTags(collect);
         }
         return R.ok(byId);
     }
@@ -520,8 +611,12 @@
     })
     public R setTotalEnergyValue(String uid,Integer energyValue,String reason) {
         AppUser byId = appUserService.getById(uid);
+        if (energyValue<0){
+            if (byId.getTotalEnergyValue()<Math.abs(energyValue)){
+                return R.fail("扣除能量值应小于当前能量值");
+            }
+        }
         byId.setTotalEnergyValue(byId.getTotalEnergyValue()+energyValue);
-        byId.setEnergyValue(byId.getEnergyValue()+energyValue);
         appUserService.updateById(byId);
         AppUserEnergyRecord appUserEnergyRecord = new AppUserEnergyRecord();
         appUserEnergyRecord.setAppUserId(byId.getId());
@@ -555,10 +650,9 @@
         AppUser byId = appUserService.getById(uid);
         switch (vipType){
             case 1:
-                appUserLambdaUpdateWrapper.set(AppUser::getVipExpireTime,null);
-                appUserLambdaUpdateWrapper.set(AppUser::getVipLevel,null);
-                appUserLambdaUpdateWrapper.eq(AppUser::getId,byId.getUserId());
-                appUserService.update(appUserLambdaUpdateWrapper);
+                byId.setVipExpireTime(null);
+                byId.setVipLevel(null);
+                appUserService.updateById(byId);
                 break;
             case 2:
                 if (byId.getVipExpireTime() == null){
@@ -623,8 +717,8 @@
         String endTime = null;
         if (org.springframework.util.StringUtils.hasLength(dto.getTime())){
             String[] split = dto.getTime().split(" - ");
-            startTime = split[0]+"00:00:00";
-            endTime = split[1]+"23:59:59";
+            startTime = split[0]+" 00:00:00";
+            endTime = split[1]+" 23:59:59";
         }
         String userId = dto.getUid();
         LambdaQueryWrapper<AppUser> appUserWalletRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -690,15 +784,15 @@
         String endTime = null;
         if (org.springframework.util.StringUtils.hasLength(courseDTO.getVipExpireTime())){
             String[] split = courseDTO.getVipExpireTime().split(" - ");
-            startTime = split[0]+"00:00:00";
-            endTime = split[1]+"23:59:59";
+            startTime = split[0]+" 00:00:00";
+            endTime = split[1]+" 23:59:59";
         }
         String startTime1 = null;
         String endTime1 = null;
         if (org.springframework.util.StringUtils.hasLength(courseDTO.getRegisterTime())){
             String[] split = courseDTO.getRegisterTime().split(" - ");
-            startTime1 = split[0]+"00:00:00";
-            endTime1 = split[1]+"23:59:59";
+            startTime1 = split[0]+" 00:00:00";
+            endTime1 = split[1]+" 23:59:59";
         }
         List<Long> longs = new ArrayList<>();
         LambdaQueryWrapper<AppUser> courseLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -733,23 +827,11 @@
             List<AppUser> list = appUserService.lambdaQuery().list();
             List<AppUser> appUsers = new ArrayList<>();
             for (AppUser appUser : list) {
-                List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, appUser.getId())
-                        .list();
-                // 查询用户等级最高的那颗树苗
-                AppUserTree tree = list1.stream().max((o1, o2) -> {
-                    if (o1.getTreeLevelType() > o2.getTreeLevelType()) {
-                        return 1;
-                    } else if (o1.getTreeLevelType() < o2.getTreeLevelType()) {
-                        return -1;
-                    } else {
-                        return 0;
-                    }
-                }).orElse(null);
+                AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, appUser.getId())
+                        .eq(AppUserTree::getSowAgain,2)
+                        .one();
                 // 查询疗愈等级 名称 图标
-                int level = 1;
-                if (tree != null){
-                    level = tree.getTreeLevelType();
-                }
+                int level = list1.getTreeLevelType();
                 if (list2.contains(level+"")){
                     appUsers.add(appUser);
                 }
@@ -760,6 +842,7 @@
             }
             courseLambdaQueryWrapper.in(AppUser::getId, collect);
         }
+        courseLambdaQueryWrapper.isNotNull(AppUser::getCellPhone);
         List<AppUser> page = appUserService.list(courseLambdaQueryWrapper);
         List<UserExport> userExports = new ArrayList<>();
         for (AppUser record : page) {
@@ -772,23 +855,11 @@
             }else{
                 record.setIsVip(1);
             }
-            List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, record.getId())
-                    .list();
-            // 查询用户等级最高的那颗树苗
-            AppUserTree tree = list1.stream().max((o1, o2) -> {
-                if (o1.getTreeLevelType() > o2.getTreeLevelType()) {
-                    return 1;
-                } else if (o1.getTreeLevelType() < o2.getTreeLevelType()) {
-                    return -1;
-                } else {
-                    return 0;
-                }
-            }).orElse(null);
+            AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, record.getId())
+                    .eq(AppUserTree::getSowAgain,2)
+                    .one();
             // 查询疗愈等级 名称 图标
-            int level = 1;
-            if (tree != null){
-                level = tree.getTreeLevelType();
-            }
+            int level = list1.getTreeLevelType();
             // 根据等级查询疗愈名称和图标
             UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData();
             record.setLevel(level);
@@ -828,6 +899,13 @@
             userExport.setUserStatus(record.getUserStatus()+"");
             List<AppUserQuestion> list = appUserQuestionService.lambdaQuery()
                     .eq(AppUserQuestion::getAppUserId, record.getId()).list();
+                userExport.setType1("");
+                userExport.setType2("");
+                userExport.setType3("");
+                userExport.setType4("");
+                userExport.setType5("");
+                userExport.setType6("");
+                userExport.setType6("");
             for (AppUserQuestion appUserQuestion : list) {
                 switch (appUserQuestion.getType()){
                     case 1:
@@ -850,17 +928,15 @@
                         break;
                 }
             }
-            List<Integer> collect = appUserTagService.lambdaQuery()
-                    .eq(AppUserTag::getAppUserId, record.getId()).list().stream()
-                    .map(AppUserTag::getTagId)
-                    .collect(Collectors.toList());
-            if (collect.isEmpty()){
-                collect.add(-1);
+            List<String> collect = new ArrayList<>();
+            if (org.springframework.util.StringUtils.hasLength(record.getTagId())) {
+                collect = tagService.lambdaQuery()
+                        .in(Tag::getId, Arrays.stream(record.getTagId().split(",")).map(Long::parseLong).collect(Collectors.toList())).list().stream()
+                                .map(Tag::getTagName).collect(Collectors.toList());
             }
-            List<Tag> list2 = tagService.lambdaQuery().in(Tag::getId, collect).list();
             StringBuilder stringBuilder = new StringBuilder();
-            for (Tag tag : list2) {
-                stringBuilder.append(tag.getTagName()).append(";");
+            for (String tag : collect) {
+                stringBuilder.append(tag).append(";");
             }
             userExport.setType7(stringBuilder+"");
             userExport.setSanskritFlag(record.getSanskritFlag()+"");
@@ -899,15 +975,15 @@
         String endTime = null;
         if (org.springframework.util.StringUtils.hasLength(courseDTO.getVipExpireTime())){
             String[] split = courseDTO.getVipExpireTime().split(" - ");
-            startTime = split[0]+"00:00:00";
-            endTime = split[1]+"23:59:59";
+            startTime = split[0]+" 00:00:00";
+            endTime = split[1]+" 23:59:59";
         }
         String startTime1 = null;
         String endTime1 = null;
         if (org.springframework.util.StringUtils.hasLength(courseDTO.getRegisterTime())){
             String[] split = courseDTO.getRegisterTime().split(" - ");
-            startTime1 = split[0]+"00:00:00";
-            endTime1 = split[1]+"23:59:59";
+            startTime1 = split[0]+" 00:00:00";
+            endTime1 = split[1]+" 23:59:59";
         }
         List<Long> longs = new ArrayList<>();
         LambdaQueryWrapper<AppUser> courseLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -921,43 +997,54 @@
                 .orderByDesc(AppUser::getRegisterTime);
         if (org.springframework.util.StringUtils.hasLength(courseDTO.getVipType())){
             String[] split = courseDTO.getVipType().split(",");
-            List<String> list1 = Arrays.asList(split);
+            List<Integer> objects = new ArrayList<>();
+            for (String s : split) {
+                objects.add(Integer.parseInt(s)-1);
+            }
             List<AppUser> appUsers = new ArrayList<>();
-            List<AppUser> list = appUserService.lambdaQuery().gt(AppUser::getVipExpireTime, LocalDateTime.now()).list();
+            List<AppUser> list = appUserService.lambdaQuery().list();
             for (AppUser appUser : list) {
-                if(appUser.getVipLevel()!=null){
-                    if (list1.contains(appUser.getVipLevel().toString())){
+               if (objects.contains(0)){
+                   if (appUser.getVipExpireTime()==null){
+                       appUsers.add(appUser);
+                   }else if (appUser.getVipExpireTime().isBefore(LocalDateTime.now())){
+                       appUsers.add(appUser);
+                   }
+                }
+                if (objects.contains(1)){
+                    if (appUser.getVipExpireTime()!=null&&appUser.getVipExpireTime().isAfter(LocalDateTime.now())&&appUser.getVipLevel()==1){
+                        appUsers.add(appUser);
+                    }
+                }
+                if (objects.contains(2)){
+                    if (appUser.getVipExpireTime()!=null&&appUser.getVipExpireTime().isAfter(LocalDateTime.now())&&appUser.getVipLevel()==2){
+                        appUsers.add(appUser);
+                    }
+                }
+                if (objects.contains(3)){
+                    if (appUser.getVipExpireTime()!=null&&appUser.getVipExpireTime().isAfter(LocalDateTime.now())&&appUser.getVipLevel()==3){
                         appUsers.add(appUser);
                     }
                 }
             }
-            List<Long> collect = appUsers.stream().map(AppUser::getId).collect(Collectors.toList());
+            List<Long> collect = appUsers.stream().distinct().map(AppUser::getId).collect(Collectors.toList());
             if (collect.isEmpty()){
                 collect.add(-1L);
             }
-            courseLambdaQueryWrapper.in(AppUser::getId, longs);
+            courseLambdaQueryWrapper.in(AppUser::getId, collect);
         }
         if (org.springframework.util.StringUtils.hasLength(courseDTO.getLevel())){
             List<String> list2 = Arrays.asList(courseDTO.getLevel().split(","));
             List<AppUser> list = appUserService.lambdaQuery().list();
             List<AppUser> appUsers = new ArrayList<>();
             for (AppUser appUser : list) {
-                List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, appUser.getId())
-                        .list();
-                // 查询用户等级最高的那颗树苗
-                AppUserTree tree = list1.stream().max((o1, o2) -> {
-                    if (o1.getTreeLevelType() > o2.getTreeLevelType()) {
-                        return 1;
-                    } else if (o1.getTreeLevelType() < o2.getTreeLevelType()) {
-                        return -1;
-                    } else {
-                        return 0;
-                    }
-                }).orElse(null);
+                AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, appUser.getId())
+                        .eq(AppUserTree::getSowAgain,2)
+                        .one();
                 // 查询疗愈等级 名称 图标
                 int level = 1;
-                if (tree != null){
-                    level = tree.getTreeLevelType();
+                if (list1 != null){
+                    level = list1.getTreeLevelType();
                 }
                 if (list2.contains(level+"")){
                     appUsers.add(appUser);
@@ -969,6 +1056,7 @@
             }
             courseLambdaQueryWrapper.in(AppUser::getId, collect);
         }
+        courseLambdaQueryWrapper.isNotNull(AppUser::getCellPhone);
         Page<AppUser> page = appUserService.page(new Page<>(courseDTO.getPageCurr(), courseDTO.getPageSize()), courseLambdaQueryWrapper);
         if (CollUtils.isEmpty(page.getRecords())) {
             return R.ok(PageDTO.empty(page));
@@ -1042,8 +1130,38 @@
             return R.tokenError("登录失效");
         }
         Long userId = loginUser.getUserid();
-
+        // 校验验证码
+        if (!verifyCaptcha(phone, code,
+                CacheConstants.APP_CHANGE_PHONE_CODE_PREFIX)) {
+            throw new ServiceException("验证码不正确");
+        }
+        AppUser byId = appUserService.getById(userId);
+        AppUser one = appUserService.lambdaQuery().eq(AppUser::getCellPhone, phone)
+                .ne(AppUser::getId, userId)
+                .ne(AppUser::getUserStatus, 3).one();
+        if (one!=null){
+            return R.fail("当前手机号已被绑定");
+        }
+        byId.setCellPhone(phone);
+        boolean b = appUserService.updateById(byId);
         return R.ok();
+    }
+
+    @Autowired
+    private RedisService redisService;
+    private boolean verifyCaptcha(String cellPhone, String captcha, String keyPrefix) {
+
+        if (com.xinquan.common.core.utils.StringUtils.isNotBlank(cellPhone) && com.xinquan.common.core.utils.StringUtils.isNotBlank(captcha)) {
+            String key = keyPrefix + cellPhone;
+            String code = redisService.getCacheObject(key);
+            // 万能验证码
+            if (captcha.equals("123456") || (com.xinquan.common.core.utils.StringUtils.isNotBlank(code) && code.equals(
+                    captcha))) {
+                redisService.deleteObject(key);
+                return true;
+            }
+        }
+        return false;
     }
     @PostMapping("/deleteUser")
     @ApiOperation(value = "注销账号", tags = {"设置"})
@@ -1053,7 +1171,12 @@
             return R.tokenError("登录失效");
         }
         Long userId = loginUser.getUserid();
-
+        AppUser byId = appUserService.getById(userId);
+        byId.setUserStatus(3);
+        byId.setLogoutTime(LocalDateTime.now());
+        appUserService.updateById(byId);
+        appUserService.removeById(byId);
+        remoteUserService.removeByAppUserId(byId.getUserId());
         return R.ok();
     }
     @PostMapping("/wallet")
@@ -1068,7 +1191,22 @@
         WalletVO walletVO = new WalletVO();
         walletVO.setId(userId);
         walletVO.setBalance(byId.getBalance());
-        walletVO.setIncome(byId.getIncome());
+
+        List<AppUser> page = appUserService.lambdaQuery()
+                .eq(AppUser::getInviteUserId, userId)
+                .list();
+        // 查询登录用户邀请了哪些人
+        List<Long> collect = page.stream().map(AppUser::getId).collect(Collectors.toList());
+        BigDecimal bigDecimal1 = new BigDecimal("0");
+
+        for (AppUser record : page) {
+            List<AppUserWalletRecord> list = appUserWalletRecordService.lambdaQuery().eq(AppUserWalletRecord::getAppUserId, userId)
+                    .like(AppUserWalletRecord::getReason,"分佣").eq(AppUserWalletRecord::getChildAppUserId, record.getId()).list();
+            BigDecimal reduce = list.stream().map(AppUserWalletRecord::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            bigDecimal1 = bigDecimal1.add(reduce);
+            record.setMoney(reduce);
+        }
+        walletVO.setIncome(bigDecimal1);
         // 查询用户充值
         String data = remoteOrderService.queryChargeByUserId(userId).getData();
         BigDecimal bigDecimal = new BigDecimal(data);
@@ -1095,33 +1233,27 @@
         if (loginUser==null){
             return R.tokenError("登录失效");
         }
-        Long userId = loginUser.getUserid();
-        Page<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
-                .eq(AppUser::getInviteUserId, userId)
-                .page(new Page<>(pageCurr, pageSize));
-        if (page.getRecords().isEmpty()){
-            return R.ok(PageDTO.empty(page));
-        }
-        // 查询登录用户邀请了哪些人
-        List<Long> collect = page.getRecords().stream().map(AppUser::getId).collect(Collectors.toList());
-        if (collect.isEmpty())return R.ok(PageDTO.empty(page));
-        for (int i = 0; i < page.getRecords().size(); i++) {
-            AppUser appUser = page.getRecords().get(i);
-            // 查询该给用户带来收益
-            List<AppUserWalletRecord> list = appUserWalletRecordService.lambdaQuery().eq(AppUserWalletRecord::getAppUserId, userId)
-                    .eq(AppUserWalletRecord::getChildAppUserId,appUser.getUserId()).list();
-            BigDecimal bigDecimal = new BigDecimal("0");
-            for (AppUserWalletRecord appUserWalletRecord : list) {
-                if (appUserWalletRecord.getAmount()!=null && appUserWalletRecord.getChangeType() == 1){
-                    bigDecimal = bigDecimal.add(appUserWalletRecord.getAmount());
-                }
-            }
-            appUser.setMoney(bigDecimal);
+        Page<AppUser> objectPage = new Page<>(pageCurr, pageSize);
 
+        Long userId = loginUser.getUserid();
+        List<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
+                .eq(AppUser::getInviteUserId, userId)
+                .list();
+        // 查询登录用户邀请了哪些人
+        List<Long> collect = page.stream().map(AppUser::getId).collect(Collectors.toList());
+        for (AppUser record : page) {
+            List<AppUserWalletRecord> list = appUserWalletRecordService.lambdaQuery().eq(AppUserWalletRecord::getAppUserId, userId)
+                    .like(AppUserWalletRecord::getReason,"分佣").eq(AppUserWalletRecord::getChildAppUserId, record.getId()).list();
+            BigDecimal reduce = list.stream().map(AppUserWalletRecord::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            record.setMoney(reduce);
         }
         // 根据佣金金额 从大到小排序
-        page.getRecords().sort((o1, o2) -> o2.getMoney().compareTo(o1.getMoney()));
-        return R.ok(PageDTO.of(page, InviteRankListVO.class));
+        page.sort((o1, o2) -> o2.getMoney().compareTo(o1.getMoney()));
+
+        List<AppUser> testing = testing(page.size(), pageCurr, pageSize, page);
+        objectPage.setTotal(testing.size());
+        objectPage.setRecords(testing);
+        return R.ok(PageDTO.of(objectPage, InviteRankListVO.class));
     }
     @PostMapping("/myInviteRankListShare")
     @ApiOperation(value = "我的助力-分页", tags = {"H5分享"})
@@ -1134,32 +1266,25 @@
             @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
             @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
             @RequestParam(value = "userId") String userId) {
-        Page<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
+        Page<AppUser> objectPage = new Page<>(pageCurr, pageSize);
+        List<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
                 .eq(AppUser::getInviteUserId, userId)
-                .page(new Page<>(pageCurr, pageSize));
-        if (page.getRecords().isEmpty()){
-            return R.ok(PageDTO.empty(page));
-        }
+                .list();
         // 查询登录用户邀请了哪些人
-        List<Long> collect = page.getRecords().stream().map(AppUser::getId).collect(Collectors.toList());
-        if (collect.isEmpty())return R.ok(PageDTO.empty(page));
-        for (int i = 0; i < page.getRecords().size(); i++) {
-            AppUser appUser = page.getRecords().get(i);
-            // 查询该给用户带来收益
+        List<Long> collect = page.stream().map(AppUser::getId).collect(Collectors.toList());
+        for (AppUser record : page) {
             List<AppUserWalletRecord> list = appUserWalletRecordService.lambdaQuery().eq(AppUserWalletRecord::getAppUserId, userId)
-                    .eq(AppUserWalletRecord::getChildAppUserId,appUser.getUserId()).list();
-            BigDecimal bigDecimal = new BigDecimal("0");
-            for (AppUserWalletRecord appUserWalletRecord : list) {
-                if (appUserWalletRecord.getAmount()!=null && appUserWalletRecord.getChangeType() == 1){
-                    bigDecimal = bigDecimal.add(appUserWalletRecord.getAmount());
-                }
-            }
-            appUser.setMoney(bigDecimal);
-
+                    .like(AppUserWalletRecord::getReason,"分佣").eq(AppUserWalletRecord::getChildAppUserId, record.getId()).list();
+            BigDecimal reduce = list.stream().map(AppUserWalletRecord::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            record.setMoney(reduce);
         }
         // 根据佣金金额 从大到小排序
-        page.getRecords().sort((o1, o2) -> o2.getMoney().compareTo(o1.getMoney()));
-        return R.ok(PageDTO.of(page, InviteRankListVO.class));
+        page.sort((o1, o2) -> o2.getMoney().compareTo(o1.getMoney()));
+
+        List<AppUser> testing = testing(page.size(), pageCurr, pageSize, page);
+        objectPage.setTotal(page.size());
+        objectPage.setRecords(testing);
+        return R.ok(PageDTO.of(objectPage, InviteRankListVO.class));
     }
     @Resource
     private AppUserWalletRecordService appUserWalletRecordService;
@@ -1179,17 +1304,47 @@
     public R<PageDTO<InviteRankListVO>> inviteRankList(
             @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
             @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
-        Page<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
-                .page(new Page<>(pageCurr, pageSize));
-        for (AppUser appUser : page.getRecords()) {
+        Page<AppUser> objectPage = new Page<>(pageCurr, pageSize);
+
+        List<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
+                .list();
+        List<AppUser> res = new ArrayList<>();
+        for (AppUser appUser : page) {
             int size = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
                     .eq(AppUser::getInviteUserId, appUser.getId())
                     .list().size();
             appUser.setCount(size);
+            if (size>0){
+                res.add(appUser);
+            }
         }
         // 根据帮助人数 从大到小排序
-        page.getRecords().sort((o1, o2) -> o2.getCount() - o1.getCount());
-        return R.ok(PageDTO.of(page, InviteRankListVO.class)) ;
+        res.sort((o1, o2) -> o2.getCount() - o1.getCount());
+        List<AppUser> testing = testing(res.size(), pageCurr, pageSize, res);
+        objectPage.setRecords(testing);
+        objectPage.setTotal(res.size());
+        return R.ok(PageDTO.of(objectPage, InviteRankListVO.class)) ;
+    }
+    public static List<AppUser> testing(long total, long current, long size, List<AppUser> str){
+        List<AppUser> result = new ArrayList<>();
+        //获取初始化分页结构
+        Page<AppUser> page = new Page<>(current - 1, size, total);
+        //获取集合下标初始值
+        long startIndex = (current - 1) * size;
+        //获取集合下标结束值
+        long endInddex = 0;
+        if(startIndex + page.getCurrent() >= total || size > total){
+            endInddex = total;
+        }else {
+            endInddex = Math.min(startIndex + page.getSize(), total);
+        }
+        //如果输入的开始查询下标大于集合大小,则查询为空值
+        if(startIndex > total){
+            result = Collections.emptyList();
+        }else{
+            result = str.subList((int)startIndex,(int)endInddex);
+        }
+        return result;
     }
     @PostMapping("/inviteRankListShare")
     @ApiOperation(value = "爱心助力榜单-分页", tags = {"H5分享"})
@@ -1200,16 +1355,42 @@
     public R<PageDTO<InviteRankListVO>> inviteRankListShare(
             @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
             @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
-        Page<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
-                .page(new Page<>(pageCurr, pageSize));
-        for (AppUser appUser : page.getRecords()) {
+        Page<AppUser> objectPage = new Page<>(pageCurr, pageSize);
+
+        List<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
+                .list();
+        List<AppUser> res = new ArrayList<>();
+        for (AppUser appUser : page) {
             int size = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
                     .eq(AppUser::getInviteUserId, appUser.getId())
                     .list().size();
             appUser.setCount(size);
+            if (size>0){
+                res.add(appUser);
+            }
         }
         // 根据帮助人数 从大到小排序
-        page.getRecords().sort((o1, o2) -> o2.getCount() - o1.getCount());
+        res.sort((o1, o2) -> o2.getCount() - o1.getCount());
+        List<AppUser> testing = testing(res.size(), pageCurr, pageSize, res);
+        objectPage.setRecords(testing);
+        objectPage.setTotal(res.size());
+        return R.ok(PageDTO.of(objectPage, InviteRankListVO.class)) ;
+    }
+    @PostMapping("/inviteRankListShareInfo")
+    @ApiOperation(value = "爱心助力榜单详情-分页", tags = {"H5分享"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "id", name = "id", required = true, dataType = "Long"),
+            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
+            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
+    })
+    public R<PageDTO<InviteRankListVO>> inviteRankListShareInfo(
+            @RequestParam(value = "id") Long id,
+            @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
+            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        LambdaQueryWrapper<AppUser> appUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        appUserLambdaQueryWrapper.eq(AppUser::getInviteUserId,id);
+        appUserLambdaQueryWrapper.ne(AppUser::getUserStatus,3);
+        Page<AppUser> page = appUserService.page(new Page<>(pageCurr, pageSize), appUserLambdaQueryWrapper);
         return R.ok(PageDTO.of(page, InviteRankListVO.class)) ;
     }
     @PostMapping("/getUserInfo")
@@ -1274,23 +1455,14 @@
             consecutiveDays++;
             currentDate = currentDate.minusDays(1);
         }
-        appUserInfoVO.setToday(consecutiveDays);
-        List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
-                .list();
-        // 查询用户等级最高的那颗树苗
-        AppUserTree tree = list1.stream().max((o1, o2) -> {
-            if (o1.getTreeLevelType() > o2.getTreeLevelType()) {
-                return 1;
-            } else if (o1.getTreeLevelType() < o2.getTreeLevelType()) {
-                return -1;
-            } else {
-                return 0;
-            }
-        }).orElse(null);
+        appUserInfoVO.setContinuity(consecutiveDays);
+        AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .eq(AppUserTree::getSowAgain,2)
+                .one();
         // 查询疗愈等级 名称 图标
         int level = 1;
-        if (tree != null){
-            level = tree.getTreeLevelType();
+        if (list1 != null){
+            level = list1.getTreeLevelType();
         }
         appUserInfoVO.setLevel(level);
         // 根据等级查询疗愈名称和图标
@@ -1315,8 +1487,60 @@
         }else{
             appUser.setIsVip(2);
         }
+        AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .eq(AppUserTree::getSowAgain,2)
+                .one();
+        // 查询疗愈等级 名称 图标
+        int level = list1.getTreeLevelType();
+        appUser.setLevel(level);
+        // 查询用户累计学习天数
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        List<AppUserViewingHistory> com = appUserViewingHistoryService.cumulative(userId);
+        appUser.setCumulative(com.size());
+        // 查询用户今日学习多少分钟
+        Integer temp = appUserViewingHistoryService.today(userId);
+        if (temp == null){
+            temp =0;
+        }
+        if (temp == 0){
+            appUser.setToday(0);
+        }else if (temp<60){
+            // 不足一分钟按一分钟计算
+            appUser.setToday(1);
+        }else{
+            appUser.setToday(temp/60);
+        }
+        // 查询用户连续观看天数
+        List<AppUserViewingHistory> list = appUserViewingHistoryService.lambdaQuery().eq(AppUserViewingHistory::getAppUserId, userId)
+                .eq(AppUserViewingHistory::getViewingType, 1)
+                .orderByDesc(BaseModel::getCreateTime).list();
+        Set<LocalDate> viewingDates = list.stream()
+                .map(record -> LocalDate.parse(record.getCreateTime().toLocalDate().toString(), formatter))
+                .collect(Collectors.toCollection(HashSet::new));
+        // 获取今天的日期
+        LocalDate today = LocalDate.now();
+        // 计算连续观看天数
+        int consecutiveDays = 0;
+        LocalDate currentDate = today;
+        // 如果今天没有观看 也进入循环判断
+        while (viewingDates.contains(currentDate)||LocalDate.parse(currentDate.toString(), formatter).equals(today)) {
+            if (!viewingDates.contains(currentDate)){
+                // 如果今天没有观看
+                currentDate = currentDate.minusDays(1);
+                continue;
+            }
+            consecutiveDays++;
+            currentDate = currentDate.minusDays(1);
+        }
+        appUser.setContinuity(consecutiveDays);
+        // 根据等级查询疗愈名称和图标
+        UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData();
+        appUser.setLevelName(data.getLevelName());
+        appUser.setLevelIcon(data.getLevelIcon());
         return R.ok(appUser);
     }
+    @Resource
+    private SysUserClient sysUserClient;
     @PostMapping("/healingLevel")
     @ApiOperation(value = "冥想等级", tags = {"个人中心"})
     public R<HealingLevelVO> healingLevel() {
@@ -1325,88 +1549,69 @@
             return R.tokenError("登录失效");
         }
         Long userId = loginUser.getUserid();
-        List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
-                .list();
-        if (list1.isEmpty()){
-            AppUserTree appUserTree = new AppUserTree();
-            appUserTree.setAppUserId(userId);
-            appUserTree.setTreeLevelType(1);
-            appUserTree.setGrowthValue(0);
-            appUserTree.setSowAgain(2);
-            appUserTree.setStatus(2);
-            appUserTree.setCreateTime(LocalDateTime.now());
-            appUserTreeService.save(appUserTree);
-        }
-        // 查询用户等级最高的那颗树苗
-        AppUserTree tree = list1.stream().max((o1, o2) -> {
-            if (o1.getTreeLevelType() > o2.getTreeLevelType()) {
-                return 1;
-            } else if (o1.getTreeLevelType() < o2.getTreeLevelType()) {
-                return -1;
-            } else {
-                return 0;
-            }
-        }).orElse(null);
-        // 查询疗愈等级 名称 图标
-        int level = 1;
-        if (tree != null){
-            level = tree.getTreeLevelType();
-        }
-        HealingLevelVO healingLevelVO = new HealingLevelVO();
 
+        HealingLevelVO healingLevelVO = new HealingLevelVO();
+        AppUser one = appUserService.getById(userId);
+        AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .eq(AppUserTree::getSowAgain,2)
+                .one();
+        // 查询疗愈等级 名称 图标
+        int level = list1.getTreeLevelType();
+        healingLevelVO.setLevel(level);
+        // 查询疗愈等级 名称 图标
+        if (list1 != null){
+            level = list1.getTreeLevelType();
+        }
         healingLevelVO.setLevel(level);
         // 根据等级查询疗愈名称和图标
         UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData();
         healingLevelVO.setLevelName(data.getLevelName());
         healingLevelVO.setLevelIcon(data.getLevelIcon());
-        if (level==10){
-            healingLevelVO.setNextLevel(2400);
-        }else{
-            switch (level){
-                case 1:
-                    healingLevelVO.setNextLevel(1000);
-                    healingLevelVO.setDifferenceLevel(1000-tree.getGrowthValue());
+        List<TreeLevelSetting> data3 = sysUserClient.getTreeGroup().getData();
 
-                    break;
-                case 2:
-                    healingLevelVO.setNextLevel(1000);
-                    healingLevelVO.setDifferenceLevel(1000-tree.getGrowthValue());
-                    break;
-                case 3:
-                    healingLevelVO.setNextLevel(1000);
-                    healingLevelVO.setDifferenceLevel(1000-tree.getGrowthValue());
-                    break;
-                case 4:
-                    healingLevelVO.setNextLevel(1000);
-                    healingLevelVO.setDifferenceLevel(1000-tree.getGrowthValue());
-                    break;
-                case 5:
-                    healingLevelVO.setNextLevel(2000);
-                    healingLevelVO.setDifferenceLevel(2000-tree.getGrowthValue());
-                    break;
-                case 6:
-                    healingLevelVO.setNextLevel(2000);
-                    healingLevelVO.setDifferenceLevel(2000-tree.getGrowthValue());
-                    break;
-                case 7:
-                    healingLevelVO.setNextLevel(2000);
-                    healingLevelVO.setDifferenceLevel(2000-tree.getGrowthValue());
-                    break;
-                case 8:
-                    healingLevelVO.setNextLevel(2000);
-                    healingLevelVO.setDifferenceLevel(2000-tree.getGrowthValue());
-                    break;
-                case 9:
-                    healingLevelVO.setNextLevel(2400);
-                    healingLevelVO.setDifferenceLevel(2400-tree.getGrowthValue());
-                    break;
-                case 10:
-                    healingLevelVO.setNextLevel(2400);
-                    healingLevelVO.setDifferenceLevel(2400-tree.getGrowthValue());
-                    break;
+        Integer total1 = list1.getTotal();
+        // 根据总能量值 确定他在哪一等级
+        int x = 1;
+        int tem = 0;
+        for (TreeLevelSetting datum : data3) {
+            if (total1 == 0){
+                Integer growthValue = data3.get(1).getGrowthValue();
+                tem = growthValue;
+                break;
+            }else if (total1>=datum.getGrowthValue()){
+                x = datum.getTreeLevelType();
             }
         }
-        healingLevelVO.setGrowthValue(tree.getGrowthValue());
+        if (x == 10){
+            // 如果等级为10那么成长阈值是10级减去9级
+            int ten=0;
+            int nine = 0;
+            for (TreeLevelSetting datum : data3) {
+                if (datum.getTreeLevelType()==10){
+                    ten = datum.getGrowthValue();
+                }
+                if (datum.getTreeLevelType()==9){
+                    nine = datum.getGrowthValue();
+                }
+            }
+            tem = ten-nine;
+            total1 = tem;
+        }else{
+            // 根据当前所在等级查询成长值
+            int a = data3.get(x).getGrowthValue()-data3.get(x-1).getGrowthValue();
+            tem = a;
+            total1 = Math.abs(total1-data3.get(x-1).getGrowthValue());
+        }
+        if (x==10){
+            healingLevelVO.setDifferenceLevel(0);
+            healingLevelVO.setGrowthValue(tem);
+        }else{
+            healingLevelVO.setDifferenceLevel(tem-total1);
+            healingLevelVO.setGrowthValue(total1);
+        }
+        healingLevelVO.setNextLevel(tem);
+        healingLevelVO.setLevel(x);
+        // 将当前成长值更新
         String data1 = remoteUserService.getCourseList(7).getData();
         healingLevelVO.setContent(data1);
         return R.ok(healingLevelVO);
@@ -1443,7 +1648,7 @@
         updateWrapper.set(AppUser::getOccupation, dto.getOccupation());
         updateWrapper.set(AppUser::getLocation, dto.getLocation());
         updateWrapper.set(AppUser::getHometown, dto.getHometown());
-        updateWrapper.set(AppUser::getEmail, dto.getEducation());
+        updateWrapper.set(AppUser::getEmail, dto.getEmail());
         updateWrapper.eq(AppUser::getId,userId);
         appUserService.update(byId, updateWrapper);
         return R.ok(byId);
@@ -1482,13 +1687,27 @@
     @PostMapping("/getUserByPhone")
     @ApiOperation(value = "根据用户手机号查询用户信息")
     public R<AppUserDetailVO> getCurrentUser(String phone) {
-        AppUser one = appUserService.lambdaQuery().eq(AppUser::getCellPhone, phone).one();
-        AppUserDetailVO appUserDetailVO = new AppUserDetailVO();
-        appUserDetailVO.setId(one.getId());
-        appUserDetailVO.setCellPhone(one.getCellPhone());
-        appUserDetailVO.setAvatar(one.getAvatar());
-        appUserDetailVO.setNickname(one.getNickname());
-        return R.ok(appUserDetailVO);
+        LoginUser loginUser = tokenService.getLoginUser();
+        if (loginUser==null){
+            return R.tokenError("登录失效");
+        }
+
+        AppUser one = appUserService.lambdaQuery().eq(AppUser::getCellPhone, phone)
+                .ne(AppUser::getUserStatus,3).one();
+        if (one!=null){
+            if (one.getId().equals(loginUser.getUserid())){
+                return R.giveError("不能赠送给自己");
+            }
+            AppUserDetailVO appUserDetailVO = new AppUserDetailVO();
+            appUserDetailVO.setId(one.getId());
+            appUserDetailVO.setCellPhone(one.getCellPhone());
+            appUserDetailVO.setAvatar(one.getAvatar());
+            appUserDetailVO.setNickname(one.getNickname());
+            return R.ok(appUserDetailVO);
+
+        }else {
+            return R.fail("未查询到账户信息");
+        }
     }
     @PostMapping("/getUserBalance")
     @ApiOperation(value = "查询当前用户余额")
@@ -1523,11 +1742,7 @@
     @PostMapping("/saveUserAnswers")
     @ApiOperation(value = "保存计划引导页用户的答案", tags = {"用户端-计划引导相关接口"})
     public R<?> saveUserAnswers(@Validated @RequestBody UserAnswerDTO dto) {
-        LoginUser loginUser = tokenService.getLoginUser();
-        if (loginUser==null){
-            return R.tokenError("登录失效");
-        }
-        Long userId = loginUser.getUserid();
+
         appUserService.saveUserAnswers(dto);
         return R.ok();
     }

--
Gitblit v1.7.1