Browse Source

Merge branch 'milestone-20250723-wwl' of http://39.101.133.168:8807/qimaohong/ActivityProject into milestone-20250723-wwl合并代码

feature/0725lihuilin
jihaipeng 4 weeks ago
parent
commit
73388fb96f
  1. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserLoginDto.java
  2. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java
  3. 2
      lottery-system/lottery-service/src/main/java/com/lottery/LotteryApplication.java
  4. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java
  5. 13
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java
  6. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java
  7. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java
  8. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java
  9. 7
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java
  10. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java
  11. 49
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java
  12. 104
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  13. 115
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  14. 72
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  15. 1
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  16. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java
  17. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserMapper.java
  18. 19
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java
  19. 50
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java
  20. 2
      lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java
  21. 1
      lottery-system/lottery-service/src/main/resources/application.yml
  22. 15
      lottery-system/pom.xml

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

2
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; // 更新时间

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

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

13
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);
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);
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);
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());

4
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<UserDetail> {
@Select("select jwcode from user_detail")
Set<String> selectAllUserCodes();
@Update("UPDATE user_detail SET is_del = 1 WHERE id = #{id}")
int removeFixUserById(Long id);
}

4
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<User> {
Set<String> selectAllUserCodes();
Long selectByJwcode(String jwcode);
@Update("update user set is_del = 1 where id = #{id}")
void deleteUserById(Long id);
}

3
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<Prize> {
PrizeVo getPrizeById(Long id);
void addWinUser(FixUserDto fixUserDto);
Result addWinUser(FixUserDto fixUserDto);
boolean removePrizeById(Long id);
}

7
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<UserDetail> {
PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto);
Result importFixUsers(MultipartFile file, Long gradeId);
boolean removeFixUserById(Long id);
boolean removeFixUserBatchByIds(List<Long> ids);
}

2
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java

@ -41,5 +41,7 @@ public interface AdminUserService extends IService<User> {
Result importUsers(MultipartFile file);
void removeUserById(Long id);
boolean removeUserBatchByIds(List<Long> ids);
}

49
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<AdminGradeMapper, Grade>
@Transactional
public boolean removeGradeById(Long id) {
//把关联的win_record表删了
//先根据 gradeId 查询关联的 prizeId
LambdaQueryWrapper<Prize> prizeQueryWrapper = new LambdaQueryWrapper<>();
prizeQueryWrapper.eq(Prize::getGradeId, id).select(Prize::getId);
Prize prize = adminPrizeMapper.selectOne(prizeQueryWrapper);
LambdaUpdateWrapper<WinnerRecord> updateWrapper3 = new LambdaUpdateWrapper<>();
updateWrapper3.eq(WinnerRecord::getPrizeId, prize.getId()).set(WinnerRecord::getIsDel,1);
adminWinMapper.update(null, updateWrapper3);
//吧关联的prize表删了
LambdaUpdateWrapper<Prize> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Prize::getGradeId, id).set(Prize::getIs_del, 1);
adminPrizeMapper.update(null, updateWrapper);
// 1. 查询所有关联的 prizeId可能多个
List<Prize> prizes = adminPrizeMapper.selectList(
new LambdaQueryWrapper<Prize>()
.eq(Prize::getGradeId, id)
.select(Prize::getId)
);
// 2. 批量逻辑删除关联的 win_record
if (!prizes.isEmpty()) {
List<Long> prizeIds = prizes.stream()
.map(Prize::getId)
.collect(Collectors.toList());
LambdaUpdateWrapper<WinnerRecord> winRecordWrapper = new LambdaUpdateWrapper<>();
winRecordWrapper.in(WinnerRecord::getPrizeId, prizeIds)
.set(WinnerRecord::getIsDel, 1);
adminWinMapper.update(null, winRecordWrapper);
}
//把关联的user_detail表删了
LambdaUpdateWrapper<UserDetail> updateWrapper1 = new LambdaUpdateWrapper<>();
updateWrapper1.eq(UserDetail::getGradeId, id).set(UserDetail::getIsDel, 1);
adminUserDetailMapper.update(null, updateWrapper1);
// 3. 逻辑删除关联的 prize
LambdaUpdateWrapper<Prize> prizeWrapper = new LambdaUpdateWrapper<>();
prizeWrapper.eq(Prize::getGradeId, id)
.set(Prize::getIs_del, 1);
adminPrizeMapper.update(null, prizeWrapper);
// 4. 逻辑删除关联的 user_detail
LambdaUpdateWrapper<UserDetail> userDetailWrapper = new LambdaUpdateWrapper<>();
userDetailWrapper.eq(UserDetail::getGradeId, id)
.set(UserDetail::getIsDel, 1);
adminUserDetailMapper.update(null, userDetailWrapper);
//最后逻辑删除等级
// 5. 逻辑删除 grade
adminGradeMapper.deleteGradeById(id);
return true;
}

