package com.xinquan.user.controller.client;
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.core.web.page.PageInfo;
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 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;
/**
*
* 用户信息表 前端控制器
*
*
* @author mitao
* @since 2024-08-21
*/
@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;
/**
* 远程调用 保存邀请码
*/
@PostMapping("/saveQrCode")
public R saveQrCode(@RequestBody AppUser appUser){
appUserService.updateById(appUser);
return R.ok();
}
/**
* 远程调用 查询用户信息
*/
@GetMapping("/getUserById/{id}")
public R getUserById(@PathVariable("id") Long id){
AppUser byId = appUserService.getById(id);
if (byId==null){
return R.fail();
}else{
return R.ok(byId);
}
}
/**
* 远程调用 查询当前登陆人拉黑列表
* @param appUserId
*/
@PostMapping("/getUserBlackList/{appUserId}")
public R> getUserBlackList(@PathVariable("appUserId") Long appUserId){
List 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> blackList(Integer pageCurr, Integer pageSize) {
LoginUser loginUser = tokenService.getLoginUser();
if (loginUser==null){
return R.tokenError("登录失效");
}
List collect = appUserBlackService.lambdaQuery().eq(AppUserBlack::getAppUserId, loginUser.getAppUserId()).list()
.stream().map(AppUserBlack::getBlackId).collect(Collectors.toList());
if (collect.isEmpty()){
collect.add(-1L);
}
Page page = appUserService.lambdaQuery().in(AppUser::getId, collect).page(new Page<>(pageCurr, pageSize));
if (CollUtils.isEmpty(page.getRecords())){
PageDTO 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 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 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 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> getAllUserList() {
List 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