From 1d44c20eabc99e9970fb58d4dbd3a94d77e83e39 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 07 三月 2025 18:35:50 +0800 Subject: [PATCH] 冥想 --- xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java | 1781 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,779 insertions(+), 2 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 87bc14d..0a08aca 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 @@ -1,9 +1,94 @@ package com.xinquan.user.controller.client; -import org.springframework.web.bind.annotation.RequestMapping; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +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.log.annotation.Log; +import com.xinquan.common.log.enums.BusinessType; +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; +import com.xinquan.user.api.domain.dto.UserChildDTO; +import com.xinquan.user.api.domain.vo.FreezingVO; +import com.xinquan.user.api.domain.vo.ViewReport; +import com.xinquan.user.domain.dto.UserAnswerDTO; +import com.xinquan.user.domain.dto.UserFreezingDTO; +import com.xinquan.user.domain.export.UserExport; +import com.xinquan.user.domain.export.UserInfoExport; +import com.xinquan.user.domain.export.WithdrawExport; +import com.xinquan.user.domain.vo.TagVO; +import com.xinquan.user.service.*; +import com.xinquan.user.utils.MailUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.RestController; +import java.awt.image.BufferedImage; +import java.io.*; +import java.math.BigDecimal; +import java.net.URL; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +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; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.IOUtils; +import org.apache.poi.ss.formula.functions.T; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.mail.*; +import javax.mail.internet.*; +import javax.mail.util.ByteArrayDataSource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; + +import static com.xinquan.common.core.enums.TreeLevelEnum.TOWERING_TREES; /** * <p> @@ -15,7 +100,1699 @@ */ @RestController @RequestMapping("/client/app-user") +@RequiredArgsConstructor public class ClientAppUserController { + private final AppUserService appUserService; + @Resource + private AppUserViewingHistoryService appUserViewingHistoryService; + @Resource + private AppUserEnergyRecordService appUserEnergyRecordService; + @Resource + private AppUserTagService appUserTagService; + @Resource + private TagService tagService; + + @Resource + private AppUserTreeService appUserTreeService; + @Resource + private AppUserQuestionService appUserQuestionService; + + @Resource + private RemoteBannerService remoteBannerService; + @Resource + 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(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + // 获取1月份的第一天 + LocalDate firstDayOfMonth = LocalDate.of(currentYear, 2, 1); + LocalDateTime firstDayOfMonthDateTime = firstDayOfMonth.atStartOfDay(); + + // 获取1月份的最后一天 + LocalDate lastDayOfMonth = LocalDate.of(currentYear, 2, 12).with(TemporalAdjusters.lastDayOfMonth()); + LocalDateTime lastDayOfMonthDateTime = lastDayOfMonth.atTime(23, 59, 59); + + + + // 格式化日期时间 + String firstDayOfMonthString = firstDayOfMonthDateTime.format(formatter); + String lastDayOfMonthString = lastDayOfMonthDateTime.format(formatter); + + System.out.println("1月份的第一天: " + firstDayOfMonthString); + System.out.println("1月份的最后一天: " + lastDayOfMonthString); + } + @GetMapping("/addVipExpireTime/{id}/{type}") + public R addVipExpireTime(@PathVariable("id")Long id,@PathVariable("type")Integer type) { + AppUser byId = appUserService.getById(id); + byId.setVipLevel(type); + switch (type){ + case 1: + if (byId.getVipExpireTime()!=null&&byId.getVipExpireTime().isAfter(LocalDateTime.now())){ + byId.setVipExpireTime(byId.getVipExpireTime().plusDays(30)); + }else{ + byId.setVipExpireTime(LocalDateTime.now().plusDays(30)); + } + break; + case 2: + if (byId.getVipExpireTime()!=null&&byId.getVipExpireTime().isAfter(LocalDateTime.now())){ + byId.setVipExpireTime(byId.getVipExpireTime().plusDays(90)); + }else{ + byId.setVipExpireTime(LocalDateTime.now().plusDays(90)); + } + break; + case 3: + if (byId.getVipExpireTime()!=null&&byId.getVipExpireTime().isAfter(LocalDateTime.now())){ + byId.setVipExpireTime(byId.getVipExpireTime().plusDays(365)); + }else{ + byId.setVipExpireTime(LocalDateTime.now().plusDays(365)); + } + break; + } + appUserService.updateById(byId); + return R.ok(); + } + @GetMapping("/addBalance/{id}/{money}") + public R addBalance(@PathVariable("id")Long id,@PathVariable("money")BigDecimal money) { + AppUser byId = appUserService.getById(id); + byId.setBalance(byId.getBalance().add(money)); + appUserService.updateById(byId); + return R.ok(); + } + /** + * 远程调用 获取用户总数上升趋势 + */ + @ApiOperation(value = "首页统计测试接口", tags = "首页统计测试接口") + @PostMapping("/getUserListCount") + public R<Map<String,Object>> getUserListCount() { + Map<String, Object> res = new HashMap<>(); + // 获取当前年份 + int currentYear = LocalDate.now().getYear(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + for (int i = 1; i <= 12; i++) { + // 获取1月份的第一天 + LocalDate firstDayOfMonth = LocalDate.of(currentYear, i, 1); + LocalDateTime firstDayOfMonthDateTime = firstDayOfMonth.atStartOfDay(); + // 获取1月份的最后一天 + LocalDate lastDayOfMonth = LocalDate.of(currentYear, i, 12).with(TemporalAdjusters.lastDayOfMonth()); + LocalDateTime lastDayOfMonthDateTime = lastDayOfMonth.atTime(23, 59, 59); + // 格式化日期时间 + String firstDayOfMonthString = firstDayOfMonthDateTime.format(formatter); + String lastDayOfMonthString = lastDayOfMonthDateTime.format(formatter); + List<AppUser> list = appUserService.lambdaQuery().eq(BaseModel::getDelFlag, 0) + .ne(AppUser::getUserStatus, 3) + .between(BaseModel::getCreateTime, firstDayOfMonthString, lastDayOfMonthString) + .list(); + + res.put(i+"月",list.size()); + } + // 定义月份的排序顺序 + List<String> monthsOrder = Arrays.asList("1月", "2月", "3月", "4月", "5月", + "6月", "7月", "8月", "9月", + "10月", "11月", "12月"); + + // 创建一个 LinkedHashMap 来保持插入顺序 + Map<String, Object> sortedData = new LinkedHashMap<>(); + + // 按照定义的顺序将数据放入 LinkedHashMap + for (String month : monthsOrder) { + if (res.containsKey(month)) { + sortedData.put(month, res.get(month)); + } + } + return R.ok(sortedData); + } + + /** + * 远程调用 获取用户总数 非会员数 会员数 + * @return + */ + @PostMapping("/getUserCount") + public R<String> getUserCount() { + StringBuilder stringBuilder = new StringBuilder(); + List<AppUser> list = appUserService.lambdaQuery() + .eq(BaseModel::getDelFlag, 0) + .isNotNull(AppUser::getCellPhone) + .ne(AppUser::getUserStatus, 3).list(); + stringBuilder.append(list.size()).append(","); + List<AppUser> memberList = list.stream().filter(appUser -> + appUser.getVipExpireTime() == null || + appUser.getVipExpireTime() + .isBefore(LocalDateTime.now())).collect(Collectors.toList()); + int month=0; + int quarter=0; + int year=0; + // 获取当前时间的单例 + LocalDateTime now = LocalDateTime.now(); + stringBuilder.append(memberList.size()).append(","); + for (AppUser appUser : list) { + if (appUser.getVipExpireTime()!=null){ + if (appUser.getVipExpireTime().isAfter(now)){ + if (appUser.getVipLevel()!=null){ + switch (appUser.getVipLevel()){ + case 1: + month++; + break; + case 2: + quarter++; + break; + case 3: + year++; + break; + } + } + } + } + } + stringBuilder.append(month).append(","); + stringBuilder.append(quarter).append(","); + stringBuilder.append(year); + return R.ok(stringBuilder.toString()); + } + + + @PostMapping("/userDetail") + @ApiOperation(value = "用户详情-基础信息", tags = "管理后台-用户管理") + public R userDetail(String uid) { + AppUser byId = appUserService.getById(uid); + // 判断是不是会员 + if (byId.getVipExpireTime() == null){ + byId.setIsVip(2); + }else if (byId.getVipExpireTime().isBefore(LocalDateTime.now())){ + byId.setIsVip(2); + }else{ + byId.setIsVip(1); + } + AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, uid) + .eq(AppUserTree::getSowAgain,2) + .one(); + // 查询疗愈等级 名称 图标 + int level = list1.getTreeLevelType(); + // 根据等级查询疗愈名称和图标 + UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData(); + byId.setLevel(level); + byId.setLevelIcon(data.getLevelIcon()); + byId.setLevelName(data.getLevelName()); + byId.setUid(byId.getId().toString()); + 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(); + } + @GetMapping("/viewReport") + @ApiOperation(value = "用户详情-查看报告", tags = "管理后台-用户管理") + public R<ViewReport> viewReport(String uid) { + ViewReport viewReport = new ViewReport(); + String tagId = appUserService.getById(uid).getTagId(); + List<AppUserQuestion> appUserQuestions = new ArrayList<>(); + List<AppUserQuestion> list = appUserQuestionService.lambdaQuery().eq(AppUserQuestion::getAppUserId, uid).orderByAsc(AppUserQuestion::getType).list(); + for (int i = 0; i < 6; i++) { + AppUserQuestion appUserQuestion = new AppUserQuestion(); + appUserQuestion.setType(i+1); + if (!list.isEmpty()){ + appUserQuestion.setAnswer(list.get(i)!=null?list.get(i).getAnswer():""); + }else{ + appUserQuestion.setAnswer(null); + } + appUserQuestions.add(appUserQuestion); + } + List<Tag> list1 = tagService.lambdaQuery().eq(Tag::getTagType,2).list(); + 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); + } + } + viewReport.setQuestions(appUserQuestions); + viewReport.setTags(list1); + return R.ok(viewReport); + } + @Autowired + private TokenService tokenService; + @PostMapping("/freezing") + @ApiOperation(value = "冻结用户", tags = "管理后台-用户管理") + @Log(title = "【用户管理】冻结用户", businessType = BusinessType.UPDATE) + public R freezingDetail(@RequestBody UserFreezingDTO dto) { + AppUser byId = appUserService.getById(dto.getUid()); + byId.setFreezingTime(LocalDateTime.now()); + byId.setFreezingReason(dto.getFreezingReason()); + byId.setUserStatus(2); + 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 = "管理后台-用户管理") + public R<AppUser> detail(String uid) { + AppUser byId = appUserService.getById(uid); + 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); + // 查询疗愈等级 名称 图标 + int level = 1; + if (tree != null){ + level = tree.getTreeLevelType(); + } + byId.setLevel(level); + // 根据等级查询疗愈名称和图标 + UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData(); + 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); + } + @GetMapping("/unFreezing") + @ApiOperation(value = "解冻用户", tags = "管理后台-用户管理") + @Log(title = "【用户管理】解冻用户", businessType = BusinessType.UPDATE) + public R unFreezing(String uid) { + AppUser byId = appUserService.getById(uid); + byId.setUserStatus(1); + appUserService.updateById(byId); + return R.ok(byId.getFreezingReason()); + } + @GetMapping("/setSanskritFlag") + @ApiOperation(value = "设置梵文权限", tags = "管理后台-用户管理") + @ApiImplicitParams({ + @ApiImplicitParam(name = "uid", value = "用户uid 多个逗号拼接", dataType = "String", required = true), + @ApiImplicitParam(name = "setSanskritFlag", value = "梵文权限 1是2否", dataType = "int", required = true), + }) + public R setSanskritFlag(String uid,Integer setSanskritFlag) { + List<String> list = Arrays.asList(uid.split(",")); + List<AppUser> list1 = appUserService.lambdaQuery().in(AppUser::getId, list).list(); + for (AppUser appUser : list1) { + appUser.setSanskritFlag(setSanskritFlag); + } + appUserService.updateBatchById(list1); + return R.ok(); + } + @GetMapping("/setTotalEnergyValue") + @ApiOperation(value = "能量值修改", tags = "管理后台-用户管理") + @ApiImplicitParams({ + @ApiImplicitParam(name = "uid", value = "用户uid", dataType = "String", required = true), + @ApiImplicitParam(name = "energyValue", value = "能量值", dataType = "int", required = true), + @ApiImplicitParam(name = "reason", value = "备注", dataType = "String", required = true) + }) + @Log(title = "【用户管理】能量值修改", businessType = BusinessType.UPDATE) + + 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); + appUserService.updateById(byId); + AppUserEnergyRecord appUserEnergyRecord = new AppUserEnergyRecord(); + appUserEnergyRecord.setAppUserId(byId.getId()); + if (energyValue<0){ + appUserEnergyRecord.setChangeType(2); + appUserEnergyRecord.setEnergyValue(-energyValue); + }else{ + appUserEnergyRecord.setChangeType(1); + appUserEnergyRecord.setEnergyValue(energyValue); + } + appUserEnergyRecord.setUpdateId(tokenService.getLoginUser().getUserid()); + appUserEnergyRecord.setReason(reason); + appUserEnergyRecord.setCreateBy(SecurityUtils.getUsername()); + appUserEnergyRecord.setCreateTime(LocalDateTime.now()); + appUserEnergyRecordService.save(appUserEnergyRecord); + return R.ok(); + } + + + @GetMapping("/setVip") + @ApiOperation(value = "设置会员", tags = "管理后台-用户管理") + @ApiImplicitParams({ + @ApiImplicitParam(name = "uid", value = "uid", dataType = "String", required = true), + @ApiImplicitParam(name = "vipType", value = "会员类型 1非 2月 3季 4年", dataType = "Integer", required = true), + @ApiImplicitParam(name = "vipExpireTime", value = "会员到期时间 yyyy-MM-dd HH:mm", dataType = "String", required = true), + }) + @Log(title = "【用户管理】设置会员", businessType = BusinessType.UPDATE) + + public R setVip(String uid, Integer vipType,String vipExpireTime) { + // 将其转化为LocalDateTime格式 + LocalDateTime parse = LocalDateTime.parse(vipExpireTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + LambdaUpdateWrapper<AppUser> appUserLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + AppUser byId = appUserService.getById(uid); + switch (vipType){ + case 1: + byId.setVipExpireTime(null); + byId.setVipLevel(null); + appUserService.updateById(byId); + break; + case 2: + if (byId.getVipExpireTime() == null){ + byId.setVipLevel(1); + byId.setVipExpireTime(parse); + }else if (byId.getVipExpireTime().isAfter(LocalDateTime.now())){ + byId.setVipExpireTime(parse); + }else{ + byId.setVipExpireTime(parse); + } + break; + case 3: + + if (byId.getVipExpireTime() == null){ + byId.setVipLevel(2); + byId.setVipExpireTime(parse); + }else if (byId.getVipExpireTime().isAfter(LocalDateTime.now())){ + // 如果当前用户的会员等级大于设置的会员等级那么不管 + if (byId.getVipLevel()<2){ + byId.setVipLevel(2); + } + byId.setVipExpireTime(parse); + }else{ + if (byId.getVipLevel()<2){ + byId.setVipLevel(2); + } + byId.setVipExpireTime(parse); + } + break; + case 4: + byId.setVipLevel(3); + if (byId.getVipExpireTime() == null){ + byId.setVipExpireTime(parse); + }else if (byId.getVipExpireTime().isAfter(LocalDateTime.now())){ + byId.setVipExpireTime(parse); + }else{ + byId.setVipExpireTime(parse); + } + break; + } + appUserService.updateById(byId); + return R.ok(); + } + @GetMapping("/freezingDetail") + @ApiOperation(value = "冻结详情", tags = "管理后台-用户管理") + public R<FreezingVO> freezingDetail(String uid) { + AppUser byId = appUserService.getById(uid); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String format = simpleDateFormat.format(byId.getFreezingTime()); + FreezingVO freezingVO = new FreezingVO(); + freezingVO.setFreezingTime(format); + freezingVO.setFreezingReason(byId.getFreezingReason()); + SysUser data = remoteUserService.getSysUserById(byId.getFreezingOperator()).getData(); + freezingVO.setFreezingOperator(data.getNickName()+"("+data.getUserName()+")"); + return R.ok(freezingVO); + } + @ApiOperation(value = "用户列表-下级用户管理导出", tags = {"管理后台-用户管理"}) + @PutMapping("/exportUser") + public void export(@RequestBody UserChildDTO dto) + { + String startTime = null; + 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"; + } + String userId = dto.getUid(); + LambdaQueryWrapper<AppUser> appUserWalletRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); + appUserWalletRecordLambdaQueryWrapper.between(startTime!=null,BaseModel::getCreateTime,startTime,endTime); + appUserWalletRecordLambdaQueryWrapper.eq(AppUser::getInviteUserId, userId); + appUserWalletRecordLambdaQueryWrapper.like(org.springframework.util.StringUtils.hasLength(dto.getCellPhone()),AppUser::getCellPhone,dto.getCellPhone()); + appUserWalletRecordLambdaQueryWrapper.like(org.springframework.util.StringUtils.hasLength(dto.getNickName()),AppUser::getNickname,dto.getNickName()); + appUserWalletRecordLambdaQueryWrapper.orderByDesc(BaseModel::getCreateTime); + appUserWalletRecordLambdaQueryWrapper.isNotNull(AppUser::getCellPhone); + List<AppUser> page = appUserService + .list(appUserWalletRecordLambdaQueryWrapper); + List<UserInfoExport> userInfoExports = new ArrayList<>(); + + for (AppUser record : page) { + // 查询该用户带来收益 + List<AppUserWalletRecord> list = appUserWalletRecordService.lambdaQuery().eq(AppUserWalletRecord::getAppUserId, record.getId()) + .eq(AppUserWalletRecord::getChildAppUserId, record.getUserId()).list(); + BigDecimal bigDecimal = new BigDecimal("0"); + for (AppUserWalletRecord appUserWalletRecord : list) { + if (appUserWalletRecord.getAmount()!=null && appUserWalletRecord.getChangeType() == 1){ + bigDecimal = bigDecimal.add(appUserWalletRecord.getAmount()); + } + record.setMoney(bigDecimal); + } + UserInfoExport userInfoExport = new UserInfoExport(); + userInfoExport.setCode(record.getCode()); + userInfoExport.setUserName(record.getNickname()); + userInfoExport.setCellphone(record.getCellPhone()); + userInfoExport.setIncome("¥"+record.getMoney()); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String format = df.format(record.getInviteUserTime()); + userInfoExport.setInviteUserTime(format); + userInfoExport.setUserStatus(record.getUserStatus()+""); + userInfoExports.add(userInfoExport); + } + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), UserInfoExport.class, userInfoExports); + HttpServletResponse response = WebUtils.response(); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + ServletOutputStream outputStream = null; + try { + String fileName = URLEncoder.encode("用户管理导出.xls", "utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + outputStream = response.getOutputStream(); + workbook.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + @ApiOperation(value = "用户列表管理导出", tags = {"管理后台-用户管理"}) + @PutMapping("/export") + public void export(@RequestBody AppUserManagementDTO courseDTO) + { + String startTime = null; + 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"; + } + 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"; + } + List<Long> longs = new ArrayList<>(); + LambdaQueryWrapper<AppUser> courseLambdaQueryWrapper = new LambdaQueryWrapper<>(); + courseLambdaQueryWrapper + .like(StringUtils.isNotBlank(courseDTO.getNickname()), AppUser::getNickname, courseDTO.getNickname()) + .like(StringUtils.isNotBlank(courseDTO.getCellPhone()), AppUser::getCellPhone, courseDTO.getCellPhone()) + .eq(Objects.nonNull(courseDTO.getGender()), AppUser::getGender, courseDTO.getGender()) + .eq(Objects.nonNull(courseDTO.getUserStatus()), AppUser::getUserStatus, courseDTO.getUserStatus()) + .between(Objects.nonNull(startTime),AppUser::getVipExpireTime,startTime,endTime) + .between(Objects.nonNull(startTime1),AppUser::getRegisterTime,startTime1,endTime1); + courseLambdaQueryWrapper.isNotNull(AppUser::getCellPhone) + .orderByDesc(AppUser::getRegisterTime); + if (org.springframework.util.StringUtils.hasLength(courseDTO.getVipType())){ + String[] split = courseDTO.getVipType().split(","); + List<String> list1 = Arrays.asList(split); + List<AppUser> appUsers = new ArrayList<>(); + List<AppUser> list = appUserService.lambdaQuery().gt(AppUser::getVipExpireTime, LocalDateTime.now()).list(); + for (AppUser appUser : list) { + if(appUser.getVipLevel()!=null){ + if (list1.contains(appUser.getVipLevel().toString())){ + appUsers.add(appUser); + } + } + } + List<Long> collect = appUsers.stream().map(AppUser::getId).collect(Collectors.toList()); + if (collect.isEmpty()){ + collect.add(-1L); + } + courseLambdaQueryWrapper.in(AppUser::getId, longs); + } + 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) { + AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, appUser.getId()) + .eq(AppUserTree::getSowAgain,2) + .one(); + // 查询疗愈等级 名称 图标 + int level = list1.getTreeLevelType(); + if (list2.contains(level+"")){ + appUsers.add(appUser); + } + } + List<Long> collect = appUsers.stream().map(AppUser::getId).collect(Collectors.toList()); + if (collect.isEmpty()){ + collect.add(-1L); + } + courseLambdaQueryWrapper.in(AppUser::getId, collect); + } + courseLambdaQueryWrapper.isNotNull(AppUser::getCellPhone); + List<AppUser> page = appUserService.list(courseLambdaQueryWrapper); + List<UserExport> userExports = new ArrayList<>(); + for (AppUser record : page) { + record.setUid(record.getId()+""); + // 判断是不是会员 + if (record.getVipExpireTime() == null){ + record.setIsVip(2); + }else if (record.getVipExpireTime().isBefore(LocalDateTime.now())){ + record.setIsVip(2); + }else{ + record.setIsVip(1); + } + AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, record.getId()) + .eq(AppUserTree::getSowAgain,2) + .one(); + // 查询疗愈等级 名称 图标 + int level = list1.getTreeLevelType(); + // 根据等级查询疗愈名称和图标 + UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData(); + record.setLevel(level); + record.setLevelIcon(data.getLevelIcon()); + record.setLevelName(data.getLevelName()); + record.setUid(record.getId().toString()); + UserExport userExport = new UserExport(); + userExport.setCode(record.getCode()); + userExport.setUserName(record.getNickname()); + userExport.setRealname(record.getRealname()); + userExport.setCellphone(record.getCellPhone()); + userExport.setGender(record.getGender()+""); + userExport.setBirthday(record.getBirthday()); + userExport.setEducation(record.getEducation()); + userExport.setLocation(record.getLocation()); + userExport.setHometown(record.getHometown()); + userExport.setEmail(record.getEmail()); + userExport.setIndustry(record.getIndustry()); + userExport.setCompany(record.getCompany()); + userExport.setOccupation(record.getOccupation()); + if (record.getVipExpireTime()!=null){ + if (record.getVipExpireTime().isAfter(LocalDateTime.now())){ + userExport.setIsVip(1+""); + }else{ + userExport.setIsVip(2+""); + } + }else{ + userExport.setIsVip(2+""); + + } + userExport.setMeditationLevel(record.getLevelName()); + userExport.setTotalEnergyValue(record.getTotalEnergyValue()+""); + userExport.setBalance(record.getBalance()+""); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String format = df.format(record.getRegisterTime()); + userExport.setRegisterTime(format); + 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: + userExport.setType1(appUserQuestion.getAnswer()); + break; + case 2: + userExport.setType2(appUserQuestion.getAnswer()); + break; + case 3: + userExport.setType3(appUserQuestion.getAnswer()); + break; + case 4: + userExport.setType4(appUserQuestion.getAnswer()); + break; + case 5: + userExport.setType5(appUserQuestion.getAnswer()); + break; + case 6: + userExport.setType6(appUserQuestion.getAnswer()); + break; + } + } + 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()); + } + StringBuilder stringBuilder = new StringBuilder(); + for (String tag : collect) { + stringBuilder.append(tag).append(";"); + } + userExport.setType7(stringBuilder+""); + userExport.setSanskritFlag(record.getSanskritFlag()+""); + int size = appUserService.lambdaQuery().eq(AppUser::getInviteUserId, record.getId()).list() + .size(); + userExport.setUserCount(size+""); + userExports.add(userExport); + } + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), UserExport.class, userExports); + HttpServletResponse response = WebUtils.response(); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + ServletOutputStream outputStream = null; + try { + String fileName = URLEncoder.encode("用户管理导出.xls", "utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + outputStream = response.getOutputStream(); + workbook.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + @PostMapping("/userManagementList") + @ApiOperation(value = "用户管理列表-分页", tags = {"管理后台-用户管理"}) + public R<PageDTO<AppUser>> userManagementList(@RequestBody AppUserManagementDTO courseDTO) { + String startTime = null; + 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"; + } + 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"; + } + List<Long> longs = new ArrayList<>(); + LambdaQueryWrapper<AppUser> courseLambdaQueryWrapper = new LambdaQueryWrapper<>(); + courseLambdaQueryWrapper + .like(StringUtils.isNotBlank(courseDTO.getNickname()), AppUser::getNickname, courseDTO.getNickname()) + .like(StringUtils.isNotBlank(courseDTO.getCellPhone()), AppUser::getCellPhone, courseDTO.getCellPhone()) + .eq(Objects.nonNull(courseDTO.getGender()), AppUser::getGender, courseDTO.getGender()) + .eq(Objects.nonNull(courseDTO.getUserStatus()), AppUser::getUserStatus, courseDTO.getUserStatus()) + .between(Objects.nonNull(startTime),AppUser::getVipExpireTime,startTime,endTime) + .between(Objects.nonNull(startTime1),AppUser::getRegisterTime,startTime1,endTime1) + .orderByDesc(AppUser::getRegisterTime); + if (org.springframework.util.StringUtils.hasLength(courseDTO.getVipType())){ + String[] split = courseDTO.getVipType().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().list(); + for (AppUser appUser : list) { + 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().distinct().map(AppUser::getId).collect(Collectors.toList()); + if (collect.isEmpty()){ + collect.add(-1L); + } + 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) { + AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, appUser.getId()) + .eq(AppUserTree::getSowAgain,2) + .one(); + // 查询疗愈等级 名称 图标 + int level = 1; + if (list1 != null){ + level = list1.getTreeLevelType(); + } + if (list2.contains(level+"")){ + appUsers.add(appUser); + } + } + List<Long> collect = appUsers.stream().map(AppUser::getId).collect(Collectors.toList()); + if (collect.isEmpty()){ + collect.add(-1L); + } + 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)); + } + for (AppUser record : page.getRecords()) { + record.setUid(record.getId()+""); + // 判断是不是会员 + if (record.getVipExpireTime() == null){ + record.setIsVip(2); + }else if (record.getVipExpireTime().isBefore(LocalDateTime.now())){ + record.setIsVip(2); + }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); + // 查询疗愈等级 名称 图标 + int level = 1; + if (tree != null){ + level = tree.getTreeLevelType(); + } + // 根据等级查询疗愈名称和图标 + UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData(); + record.setLevel(level); + record.setLevelIcon(data.getLevelIcon()); + record.setLevelName(data.getLevelName()); + record.setUid(record.getId().toString()); + } + return R.ok(PageDTO.of(page, AppUser.class)); + } + private static String getImageFormat(String url) { + String extension = url.substring(url.lastIndexOf('.') + 1).toLowerCase(); + switch (extension) { + case "png": + return "image/png"; + case "jpg": + case "jpeg": + return "image/jpeg"; + case "gif": + return "image/gif"; + default: + return "unknown format"; + } + } + public static DataSource convertImageToDataSource(String imageUrl) throws Exception { + URL url = new URL(imageUrl); + try (InputStream inputStream = url.openStream()) { + byte[] imageBytes = IOUtils.toByteArray(inputStream); + + // 使用 ImageIO 读取图片,以检测格式 + BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes)); + String formatName = ImageIO.getImageReaders(image).next().getFormatName(); + return new ByteArrayDataSource(imageBytes, "image/" + formatName); + } + } + @PostMapping("/changePhone") + @ApiOperation(value = "更换绑定手机号", tags = {"设置"}) + public R changePhone(String phone,String code) { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + 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("220125") || (com.xinquan.common.core.utils.StringUtils.isNotBlank(code) && code.equals( + captcha))) { + redisService.deleteObject(key); + return true; + } + } + return false; + } + @PostMapping("/deleteUser") + @ApiOperation(value = "注销账号", tags = {"设置"}) + public R deleteUser() { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + 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") + @ApiOperation(value = "我的钱包", tags = {"个人中心"}) + public R<WalletVO> wallet() { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + AppUser byId = appUserService.getById(userId); + WalletVO walletVO = new WalletVO(); + walletVO.setId(userId); + walletVO.setBalance(byId.getBalance()); + + 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); + walletVO.setRecharge(bigDecimal); + return R.ok(walletVO); + } + /** + * 爱心助力榜单-分页 + * + * @param pageCurr 分页参数,当前页码 + * @param pageSize 分页参数,每页数量 + * @return 课程分页列表 + */ + @PostMapping("/myInviteRankList") + @ApiOperation(value = "我的助力-分页", tags = {"个人中心"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"), + @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer") + }) + public R<PageDTO<InviteRankListVO>> myInviteRankList( + @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + 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.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分享"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"), + @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer"), + @ApiImplicitParam(value = "用户id", name = "userId", required = true, dataType = "String"), + }) + public R<PageDTO<InviteRankListVO>> myInviteRankListShare( + @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, + @RequestParam(value = "userId") String userId) { + Page<AppUser> objectPage = new Page<>(pageCurr, pageSize); + 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.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; + /** + * 爱心助力榜单-分页 + * + * @param pageCurr 分页参数,当前页码 + * @param pageSize 分页参数,每页数量 + * @return 课程分页列表 + */ + @PostMapping("/inviteRankList") + @ApiOperation(value = "爱心助力榜单-分页", tags = {"个人中心"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"), + @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer") + }) + public R<PageDTO<InviteRankListVO>> inviteRankList( + @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { + 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); + } + } + // 根据帮助人数 从大到小排序 + 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分享"}) + @ApiImplicitParams({ + @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"), + @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer") + }) + public R<PageDTO<InviteRankListVO>> inviteRankListShare( + @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { + 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); + } + } + // 根据帮助人数 从大到小排序 + 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") + @ApiOperation(value = "获取用户信息", tags = {"个人中心"}) + public R<AppUserInfoVO> getUserInfo() { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + AppUserInfoVO appUserInfoVO = new AppUserInfoVO(); + AppUser byId = appUserService.getById(userId); + BeanUtils.copyProperties(byId, appUserInfoVO); + AppUserVO currentUser = appUserService.getCurrentUser(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + if (currentUser.getVipExpireTime() == null){ + appUserInfoVO.setIsVip(2); + }else if (currentUser.getVipExpireTime().isAfter(LocalDateTime.now())){ + appUserInfoVO.setIsVip(1); + String formattedDateTime =currentUser.getVipExpireTime().format(formatter); + appUserInfoVO.setVipExpireTime(formattedDateTime); + }else{ + String formattedDateTime =currentUser.getVipExpireTime().format(formatter); + appUserInfoVO.setVipExpireTime(formattedDateTime); + appUserInfoVO.setIsVip(2); + } + // 查询用户累计学习天数 + List<AppUserViewingHistory> com = appUserViewingHistoryService.cumulative(userId); + appUserInfoVO.setCumulative(com.size()); + // 查询用户今日学习多少分钟 + Integer temp = appUserViewingHistoryService.today(userId); + if (temp == null){ + temp =0; + } + if (temp == 0){ + appUserInfoVO.setToday(0); + }else if (temp<60){ + // 不足一分钟按一分钟计算 + appUserInfoVO.setToday(1); + }else{ + appUserInfoVO.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); + } + appUserInfoVO.setContinuity(consecutiveDays); + AppUserTree list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId) + .eq(AppUserTree::getSowAgain,2) + .one(); + // 查询疗愈等级 名称 图标 + int level = 1; + if (list1 != null){ + level = list1.getTreeLevelType(); + } + appUserInfoVO.setLevel(level); + // 根据等级查询疗愈名称和图标 + UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData(); + appUserInfoVO.setLevelName(data.getLevelName()); + appUserInfoVO.setLevelIcon(data.getLevelIcon()); + return R.ok(appUserInfoVO); + } + @PostMapping("/getUserDetail") + @ApiOperation(value = "获取个人资料", tags = {"个人中心"}) + public R<AppUser> getUserDetail() { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + AppUser appUser = appUserService.lambdaQuery().eq(AppUser::getId, userId).one(); + if (appUser.getVipExpireTime() == null){ + appUser.setIsVip(2); + }else if (appUser.getVipExpireTime().isAfter(LocalDateTime.now())){ + appUser.setIsVip(1); + }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() { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + + 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()); + List<TreeLevelSetting> data3 = sysUserClient.getTreeGroup().getData(); + + 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(); + } + } + 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); + } + @PostMapping("/getTotalEnergyValue") + @ApiOperation(value = "获取用户当前累计能量值",tags = "树苗打卡站") + public R getTotalEnergyValue() { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + AppUser byId = appUserService.getById(userId); + return R.ok(byId.getTotalEnergyValue()); + } + @PostMapping("/updateUserDetail") + @ApiOperation(value = "修改个人资料", tags = {"个人中心"}) + public R<AppUser> updateUserDetail(@RequestBody UpdateAppUserDTO dto) { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + AppUser byId = appUserService.getById(userId); + LambdaUpdateWrapper<AppUser> updateWrapper = new LambdaUpdateWrapper<>(AppUser.class); + updateWrapper.set(AppUser::getNickname, dto.getNickname()); + updateWrapper.set(AppUser::getRealname, dto.getRealname()); + updateWrapper.set(AppUser::getSignature, dto.getSignature()); + updateWrapper.set(AppUser::getGender, dto.getGender()); + updateWrapper.set(AppUser::getBirthday, dto.getBirthday()); + updateWrapper.set(AppUser::getEducation, dto.getEducation()); + updateWrapper.set(AppUser::getIndustry, dto.getIndustry()); + updateWrapper.set(AppUser::getCompany, dto.getCompany()); + updateWrapper.set(AppUser::getOccupation, dto.getOccupation()); + updateWrapper.set(AppUser::getLocation, dto.getLocation()); + updateWrapper.set(AppUser::getHometown, dto.getHometown()); + updateWrapper.set(AppUser::getEmail, dto.getEmail()); + updateWrapper.eq(AppUser::getId,userId); + appUserService.update(byId, updateWrapper); + return R.ok(byId); + } + @PostMapping("/updateUserAvatar") + @ApiOperation(value = "修改头像", tags = {"个人中心"}) + public R updateUserDetail(String avatar) { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + AppUser byId = appUserService.getById(userId); + byId.setAvatar(avatar); + appUserService.updateById(byId); + return R.ok(); + } + /** + * 获取当前登录用户信息 + * + * @return 用户信息 + * @see AppUserVO + */ + @PostMapping("/getCurrentUser") + @ApiOperation(value = "获取当前用户信息", tags = {"用户端-用户信息相关接口"}) + public R<AppUserVO> getCurrentUser() { + return R.ok(appUserService.getCurrentUser()); + } + + /** + * 通过手机号查询用户端用户信息 + * + * @return 用户信息 + * @see AppUserVO + */ + @PostMapping("/getUserByPhone") + @ApiOperation(value = "根据用户手机号查询用户信息") + public R<AppUserDetailVO> getCurrentUser(String phone) { + 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 = "查询当前用户余额") + public R<String> getUserBalance() { + LoginUser loginUser = tokenService.getLoginUser(); + if (loginUser==null){ + return R.tokenError("登录失效"); + } + Long userId = loginUser.getUserid(); + AppUser one = appUserService.lambdaQuery().eq(AppUser::getId, userId).one(); + return R.ok(one.getBalance().toString()); + } + + /** + * 获取问题二的标签列表 + * + * @return List<TagVO> + */ + @GetMapping("/getTagList") + @ApiOperation(value = "问题二获取用户标签列表", tags = {"用户端-计划引导相关接口"}) + public R<List<TagVO>> getTagList() { + List<TagVO> voList = appUserService.getTagList(); + return R.ok(voList); + } + + /** + * 保存计划引导页用户的答案 + * + * @param dto 用户计划引导答案数据传输对象 + * @return + */ + @PostMapping("/saveUserAnswers") + @ApiOperation(value = "保存计划引导页用户的答案", tags = {"用户端-计划引导相关接口"}) + public R<?> saveUserAnswers(@Validated @RequestBody UserAnswerDTO dto) { + + appUserService.saveUserAnswers(dto); + return R.ok(); + } + /** + * 远程调用根据用户id 查询用户 + */ + @PostMapping("/getAppUserById/{id}") + public R<AppUser> getAppUserById(@PathVariable("id")String id) { + AppUser byId = appUserService.getById(id); + return R.ok(byId); + } + /** + * 远程调用根据用户名称 查询用户 + */ + @PostMapping("/getAppUserByName/{name}") + public R<List<Long>> getAppUserByName(@PathVariable("name")String name) { + List<Long> collect = appUserService.lambdaQuery() + .like(AppUser::getNickname, name) + .list() + .stream().map(AppUser::getId).collect(Collectors.toList()); + return R.ok(collect); + } + /** + * 远程调用根据用户名称 查询用户 + */ + @PostMapping("/getAppUserByNameOrPhone/{name}") + public R<List<Long>> getAppUserByNameOrPhone(@PathVariable("name")String name) { + List<Long> collect = appUserService.lambdaQuery() + .like(AppUser::getNickname, name) + .list() + .stream().map(AppUser::getId).collect(Collectors.toList()); + List<Long> collect1 = appUserService.lambdaQuery() + .like(AppUser::getCellPhone, name) + .list() + .stream().map(AppUser::getId).collect(Collectors.toList()); + collect1.addAll(collect); + List<Long> collect2 = collect1.stream().distinct().collect(Collectors.toList()); + return R.ok(collect2); + } + + } -- Gitblit v1.7.1