104
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<AdminPrizeMapper, Prize>
// 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<Prize> 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<AdminPrizeMapper, Prize>
}
// 2. 查询目标等级信息
Grade targetGrade = adminGradeMapper.selectById(gradeId);
if (targetGrade == null) {
@ -144,14 +144,14 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
return false; // 目标等级已有奖品不能修改
}
}
// 4. 检查奖品名称是否重复排除自己
LambdaQueryWrapper<Prize> nameCheckWrapper = new LambdaQueryWrapper<>();
nameCheckWrapper.eq(Prize::getPrizeName, prizeDto.getPrizeName())
.ne(Prize::getId, prizeDto.getId());
if (this.count(nameCheckWrapper) > 0) {
return false; // 奖品名称已存在
}
//
// // 4. 检查奖品名称是否重复排除自己
// LambdaQueryWrapper<Prize> nameCheckWrapper = new LambdaQueryWrapper<>();
// nameCheckWrapper.eq(Prize::getPrizeName, prizeDto.getPrizeName())
// .ne(Prize::getId, prizeDto.getId());
// if (this.count(nameCheckWrapper) > 0) {
// return false; // 奖品名称已存在
// }
// LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>();
// wrapper.eq(Prize::getGradeId, grade.getId());
@ -181,8 +181,36 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
}
@Override
public void addWinUser(FixUserDto fixUserDto) {
//先判断新增的内定用户是否在总的抽奖用户中
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()
@ -190,21 +218,51 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
.jwcode(fixUserDto.getJwcode())
.password("123456")
.isWin(0)
.isDel(0)
.createTime(new Date())
.updateTime(new Date()).build();
adminUserMapper.insert(user); //不存在插入总表
.updateTime(new Date())
.build();
adminUserMapper.insert(user);
userId = user.getId();
}
// Grade grade = adminGradeMapper.selectByName(fixUserDto.getGradeName());
Long gradeId = fixUserDto.getGradeId();
Long userIdd = adminUserMapper.selectByJwcode(fixUserDto.getJwcode());
// 2. 检查该等级下是否已存在未删除的内定用户
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDetail::getGradeId, gradeId)
// .eq(UserDetail::getIsFixed, 1)
.eq(UserDetail::getIsDel, 0); // 只检查未删除的记录
if (adminUserDetailMapper.selectCount(wrapper) > 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);
UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper);
if (deletedUserDetail != null) {
// 如果存在已删除的记录先物理删除
adminUserDetailMapper.deleteById(deletedUserDetail.getId());
}
// 4. 添加新内定用户
UserDetail userDetail = new UserDetail();
userDetail.setUserId(userIdd);
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<AdminPrizeMapper, Prize>
updateWrapper.eq(WinnerRecord::getPrizeId, id).set(WinnerRecord::getIsDel, 1);
adminWinMapper.update(null, updateWrapper);
// //把关联的user_detail表删了
// LambdaUpdateWrapper<UserDetail> wrapper = new LambdaUpdateWrapper<>();
// wrapper.eq(UserDetail::getUserId, id);
// adminUserDetailMapper.update(null, wrapper);
//把关联的user_detail表删了
LambdaUpdateWrapper<UserDetail> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1);
adminUserDetailMapper.update(null, wrapper);
//最后逻辑删除奖品
return adminPrizeMapper.deletePrizeById(id);

