diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserLoginDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserLoginDto.java index 0834a91..0f44454 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserLoginDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserLoginDto.java @@ -15,7 +15,7 @@ import java.io.Serializable; @Data public class UserLoginDto implements Serializable { - private String username; +// private String username; private String password; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java index 508b749..b77604f 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java @@ -38,6 +38,8 @@ public class User { private int isWin; //是否中奖 + private int isDel; + private Date createTime; // 创建时间 private Date updateTime; // 更新时间 diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/LotteryApplication.java b/lottery-system/lottery-service/src/main/java/com/lottery/LotteryApplication.java index 335f647..7daf8b5 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/LotteryApplication.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/LotteryApplication.java @@ -5,11 +5,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; +import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.swing.*; @SpringBootApplication @MapperScan("com.lottery.*.mapper") +@EnableTransactionManagement public class LotteryApplication { public static void main(String[] args) { SpringApplication.run(LotteryApplication.class, args); 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 bf94b1e..fff108e 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 @@ -93,7 +93,7 @@ public class AdminPrizeController { if (fixUserDto.getUsername() == null || fixUserDto.getJwcode() == null) { return Result.failure("所有字段都必须填写"); } - adminPrizeService.addWinUser(fixUserDto); - return Result.success(); + return adminPrizeService.addWinUser(fixUserDto); + } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java index 8169c15..78cc1c3 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java @@ -84,8 +84,10 @@ public class AdminUserController { if (ids == null || ids.size() == 0) { return Result.failure("ids is null"); } - adminUserService.removeBatchByIds(ids); - return Result.success(); + if (adminUserService.removeUserBatchByIds(ids)){ + return Result.success(); + }; + return Result.failure("删除失败"); } @PostMapping("/import") @@ -128,8 +130,10 @@ public class AdminUserController { @PostMapping("/delete/fix") public Result deleteFix(@RequestParam Long id) { LOGGER.info("根据id删除内定用户:{}",id); - adminUserDetailService.removeById(id); - return Result.success(); + if (adminUserDetailService.removeFixUserById(id)){ + return Result.success(); + }; + return Result.failure("删除失败"); } @PostMapping("/delete/fix/batch") @@ -138,11 +142,12 @@ public class AdminUserController { if (ids == null || ids.size() == 0) { return Result.failure("ids is null"); } - adminUserDetailService.removeBatchByIds(ids); - return Result.success(); + if (adminUserDetailService.removeFixUserBatchByIds(ids)){ + return Result.success(); + }; + return Result.failure("删除失败"); } - //TODO 导入有点问题 @PostMapping("/import/fix") public Result importFixUsers(@RequestParam("file") MultipartFile file, @RequestParam Long gradeId) { LOGGER.info("开始导入内定用户Excel文件: {}", file.getOriginalFilename()); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java index dd21e17..9f6bf44 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lottery.entity.UserDetail; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; import java.util.Set; @@ -20,4 +21,7 @@ import java.util.Set; public interface AdminUserDetailMapper extends BaseMapper { @Select("select jwcode from user_detail") Set selectAllUserCodes(); + + @Update("UPDATE user_detail SET is_del = 1 WHERE id = #{id}") + int removeFixUserById(Long id); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java index 96ac205..7fad76b 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lottery.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; import java.util.Set; @@ -22,4 +23,7 @@ public interface AdminUserMapper extends BaseMapper { Set selectAllUserCodes(); Long selectByJwcode(String jwcode); + + @Update("update user set is_del = 1 where id = #{id}") + void deleteUserById(Long id); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java index 8e0d8c2..c49827e 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.lottery.dto.PrizeDto; import com.lottery.dto.FixUserDto; import com.lottery.entity.Prize; +import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; @@ -24,7 +25,7 @@ public interface AdminPrizeService extends IService { PrizeVo getPrizeById(Long id); - void addWinUser(FixUserDto fixUserDto); + Result addWinUser(FixUserDto fixUserDto); boolean removePrizeById(Long id); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java index 17ff9e6..f9ba296 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java @@ -6,9 +6,10 @@ import com.lottery.entity.UserDetail; import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.UserVo; -import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + /** * @program: lottery * @ClassName IUserDetail @@ -22,4 +23,8 @@ public interface AdminUserDetailService extends IService { PageInfo listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto); Result importFixUsers(MultipartFile file, Long gradeId); + + boolean removeFixUserById(Long id); + + boolean removeFixUserBatchByIds(List ids); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java index f4ae225..3801cde 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java @@ -41,5 +41,7 @@ public interface AdminUserService extends IService { Result importUsers(MultipartFile file); void removeUserById(Long id); + + boolean removeUserBatchByIds(List ids); } 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 76a6f37..792635f 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 @@ -31,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @program: lottery-system @@ -105,28 +106,38 @@ public class AdminGradeServiceImpl extends ServiceImpl @Transactional public boolean removeGradeById(Long id) { //把关联的win_record表删了 - //先根据 gradeId 查询关联的 prizeId - LambdaQueryWrapper prizeQueryWrapper = new LambdaQueryWrapper<>(); - prizeQueryWrapper.eq(Prize::getGradeId, id).select(Prize::getId); - Prize prize = adminPrizeMapper.selectOne(prizeQueryWrapper); - LambdaUpdateWrapper updateWrapper3 = new LambdaUpdateWrapper<>(); - updateWrapper3.eq(WinnerRecord::getPrizeId, prize.getId()).set(WinnerRecord::getIsDel,1); - adminWinMapper.update(null, updateWrapper3); - - - //吧关联的prize表删了 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(Prize::getGradeId, id).set(Prize::getIs_del, 1); - adminPrizeMapper.update(null, updateWrapper); - - - //把关联的user_detail表删了 - LambdaUpdateWrapper updateWrapper1 = new LambdaUpdateWrapper<>(); - updateWrapper1.eq(UserDetail::getGradeId, id).set(UserDetail::getIsDel, 1); - adminUserDetailMapper.update(null, updateWrapper1); - - - //最后逻辑删除等级 + // 1. 查询所有关联的 prizeId(可能多个) + List prizes = adminPrizeMapper.selectList( + new LambdaQueryWrapper() + .eq(Prize::getGradeId, id) + .select(Prize::getId) + ); + + // 2. 批量逻辑删除关联的 win_record + if (!prizes.isEmpty()) { + List prizeIds = prizes.stream() + .map(Prize::getId) + .collect(Collectors.toList()); + + LambdaUpdateWrapper winRecordWrapper = new LambdaUpdateWrapper<>(); + winRecordWrapper.in(WinnerRecord::getPrizeId, prizeIds) + .set(WinnerRecord::getIsDel, 1); + adminWinMapper.update(null, winRecordWrapper); + } + + // 3. 逻辑删除关联的 prize + LambdaUpdateWrapper prizeWrapper = new LambdaUpdateWrapper<>(); + prizeWrapper.eq(Prize::getGradeId, id) + .set(Prize::getIs_del, 1); + adminPrizeMapper.update(null, prizeWrapper); + + // 4. 逻辑删除关联的 user_detail + LambdaUpdateWrapper userDetailWrapper = new LambdaUpdateWrapper<>(); + userDetailWrapper.eq(UserDetail::getGradeId, id) + .set(UserDetail::getIsDel, 1); + adminUserDetailMapper.update(null, userDetailWrapper); + + // 5. 逻辑删除 grade adminGradeMapper.deleteGradeById(id); return true; } 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 88160ba..3346c04 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 @@ -10,6 +10,7 @@ import com.lottery.admin.service.AdminPrizeService; import com.lottery.dto.PrizeDto; import com.lottery.dto.FixUserDto; import com.lottery.entity.*; +import com.lottery.result.Result; import com.lottery.utils.ConvertBeanUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; @@ -78,14 +79,15 @@ public class AdminPrizeServiceImpl extends ServiceImpl // 1. 查询关联的等级(grade)状态 Grade grade = adminGradeMapper.selectById(prizeDto.getGradeId()); // 假设 gradeId 是传入的等级ID - if (grade == null) { + if (grade.getIsDel() == 1) { return false; // 等级不存在,直接返回失败 } // 2. 检查逻辑:仅当等级未删除(is_del=0)且已存在奖品时,才拒绝添加 if (grade.getIsDel() == 0) { // 等级未删除 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(Prize::getGradeId, prizeDto.getGradeId()); + wrapper.eq(Prize::getGradeId, prizeDto.getGradeId()) + .eq(Prize::getIs_del, 0); // 只统计未删除的奖品; if (this.count(wrapper) > 0) { return false; // 等级未删除且已有奖品,拒绝添加 } @@ -123,8 +125,6 @@ public class AdminPrizeServiceImpl extends ServiceImpl } - - // 2. 查询目标等级信息 Grade targetGrade = adminGradeMapper.selectById(gradeId); if (targetGrade == null) { @@ -144,14 +144,14 @@ public class AdminPrizeServiceImpl extends ServiceImpl return false; // 目标等级已有奖品,不能修改 } } - - // 4. 检查奖品名称是否重复(排除自己) - LambdaQueryWrapper nameCheckWrapper = new LambdaQueryWrapper<>(); - nameCheckWrapper.eq(Prize::getPrizeName, prizeDto.getPrizeName()) - .ne(Prize::getId, prizeDto.getId()); - if (this.count(nameCheckWrapper) > 0) { - return false; // 奖品名称已存在 - } +// +// // 4. 检查奖品名称是否重复(排除自己) +// LambdaQueryWrapper nameCheckWrapper = new LambdaQueryWrapper<>(); +// nameCheckWrapper.eq(Prize::getPrizeName, prizeDto.getPrizeName()) +// .ne(Prize::getId, prizeDto.getId()); +// if (this.count(nameCheckWrapper) > 0) { +// return false; // 奖品名称已存在 +// } // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(Prize::getGradeId, grade.getId()); @@ -181,30 +181,88 @@ public class AdminPrizeServiceImpl extends ServiceImpl } @Override - public void addWinUser(FixUserDto fixUserDto) { - //先判断新增的内定用户是否在总的抽奖用户中 - Long userId = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); - if (userId == null) { - User user = User.builder() - .username(fixUserDto.getUsername()) - .jwcode(fixUserDto.getJwcode()) - .password("123456") - .isWin(0) - .createTime(new Date()) - .updateTime(new Date()).build(); - adminUserMapper.insert(user); //不存在,插入总表 - } + public Result addWinUser(FixUserDto fixUserDto) { + +// //先判断新增的内定用户是否在总的抽奖用户中 +// Long userId = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); +// if (userId == null) { +// User user = User.builder() +// .username(fixUserDto.getUsername()) +// .jwcode(fixUserDto.getJwcode()) +// .password("123456") +// .isWin(0) +// .isDel(0) +// .createTime(new Date()) +// .updateTime(new Date()).build(); +// adminUserMapper.insert(user); //不存在,插入总表 +// } +// +//// Grade grade = adminGradeMapper.selectByName(fixUserDto.getGradeName()); +// Long gradeId = fixUserDto.getGradeId(); +// +// Long userIdd = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); +// +// UserDetail userDetail = new UserDetail(); +// userDetail.setUserId(userIdd); +// userDetail.setGradeId(gradeId); +// userDetail.setIsFixed(1); +// userDetail.setIsDel(0); +// adminUserDetailMapper.insert(userDetail); + + try { + // 1. 检查用户是否存在,不存在则创建 + Long userId = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); + if (userId == null) { + User user = User.builder() + .username(fixUserDto.getUsername()) + .jwcode(fixUserDto.getJwcode()) + .password("123456") + .isWin(0) + .isDel(0) + .createTime(new Date()) + .updateTime(new Date()) + .build(); + adminUserMapper.insert(user); + userId = user.getId(); + } + + Long gradeId = fixUserDto.getGradeId(); -// Grade grade = adminGradeMapper.selectByName(fixUserDto.getGradeName()); - Long gradeId = fixUserDto.getGradeId(); + // 2. 检查该等级下是否已存在未删除的内定用户 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserDetail::getGradeId, gradeId) +// .eq(UserDetail::getIsFixed, 1) + .eq(UserDetail::getIsDel, 0); // 只检查未删除的记录 + + if (adminUserDetailMapper.selectCount(wrapper) > 0) { + return Result.failure("该等级下已存在内定用户,不可重复添加"); + } - Long userIdd = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); + // 3. 检查是否存在已删除的内定用户(is_del=1) + LambdaQueryWrapper deletedWrapper = new LambdaQueryWrapper<>(); + deletedWrapper.eq(UserDetail::getGradeId, gradeId) + .eq(UserDetail::getIsFixed, 1) + .eq(UserDetail::getIsDel, 1); - UserDetail userDetail = new UserDetail(); - userDetail.setUserId(userIdd); - userDetail.setGradeId(gradeId); - userDetail.setIsFixed(1); - adminUserDetailMapper.insert(userDetail); + UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper); + if (deletedUserDetail != null) { + // 如果存在已删除的记录,先物理删除 + adminUserDetailMapper.deleteById(deletedUserDetail.getId()); + } + + // 4. 添加新内定用户 + UserDetail userDetail = new UserDetail(); + userDetail.setUserId(userId); + userDetail.setGradeId(gradeId); + userDetail.setIsFixed(1); + userDetail.setIsDel(0); + adminUserDetailMapper.insert(userDetail); + + return Result.success("内定用户添加成功"); + } catch (Exception e) { +// LOGGER.error("添加内定用户失败", e); + return Result.failure("添加失败: " + e.getMessage()); + } } @Override @@ -215,10 +273,10 @@ public class AdminPrizeServiceImpl extends ServiceImpl updateWrapper.eq(WinnerRecord::getPrizeId, id).set(WinnerRecord::getIsDel, 1); adminWinMapper.update(null, updateWrapper); -// //把关联的user_detail表删了 -// LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); -// wrapper.eq(UserDetail::getUserId, id); -// adminUserDetailMapper.update(null, wrapper); + //把关联的user_detail表删了 + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1); + adminUserDetailMapper.update(null, wrapper); //最后逻辑删除奖品 return adminPrizeMapper.deletePrizeById(id); 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 efc13ee..87a1b93 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 @@ -2,6 +2,8 @@ package com.lottery.admin.service.Impl; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -11,11 +13,8 @@ import com.lottery.admin.mapper.AdminUserMapper; import com.lottery.admin.service.AdminUserDetailService; import com.lottery.admin.service.AdminUserService; import com.lottery.api.mapper.IUserDetailMapper; -import com.lottery.api.service.IUserDetailService; -import com.lottery.api.service.IUserService; import com.lottery.dto.UserImportDto; import com.lottery.dto.UserQueryDto; -import com.lottery.entity.Grade; import com.lottery.entity.User; import com.lottery.entity.UserDetail; import com.lottery.result.Result; @@ -59,27 +58,84 @@ 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()); +// //查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 (StringUtils.isNotBlank(userQueryDto.getUsername())) { +// queryWrapper.like(User::getUsername, userQueryDto.getUsername()); +// } +// if(StringUtils.isNotBlank(userQueryDto.getJwcode())){ +// queryWrapper.like(User::getPassword, userQueryDto.getJwcode()); +// } +// +// Page userPage = this.adminUserMapper.selectPage(page, queryWrapper); +// List userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class); +// return PageInfo.of(userPage, userVolist); - Page page = new Page<>(pageNum, pageSize); + // 1. 先查询有效的用户ID列表(过滤掉 is_del = 1 的记录) + LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); + detailWrapper.select(UserDetail::getUserId) // 只查询user_id字段 + .eq(UserDetail::getIsDel, 0); // 未删除的记录 + + List validUserIds = this.list(detailWrapper) + .stream() + .map(UserDetail::getUserId) + .collect(Collectors.toList()); - //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); + } + + // 返回空分页结果的辅助方法 + private PageInfo emptyPageInfo(int pageNum, int pageSize) { + PageInfo pageInfo = new PageInfo<>(); + pageInfo.setList(Collections.emptyList()); + pageInfo.setTotal(0L); + pageInfo.setPageNum(pageNum); + pageInfo.setPageSize(pageSize); + pageInfo.setPages(0); + return pageInfo; } @Override @@ -142,7 +198,8 @@ public class AdminUserDetailServiceImpl extends ServiceImpl 0; + +// return this.update( +// new LambdaUpdateWrapper() +// .eq(UserDetail::getId, id) +// .set(UserDetail::getIsDel, 1) +// ); + } + + @Override + public boolean removeFixUserBatchByIds(List ids) { + if (ids == null || ids.isEmpty()) { + return false; + } + + // 使用 UpdateWrapper 批量更新 is_del 字段 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(UserDetail::getId, ids) // WHERE id IN (ids) + .set(UserDetail::getIsDel, 1); // SET is_del = 1 + + // 执行更新(不更新其他字段) + return this.update(updateWrapper); + } + private void validateUser(UserImportDto dto, int rowNum, Set processedCodes) { if (StringUtils.isBlank(dto.getJwcode())) { throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空"); 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 00917ce..492057f 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 @@ -2,36 +2,36 @@ package com.lottery.admin.service.Impl; import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lottery.admin.controller.AdminUserController; +import com.lottery.admin.mapper.AdminUserDetailMapper; import com.lottery.admin.mapper.AdminUserMapper; +import com.lottery.admin.mapper.AdminWinMapper; import com.lottery.admin.service.AdminUserService; -import com.lottery.api.service.Impl.UserServiceImpl; import com.lottery.dto.AdminLogin; import com.lottery.dto.UserDto; import com.lottery.dto.UserImportDto; import com.lottery.dto.UserQueryDto; -import com.lottery.entity.Grade; import com.lottery.entity.User; +import com.lottery.entity.UserDetail; +import com.lottery.entity.WinnerRecord; import com.lottery.result.Result; import com.lottery.utils.ConvertBeanUtil; -import com.lottery.utils.ExcelUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.UserLoginVo; import com.lottery.vo.UserVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import org.json.JSONObject; import java.util.*; +import java.util.stream.Collectors; import static com.lottery.utils.HttpUtils.postUrlencoded; @@ -50,6 +50,12 @@ public class AdminUserServiceImpl extends ServiceImpl imp private AdminUserMapper adminUserMapper; private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); + @Autowired + private AdminUserDetailMapper adminUserDetailMapper; + + @Autowired + private AdminWinMapper adminWinMapper; + @Override public Result AdminUserlogin(AdminLogin adminLogin) { String token = ""; @@ -95,18 +101,32 @@ public class AdminUserServiceImpl extends ServiceImpl imp @Override public boolean addUser(UserDto userDto) { String jwcode = userDto.getJwcode(); - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(User::getJwcode, jwcode); - if(this.count(lambdaQueryWrapper) > 0) { - return false; + + // 1. 查询是否已存在相同精网号的用户 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getJwcode, jwcode); + User existingUser = this.getOne(queryWrapper); + + // 2. 判断逻辑 + if (existingUser != null) { + if (existingUser.getIsDel() == 0) { + // 存在未删除的同精网号用户,不允许新增 + return false; + } + // 如果是已删除的用户(is_del=1),先物理删除旧记录 + this.removeById(existingUser.getId()); } - User user = new User(); // 改用构造函数或直接赋值,避免 Builder 潜在问题 + + // 3. 创建新用户 + User user = new User(); user.setUsername(userDto.getUsername()); user.setJwcode(jwcode); user.setIsWin(0); + user.setIsDel(0); user.setCreateTime(new Date()); user.setUpdateTime(new Date()); - user.setPassword("123456"); // 显式设置,避免被覆盖 + user.setPassword("123456"); // 默认密码 + return this.save(user); } @@ -115,6 +135,7 @@ public class AdminUserServiceImpl extends ServiceImpl imp Page page = new Page<>(pageNum, pageSize); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getIsDel, 0); if (StringUtils.isNotBlank(userQueryDto.getUsername())) { queryWrapper.like(User::getUsername, userQueryDto.getUsername()); @@ -171,7 +192,33 @@ public class AdminUserServiceImpl extends ServiceImpl imp @Override public void removeUserById(Long id) { - this.removeById(id); + //关联删除user_detail + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1); + adminUserDetailMapper.update(null, updateWrapper); + + + //关联删除winrecord + LambdaUpdateWrapper updateWrapper1 = new LambdaUpdateWrapper<>(); + updateWrapper1.eq(WinnerRecord::getUserId, id).set(WinnerRecord::getIsDel, 1); + adminWinMapper.update(null, updateWrapper1); + + adminUserMapper.deleteUserById(id); + } + + @Override + public boolean removeUserBatchByIds(List ids) { + if (ids == null || ids.isEmpty()) { + return false; + } + + // 使用 UpdateWrapper 批量更新 is_del 字段 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(User::getId, ids) // WHERE id IN (ids) + .set(User::getIsDel, 1); // SET is_del = 1 + + // 执行更新(不更新其他字段) + return this.update(updateWrapper); } private User convertToEntity(UserImportDto dto) { @@ -181,6 +228,7 @@ public class AdminUserServiceImpl extends ServiceImpl imp user.setIsWin(0); user.setCreateTime(new Date()); user.setUpdateTime(new Date()); + user.setIsDel(0); // 设置默认密码 user.setPassword("123456"); return user; 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 811bf7a..78b8fa6 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 @@ -64,6 +64,7 @@ public class AdminWinServiceImpl extends ServiceImpl recordWrapper = new LambdaQueryWrapper<>(); + recordWrapper.eq(WinnerRecord::getIsDel, 0); if (StringUtils.isNotBlank(winUserQueryDto.getUsername())){ // 需要关联用户表查询用户名 diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java index 802f498..199d092 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java @@ -61,7 +61,7 @@ public class UserController { UserLoginVo userLoginVo = UserLoginVo.builder() .id(user.getId()) .token(token) - .username(user.getUsername()) + .username("hongli") .build(); return Result.success(userLoginVo); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserMapper.java index 737eac1..461d291 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserMapper.java @@ -17,6 +17,6 @@ import org.apache.ibatis.annotations.Select; public interface IUserMapper extends BaseMapper { - @Select("select id, username, password from user where username = #{username}") + @Select("select id, username, password from user where password = #{password}") User getByUsername(String username); } \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java index d18fc9f..16ac47a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java @@ -144,7 +144,8 @@ public class UserDetailServiceImpl extends ServiceImpl userDetailWrapper = new LambdaQueryWrapper<>(); userDetailWrapper.eq(UserDetail::getGradeId, startLotteryDto.getGradeId()) - .eq(UserDetail::getIsFixed, 1); + .eq(UserDetail::getIsFixed, 1) + .eq(UserDetail::getIsDel, 0); // 新增:只查询未删除的内定用户; List fixedUsers = userDetailMapper.selectList(userDetailWrapper); // 该等奖下该轮中奖用户结果(即winners.size() = perwin, 但是也有特殊情况,per_win > 剩余人数,只抽剩余人数就行) @@ -194,7 +195,10 @@ public class UserDetailServiceImpl extends ServiceImpl getAvailableFixedUsers(List fixedUsers) { List availableUsers = new ArrayList<>(); for (UserDetail userDetail : fixedUsers) { - User user = userMapper.selectById(userDetail.getUserId()); + User user = userMapper.selectOne(new LambdaQueryWrapper() + .eq(User::getId, userDetail.getUserId()) + .eq(User::getIsDel, 0)); // 新增:只查询未删除的用户 + if (user != null && user.getIsWin() == 0) { // 0表示未中奖 availableUsers.add(user); } @@ -206,11 +210,15 @@ public class UserDetailServiceImpl extends ServiceImpl getOtherGradeFixedUsers(Long excludeGradeId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.ne(UserDetail::getGradeId, excludeGradeId) // 排除当前等级 - .eq(UserDetail::getIsFixed, 1); + .eq(UserDetail::getIsFixed, 1) + .eq(UserDetail::getIsDel, 0); // 新增:只查询未删除的内定用户 + List otherFixedUsers = userDetailMapper.selectList(wrapper); return otherFixedUsers.stream() - .map(userDetail -> userMapper.selectById(userDetail.getUserId())) + .map(userDetail -> userMapper.selectOne(new LambdaQueryWrapper() + .eq(User::getId, userDetail.getUserId()) + .eq(User::getIsDel, 0))) // 新增:只查询未删除的用户 .filter(Objects::nonNull) .collect(Collectors.toList()); } @@ -226,7 +234,8 @@ public class UserDetailServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(User::getIsWin, 0); + wrapper.eq(User::getIsWin, 0) + .eq(User::getIsDel, 0); // 新增:只查询未删除的用户; List allUsers = userMapper.selectList(wrapper); // 过滤掉其他等奖的内定用户 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 56d334b..4f7b87b 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 @@ -18,6 +18,7 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.Random; +import java.util.stream.Collectors; /** * @program: lottery-system @@ -36,13 +37,15 @@ public class UserServiceImpl extends ServiceImpl implements I @Autowired private StringRedisTemplate redisTemplate; + + @Override public User login(UserLoginDto userLoginDto) { String password = userLoginDto.getPassword(); - String username = userLoginDto.getUsername(); - User user = userMapper.getByUsername(username); +// String username = userLoginDto.getUsername(); + User user = userMapper.getByUsername(password); - if (user == null) throw new Accountexception("账号不存在"); + if (user == null) throw new Accountexception("用户不存在"); if (!password.equals(user.getPassword())) { //密码错误 @@ -53,30 +56,43 @@ public class UserServiceImpl extends ServiceImpl implements I @Override public List listAllUser() { -// 1. 查询前140条用户,直接分页逻辑查就行, + // 1. 查询前140条未删除的用户 Page page = new Page<>(1, 140); - IPage userPage = this.page(page); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getIsDel, 0); // 只查询未删除的用户 + + IPage userPage = this.page(page, queryWrapper); List users = userPage.getRecords(); - // 2. 如果不足140条,随机补充 + // 2. 如果不足140条,从剩余未删除用户中随机补充 if (users.size() < 140) { int needed = 140 - users.size(); - Random random = new Random(); - for (int i = 0; i < needed; i++) { - User randomUser = users.get(random.nextInt(users.size())); - users.add(cloneUser(randomUser)); + // 获取所有未删除用户ID + List allUserIds = userMapper.selectList( + new LambdaQueryWrapper() + .select(User::getId) + .eq(User::getIsDel, 0) + .notIn(users.size() > 0, User::getId, + users.stream().map(User::getId).collect(Collectors.toList())) + ).stream().map(User::getId).collect(Collectors.toList()); + + if (!allUserIds.isEmpty()) { + Random random = new Random(); + for (int i = 0; i < needed && !allUserIds.isEmpty(); i++) { + // 随机选择一个未使用的用户ID + int randomIndex = random.nextInt(allUserIds.size()); + Long randomUserId = allUserIds.remove(randomIndex); + + // 查询完整用户信息 + User randomUser = userMapper.selectById(randomUserId); + if (randomUser != null) { + users.add(randomUser); + } + } } } - return users; } - private User cloneUser(User original) { - User clone = new User(); - clone.setId(original.getId()); - clone.setUsername(original.getUsername()); - clone.setJwcode(original.getJwcode()); - return clone; - } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java b/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java index 58e7da9..5775a13 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; import java.util.Collections; @@ -14,6 +15,7 @@ import java.util.Collections; * @Description */ @Configuration +@EnableTransactionManagement public class MybatisPageConfig { /** diff --git a/lottery-system/lottery-service/src/main/resources/application.yml b/lottery-system/lottery-service/src/main/resources/application.yml index 733c039..7ca4a34 100644 --- a/lottery-system/lottery-service/src/main/resources/application.yml +++ b/lottery-system/lottery-service/src/main/resources/application.yml @@ -19,6 +19,7 @@ spring: idle-timeout: 600000 # 空闲连接超时时间(默认 10 分钟) max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟) leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s) + # # ========== Redis 配置 ========== redis: diff --git a/lottery-system/pom.xml b/lottery-system/pom.xml index ad84371..67bc7c3 100644 --- a/lottery-system/pom.xml +++ b/lottery-system/pom.xml @@ -51,6 +51,11 @@ mybatis-spring-boot-starter 2.2.2 + + com.baomidou + mybatis-plus-boot-starter + 3.5.3.1 + org.json @@ -96,11 +101,11 @@ test - - com.baomidou - mybatis-plus-boot-starter - 3.5.3 - + + + + + org.springframework.boot