diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java new file mode 100644 index 0000000..a2e90b2 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java @@ -0,0 +1,19 @@ +package com.lottery.dto; + +import lombok.Data; + +/** + * @program: lottery + * @ClassName PageSimpleDto + * @description: + * @author: wwl + * @create: 2025-07-22 16:50 + * @Version 1.0 + **/ +@Data +public class PageSimpleDto { + + private Integer pageNum; + + private Integer pageSize; +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java index 02bb52d..79b1b54 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java @@ -3,6 +3,7 @@ package com.lottery.admin.controller; import com.lottery.admin.mapper.AdminGradeMapper; import com.lottery.admin.service.AdminGradeService; import com.lottery.dto.GradeDto; +import com.lottery.dto.PageSimpleDto; import com.lottery.entity.Grade; import com.lottery.exception.SomeException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -46,11 +47,17 @@ public class AdminGradeController { @PostMapping("/list") - public Result> selectGrade( @RequestParam(defaultValue = "1") Integer pageNum, - @RequestParam(defaultValue = "10") Integer pageSize){ - LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageNum, pageSize); + public Result> selectGrade(@RequestBody PageSimpleDto pageSimpleDto){ + if (pageSimpleDto.getPageNum() == null) { + pageSimpleDto.setPageNum(1); + } + if (pageSimpleDto.getPageSize() == null) { + pageSimpleDto.setPageSize(10); + } + + LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); - PageInfo pageSelectGrade = adminGradeService.pageSelectGrade(pageNum, pageSize); + PageInfo pageSelectGrade = adminGradeService.pageSelectGrade(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); return Result.success(pageSelectGrade); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java index bb98c0c..8b8bd37 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java @@ -1,6 +1,7 @@ package com.lottery.admin.controller; import com.lottery.admin.service.AdminPrizeService; +import com.lottery.dto.PageSimpleDto; import com.lottery.dto.PrizeDto; import com.lottery.dto.FixUserDto; import com.lottery.result.Result; @@ -31,10 +32,16 @@ public class AdminPrizeController { private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class); @PostMapping("list") - public Result> listPrize(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { - LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageNum, pageSize); + public Result> listPrize(@RequestBody PageSimpleDto pageSimpleDto) { + if (pageSimpleDto.getPageNum() == null) { + pageSimpleDto.setPageNum(1); + } + if (pageSimpleDto.getPageSize() == null) { + pageSimpleDto.setPageSize(10); + } + LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); - PageInfo pageInfo = adminPrizeService.pageListPrize(pageNum, pageSize); + PageInfo pageInfo = adminPrizeService.pageListPrize(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); return Result.success(pageInfo); } @@ -48,8 +55,6 @@ public class AdminPrizeController { @PostMapping("/add") public Result addPrize(@RequestBody @Valid PrizeDto prizeDto) { LOGGER.info("新增奖品:{}", prizeDto); - - //TODO 新增的时候选择不存在的等级,给前端返回错误信息 return adminPrizeService.add(prizeDto); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java index 9cf50ae..0cadb53 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java @@ -3,6 +3,7 @@ package com.lottery.admin.service; import com.baomidou.mybatisplus.extension.service.IService; import com.lottery.dto.WinUserQueryDto; import com.lottery.entity.WinnerRecord; +import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.WinUserVo; @@ -26,4 +27,6 @@ public interface AdminWinService extends IService { PageInfo listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto); void exportWinUser(WinUserQueryDto winUserQueryDto, HttpServletResponse response) throws IOException; + + PageInfo listWinUserWin(); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java index 792635f..ebdd90b 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java @@ -74,7 +74,8 @@ public class AdminGradeServiceImpl extends ServiceImpl LambdaQueryWrapper gradeLambdaQueryWrapper = new LambdaQueryWrapper<>(); gradeLambdaQueryWrapper.eq(Grade::getIsDel, 0); - gradeLambdaQueryWrapper.orderByDesc(Grade::getSort); + gradeLambdaQueryWrapper.orderByDesc(Grade::getSort) + .orderByAsc(Grade::getId); //sort一样按照id排序 Page gradePage = this.page(page, gradeLambdaQueryWrapper); List gradeVos = ConvertBeanUtil.convertList(gradePage.getRecords(), GradeVo.class); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java index f0293f8..b739229 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java @@ -232,26 +232,51 @@ public class AdminPrizeServiceImpl extends ServiceImpl // 2. 检查该等级下是否已存在未删除的内定用户 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(UserDetail::getGradeId, gradeId) -// .eq(UserDetail::getIsFixed, 1) + wrapper.eq(UserDetail::getUserId, userId) + .eq(UserDetail::getIsFixed, 1) //已经内定的用户不能内定 .eq(UserDetail::getIsDel, 0); // 只检查未删除的记录 if (adminUserDetailMapper.selectCount(wrapper) > 0) { - return Result.failure("该等级下已存在内定用户,不可重复添加"); + return Result.failure("该用户已是其他等级的内定用户,一个用户只能内定一个等级"); } - // 3. 检查是否存在已删除的内定用户(is_del=1) +// // 检查该等级下是否已存在未删除的内定用户 +// LambdaQueryWrapper gradeWrapper = new LambdaQueryWrapper<>(); +// gradeWrapper.eq(UserDetail::getGradeId, gradeId) +// .eq(UserDetail::getIsFixed, 1) +// .eq(UserDetail::getIsDel, 0); +// +// if (adminUserDetailMapper.selectCount(gradeWrapper) > 0) { +// return Result.failure("该等级下已存在内定用户"); +// } + +// // 3. 检查是否存在已删除的内定用户(is_del=1) +// LambdaQueryWrapper deletedWrapper = new LambdaQueryWrapper<>(); +// deletedWrapper.eq(UserDetail::getGradeId, gradeId) +// .eq(UserDetail::getIsFixed, 1) +// .eq(UserDetail::getIsDel, 1) +// .last("LIMIT 1"); // 只取第一条 +// +// UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper); +// if (deletedUserDetail != null) { +// // 如果存在已删除的记录,先物理删除 +// adminUserDetailMapper.deleteById(deletedUserDetail.getId()); +// } + // 3. 检查该等级下是否存在已删除的内定用户(is_del=1),并全部物理删除 LambdaQueryWrapper deletedWrapper = new LambdaQueryWrapper<>(); deletedWrapper.eq(UserDetail::getGradeId, gradeId) .eq(UserDetail::getIsFixed, 1) - .eq(UserDetail::getIsDel, 1); - - UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper); - if (deletedUserDetail != null) { - // 如果存在已删除的记录,先物理删除 - adminUserDetailMapper.deleteById(deletedUserDetail.getId()); + .eq(UserDetail::getIsDel, 1); // 查询所有已删除的内定用户 + + List deletedDetails = adminUserDetailMapper.selectList(deletedWrapper); + if (!deletedDetails.isEmpty()) { + // 批量删除所有已标记为删除的记录 + deletedDetails.forEach(deletedUserDetail -> { + adminUserDetailMapper.deleteById(deletedUserDetail.getId()); + }); } + // 4. 添加新内定用户 UserDetail userDetail = new UserDetail(); userDetail.setUserId(userId); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java index 506ab91..3489e3f 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java @@ -58,74 +58,83 @@ public class AdminUserDetailServiceImpl extends ServiceImpl listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { - -// //查UserDetail表吧所有的userid取出来,然后在从user表根据id查就行了。 -// List list = this.list(); -// List UserIds = list.stream().map(UserDetail::getUserId).collect(Collectors.toList()); -// -// Page page = new Page<>(pageNum, pageSize); // -// //user表根据id批量查询 -// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); -// queryWrapper.in(User::getId, UserIds); +// // 如果没有有效用户,返回空分页结果 +// if (CollectionUtils.isEmpty(validUserIds)) { +// return emptyPageInfo(pageNum, pageSize); +// } // +// // 2. 构建用户表查询条件 +// LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); +// userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内 // +// // 添加动态查询条件 // if (StringUtils.isNotBlank(userQueryDto.getUsername())) { -// queryWrapper.like(User::getUsername, userQueryDto.getUsername()); +// userWrapper.like(User::getUsername, userQueryDto.getUsername()); // } -// if(StringUtils.isNotBlank(userQueryDto.getJwcode())){ -// queryWrapper.like(User::getPassword, userQueryDto.getJwcode()); +// if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { +// userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); // 注意字段名是否匹配 // } // -// Page userPage = this.adminUserMapper.selectPage(page, queryWrapper); -// List userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class); -// return PageInfo.of(userPage, userVolist); +// // 3. 执行分页查询 +// Page page = new Page<>(pageNum, pageSize); +// Page userPage = adminUserMapper.selectPage(page, userWrapper); +// +// // 4. 转换为VO对象 +// List userVoList = userPage.getRecords().stream() +// .map(user -> { +// UserVo vo = new UserVo(); +// // 这里做属性拷贝,可以使用BeanUtils或MapStruct等工具 +// vo.setId(user.getId()); +// vo.setUsername(user.getUsername()); +// // ...其他字段拷贝 +// return vo; +// }) +// .collect(Collectors.toList()); +// +// // 5. 构建分页结果 +// return PageInfo.of(userPage, userVoList); - // 1. 先查询有效的用户ID列表(过滤掉 is_del = 1 的记录) + // 1. 查询有效的用户详情记录(过滤掉 is_del = 1 的记录) LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); - detailWrapper.select(UserDetail::getUserId) // 只查询user_id字段 - .eq(UserDetail::getIsDel, 0); // 未删除的记录 + detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录 - List validUserIds = this.list(detailWrapper) - .stream() - .map(UserDetail::getUserId) - .collect(Collectors.toList()); + // 2. 执行分页查询(直接查询UserDetail表) + Page detailPage = new Page<>(pageNum, pageSize); + Page detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper); - // 如果没有有效用户,返回空分页结果 - if (CollectionUtils.isEmpty(validUserIds)) { + // 3. 如果没有数据,返回空分页结果 + if (CollectionUtils.isEmpty(detailPageResult.getRecords())) { return emptyPageInfo(pageNum, pageSize); } - // 2. 构建用户表查询条件 - LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); - userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内 - - // 添加动态查询条件 - if (StringUtils.isNotBlank(userQueryDto.getUsername())) { - userWrapper.like(User::getUsername, userQueryDto.getUsername()); - } - if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { - userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); // 注意字段名是否匹配 - } + // 4. 批量获取关联的User信息 + List userIds = detailPageResult.getRecords().stream() + .map(UserDetail::getUserId) + .collect(Collectors.toList()); - // 3. 执行分页查询 - Page page = new Page<>(pageNum, pageSize); - Page userPage = adminUserMapper.selectPage(page, userWrapper); + Map userMap = adminUserMapper.selectBatchIds(userIds).stream() + .collect(Collectors.toMap(User::getId, Function.identity())); - // 4. 转换为VO对象 - List userVoList = userPage.getRecords().stream() - .map(user -> { + // 5. 构建VO对象 + List userVoList = detailPageResult.getRecords().stream() + .map(detail -> { UserVo vo = new UserVo(); - // 这里做属性拷贝,可以使用BeanUtils或MapStruct等工具 - vo.setId(user.getId()); - vo.setUsername(user.getUsername()); - // ...其他字段拷贝 + vo.setId(detail.getId()); // 这里使用user_detail表的ID + + // 设置User表的信息 + User user = userMap.get(detail.getUserId()); + if (user != null) { + vo.setUsername(user.getUsername()); + vo.setJwcode(user.getJwcode()); + // 其他需要从User表获取的字段... + } return vo; }) .collect(Collectors.toList()); - // 5. 构建分页结果 - return PageInfo.of(userPage, userVoList); + // 6. 构建分页结果 + return PageInfo.of(detailPageResult, userVoList); } // 返回空分页结果的辅助方法 @@ -221,6 +230,141 @@ public class AdminUserDetailServiceImpl extends ServiceImpl userDtos = EasyExcel.read(file.getInputStream()) +// .head(UserImportDto.class) +// .sheet() +// .doReadSync(); +// +// // 2. 准备数据集合 +// List newUsers = new ArrayList<>(); // 需要新增到user表的用户 +// List usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户 +// List newUserDetails = new ArrayList<>(); // 新增的userDetail +// List detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail +// +// Set processedCodes = new HashSet<>(); +// int successCount = 0; +// int skipCount = 0; +// +// // 3. 查询所有已存在的jwcode(user表) +// Set existingJwCodes = adminUserMapper.selectAllUserCodes(); +// +// // 4. 查询所有已存在的user_detail记录(避免N+1查询) +// Map existingDetails = adminUserDetailMapper.selectList(null) +// .stream() +// .collect(Collectors.toMap( +// detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(), +// detail -> detail +// )); +// +// for (int i = 0; i < userDtos.size(); i++) { +// UserImportDto dto = userDtos.get(i); +// try { +// validateUser(dto, i + 2, processedCodes); +// +// // 检查是否已在当前文件中处理过 +// if (processedCodes.contains(dto.getJwcode())) { +// throw new IllegalArgumentException("精网号在当前文件中重复: " + dto.getJwcode()); +// } +// processedCodes.add(dto.getJwcode()); +// +// // 处理逻辑 +// if (existingJwCodes.contains(dto.getJwcode())) { +// // --- 用户已存在 --- +// User existingUser = adminUserMapper.selectUserByJwcode(dto.getJwcode()); +// +// // 检查user表状态 +// if (existingUser.getIsDel() == 1) { +// // user表已删除,恢复用户 +// existingUser.setIsDel(0); +// usersToRecover.add(existingUser); +// } +// +//// // 检查user_detail状态 +//// UserDetail existingDetail = existingDetails.get(dto.getJwcode()); +//// if (existingDetail != null) { +//// if (existingDetail.getIsDel() == 1) { +//// // user_detail已删除,恢复记录 +//// existingDetail.setIsDel(0); +//// existingDetail.setGradeId(gradeId); +//// detailsToRecover.add(existingDetail); +//// } else { +//// // user_detail已存在且未删除,跳过 +//// throw new IllegalArgumentException("用户已存在且未删除: " + dto.getJwcode()); +//// } +//// } else { +//// // user_detail不存在,新增 +//// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId)); +//// } +//// } else { +//// // --- 全新用户 --- +//// User newUser = convertToEntity(dto); +//// newUsers.add(newUser); +//// } +//// successCount++; +//// } catch (IllegalArgumentException e) { +//// LOGGER.warn("导入数据校验失败: {}", e.getMessage()); +//// skipCount++; +//// } +//// } +// // 检查用户是否已经是其他等级的内定用户 +// UserDetail existingFixedDetail = existingDetails.get(existingUser.getId()); +// if (existingFixedDetail != null) { +// if (existingFixedDetail.getGradeId().equals(gradeId)) { +// // 已经是当前等级的内定用户 +// if (existingFixedDetail.getIsDel() == 1) { +// // 恢复已删除的记录 +// existingFixedDetail.setIsDel(0); +// detailsToRecover.add(existingFixedDetail); +// } else { +// throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode()); +// } +// } else { +// // 已经是其他等级的内定用户 +// throw new IllegalArgumentException("用户已是其他等级的内定用户,无法添加到本等级: " + dto.getJwcode()); +// } +// } else { +// // 不是任何等级的内定用户,可以添加 +// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId)); +// } +// } else { +// // --- 全新用户 --- +// User newUser = convertToEntity(dto); +// newUsers.add(newUser); +// } +// successCount++; +// } catch (IllegalArgumentException e) { +// LOGGER.warn("导入数据校验失败: {}", e.getMessage()); +// skipCount++; +// } +// } +// // 5. 批量操作数据库 +// if (!newUsers.isEmpty()) { +// adminUserService.saveBatch(newUsers); +// // 为新用户创建userDetail +// newUsers.forEach(user -> +// newUserDetails.add(createUserDetail(user.getId(), gradeId))); +// } +// +// if (!usersToRecover.isEmpty()) { +// adminUserService.updateBatchById(usersToRecover); +// } +// +// if (!detailsToRecover.isEmpty()) { +// this.updateBatchById(detailsToRecover); +// } +// +// if (!newUserDetails.isEmpty()) { +// this.saveBatch(newUserDetails); +// } +// +// return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); +// } catch (Exception e) { +// LOGGER.error("导入用户失败", e); +// return Result.failure("导入失败: " + e.getMessage()); +// } + try { // 1. 解析Excel List userDtos = EasyExcel.read(file.getInputStream()) @@ -228,100 +372,69 @@ public class AdminUserDetailServiceImpl extends ServiceImpl newUsers = new ArrayList<>(); // 需要新增到user表的用户 - List usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户 - List newUserDetails = new ArrayList<>(); // 新增的userDetail - List detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail - - Set processedCodes = new HashSet<>(); int successCount = 0; int skipCount = 0; - - // 3. 查询所有已存在的jwcode(user表) - Set existingJwCodes = adminUserMapper.selectAllUserCodes(); - - // 4. 查询所有已存在的user_detail记录(避免N+1查询) - Map existingDetails = adminUserDetailMapper.selectList(null) - .stream() - .collect(Collectors.toMap( - detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(), - detail -> detail - )); + Set processedCodes = new HashSet<>(); for (int i = 0; i < userDtos.size(); i++) { UserImportDto dto = userDtos.get(i); try { validateUser(dto, i + 2, processedCodes); + processedCodes.add(dto.getJwcode()); - // 检查是否已在当前文件中处理过 - if (processedCodes.contains(dto.getJwcode())) { - throw new IllegalArgumentException("精网号在当前文件中重复: " + dto.getJwcode()); + // 2. 查询用户是否存在(按jwcode) + User user = adminUserMapper.selectUserByJwcode(dto.getJwcode()); + if (user == null) { + // 新增用户 + user = convertToEntity(dto); + adminUserMapper.insert(user); + } else if (user.getIsDel() == 1) { + // 恢复已删除用户 + user.setIsDel(0); + adminUserMapper.updateById(user); } - processedCodes.add(dto.getJwcode()); - // 处理逻辑 - if (existingJwCodes.contains(dto.getJwcode())) { - // --- 用户已存在 --- - User existingUser = adminUserMapper.selectUserByJwcode(dto.getJwcode()); + // 3. 检查用户是否已经是其他等级的内定用户(全局检查) + LambdaQueryWrapper globalCheckWrapper = new LambdaQueryWrapper<>(); + globalCheckWrapper.eq(UserDetail::getUserId, user.getId()) + .eq(UserDetail::getIsFixed, 1) + .eq(UserDetail::getIsDel, 0) + .ne(UserDetail::getGradeId, gradeId); // 排除当前等级 - // 检查user表状态 - if (existingUser.getIsDel() == 1) { - // user表已删除,恢复用户 - existingUser.setIsDel(0); - usersToRecover.add(existingUser); - } + if (adminUserDetailMapper.selectCount(globalCheckWrapper) > 0) { + throw new IllegalArgumentException("用户已是其他等级的内定用户,无法重复内定: " + dto.getJwcode()); + } - // 检查user_detail状态 - UserDetail existingDetail = existingDetails.get(dto.getJwcode()); - if (existingDetail != null) { - if (existingDetail.getIsDel() == 1) { - // user_detail已删除,恢复记录 - existingDetail.setIsDel(0); - existingDetail.setGradeId(gradeId); - detailsToRecover.add(existingDetail); - } else { - // user_detail已存在且未删除,跳过 - throw new IllegalArgumentException("用户已存在且未删除: " + dto.getJwcode()); - } + // 3. 检查是否已是当前gradeId的内定用户 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserDetail::getUserId, user.getId()) + .eq(UserDetail::getGradeId, gradeId) + .eq(UserDetail::getIsFixed, 1); + + UserDetail existingDetail = adminUserDetailMapper.selectOne(wrapper); + if (existingDetail != null) { + if (existingDetail.getIsDel() == 0) { + throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode()); } else { - // user_detail不存在,新增 - newUserDetails.add(createUserDetail(existingUser.getId(), gradeId)); + // 物理删除旧记录,再新增一条 + adminUserDetailMapper.deleteById(existingDetail.getId()); } - } else { - // --- 全新用户 --- - User newUser = convertToEntity(dto); - newUsers.add(newUser); } + + // 4. 新增内定记录 + UserDetail newDetail = createUserDetail(user.getId(), gradeId); + adminUserDetailMapper.insert(newDetail); successCount++; + } catch (IllegalArgumentException e) { - LOGGER.warn("导入数据校验失败: {}", e.getMessage()); + LOGGER.warn("导入失败(行{}): {}", i + 2, e.getMessage()); skipCount++; } } - // 5. 批量操作数据库 - if (!newUsers.isEmpty()) { - adminUserService.saveBatch(newUsers); - // 为新用户创建userDetail - newUsers.forEach(user -> - newUserDetails.add(createUserDetail(user.getId(), gradeId))); - } - - if (!usersToRecover.isEmpty()) { - adminUserService.updateBatchById(usersToRecover); - } - - if (!detailsToRecover.isEmpty()) { - this.updateBatchById(detailsToRecover); - } - - if (!newUserDetails.isEmpty()) { - this.saveBatch(newUserDetails); - } return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); } catch (Exception e) { - LOGGER.error("导入用户失败", e); + LOGGER.error("导入失败", e); return Result.failure("导入失败: " + e.getMessage()); } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java index 989d09f..1f43e9b 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java @@ -281,12 +281,12 @@ public class AdminUserServiceImpl extends ServiceImpl imp return Result.failure("Token为空"); } - String username = redisTemplate.opsForValue().get(token); + String username = redisTemplate.opsForValue().get("token:" + token); if (StringUtils.isBlank(username)) { return Result.failure("无效的Token"); } - redisTemplate.delete(token); + redisTemplate.delete("token:" + token); return Result.success("登出成功"); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java index 78b8fa6..ed3fad6 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java @@ -19,6 +19,7 @@ import com.lottery.dto.UserQueryDto; import com.lottery.dto.WinUserExportDto; import com.lottery.dto.WinUserQueryDto; import com.lottery.entity.*; +import com.lottery.result.Result; import com.lottery.utils.ConvertBeanUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.UserVo; @@ -64,7 +65,7 @@ public class AdminWinServiceImpl extends ServiceImpl recordWrapper = new LambdaQueryWrapper<>(); - recordWrapper.eq(WinnerRecord::getIsDel, 0); + recordWrapper.eq(WinnerRecord::getIsDel, 0).orderByDesc(WinnerRecord::getWinTime); if (StringUtils.isNotBlank(winUserQueryDto.getUsername())){ // 需要关联用户表查询用户名 @@ -181,6 +182,11 @@ public class AdminWinServiceImpl extends ServiceImpl listWinUserWin() { + return this.listWinUser(1, Integer.MAX_VALUE, new WinUserQueryDto()); + } + // Vo 转 ExportDto 的转换方法 private List convertToExportDto(List voList) { diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java new file mode 100644 index 0000000..084a642 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java @@ -0,0 +1,40 @@ +package com.lottery.api.controller; + +import com.lottery.admin.mapper.AdminUserMapper; +import com.lottery.admin.service.AdminWinService; +import com.lottery.api.service.WinUserService; +import com.lottery.result.Result; +import com.lottery.vo.PageInfo; +import com.lottery.vo.WinUserVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.logging.Logger; + +/** + * @program: lottery + * @ClassName WinUserController + * @description: + * @author: wwl + * @create: 2025-07-22 15:05 + * @Version 1.0 + **/ +@RestController +@RequestMapping("/api/winUser") +public class WinUserController { + + private final static Logger LOGGER = Logger.getLogger(WinUserController.class.getName()); + + @Autowired + private AdminWinService adminWinService; + + @PostMapping("/list") + public Result> list(){ + LOGGER.info("查询所有中奖用户"); + return Result.success(adminWinService.listWinUserWin()); + //return Result.success(); + } +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java index 4f7b87b..90cbdcb 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java @@ -57,7 +57,7 @@ public class UserServiceImpl extends ServiceImpl implements I @Override public List listAllUser() { // 1. 查询前140条未删除的用户 - Page page = new Page<>(1, 140); + Page page = new Page<>(1, 2); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getIsDel, 0); // 只查询未删除的用户 @@ -65,8 +65,8 @@ public class UserServiceImpl extends ServiceImpl implements I List users = userPage.getRecords(); // 2. 如果不足140条,从剩余未删除用户中随机补充 - if (users.size() < 140) { - int needed = 140 - users.size(); + if (users.size() < 2) { + int needed = 2 - users.size(); // 获取所有未删除用户ID List allUserIds = userMapper.selectList( diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java new file mode 100644 index 0000000..28eacf0 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java @@ -0,0 +1,15 @@ +package com.lottery.api.service.Impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lottery.api.service.WinUserService; + +/** + * @program: lottery + * @ClassName WinUserServiceImpl + * @description: + * @author: wwl + * @create: 2025-07-22 15:21 + * @Version 1.0 + **/ +public class WinUserServiceImpl implements WinUserService { +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java new file mode 100644 index 0000000..3ab4b73 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java @@ -0,0 +1,14 @@ +package com.lottery.api.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @program: lottery + * @ClassName WinUserService + * @description: + * @author: wwl + * @create: 2025-07-22 15:21 + * @Version 1.0 + **/ +public interface WinUserService { +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java b/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java index da79684..5da90ee 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java @@ -17,9 +17,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { +// registry.addMapping("/**") +// .allowedOrigins("*") // 允许所有来源 +// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") +// .allowedHeaders("*"); + registry.addMapping("/**") - .allowedOrigins("*") // 允许所有来源 + .allowedOriginPatterns("*") // 允许所有来源模式 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") - .allowedHeaders("*"); + .allowedHeaders("*") + .allowCredentials(true); // 允许携带凭证(如cookie、认证头) + } } diff --git a/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml index da97ce2..7a4ed26 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml @@ -7,7 +7,7 @@ from prize p left join grade g on p.grade_id = g.id where g.is_del = 0 - order by g.sort desc + order by g.sort desc,g.id ASC