package com.xinquan.user.controller.client;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson2.util.UUIDUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xinquan.common.core.domain.R;
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.security.utils.SecurityUtils;
import com.xinquan.system.api.RemoteUserService;
import com.xinquan.system.api.domain.*;
import com.xinquan.system.api.domain.vo.AppUserEnergyRecordVO;
import com.xinquan.system.api.domain.vo.WateringVO;
import com.xinquan.user.api.domain.dto.UserEnergyDTO;
import com.xinquan.user.api.domain.dto.UserExchangeRecordDTO;
import com.xinquan.user.domain.vo.EnergyVO;
import com.xinquan.user.domain.vo.ExchangeRecordVO;
import com.xinquan.user.service.*;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
/**
*
* 用户树苗表 前端控制器
*
*
* @author mitao
* @since 2024-08-21
*/
@RestController
@RequestMapping("/client/app-user-tree")
public class ClientAppUserTreeController {
@Resource
private AppUserTreeService appUserTreeService;
@Resource
private AppUserViewingHistoryService appUserViewingHistoryService;
@Resource
private AppUserService appUserService;
@Resource
private AppUserEnergyRecordService appUserEnergyRecordService;
@Resource
private PrizeService prizeService;
@Resource
private PrizeRedemptionRecordService prizeRedemptionRecordService;
@PostMapping("/getUserTree")
@ApiOperation(value = "获取用户树苗",tags = "树苗打卡站")
public R getUserTree() {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
AppUser byId = appUserService.getById(userId);
byId.setIsFirst(2);
appUserService.updateById(byId);
// 查询用户今日观看疗愈多少秒
LocalDateTime now = LocalDateTime.now();
LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
LocalDateTime endOfDay = now.toLocalDate().atTime(LocalTime.MAX);
List list = appUserViewingHistoryService
.lambdaQuery().eq(AppUserViewingHistory::getAppUserId, userId)
.eq(AppUserViewingHistory::getViewingType, 1)
.eq(BaseModel::getDelFlag,0)
.between(AppUserViewingHistory::getCreateTime, startOfDay,endOfDay).list();
int temp = 0;
for (AppUserViewingHistory appUserViewingHistory : list) {
temp += appUserViewingHistory.getTimeLook();
}
AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
.eq(AppUserTree::getSowAgain,2).one();
if (one == null){
AppUserTree appUserTree = new AppUserTree();
appUserTree.setAppUserId(userId);
appUserTree.setTreeLevelType(1);
appUserTree.setGrowthValue(0);
appUserTree.setSowAgain(2);
appUserTree.setCreateTime(LocalDateTime.now());
// 如果用户的签到时间是今天 那么修改为已签到
if (byId.getSignTime().toLocalDate().equals(LocalDateTime.now().toLocalDate())){
appUserTree.setIsSign(1);
}else{
appUserTree.setIsSign(2);
}
if (temp>=60){
appUserTree.setTaskOne(1);
appUserTree.setTaskTwo(1);
}
else if (temp>=30){
appUserTree.setTaskOne(1);
appUserTree.setTaskTwo(2);
}else{
appUserTree.setTaskOne(2);
appUserTree.setTaskTwo(2);
}
appUserTree.setNextLevel(1000);
appUserTreeService.save(appUserTree);
return R.ok(appUserTree);
}else{
if (temp>=60){
one.setTaskOne(1);
one.setTaskTwo(1);
}
else if (temp>=30){
one.setTaskOne(1);
one.setTaskTwo(2);
}else{
one.setTaskOne(2);
one.setTaskTwo(2);
}
// 如果用户的签到时间是今天 那么修改为已签到
if (byId.getSignTime().toLocalDate().equals(LocalDateTime.now().toLocalDate())){
one.setIsSign(1);
}else{
one.setIsSign(2);
}
switch (one.getTreeLevelType()){
case 1:
one.setNextLevel(1000);
break;
case 2:
one.setNextLevel(1000);
break;
case 3:
one.setNextLevel(1000);
break;
case 4:
one.setNextLevel(1000);
break;
case 5:
one.setNextLevel(2000);
break;
case 6:
one.setNextLevel(2000);
break;
case 7:
one.setNextLevel(2000);
break;
case 8:
one.setNextLevel(2000);
break;
case 9:
one.setNextLevel(2400);
break;
case 10:
one.setNextLevel(2400);
break;
}
return R.ok(one);
}
}
@PostMapping("/restart")
@ApiOperation(value = "重新播种",tags = "树苗打卡站")
public R restart() {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
.eq(AppUserTree::getSowAgain,2).one();
one.setSowAgain(1);
appUserTreeService.updateById(one);
AppUserTree appUserTree = new AppUserTree();
appUserTree.setAppUserId(userId);
appUserTree.setTreeLevelType(1);
appUserTree.setGrowthValue(0);
appUserTree.setSowAgain(2);
appUserTree.setCreateTime(LocalDateTime.now());
appUserTreeService.save(appUserTree);
return R.ok();
}
@PostMapping("/watering")
@ApiOperation(value = "浇水 返回值true证明升级了 false没升级",tags = "树苗打卡站")
public R watering() {
WateringVO wateringVO = new WateringVO();
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
AppUser byId = appUserService.getById(userId);
AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
.eq(AppUserTree::getSowAgain,2).one();
Integer currentEnergyValue = byId.getEnergyValue();
byId.setEnergyValue(0);
// 判断能否升级
int temp = 0;
switch (one.getTreeLevelType()){
case 1:
temp=1000;
break;
case 2:
temp=1000;
break;
case 3:
temp=1000;
break;
case 4:
temp=1000;
break;
case 5:
temp=2000;
break;
case 6:
temp=2000;
break;
case 7:
temp=2000;
break;
case 8:
temp=2000;
break;
case 9:
temp=2400;
break;
case 10:
temp=2400;
break;
}
wateringVO.setNextLevel(temp);
// 升级阈值
if (one.getGrowthValue()+currentEnergyValue>=temp){
// 升级咯 如果当前等级已经为10级
if (one.getTreeLevelType()==10){
one.setGrowthValue(one.getGrowthValue()+currentEnergyValue);
appUserTreeService.updateById(one);
wateringVO.setIsNext(false);
wateringVO.setNextLevel(2400);
}else{
// 升级
one.setTreeLevelType(one.getTreeLevelType()+1);
one.setGrowthValue(one.getGrowthValue()+currentEnergyValue-temp);
appUserTreeService.updateById(one);
switch (one.getTreeLevelType()+1){
case 2:
temp=1000;
break;
case 3:
temp=1000;
break;
case 4:
temp=1000;
break;
case 5:
temp=2000;
break;
case 6:
temp=2000;
break;
case 7:
temp=2000;
break;
case 8:
temp=2000;
break;
case 9:
temp=2400;
break;
case 10:
temp=2400;
break;
}
wateringVO.setNextLevel(temp);
wateringVO.setIsNext(true);
}
}else{
// 不能升级
one.setGrowthValue(one.getGrowthValue()+currentEnergyValue-temp);
appUserTreeService.updateById(one);
wateringVO.setIsNext(false);
}
wateringVO.setGrowthValue(one.getGrowthValue());
return R.ok(wateringVO);
}
@PostMapping("/sign")
@ApiOperation(value = "签到",tags = "树苗打卡站")
public R sign() {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
// 给用户加10能量
AppUser byId = appUserService.getById(userId);
byId.setTotalEnergyValue(byId.getTotalEnergyValue()+10);
byId.setEnergyValue(byId.getEnergyValue()+10);
appUserService.updateById(byId);
return R.ok();
}
@PostMapping("/isFirst")
@ApiOperation(value = "是否首次进入 ",tags = "树苗打卡站")
public R isFirst() {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
AppUser byId = appUserService.getById(userId);
if (byId.getIsFirst() == 1){
byId.setIsFirst(2);
appUserService.updateById(byId);
return R.ok(true);
}else{
return R.ok(false);
}
}
@PostMapping("/userEnergyDetail")
@ApiOperation(value = "用户详情-能量值明细 ",tags = "管理后台-用户管理")
public R> userEnergyDetail(@RequestBody UserEnergyDTO 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();
EnergyVO energyVO = new EnergyVO();
energyVO.setEnergyTotal(appUserService.getById(userId).getTotalEnergyValue());
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
if (dto.getState()!=null){
switch (dto.getState()){
case 1:
lambdaQueryWrapper.eq(AppUserEnergyRecord::getChangeType, 1);
break;
case 2:
lambdaQueryWrapper.eq(AppUserEnergyRecord::getChangeType, 2);
break;
}
}
lambdaQueryWrapper.like(StringUtils.hasLength(dto.getContent()),AppUserEnergyRecord::getReason,dto.getContent());
lambdaQueryWrapper.between(startTime!=null,BaseModel::getCreateTime,startTime,endTime);
lambdaQueryWrapper.eq(AppUserEnergyRecord::getAppUserId, userId).orderByDesc(BaseModel::getCreateTime);
Page page = appUserEnergyRecordService.page(new Page<>(dto.getPageCurr(), dto.getPageSize()), lambdaQueryWrapper);
if (CollUtils.isEmpty(page.getRecords())){
PageDTO empty = PageDTO.empty(page);
energyVO.setList(new ArrayList());
return R.ok(empty);
}
PageDTO appUserEnergyRecordVOPageDTO = PageDTO.of(page, AppUserEnergyRecordVO.class);
energyVO.setList(appUserEnergyRecordVOPageDTO.getList());
return R.ok(appUserEnergyRecordVOPageDTO);
}
@PostMapping("/userExchangeRecordList")
@ApiOperation(value = "用户详情-兑换记录 ",tags = "管理后台-用户管理")
public R> userExchangeRecordList(@RequestBody UserExchangeRecordDTO dto) {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
Page page = prizeRedemptionRecordService.lambdaQuery()
.eq(PrizeRedemptionRecord::getAppUserId, userId)
.orderByDesc(BaseModel::getCreateTime).page(new Page<>(dto.getPageCurr(), dto.getPageSize()));
if (CollUtils.isEmpty(page.getRecords())){
PageDTO empty = PageDTO.empty(page);
return R.ok(empty);
}
PageDTO res = PageDTO.of(page, ExchangeRecordVO.class);
for (ExchangeRecordVO record : res.getList()) {
Prize temp = prizeService.lambdaQuery()
.eq(Prize::getId, record.getId()).one();
if (temp != null){
record.setName(temp.getName());
record.setCoverUrl(temp.getCoverUrl());
record.setWorth(temp.getWorth());
record.setEnergyValue(temp.getEnergyValue());
}
}
return R.ok(res);
}
@PostMapping("/energyDetail")
@ApiOperation(value = "能量值明细 ",tags = "树苗打卡站")
@ApiImplicitParams({
@ApiImplicitParam(name = "state", value = "状态1全部 2增加 3扣除", dataType = "int", required = false),
@ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true),
@ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)
})
public R> energyDetail(Integer state,Integer pageCurr,Integer pageSize) {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
EnergyVO energyVO = new EnergyVO();
energyVO.setEnergyTotal(appUserService.getById(userId).getTotalEnergyValue());
LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
if (state!=null){
switch (state){
case 2:
lambdaQueryWrapper.eq(AppUserEnergyRecord::getChangeType, 1);
break;
case 3:
lambdaQueryWrapper.eq(AppUserEnergyRecord::getChangeType, 2);
break;
}
}
lambdaQueryWrapper.eq(AppUserEnergyRecord::getAppUserId, userId).orderByDesc(BaseModel::getCreateTime);
Page page = appUserEnergyRecordService.page(new Page<>(pageCurr, pageSize), lambdaQueryWrapper);
if (CollUtils.isEmpty(page.getRecords())){
PageDTO empty = PageDTO.empty(page);
energyVO.setList(new ArrayList());
return R.ok(empty);
}
PageDTO appUserEnergyRecordVOPageDTO = PageDTO.of(page, AppUserEnergyRecordVO.class);
energyVO.setList(appUserEnergyRecordVOPageDTO.getList());
return R.ok(appUserEnergyRecordVOPageDTO);
}
@PostMapping("/goodsList")
@ApiOperation(value = "能量兑换礼物列表 ",tags = "树苗打卡站")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true),
@ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)
})
public R> goodsList(Integer pageCurr,Integer pageSize) {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
Page page = prizeService.lambdaQuery()
.eq(Prize::getStatus, 1)
.orderByDesc(BaseModel::getCreateTime).page(new Page<>(pageCurr, pageSize));
if (CollUtils.isEmpty(page.getRecords())){
PageDTO empty = PageDTO.empty(page);
return R.ok(empty);
}
for (Prize record : page.getRecords()) {
PrizeRedemptionRecord one = prizeRedemptionRecordService.lambdaQuery()
.eq(PrizeRedemptionRecord::getPrizeId, record.getId())
.eq(PrizeRedemptionRecord::getAppUserId, userId).one();
if (one == null){
record.setReceiveStatus(2);
}
}
PageDTO res = PageDTO.of(page, Prize.class);
return R.ok(res);
}
@PostMapping("/exchange")
@ApiOperation(value = "兑换奖品 ",tags = "树苗打卡站")
@ApiImplicitParams({
@ApiImplicitParam(name = "prizeId", value = "奖品id", dataType = "Long", required = true),
})
public R exchange(Long prizeId) {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
AppUser byId1 = appUserService.getById(userId);
Prize byId = prizeService.getById(prizeId);
if (byId1.getTotalEnergyValue()<=byId.getEnergyValue()){
return R.fail("能量值不足");
}
PrizeRedemptionRecord one = prizeRedemptionRecordService.lambdaQuery()
.eq(PrizeRedemptionRecord::getPrizeId, prizeId)
.eq(PrizeRedemptionRecord::getAppUserId, userId).one();
if (one!=null){
return R.fail("奖品已兑换");
}
PrizeRedemptionRecord prizeRedemptionRecord = new PrizeRedemptionRecord();
prizeRedemptionRecord.setStatus(1);
prizeRedemptionRecord.setEnergyValue(byId.getEnergyValue());
prizeRedemptionRecord.setPrizeId(prizeId);
prizeRedemptionRecord.setAppUserId(userId);
prizeRedemptionRecord.setCreateTime(LocalDateTime.now());
String code = RandomUtil.randomNumbers(6);
prizeRedemptionRecord.setCode(code);
prizeRedemptionRecordService.save(prizeRedemptionRecord);
// 随机生成6位纯数字验证码
return R.ok();
}
@PostMapping("/exchangeRecordList")
@ApiOperation(value = "兑换记录 ",tags = "树苗打卡站")
@ApiImplicitParams({
@ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true),
@ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)
})
public R> exchangeRecordList(Integer pageCurr, Integer pageSize) {
Long userId = SecurityUtils.getUserId();
if (userId==0)return R.tokenError("登录失效");
Page page = prizeRedemptionRecordService.lambdaQuery()
.eq(PrizeRedemptionRecord::getAppUserId, userId)
.orderByDesc(BaseModel::getCreateTime).page(new Page<>(pageCurr, pageSize));
if (CollUtils.isEmpty(page.getRecords())){
PageDTO empty = PageDTO.empty(page);
return R.ok(new ArrayList());
}
PageDTO res = PageDTO.of(page, ExchangeRecordVO.class);
for (ExchangeRecordVO record : res.getList()) {
Prize temp = prizeService.lambdaQuery()
.eq(Prize::getId, record.getId()).one();
if (temp != null){
record.setName(temp.getName());
record.setCoverUrl(temp.getCoverUrl());
record.setWorth(temp.getWorth());
record.setEnergyValue(temp.getEnergyValue());
}
}
return R.ok(res.getList());
}
}