Browse Source

全部整理完前端反馈的bug

feature/0725lihuilin
willy 4 weeks ago
parent
commit
a44782a72b
  1. 19
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java
  2. 15
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java
  3. 15
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java
  4. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java
  5. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java
  6. 45
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  7. 349
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  8. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  9. 8
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  10. 40
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java
  11. 6
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java
  12. 15
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java
  13. 14
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java
  14. 11
      lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java
  15. 2
      lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml

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

15
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.mapper.AdminGradeMapper;
import com.lottery.admin.service.AdminGradeService; import com.lottery.admin.service.AdminGradeService;
import com.lottery.dto.GradeDto; import com.lottery.dto.GradeDto;
import com.lottery.dto.PageSimpleDto;
import com.lottery.entity.Grade; import com.lottery.entity.Grade;
import com.lottery.exception.SomeException; import com.lottery.exception.SomeException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -46,11 +47,17 @@ public class AdminGradeController {
@PostMapping("/list") @PostMapping("/list")
public Result<PageInfo<GradeVo>> selectGrade( @RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize){
LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageNum, pageSize);
public Result<PageInfo<GradeVo>> 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<GradeVo> pageSelectGrade = adminGradeService.pageSelectGrade(pageNum, pageSize);
PageInfo<GradeVo> pageSelectGrade = adminGradeService.pageSelectGrade(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize());
return Result.success(pageSelectGrade); return Result.success(pageSelectGrade);
} }

15
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java

@ -1,6 +1,7 @@
package com.lottery.admin.controller; package com.lottery.admin.controller;
import com.lottery.admin.service.AdminPrizeService; import com.lottery.admin.service.AdminPrizeService;
import com.lottery.dto.PageSimpleDto;
import com.lottery.dto.PrizeDto; import com.lottery.dto.PrizeDto;
import com.lottery.dto.FixUserDto; import com.lottery.dto.FixUserDto;
import com.lottery.result.Result; import com.lottery.result.Result;
@ -31,10 +32,16 @@ public class AdminPrizeController {
private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class); private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class);
@PostMapping("list") @PostMapping("list")
public Result<PageInfo<PrizeVo>> listPrize(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) {
LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageNum, pageSize);
public Result<PageInfo<PrizeVo>> 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<PrizeVo> pageInfo = adminPrizeService.pageListPrize(pageNum, pageSize);
PageInfo<PrizeVo> pageInfo = adminPrizeService.pageListPrize(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize());
return Result.success(pageInfo); return Result.success(pageInfo);
} }
@ -48,8 +55,6 @@ public class AdminPrizeController {
@PostMapping("/add") @PostMapping("/add")
public Result addPrize(@RequestBody @Valid PrizeDto prizeDto) { public Result addPrize(@RequestBody @Valid PrizeDto prizeDto) {
LOGGER.info("新增奖品:{}", prizeDto); LOGGER.info("新增奖品:{}", prizeDto);
//TODO 新增的时候选择不存在的等级给前端返回错误信息
return adminPrizeService.add(prizeDto); return adminPrizeService.add(prizeDto);
} }

3
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.baomidou.mybatisplus.extension.service.IService;
import com.lottery.dto.WinUserQueryDto; import com.lottery.dto.WinUserQueryDto;
import com.lottery.entity.WinnerRecord; import com.lottery.entity.WinnerRecord;
import com.lottery.result.Result;
import com.lottery.vo.PageInfo; import com.lottery.vo.PageInfo;
import com.lottery.vo.WinUserVo; import com.lottery.vo.WinUserVo;
@ -26,4 +27,6 @@ public interface AdminWinService extends IService<WinnerRecord> {
PageInfo<WinUserVo> listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto); PageInfo<WinUserVo> listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto);
void exportWinUser(WinUserQueryDto winUserQueryDto, HttpServletResponse response) throws IOException; void exportWinUser(WinUserQueryDto winUserQueryDto, HttpServletResponse response) throws IOException;
PageInfo<WinUserVo> listWinUserWin();
} }

3
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java