115
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<IUserDetailMapper, U
@Override
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());
// //查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 (StringUtils.isNotBlank(userQueryDto.getUsername())) {
// queryWrapper.like(User::getUsername, userQueryDto.getUsername());
// }
// if(StringUtils.isNotBlank(userQueryDto.getJwcode())){
// queryWrapper.like(User::getPassword, userQueryDto.getJwcode());
// }
//
// Page<User> userPage = this.adminUserMapper.selectPage(page, queryWrapper);
// List<UserVo> userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class);
// return PageInfo.of(userPage, userVolist);
Page<User> page = new Page<>(pageNum, pageSize);
// 1. 先查询有效的用户ID列表过滤掉 is_del = 1 的记录
LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.select(UserDetail::getUserId) // 只查询user_id字段
.eq(UserDetail::getIsDel, 0); // 未删除的记录
List<Long> validUserIds = this.list(detailWrapper)
.stream()
.map(UserDetail::getUserId)
.collect(Collectors.toList());
//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())) {
queryWrapper.like(User::getUsername, userQueryDto.getUsername());
userWrapper.like(User::getUsername, userQueryDto.getUsername());
}
if (StringUtils.isNotBlank(userQueryDto.getJwcode())) {
queryWrapper.like(User::getPassword, 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);
}
// 返回空分页结果的辅助方法
private <T> PageInfo<T> emptyPageInfo(int pageNum, int pageSize) {
PageInfo<T> 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<IUserDetailMapper, U
UserDetail detail = new UserDetail();
detail.setUserId(user.getId());
detail.setGradeId(gradeId);
detail.setIsFixed(1); // 标记为内定用户
detail.setIsFixed(1);
detail.setIsDel(0);// 标记为内定用户
userDetails.add(detail);
}
@ -159,6 +216,32 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
}
}
@Override
public boolean removeFixUserById(Long id) {
return adminUserDetailMapper.removeFixUserById(id) > 0;
// return this.update(
// new LambdaUpdateWrapper<UserDetail>()
// .eq(UserDetail::getId, id)
// .set(UserDetail::getIsDel, 1)
// );
}
@Override
public boolean removeFixUserBatchByIds(List<Long> ids) {
if (ids == null || ids.isEmpty()) {
return false;
}
// 使用 UpdateWrapper 批量更新 is_del 字段
LambdaUpdateWrapper<UserDetail> 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<String> processedCodes) {
if (StringUtils.isBlank(dto.getJwcode())) {
throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空");

72
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<AdminUserMapper, User> imp
private AdminUserMapper adminUserMapper;
private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class);
@Autowired
private AdminUserDetailMapper adminUserDetailMapper;
@Autowired
private AdminWinMapper adminWinMapper;
@Override
public Result<UserLoginVo> AdminUserlogin(AdminLogin adminLogin) {
String token = "";
@ -95,18 +101,32 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
@Override
public boolean addUser(UserDto userDto) {
String jwcode = userDto.getJwcode();
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getJwcode, jwcode);
if(this.count(lambdaQueryWrapper) > 0) {
// 1. 查询是否已存在相同精网号的用户
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getJwcode, jwcode);
User existingUser = this.getOne(queryWrapper);
// 2. 判断逻辑
if (existingUser != null) {
if (existingUser.getIsDel() == 0) {
// 存在未删除的同精网号用户不允许新增
return false;
}
User user = new User(); // 改用构造函数或直接赋值避免 Builder 潜在问题
// 如果是已删除的用户(is_del=1)先物理删除旧记录
this.removeById(existingUser.getId());
}
// 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<AdminUserMapper, User> imp
Page<User> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<User> 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<AdminUserMapper, User> imp
@Override
public void removeUserById(Long id) {
this.removeById(id);
//关联删除user_detail
LambdaUpdateWrapper<UserDetail> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(UserDetail::getUserId, id).set(UserDetail::getIsDel, 1);
adminUserDetailMapper.update(null, updateWrapper);
//关联删除winrecord
LambdaUpdateWrapper<WinnerRecord> updateWrapper1 = new LambdaUpdateWrapper<>();
updateWrapper1.eq(WinnerRecord::getUserId, id).set(WinnerRecord::getIsDel, 1);
adminWinMapper.update(null, updateWrapper1);
adminUserMapper.deleteUserById(id);
}
@Override
public boolean removeUserBatchByIds(List<Long> ids) {
if (ids == null || ids.isEmpty()) {
return false;
}
// 使用 UpdateWrapper 批量更新 is_del 字段
LambdaUpdateWrapper<User> 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<AdminUserMapper, User> imp
user.setIsWin(0);
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
user.setIsDel(0);
// 设置默认密码
user.setPassword("123456");
return user;

1
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java

@ -64,6 +64,7 @@ public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecor
// 2. 构建查询条件
LambdaQueryWrapper<WinnerRecord> recordWrapper = new LambdaQueryWrapper<>();
recordWrapper.eq(WinnerRecord::getIsDel, 0);
if (StringUtils.isNotBlank(winUserQueryDto.getUsername())){
// 需要关联用户表查询用户名

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

2
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<User> {
@Select("select id, username, password from user where username = #{username}")
@Select("select id, username, password from user where password = #{password}")
User getByUsername(String username);
}

19
lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java

@ -144,7 +144,8 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
// 该等奖下所有内定人员集合
LambdaQueryWrapper<UserDetail> userDetailWrapper = new LambdaQueryWrapper<>();
userDetailWrapper.eq(UserDetail::getGradeId, startLotteryDto.getGradeId())
.eq(UserDetail::getIsFixed, 1);
.eq(UserDetail::getIsFixed, 1)
.eq(UserDetail::getIsDel, 0); // 新增只查询未删除的内定用户;
List<UserDetail> fixedUsers = userDetailMapper.selectList(userDetailWrapper);
// 该等奖下该轮中奖用户结果即winners.size() = perwin 但是也有特殊情况per_win > 剩余人数,只抽剩余人数就行
@ -194,7 +195,10 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
private List<User> getAvailableFixedUsers(List<UserDetail> fixedUsers) {
List<User> availableUsers = new ArrayList<>();
for (UserDetail userDetail : fixedUsers) {
User user = userMapper.selectById(userDetail.getUserId());
User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
.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<IUserDetailMapper, UserDe
private List<User> getOtherGradeFixedUsers(Long excludeGradeId) {
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.ne(UserDetail::getGradeId, excludeGradeId) // 排除当前等级
.eq(UserDetail::getIsFixed, 1);
.eq(UserDetail::getIsFixed, 1)
.eq(UserDetail::getIsDel, 0); // 新增只查询未删除的内定用户
List<UserDetail> otherFixedUsers = userDetailMapper.selectList(wrapper);
return otherFixedUsers.stream()
.map(userDetail -> userMapper.selectById(userDetail.getUserId()))
.map(userDetail -> userMapper.selectOne(new LambdaQueryWrapper<User>()
.eq(User::getId, userDetail.getUserId())
.eq(User::getIsDel, 0))) // 新增只查询未删除的用户
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
@ -226,7 +234,8 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
// 查询所有未中奖用户
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getIsWin, 0);
wrapper.eq(User::getIsWin, 0)
.eq(User::getIsDel, 0); // 新增只查询未删除的用户;
List<User> allUsers = userMapper.selectList(wrapper);
// 过滤掉其他等奖的内定用户

50
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<IUserMapper, User> 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<IUserMapper, User> implements I
@Override
public List<User> listAllUser() {
// 1. 查询前140条用户,直接分页逻辑查就行,
// 1. 查询前140条未删除的用户
Page<User> page = new Page<>(1, 140);
IPage<User> userPage = this.page(page);
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getIsDel, 0); // 只查询未删除的用户
IPage<User> userPage = this.page(page, queryWrapper);
List<User> users = userPage.getRecords();
// 2. 如果不足140条随机补充
// 2. 如果不足140条从剩余未删除用户中随机补充
if (users.size() < 140) {
int needed = 140 - users.size();
// 获取所有未删除用户ID
List<Long> allUserIds = userMapper.selectList(
new LambdaQueryWrapper<User>()
.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);
for (int i = 0; i < needed; i++) {
User randomUser = users.get(random.nextInt(users.size()));
users.add(cloneUser(randomUser));
// 查询完整用户信息
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;
}
}

2
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 {
/**

1
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:

15
lottery-system/pom.xml

@ -51,6 +51,11 @@
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version> <!-- 或更高版本 -->
</dependency>
<dependency>
<groupId>org.json</groupId>
@ -96,11 +101,11 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus-boot-starter</artifactId>-->
<!-- <version>3.5.3</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>

Loading…
Cancel
Save