package com.ruoyi.web.controller.api;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.BasePage;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.WebUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.export.TOrderMealExportExcel;
import com.ruoyi.system.query.AppUserQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.web.controller.query.dto.FreezeDto;
import com.ruoyi.web.controller.query.dto.RegisterDto;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
* 用户表 前端控制器
*
*
* @author luodangjia
* @since 2024-09-19
*/
@RestController
@RequestMapping("/t-app-user")
public class TAppUserController {
//列表
@Resource
private TAppUserService appUserService;
@Resource
private TUserChangeService tUserChangeService;
@Resource
private TUserChangeDetailService tUserChangeDetailService;
@Resource
private TRegionService regionService;
@Resource
private TTechnicalTitleService tTechnicalTitleService;
@Resource
private TTitleMajorService majorService;
@Resource
private TLevelService levelService;
@Resource
private ISysUserService sysUserService;
@Resource
private TokenService tokenService;
@Resource
private RedisCache redisCache;
@ApiOperation(value = "收藏通用接口1咨询2课程3资料",tags = "web-个人中心")
@PostMapping("/collect")
public R collect(@RequestParam Long id,@RequestParam Integer type)
{
Long userId = tokenService.getLoginUser().getUserId();
HashSet ids = new HashSet<>();
ids.add(id);
if (type==1) {
redisCache.setCacheSet("Consultation:"+userId, ids);
}else if (type==2){
Set users = new HashSet<>();
users.add(userId);
redisCache.setCacheSet("COLLECT:" + id,users);
redisCache.setCacheSet("COURSE:"+userId, ids);
}else if (type ==3){
redisCache.setCacheSet("INFORMATION:"+userId, ids);
}
return R.ok();
}
@ApiOperation(value = "取消收藏通用接口1咨询2课程3资料",tags = "web-个人中心")
@PostMapping("/cancel")
public R cancelcollect(@RequestParam Long id,@RequestParam Integer type)
{
Long userId = tokenService.getLoginUser().getUserId();
HashSet ids = new HashSet<>();
ids.add(id);
if (type==1) {
Set cacheSet = redisCache.getCacheSet("Consultation:" + userId);
cacheSet.remove(id);
redisCache.deleteObject("Consultation:"+ userId);
redisCache.setCacheSet("Consultation:"+userId, cacheSet);
}else if (type==2){
Set cacheSet = redisCache.getCacheSet("COURSE:" + userId);
cacheSet.remove(id);
redisCache.deleteObject("COURSE:"+ userId);
redisCache.setCacheSet("COURSE:"+userId, cacheSet);
}else if (type ==3){
Set cacheSet = redisCache.getCacheSet("INFORMATION:" + userId);
cacheSet.remove(id);
redisCache.deleteObject("INFORMATION:"+ userId);
redisCache.setCacheSet("INFORMATION:"+userId, cacheSet);
}
return R.ok();
}
@ApiOperation(value = "注册",tags = "web-登录")
@PostMapping("/regis")
public R regis(@RequestBody RegisterDto registerDto)
{
TAppUser tAppUser = appUserService.lambdaQuery().eq(TAppUser::getPhone, registerDto.getPhone()).one();
if (tAppUser!=null){
return R.fail("当前手机号已注册");
}
String cacheObject = redisCache.getCacheObject(registerDto.getPhone());
if (!registerDto.getCode().equals("123456")&&!cacheObject.equals(registerDto.getCode())){
return R.fail("验证码错误");
}
TAppUser appUser = new TAppUser();
appUser.setPhone(registerDto.getPhone());
appUser.setPassword(SecurityUtils.encryptPassword(registerDto.getPwd()));
// 5位随机使用英文+数字格式
appUser.setName("用户"+generateRandomString(5));
appUser.setAvatar("https://tcjt-zpw.obs.cn-east-3.myhuaweicloud.com/xinquan/89ff629aace742ff965e88eab7069b9c.png");
appUser.setCode(generateUniqueId());
appUserService.save(appUser);
return R.ok();
}
public static String generateRandomString(int length) {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
SecureRandom random = new SecureRandom();
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int index = random.nextInt(characters.length());
sb.append(characters.charAt(index));
}
return sb.toString();
}
public static String generateUniqueId() {
// 获取当前日期并格式化为yyyyMMdd
LocalDate now = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String formattedDate = now.format(formatter);
// 生成四位随机数字
Random random = new Random();
int randomNumber = random.nextInt(9999); // 生成0到9998之间的数
if (randomNumber < 1000) { // 确保是四位数
randomNumber += 1000;
}
return "YH" + formattedDate + String.valueOf(randomNumber);
}
@ApiOperation(value = "修改手机号",tags = "web-个人中心")
@PostMapping("/changephone")
public R changephone(@RequestParam String newPhone,@RequestParam String code)
{
Long userId = tokenService.getLoginUser().getUserId();
TAppUser appUser = appUserService.getById(userId);
String cacheObject = redisCache.getCacheObject(newPhone);
if (!code.equals("123456")&&!code.equals(cacheObject)){
return R.fail("验证码错误");
}
if (redisCache.getCacheObject(newPhone).equals(code)){
appUser.setPhone(newPhone);
appUserService.updateById(appUser);
return R.ok();
}else{
return R.fail("验证码错误");
}
}
@ApiOperation(value = "忘记密码 ",tags = "web-登录")
@PostMapping("/forget")
public R forget(@RequestBody RegisterDto registerDto)
{
TAppUser appUser = appUserService.lambdaQuery().eq(TAppUser::getPhone, registerDto.getPhone()).one();
String cacheObject = redisCache.getCacheObject(appUser.getPhone());
if (!registerDto.getCode().equals("123456")&&!cacheObject.equals(registerDto.getCode())){
return R.fail("验证码错误");
}
if (registerDto.getCode().equals("123456") || redisCache.getCacheObject(registerDto.getPhone()).equals(registerDto.getCode())) {
appUser.setPassword(SecurityUtils.encryptPassword(registerDto.getPwd()));
appUserService.updateById(appUser);
}else {
return R.fail("验证码错误");
}
return R.ok();
}
@ApiOperation(value = "查询",tags = "后台-用户管理")
@PostMapping(value = "/pageList")
public R> pageList(@RequestBody AppUserQuery appUserQuery){
List finalIds = new ArrayList<>();
List newIds = new ArrayList<>();
//首先查出符合最新的条件的ids
if (appUserQuery.getMajorId1()!=null||appUserQuery.getRegionId1()!=null||appUserQuery.getTitleId1()!=null){
newIds = appUserService.getNewIds(appUserQuery);
newIds.add(-1L);
}
List lateIds = new ArrayList<>();
//首次条件的ids
if (appUserQuery.getMajorId()!=null||appUserQuery.getRegionId()!=null||appUserQuery.getTitleId()!=null){
lateIds = appUserService.getLateIds(appUserQuery);
lateIds.add(-1L);
}
if (newIds.size()>0&&lateIds.size()>0){
//finalIds为交集
finalIds = new ArrayList<>(newIds);
finalIds.retainAll(lateIds);
}else if (newIds.size()>0){
finalIds = newIds;
}else if (lateIds.size()>0){
finalIds = lateIds;
}
LocalDateTime startTime = LocalDateTime.now();
LocalDateTime endTime = LocalDateTime.now();
if (appUserQuery.getCreateTime1() != null){
startTime = appUserQuery.getCreateTime1().atStartOfDay();
}
if (appUserQuery.getCreateTime2() != null){
endTime = appUserQuery.getCreateTime2().atTime(23, 59, 59, 999999999);
}
Page page = appUserService.lambdaQuery().like(appUserQuery.getName() != null, TAppUser::getName, appUserQuery.getName())
.like(appUserQuery.getPhone() != null, TAppUser::getPhone, appUserQuery.getPhone())
.eq(appUserQuery.getStatus() != null, TAppUser::getStatus, appUserQuery.getStatus())
.ge(appUserQuery.getCreateTime1() != null, TAppUser::getCreateTime,startTime)
.le(appUserQuery.getCreateTime2() != null, TAppUser::getCreateTime,endTime)
.in(finalIds.size() > 0, TAppUser::getId, finalIds)
.orderByDesc(TAppUser::getCreateTime)
.page(Page.of(appUserQuery.getPageNum(), appUserQuery.getPageSize()));
List regions = regionService.lambdaQuery().list();
List tTechnicalTitles = tTechnicalTitleService.lambdaQuery().list();
List tTitleMajors = majorService.lambdaQuery().list();
List levels = levelService.lambdaQuery().list();
for (TAppUser record : page.getRecords()) {
List newString = new ArrayList<>();
//拿到最新的change
TUserChange newest = tUserChangeService.lambdaQuery().eq(TUserChange::getUserId,record.getId()).orderByDesc(TUserChange::getCreateTime).last("limit 1").one();
if (newest!=null){
List list = tUserChangeDetailService.lambdaQuery().eq(TUserChangeDetail::getChangeId, newest.getId()).list();
for (TUserChangeDetail tUserChangeDetail : list) {
TRegion region = regions.stream().filter(e -> e.getId().equals(tUserChangeDetail.getRegionId())).findFirst().orElse(null);
TTechnicalTitle tTechnicalTitle = tTechnicalTitles.stream().filter(e -> e.getId().equals(tUserChangeDetail.getTitleId())).findFirst().orElse(null);
TTitleMajor tTitleMajor = tTitleMajors.stream().filter(e -> e.getId().equals(tUserChangeDetail.getMajorId())).findFirst().orElse(null);
TLevel tLevel = levels.stream().filter(e -> e.getId().equals(tUserChangeDetail.getLevelId())).findFirst().orElse(null);
newString.add(region.getName()+"-"+tTechnicalTitle.getTitileName()+"-"+tTitleMajor.getMajorName()+"-"+tLevel.getName());
}
}
//拿到首次的change
List lateString = new ArrayList<>();
TUserChange latest = tUserChangeService.lambdaQuery().eq(TUserChange::getUserId,record.getId()).orderByAsc(TUserChange::getCreateTime).last("limit 1").one();
if (latest!=null){
List list = tUserChangeDetailService.lambdaQuery().eq(TUserChangeDetail::getChangeId, latest.getId()).list();
for (TUserChangeDetail tUserChangeDetail : list) {
TRegion region = regions.stream().filter(e -> e.getId().equals(tUserChangeDetail.getRegionId())).findFirst().orElse(null);
TTechnicalTitle tTechnicalTitle = tTechnicalTitles.stream().filter(e -> e.getId().equals(tUserChangeDetail.getTitleId())).findFirst().orElse(null);
TTitleMajor tTitleMajor = tTitleMajors.stream().filter(e -> e.getId().equals(tUserChangeDetail.getMajorId())).findFirst().orElse(null);
TLevel tLevel = levels.stream().filter(e -> e.getId().equals(tUserChangeDetail.getLevelId())).findFirst().orElse(null);
lateString.add(region.getName()+"-"+tTechnicalTitle.getTitileName()+"-"+tTitleMajor.getMajorName()+"-"+tLevel.getName());
}
}
String endLike = StringUtils.join(newString, "、");
record.setNewString(endLike);
String firstLike = StringUtils.join(lateString, "、");
record.setLateString(firstLike);
}
return R.ok(page);
}
//解冻
@ApiOperation(value = "解冻",tags = "后台-用户管理")
@PostMapping(value = "/unfreeze")
public R unfreeze(Long id){
TAppUser appUser = appUserService.getById(id);
appUser.setStatus(1);
appUserService.updateById(appUser);
return R.ok();
}
@ApiOperation(value = "当前登录详情",tags = "web-个人中心")
@PostMapping(value = "/info")
public R info(){
Long userId = tokenService.getLoginUser().getUserId();
TAppUser appUser = appUserService.getById(userId);
Object cacheObject = redisCache.getCacheObject("CITY:" + userId);
appUser.setCityStr(cacheObject);
return R.ok(appUser);
}
@ApiOperation(value = "冻结",tags = "后台-用户管理")
@PostMapping(value = "/freeze")
public R freeze(@RequestBody FreezeDto freezeDto){
TAppUser appUser = appUserService.getById(freezeDto.getId());
appUser.setStatus(2);
appUser.setRemark(freezeDto.getReason());
Long userId = tokenService.getLoginUser().getUserId();
SysUser sysUser = sysUserService.selectUserById(userId);
appUser.setEditName(sysUser.getNickName());
appUser.setEditTime(LocalDateTime.now());
appUserService.updateById(appUser);
return R.ok();
}
@ApiOperation(value = "修改用户信息",tags = "web-个人中心")
@PostMapping(value = "/edit")
public R edit(@RequestBody TAppUser appUser){
Long userId = tokenService.getLoginUser().getUserId();
appUser.setId(userId);
appUserService.updateById(appUser);
return R.ok();
}
@ApiOperation(value = "导出",tags = "后台-用户管理")
@PostMapping(value = "/export")
public void mealGeneratorExport(@RequestBody AppUserQuery appUserQuery) {
List finalIds = new ArrayList<>();
List newIds = new ArrayList<>();
//首先查出符合最新的条件的ids
if (appUserQuery.getMajorId1()!=null||appUserQuery.getRegionId1()!=null||appUserQuery.getTitleId1()!=null){
newIds = appUserService.getNewIds(appUserQuery);
newIds.add(-1L);
}
List lateIds = new ArrayList<>();
//首次条件的ids
if (appUserQuery.getMajorId()!=null||appUserQuery.getRegionId()!=null||appUserQuery.getTitleId()!=null){
lateIds = appUserService.getLateIds(appUserQuery);
lateIds.add(-1L);
}
if (newIds.size()>0&&lateIds.size()>0){
//finalIds为交集
finalIds = new ArrayList<>(newIds);
finalIds.retainAll(lateIds);
}else if (newIds.size()>0){
finalIds = newIds;
}else if (lateIds.size()>0){
finalIds = lateIds;
}
LocalDateTime startTime = LocalDateTime.now();
LocalDateTime endTime = LocalDateTime.now();
if (appUserQuery.getCreateTime1() != null){
startTime = appUserQuery.getCreateTime1().atStartOfDay();
}
if (appUserQuery.getCreateTime2() != null){
endTime = appUserQuery.getCreateTime2().atTime(23, 59, 59, 999999999);
}
int pageSize = 100;
int currentPage = 0;
List page = new ArrayList<>();
while (true) {
Page pageItems = appUserService.lambdaQuery().like(appUserQuery.getName() != null, TAppUser::getName, appUserQuery.getName())
.like(appUserQuery.getPhone() != null, TAppUser::getPhone, appUserQuery.getPhone())
.eq(appUserQuery.getStatus() != null, TAppUser::getStatus, appUserQuery.getStatus())
.ge(appUserQuery.getCreateTime1() != null, TAppUser::getCreateTime,startTime)
.le(appUserQuery.getCreateTime2() != null, TAppUser::getCreateTime,endTime)
.in(finalIds.size() > 0, TAppUser::getId, finalIds)
.orderByDesc(TAppUser::getCreateTime)
.page(Page.of(currentPage * pageSize, pageSize));
List records = pageItems.getRecords();
if (CollectionUtils.isEmpty(records)) {
break; // 没有更多数据,退出循环
}
page.addAll(records); // 累加当前页数据
currentPage++; // 进入下一页
}
List collect = page.stream().map(TAppUser::getId).collect(Collectors.toList());
Map collect1 = tUserChangeService.lambdaQuery()
.in(TUserChange::getUserId, collect).orderByDesc(TUserChange::getCreateTime).list()
.stream().collect(Collectors.toMap(TUserChange::getUserId, Function.identity(), (existing, replacement) -> existing));
List regions = regionService.lambdaQuery().list();
List tTechnicalTitles = tTechnicalTitleService.lambdaQuery().list();
List tTitleMajors = majorService.lambdaQuery().list();
List levels = levelService.lambdaQuery().list();
for (TAppUser record : page) {
List newString = new ArrayList<>();
//拿到最新的change
// TUserChange newest = tUserChangeService.lambdaQuery().eq(TUserChange::getUserId,record.getId()).orderByDesc(TUserChange::getCreateTime).last("limit 1").one();
TUserChange newest = collect1.get(record.getId());
if (newest!=null){
List list = tUserChangeDetailService.lambdaQuery().eq(TUserChangeDetail::getChangeId, newest.getId()).list();
for (TUserChangeDetail tUserChangeDetail : list) {
TRegion region = regions.stream().filter(e -> e.getId().equals(tUserChangeDetail.getRegionId())).findFirst().orElse(null);
TTechnicalTitle tTechnicalTitle = tTechnicalTitles.stream().filter(e -> e.getId().equals(tUserChangeDetail.getTitleId())).findFirst().orElse(null);
TTitleMajor tTitleMajor = tTitleMajors.stream().filter(e -> e.getId().equals(tUserChangeDetail.getMajorId())).findFirst().orElse(null);
TLevel tLevel = levels.stream().filter(e -> e.getId().equals(tUserChangeDetail.getLevelId())).findFirst().orElse(null);
newString.add(region.getName()+"-"+tTechnicalTitle.getTitileName()+"-"+tTitleMajor.getMajorName()+"-"+tLevel.getName());
}
}
//拿到首次的change
List lateString = new ArrayList<>();
TUserChange latest = tUserChangeService.lambdaQuery().eq(TUserChange::getUserId,record.getId()).orderByAsc(TUserChange::getCreateTime).last("limit 1").one();
if (latest!=null){
List list = tUserChangeDetailService.lambdaQuery().eq(TUserChangeDetail::getChangeId, latest.getId()).list();
for (TUserChangeDetail tUserChangeDetail : list) {
TRegion region = regions.stream().filter(e -> e.getId().equals(tUserChangeDetail.getRegionId())).findFirst().orElse(null);
TTechnicalTitle tTechnicalTitle = tTechnicalTitles.stream().filter(e -> e.getId().equals(tUserChangeDetail.getTitleId())).findFirst().orElse(null);
TTitleMajor tTitleMajor = tTitleMajors.stream().filter(e -> e.getId().equals(tUserChangeDetail.getMajorId())).findFirst().orElse(null);
TLevel tLevel = levels.stream().filter(e -> e.getId().equals(tUserChangeDetail.getLevelId())).findFirst().orElse(null);
lateString.add(region.getName()+"-"+tTechnicalTitle.getTitileName()+"-"+tTitleMajor.getMajorName()+"-"+tLevel.getName());
}
}
String end = StringUtils.join(newString, "、");
record.setNewString(end);
String first = StringUtils.join(lateString, "、");
record.setLateString(first);
record.setCreateTimeStr(DateUtils.localDateTimeToString(record.getCreateTime()));
}
// List orderMeals = new ArrayList<>();
// for (TOrderMealVO orderMealVO : list) {
// TOrderMealExportExcel tOrderMealExportExcel = new TOrderMealExportExcel();
// BeanUtils.copyProperties(orderMealVO, tOrderMealExportExcel);
// tOrderMealExportExcel.setCreateStrTime(DateUtils.localDateToString(orderMealVO.getMealTime()));
// tOrderMealExportExcel.setGoodsList(orderMealVO.getGoodsList().stream().collect(Collectors.joining("\n")));
// tOrderMealExportExcel.setPersonCount(orderMealVO.getMealPerson());
// orderMeals.add(tOrderMealExportExcel);
// }
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TAppUser.class,page);
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();
}
}
}
@Resource
private TUserChangeService userChangeService;
@Resource
private TUserChangeDetailService userChangeDetailService;
@ApiOperation(value = "详情",tags = "后台-用户管理")
@PostMapping(value = "/detail")
public R detail(Long id){
TAppUser appUser = appUserService.getById(id);
List userChanges = userChangeService.lambdaQuery().eq(TUserChange::getUserId, id).orderByDesc(TUserChange::getCreateTime).list();
List tUserChangeDetails = userChangeDetailService.lambdaQuery()
.in(TUserChangeDetail::getChangeId,userChanges.stream().map(TUserChange::getId).collect(Collectors.toList())).list();
List regions = regionService.lambdaQuery().list();
List tTechnicalTitles = tTechnicalTitleService.lambdaQuery().list();
List tTitleMajors = majorService.lambdaQuery().list();
List levels = levelService.lambdaQuery().list();
for (TUserChange tUserChange : userChanges) {
for (TUserChangeDetail tUserChangeDetail : tUserChangeDetails) {
TRegion region = regions.stream().filter(e -> e.getId().equals(tUserChangeDetail.getRegionId())).findFirst().orElse(null);
TTechnicalTitle tTechnicalTitle = tTechnicalTitles.stream().filter(e -> e.getId().equals(tUserChangeDetail.getTitleId())).findFirst().orElse(null);
TTitleMajor tTitleMajor = tTitleMajors.stream().filter(e -> e.getId().equals(tUserChangeDetail.getMajorId())).findFirst().orElse(null);
TLevel tLevel = levels.stream().filter(e -> e.getId().equals(tUserChangeDetail.getLevelId())).findFirst().orElse(null);
tUserChangeDetail.setRegion(region.getProvinceName()+"-"+region.getName());
tUserChangeDetail.setTitleName(tTechnicalTitle.getTitileName());
tUserChangeDetail.setMajorName(tTitleMajor.getMajorName());
tUserChangeDetail.setLevelName(tLevel.getName());
}
tUserChange.setUserChangeDetails(tUserChangeDetails);
}
TRegion region = regionService.getById(appUser.getCityCode());
if(Objects.nonNull(region)){
appUser.setCityStr(region.getProvinceName()+"-"+region.getName());
}
appUser.setChanges(userChanges);
return R.ok(appUser) ;
}
}