@ -74,7 +74,8 @@ public class AdminGradeServiceImpl extends ServiceImpl<AdminGradeMapper, Grade>
LambdaQueryWrapper<Grade> gradeLambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Grade> gradeLambdaQueryWrapper = new LambdaQueryWrapper<>();
gradeLambdaQueryWrapper.eq(Grade::getIsDel, 0); gradeLambdaQueryWrapper.eq(Grade::getIsDel, 0);
gradeLambdaQueryWrapper.orderByDesc(Grade::getSort);
gradeLambdaQueryWrapper.orderByDesc(Grade::getSort)
.orderByAsc(Grade::getId); //sort一样按照id排序
Page<Grade> gradePage = this.page(page, gradeLambdaQueryWrapper); Page<Grade> gradePage = this.page(page, gradeLambdaQueryWrapper);
List<GradeVo> gradeVos = ConvertBeanUtil.convertList(gradePage.getRecords(), GradeVo.class); List<GradeVo> gradeVos = ConvertBeanUtil.convertList(gradePage.getRecords(), GradeVo.class);

45
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java

@ -232,26 +232,51 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// 2. 检查该等级下是否已存在未删除的内定用户 // 2. 检查该等级下是否已存在未删除的内定用户
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserDetail> 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); // 只检查未删除的记录 .eq(UserDetail::getIsDel, 0); // 只检查未删除的记录
if (adminUserDetailMapper.selectCount(wrapper) > 0) { if (adminUserDetailMapper.selectCount(wrapper) > 0) {
return Result.failure("该等级下已存在内定用户,不可重复添加");
return Result.failure("该用户已是其他等级的内定用户,一个用户只能内定一个等级");
} }
// 3. 检查是否存在已删除的内定用户is_del=1
// // 检查该等级下是否已存在未删除的内定用户
// LambdaQueryWrapper<UserDetail> 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<UserDetail> 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<UserDetail> deletedWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserDetail> deletedWrapper = new LambdaQueryWrapper<>();
deletedWrapper.eq(UserDetail::getGradeId, gradeId) deletedWrapper.eq(UserDetail::getGradeId, gradeId)
.eq(UserDetail::getIsFixed, 1) .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<UserDetail> deletedDetails = adminUserDetailMapper.selectList(deletedWrapper);
if (!deletedDetails.isEmpty()) {
// 批量删除所有已标记为删除的记录
deletedDetails.forEach(deletedUserDetail -> {
adminUserDetailMapper.deleteById(deletedUserDetail.getId());
});
} }
// 4. 添加新内定用户 // 4. 添加新内定用户
UserDetail userDetail = new UserDetail(); UserDetail userDetail = new UserDetail();
userDetail.setUserId(userId); userDetail.setUserId(userId);

349
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java

