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) ; } }