@ -58,74 +58,83 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Override @Override
public PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { public PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) {
// //查UserDetail表吧所有的userid取出来然后在从user表根据id查就行了
// List<UserDetail> list = this.list();
// List<Long> UserIds = list.stream().map(UserDetail::getUserId).collect(Collectors.toList());
//
// Page<User> page = new Page<>(pageNum, pageSize);
// //
// //user表根据id批量查询
// LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// queryWrapper.in(User::getId, UserIds);
// // 如果没有有效用户返回空分页结果
// if (CollectionUtils.isEmpty(validUserIds)) {
// return emptyPageInfo(pageNum, pageSize);
// }
// //
// // 2. 构建用户表查询条件
// LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>();
// userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内
// //
// // 添加动态查询条件
// if (StringUtils.isNotBlank(userQueryDto.getUsername())) { // 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<User> userPage = this.adminUserMapper.selectPage(page, queryWrapper);
// List<UserVo> userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class);
// return PageInfo.of(userPage, userVolist);
// // 3. 执行分页查询
// Page<User> page = new Page<>(pageNum, pageSize);
// Page<User> userPage = adminUserMapper.selectPage(page, userWrapper);
//
// // 4. 转换为VO对象
// List<UserVo> 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<UserDetail> detailWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.select(UserDetail::getUserId) // 只查询user_id字段
.eq(UserDetail::getIsDel, 0); // 未删除的记录
detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录
List<Long> validUserIds = this.list(detailWrapper)
.stream()
.map(UserDetail::getUserId)
.collect(Collectors.toList());
// 2. 执行分页查询直接查询UserDetail表
Page<UserDetail> detailPage = new Page<>(pageNum, pageSize);
Page<UserDetail> detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper);
// 如果没有有效用户返回空分页结果
if (CollectionUtils.isEmpty(validUserIds)) {
// 3. 如果没有数据返回空分页结果
if (CollectionUtils.isEmpty(detailPageResult.getRecords())) {
return emptyPageInfo(pageNum, pageSize); return emptyPageInfo(pageNum, pageSize);
} }
// 2. 构建用户表查询条件
LambdaQueryWrapper<User> 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<Long> userIds = detailPageResult.getRecords().stream()
.map(UserDetail::getUserId)
.collect(Collectors.toList());
// 3. 执行分页查询
Page<User> page = new Page<>(pageNum, pageSize);
Page<User> userPage = adminUserMapper.selectPage(page, userWrapper);
Map<Long, User> userMap = adminUserMapper.selectBatchIds(userIds).stream()
.collect(Collectors.toMap(User::getId, Function.identity()));
// 4. 转换为VO对象
List<UserVo> userVoList = userPage.getRecords().stream()
.map(user -> {
// 5. 构建VO对象
List<UserVo> userVoList = detailPageResult.getRecords().stream()
.map(detail -> {
UserVo vo = new UserVo(); 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; return vo;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
// 5. 构建分页结果
return PageInfo.of(userPage, userVoList);
// 6. 构建分页结果
return PageInfo.of(detailPageResult, userVoList);
} }
// 返回空分页结果的辅助方法 // 返回空分页结果的辅助方法
@ -221,6 +230,141 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Result importFixUsers(MultipartFile file, Long gradeId) { public Result importFixUsers(MultipartFile file, Long gradeId) {
// try {
// // 1. 解析Excel
// List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
// .head(UserImportDto.class)
// .sheet()
// .doReadSync();
//
// // 2. 准备数据集合
// List<User> newUsers = new ArrayList<>(); // 需要新增到user表的用户
// List<User> usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户
// List<UserDetail> newUserDetails = new ArrayList<>(); // 新增的userDetail
// List<UserDetail> detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail
//
// Set<String> processedCodes = new HashSet<>();
// int successCount = 0;
// int skipCount = 0;
//
// // 3. 查询所有已存在的jwcodeuser表
// Set<String> existingJwCodes = adminUserMapper.selectAllUserCodes();
//
// // 4. 查询所有已存在的user_detail记录避免N+1查询
// Map<String, UserDetail> 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 { try {
// 1. 解析Excel // 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream()) List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
@ -228,100 +372,69 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
.sheet() .sheet()
.doReadSync(); .doReadSync();
// 2. 准备数据集合
List<User> newUsers = new ArrayList<>(); // 需要新增到user表的用户
List<User> usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户
List<UserDetail> newUserDetails = new ArrayList<>(); // 新增的userDetail
List<UserDetail> detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail
Set<String> processedCodes = new HashSet<>();
int successCount = 0; int successCount = 0;
int skipCount = 0; int skipCount = 0;
// 3. 查询所有已存在的jwcodeuser表
Set<String> existingJwCodes = adminUserMapper.selectAllUserCodes();
// 4. 查询所有已存在的user_detail记录避免N+1查询
Map<String, UserDetail> existingDetails = adminUserDetailMapper.selectList(null)
.stream()
.collect(Collectors.toMap(
detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(),
detail -> detail
));
Set<String> processedCodes = new HashSet<>();
for (int i = 0; i < userDtos.size(); i++) { for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i); UserImportDto dto = userDtos.get(i);
try { try {
validateUser(dto, i + 2, processedCodes); 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<UserDetail> 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<UserDetail> 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 { } 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++; successCount++;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
LOGGER.warn("导入数据校验失败: {}", e.getMessage());
LOGGER.warn("导入失败(行{}): {}", i + 2, e.getMessage());
skipCount++; 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)); return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
} catch (Exception e) { } catch (Exception e) {
LOGGER.error("导入用户失败", e);
LOGGER.error("导入失败", e);
return Result.failure("导入失败: " + e.getMessage()); return Result.failure("导入失败: " + e.getMessage());
} }
} }

4
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java

@ -281,12 +281,12 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
return Result.failure("Token为空"); return Result.failure("Token为空");
} }
String username = redisTemplate.opsForValue().get(token);
String username = redisTemplate.opsForValue().get("token:" + token);
if (StringUtils.isBlank(username)) { if (StringUtils.isBlank(username)) {
return Result.failure("无效的Token"); return Result.failure("无效的Token");
} }
redisTemplate.delete(token);
redisTemplate.delete("token:" + token);
return Result.success("登出成功"); return Result.success("登出成功");
} }

8
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.WinUserExportDto;
import com.lottery.dto.WinUserQueryDto; import com.lottery.dto.WinUserQueryDto;
import com.lottery.entity.*; import com.lottery.entity.*;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil; import com.lottery.utils.ConvertBeanUtil;
import com.lottery.vo.PageInfo; import com.lottery.vo.PageInfo;
import com.lottery.vo.UserVo; import com.lottery.vo.UserVo;
@ -64,7 +65,7 @@ public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecor
// 2. 构建查询条件 // 2. 构建查询条件
LambdaQueryWrapper<WinnerRecord> recordWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<WinnerRecord> recordWrapper = new LambdaQueryWrapper<>();
recordWrapper.eq(WinnerRecord::getIsDel, 0);
recordWrapper.eq(WinnerRecord::getIsDel, 0).orderByDesc(WinnerRecord::getWinTime);
if (StringUtils.isNotBlank(winUserQueryDto.getUsername())){ if (StringUtils.isNotBlank(winUserQueryDto.getUsername())){
// 需要关联用户表查询用户名 // 需要关联用户表查询用户名
@ -181,6 +182,11 @@ public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecor
.doWrite(convertToExportDto(winUserVoPageInfo.getList())); .doWrite(convertToExportDto(winUserVoPageInfo.getList()));
} }
@Override
public PageInfo<WinUserVo> listWinUserWin() {
return this.listWinUser(1, Integer.MAX_VALUE, new WinUserQueryDto());
}
// Vo ExportDto 的转换方法 // Vo ExportDto 的转换方法
private List<WinUserExportDto> convertToExportDto(List<WinUserVo> voList) { private List<WinUserExportDto> convertToExportDto(List<WinUserVo> voList) {

40
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<PageInfo<WinUserVo>> list(){
LOGGER.info("查询所有中奖用户");
return Result.success(adminWinService.listWinUserWin());
//return Result.success();
}
}

6
lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java

@ -57,7 +57,7 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements I
@Override @Override
public List<User> listAllUser() { public List<User> listAllUser() {
// 1. 查询前140条未删除的用户 // 1. 查询前140条未删除的用户
Page<User> page = new Page<>(1, 140);
Page<User> page = new Page<>(1, 2);
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getIsDel, 0); // 只查询未删除的用户 queryWrapper.eq(User::getIsDel, 0); // 只查询未删除的用户
@ -65,8 +65,8 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements I
List<User> users = userPage.getRecords(); List<User> users = userPage.getRecords();
// 2. 如果不足140条从剩余未删除用户中随机补充 // 2. 如果不足140条从剩余未删除用户中随机补充
if (users.size() < 140) {
int needed = 140 - users.size();
if (users.size() < 2) {
int needed = 2 - users.size();
// 获取所有未删除用户ID // 获取所有未删除用户ID
List<Long> allUserIds = userMapper.selectList( List<Long> allUserIds = userMapper.selectList(

15
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 {
}

14
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 {
}

11
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 { public class CorsConfig implements WebMvcConfigurer {
@Override @Override
public void addCorsMappings(CorsRegistry registry) { public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("/**")
// .allowedOrigins("*") // 允许所有来源
// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
// .allowedHeaders("*");
registry.addMapping("/**") registry.addMapping("/**")
.allowedOrigins("*") // 允许所有来源
.allowedOriginPatterns("*") // 允许所有来源模式
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*");
.allowedHeaders("*")
.allowCredentials(true); // 允许携带凭证如cookie认证头
} }
} }

2
lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml

@ -7,7 +7,7 @@
from prize p from prize p
left join grade g on p.grade_id = g.id left join grade g on p.grade_id = g.id
where g.is_del = 0 where g.is_del = 0
order by g.sort desc
order by g.sort desc,g.id ASC
</select> </select>
<select id="pageListPrize" resultType="com.lottery.entity.Prize"> <select id="pageListPrize" resultType="com.lottery.entity.Prize">

Loading…
Cancel
Save