Browse Source

实现软删之后的细节修改,修改一些bug

feature/0725lihuilin
willy 4 weeks ago
parent
commit
2432139005
  1. 9
      lottery-system/lottery-common/src/main/java/com/lottery/utils/JwtUtil.java
  2. 5
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java
  3. 6
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java
  4. 5
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java
  5. 19
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java
  6. 32
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java
  7. 16
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java
  8. 11
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java
  9. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java
  10. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java
  11. 28
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  12. 190
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  13. 115
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  14. 48
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java
  15. 15
      lottery-system/lottery-service/src/main/resources/application.yml

9
lottery-system/lottery-common/src/main/java/com/lottery/utils/JwtUtil.java

@ -63,5 +63,12 @@ public class JwtUtil {
.parseClaimsJws(token).getBody();
return claims;
}
//
// private static final String SECRET = "willy";
// public static Claims parseToken(String token) {
// return Jwts.parser()
// .setSigningKey(SECRET)
// .parseClaimsJws(token)
// .getBody();
// }
}

5
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java

@ -2,6 +2,8 @@ package com.lottery.dto;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @program: lottery
* @ClassName WinUserDto
@ -13,9 +15,12 @@ import lombok.Data;
@Data
public class FixUserDto {
@NotNull(message = "用户名不能为空")
private String username;
@NotNull(message = "精网号不能为空")
private String jwcode;
@NotNull(message = "等级不能为空")
private Long GradeId;
}

6
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java

@ -3,6 +3,8 @@ package com.lottery.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @program: lottery-system
* @ClassName GradeDto
@ -16,12 +18,16 @@ public class GradeDto {
private Long id;
@NotNull(message = "等级名称不能为空")
private String gradeName; // 等级名称
@NotNull(message = "数量不能为空")
private Integer amount; //等级数量
@NotNull(message = "排序数不能为空")
private Integer sort;
@NotNull(message = "每轮人数不能为空")
private Integer perWin;
}

5
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java

@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
/**
* @program: lottery
* @ClassName PrizeDto
@ -19,9 +21,12 @@ public class PrizeDto {
private Long id;
@NotNull(message = "奖品名不能为空")
private String prizeName;
@NotNull(message = "等级不能为空")
private Long gradeId;
@NotNull(message = "请上传图片")
private String imageUrl;
}

19
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java

@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;
@ -66,18 +67,13 @@ public class AdminGradeController {
}
@PostMapping("/add")
public Result add(@RequestBody GradeDto gradeDto){
public Result add(@RequestBody @Valid GradeDto gradeDto){
LOGGER.info("新增等级:{}", gradeDto);
if (gradeDto.getGradeName() == null || gradeDto.getAmount() == null||
gradeDto.getSort() == null || gradeDto.getPerWin() == null) {
return Result.failure("所有字段都必须填写");
}
// 修改自己等级会错误
LambdaQueryWrapper<Grade> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName())
.eq(Grade::getIsDel, 0);;
.eq(Grade::getIsDel, 0);
if (adminGradeService.count(queryWrapper) > 0) {
return Result.failure("等级已存在,新增失败");
}
@ -90,20 +86,15 @@ public class AdminGradeController {
@PostMapping("/update")
public Result update(@RequestBody GradeDto gradeDto){
if (gradeDto.getGradeName() == null || gradeDto.getAmount() == null||
gradeDto.getSort() == null || gradeDto.getPerWin() == null) {
return Result.failure("所有字段都必须填写");
}
LOGGER.info("修改等级:{}", gradeDto);
if (adminGradeService.getById(gradeDto.getId())== null) {
return Result.failure("修改的id不存在");
}
//TOdo 修改自己会失败
LambdaQueryWrapper<Grade> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName())
.eq(Grade::getIsDel, 0);
.eq(Grade::getIsDel, 0)
.ne(Grade::getId, gradeDto.getId());
if (adminGradeService.count(queryWrapper) > 0) {
return Result.failure("等级已存在,修改失败");
}

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

@ -11,6 +11,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @program: lottery
* @ClassName AdminPrizeController
@ -44,37 +46,22 @@ public class AdminPrizeController {
//TODO 添加图片oss
@PostMapping("/add")
public Result addPrize(@RequestBody PrizeDto prizeDto) {
public Result addPrize(@RequestBody @Valid PrizeDto prizeDto) {
LOGGER.info("新增奖品:{}", prizeDto);
if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null||
prizeDto.getGradeId() == null) {
return Result.failure("所有字段都必须填写");
}
if(!adminPrizeService.add(prizeDto)){
return Result.failure("该等级下已有礼物");
};
//TODO 新增的时候选择不存在的等级给前端返回错误信息
return Result.success();
return adminPrizeService.add(prizeDto);
}
@PostMapping("/update")
public Result updatePrize(@RequestBody PrizeDto prizeDto) {
public Result updatePrize(@RequestBody @Valid PrizeDto prizeDto) {
LOGGER.info("修改奖品信息:{}",prizeDto);
if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null||
prizeDto.getGradeId() == null) {
return Result.failure("所有字段都必须填写");
}
if (adminPrizeService.getById(prizeDto.getId())== null) {
return Result.failure("修改的id不存在");
}
if(!adminPrizeService.updatePrize(prizeDto)){
return Result.failure("该等级下已有礼物");
};
//TODO 修改的时候选择不存在的等级给前端返回错误信息
return Result.success();
return adminPrizeService.updatePrize(prizeDto);
}
@PostMapping("/delete")
@ -88,11 +75,8 @@ public class AdminPrizeController {
//新增内定
@PostMapping("/addFixUser")
public Result addWinUser(@RequestBody FixUserDto fixUserDto) {
public Result addWinUser(@RequestBody @Valid FixUserDto fixUserDto) {
if (fixUserDto.getUsername() == null || fixUserDto.getJwcode() == null) {
return Result.failure("所有字段都必须填写");
}
return adminPrizeService.addWinUser(fixUserDto);
}

16
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java

@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.stream.Collectors;
@ -44,6 +45,9 @@ public class AdminUserController {
private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class);
@Autowired
private com.lottery.propertise.jwtPropertice jwtPropertice;
@PostMapping("/add")
public Result add(@RequestBody UserDto userDto) {
@ -82,7 +86,7 @@ public class AdminUserController {
public Result deleteBatch(@RequestParam List<Long> ids) {
LOGGER.info("批量删除用户:{}",ids);
if (ids == null || ids.size() == 0) {
return Result.failure("ids is null");
return Result.failure("请传入id");
}
if (adminUserService.removeUserBatchByIds(ids)){
return Result.success();
@ -164,4 +168,14 @@ public class AdminUserController {
return adminUserDetailService.importFixUsers(file,gradeId);
}
/**
* 退出
* @return
*/
@PostMapping("/logout")
public Result<String> logout(HttpServletRequest request) {
String token = request.getHeader(jwtPropertice.getUserTokenName());
return adminUserService.logout(token);
}
}

11
lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java

@ -6,6 +6,8 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
@ -26,4 +28,13 @@ public interface AdminUserMapper extends BaseMapper<User> {
@Update("update user set is_del = 1 where id = #{id}")
void deleteUserById(Long id);
@Select("SELECT jwcode, is_del as isDel FROM user")
List<User> selectAllUserCodesWithDelStatus();
@Select("SELECT * FROM user WHERE jwcode = #{jwcode}")
User selectByJwCode(String jwcode);
@Select("select * from user where jwcode = #{jwcode}")
User selectUserByJwcode(String jwcode);
}

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

@ -19,9 +19,9 @@ import com.lottery.vo.PrizeVo;
public interface AdminPrizeService extends IService<Prize> {
PageInfo<PrizeVo> pageListPrize(int pageNum, int pageSize);
boolean add(PrizeDto prizeDto);
Result add(PrizeDto prizeDto);
boolean updatePrize(PrizeDto prizeDto);
Result updatePrize(PrizeDto prizeDto);
PrizeVo getPrizeById(Long id);

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

@ -43,5 +43,7 @@ public interface AdminUserService extends IService<User> {
void removeUserById(Long id);
boolean removeUserBatchByIds(List<Long> ids);
Result<String> logout(String token);
}

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

@ -59,12 +59,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
}
@Override
public boolean add(PrizeDto prizeDto) {
public Result add(PrizeDto prizeDto) {
// Long gradeId = prizeDto.getGradeId();
// Grade grade = adminGradeMapper.selectById(gradeId);
// if (grade == null) {
//// return Result.failure("等级不存在");
// throw new SomeException("heheh");
// return Result.failure("等级不存在");
// }
// 3. 检查该等级是否已有奖品
@ -80,7 +79,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// 1. 查询关联的等级grade状态
Grade grade = adminGradeMapper.selectById(prizeDto.getGradeId()); // 假设 gradeId 是传入的等级ID
if (grade.getIsDel() == 1) {
return false; // 等级不存在直接返回失败
return Result.failure("等级不存在"); // 等级不存在直接返回失败
}
// 2. 检查逻辑仅当等级未删除is_del=0且已存在奖品时才拒绝添加
@ -89,7 +88,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
wrapper.eq(Prize::getGradeId, prizeDto.getGradeId())
.eq(Prize::getIs_del, 0); // 只统计未删除的奖品;
if (this.count(wrapper) > 0) {
return false; // 等级未删除且已有奖品拒绝添加
return Result.failure("该等级已有奖品"); // 等级未删除且已有奖品拒绝添加
}
}
@ -108,12 +107,15 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// grade.setUpdateTime(new Date());
// adminGradeMapper.updateById(grade);
// }
return isPrizeSaved;
if (!isPrizeSaved) {
return Result.failure("未知错误,添加失败,122行");
}
return Result.success();
}
@Override
@Transactional
public boolean updatePrize(PrizeDto prizeDto) {
public Result updatePrize(PrizeDto prizeDto) {
Long gradeId = prizeDto.getGradeId();
Grade grade = adminGradeMapper.selectById(gradeId);
@ -121,19 +123,19 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// 1. 查询原奖品信息
Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId());
if (originalPrize == null) {
return false; // 原奖品不存在
return Result.failure("奖品不存在"); // 原奖品不存在
}
// 2. 查询目标等级信息
Grade targetGrade = adminGradeMapper.selectById(gradeId);
if (targetGrade == null) {
return false; // 目标等级不存在
return Result.failure("目标等级不存在"); // 目标等级不存在
}
// 如果目标等级已删除(is_del=1)禁止修改
if (targetGrade.getIsDel() == 1) {
return false; // 目标等级已删除不允许修改
return Result.failure("目标等级不存在"); // 目标等级已删除不允许修改
}
// 3. 如果修改后的等级和原等级不同检查目标等级是否已有奖品
@ -141,7 +143,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Prize::getGradeId, targetGrade.getId());
if (this.count(wrapper) > 0) {
return false; // 目标等级已有奖品不能修改
return Result.failure("目标等级已有奖品,不能修改"); // 目标等级已有奖品不能修改
}
}
//
@ -164,9 +166,9 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
prize.setUpdateTime(new Date());
prize.setGradeId(grade.getId());
if (adminPrizeMapper.updateById(prize) > 0){
return true;
return Result.success();
};
return false;
return Result.failure("未知错误");
}
@Override

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

@ -29,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@ -138,6 +139,85 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
return pageInfo;
}
// @Override
// @Transactional(rollbackFor = Exception.class)
// 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> existingUsers = new ArrayList<>(); // 已存在用户(从数据库查询)
// List<UserDetail> userDetails = new ArrayList<>();
// Set<String> processedCodes = new HashSet<>();
// int successCount = 0;
// int skipCount = 0;
//
// // 3. 查询所有已存在的jwcode
// Set<String> existingCodes = adminUserMapper.selectAllUserCodes();
//
// for (int i = 0; i < userDtos.size(); i++) {
// UserImportDto dto = userDtos.get(i);
// try {
// validateUser(dto, i + 2, processedCodes); // 移除了existingCodes检查
//
// // 检查用户是否已存在
// if (existingCodes.contains(dto.getJwcode())) {
// // 用户已存在查询用户信息
//// User existingUser = adminUserMapper.selectByJwcode(dto.getJwcode());
// Long userId = adminUserMapper.selectByJwcode(dto.getJwcode());
// existingUsers.add(adminUserMapper.selectById(userId));
// } else {
// // 用户不存在创建新用户
// User newUser = convertToEntity(dto);
// newUsers.add(newUser);
// }
//
// processedCodes.add(dto.getJwcode());
// successCount++;
// } catch (IllegalArgumentException e) {
// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
// skipCount++;
// }
// }
//
// // 4. 批量保存新用户
// if (!newUsers.isEmpty()) {
// adminUserService.saveBatch(newUsers);
// }
//
// // 5. 准备userDetail数据 (包括新用户和已存在用户)
// List<User> allUsers = new ArrayList<>();
// allUsers.addAll(newUsers);
// allUsers.addAll(existingUsers);
//
// for (User user : allUsers) {
// UserDetail detail = new UserDetail();
// detail.setUserId(user.getId());
// detail.setGradeId(gradeId);
// detail.setIsFixed(1);
// detail.setIsDel(0);// 标记为内定用户
// userDetails.add(detail);
// }
//
// // 6. 批量保存userDetail
// if (!userDetails.isEmpty()) {
// this.saveBatch(userDetails);
// return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
// }
//
// return Result.failure("没有有效数据可导入");
// } catch (Exception e) {
// LOGGER.error("导入用户失败", e);
// return Result.failure("导入失败: " + e.getMessage());
// }
// }
@Override
@Transactional(rollbackFor = Exception.class)
public Result importFixUsers(MultipartFile file, Long gradeId) {
@ -149,73 +229,113 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
.doReadSync();
// 2. 准备数据集合
List<User> newUsers = new ArrayList<>(); // 新用户(需要插入user表)
List<User> existingUsers = new ArrayList<>(); // 已存在用户(从数据库查询)
List<UserDetail> userDetails = new ArrayList<>();
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. 查询所有已存在的jwcode
Set<String> existingCodes = adminUserMapper.selectAllUserCodes();
// 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); // 移除了existingCodes检查
// 检查用户是否已存在
if (existingCodes.contains(dto.getJwcode())) {
// 用户已存在查询用户信息
// User existingUser = adminUserMapper.selectByJwcode(dto.getJwcode());
Long userId = adminUserMapper.selectByJwcode(dto.getJwcode());
existingUsers.add(adminUserMapper.selectById(userId));
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);
}
processedCodes.add(dto.getJwcode());
successCount++;
} catch (IllegalArgumentException e) {
LOGGER.warn("导入数据校验失败: {}", e.getMessage());
skipCount++;
}
}
// 4. 批量保存新用户
// 5. 批量操作数据库
if (!newUsers.isEmpty()) {
adminUserService.saveBatch(newUsers);
// 为新用户创建userDetail
newUsers.forEach(user ->
newUserDetails.add(createUserDetail(user.getId(), gradeId)));
}
if (!usersToRecover.isEmpty()) {
adminUserService.updateBatchById(usersToRecover);
}
// 5. 准备userDetail数据 (包括新用户和已存在用户)
List<User> allUsers = new ArrayList<>();
allUsers.addAll(newUsers);
allUsers.addAll(existingUsers);
for (User user : allUsers) {
UserDetail detail = new UserDetail();
detail.setUserId(user.getId());
detail.setGradeId(gradeId);
detail.setIsFixed(1);
detail.setIsDel(0);// 标记为内定用户
userDetails.add(detail);
if (!detailsToRecover.isEmpty()) {
this.updateBatchById(detailsToRecover);
}
// 6. 批量保存userDetail
if (!userDetails.isEmpty()) {
this.saveBatch(userDetails);
return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
if (!newUserDetails.isEmpty()) {
this.saveBatch(newUserDetails);
}
return Result.failure("没有有效数据可导入");
return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
} catch (Exception e) {
LOGGER.error("导入用户失败", e);
return Result.failure("导入失败: " + e.getMessage());
}
}
// 辅助方法创建UserDetail
private UserDetail createUserDetail(Long userId, Long gradeId) {
UserDetail detail = new UserDetail();
detail.setUserId(userId);
detail.setGradeId(gradeId);
detail.setIsFixed(1);
detail.setIsDel(0);
return detail;
}
@Override
public boolean removeFixUserById(Long id) {
return adminUserDetailMapper.removeFixUserById(id) > 0;

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

@ -20,17 +20,21 @@ import com.lottery.entity.UserDetail;
import com.lottery.entity.WinnerRecord;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.utils.JwtUtil;
import com.lottery.vo.PageInfo;
import com.lottery.vo.UserLoginVo;
import com.lottery.vo.UserVo;
import io.jsonwebtoken.Claims;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.json.JSONObject;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static com.lottery.utils.HttpUtils.postUrlencoded;
@ -55,6 +59,11 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
@Autowired
private AdminWinMapper adminWinMapper;
@Autowired
private com.lottery.propertise.jwtPropertice jwtPropertice;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public Result<UserLoginVo> AdminUserlogin(AdminLogin adminLogin) {
@ -80,8 +89,11 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
if (jsonResponse.getInt("code") == 200) {
JSONObject data = jsonResponse.getJSONObject("data");
token = data.getString("token");
// String username = data.getString("username");
LOGGER.info("登录成功,Token:{} " ,token);
// 后续可以使用token调用其他API
} else {
LOGGER.error(jsonResponse.getString("msg"));
@ -95,6 +107,9 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
UserLoginVo userLoginVo = new UserLoginVo();
userLoginVo.setUsername(adminLogin.getUsername());
userLoginVo.setToken(token);
//把token传入redis
redisTemplate.opsForValue().set(token, userLoginVo.getUsername(),2, TimeUnit.HOURS);
return Result.success(userLoginVo);
}
@ -153,43 +168,81 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
public Result importUsers(MultipartFile file) {
try {
// 2. 解析Excel
// List<UserImportDto> userDtos = ExcelUtil.parseExcel(file, UserImportDto.class);
// 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
.head(UserImportDto.class)
.sheet()
.doReadSync();
// 3. 数据校验和去重
Set<String> existingCodes = adminUserMapper.selectAllUserCodes(); // 查询已存在的精网号
List<User> users = new ArrayList<>();
// 2. 获取已存在的精网号及其删除状态
Map<String, Integer> existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus()
.stream()
.collect(Collectors.toMap(
User::getJwcode,
User::getIsDel, // 保持 Integer
(existing, replacement) -> existing
));
List<User> usersToAdd = new ArrayList<>();
List<User> usersToUpdate = new ArrayList<>();
Set<String> processedCodes = new HashSet<>(); // 用于当前文件内的去重
for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i);
try {
validateUser(dto, i + 2, existingCodes, processedCodes); // i+2对应Excel行号
users.add(convertToEntity(dto));
validateUser(dto, i + 2); // 基础校验
// 文件内去重
if (processedCodes.contains(dto.getJwcode())) {
throw new IllegalArgumentException(String.format("第%d行: 精网号%s在当前文件中重复", i + 2, dto.getJwcode()));
}
processedCodes.add(dto.getJwcode());
// 处理数据库中的重复情况
if (existingUserMap.containsKey(dto.getJwcode())) {
Integer isDel = existingUserMap.get(dto.getJwcode());
if (isDel == 1) {
// 已删除的用户可以更新
User existingUser = adminUserMapper.selectByJwCode(dto.getJwcode());
User userToUpdate = convertToEntity(dto);
userToUpdate.setId(existingUser.getId());
userToUpdate.setIsDel(0); // 恢复为未删除状态
usersToUpdate.add(userToUpdate);
} else {
throw new IllegalArgumentException(String.format("第%d行: 精网号%s已存在", i + 2, dto.getJwcode()));
}
} else {
// 全新用户直接添加
usersToAdd.add(convertToEntity(dto));
}
} catch (IllegalArgumentException e) {
LOGGER.warn("导入数据校验失败: {}", e.getMessage());
}
}
// 4. 批量保存
if (!users.isEmpty()) {
boolean success = this.saveBatch(users);
return success ?
Result.success(String.format("导入成功%d条,跳过%d条", users.size(), userDtos.size() - users.size())) :
Result.failure("部分数据导入失败");
// 3. 执行数据库操作
int successCount = 0;
if (!usersToAdd.isEmpty()) {
boolean addSuccess = this.saveBatch(usersToAdd);
successCount += addSuccess ? usersToAdd.size() : 0;
}
if (!usersToUpdate.isEmpty()) {
boolean updateSuccess = this.updateBatchById(usersToUpdate);
successCount += updateSuccess ? usersToUpdate.size() : 0;
}
return Result.failure("没有有效数据可导入");
int skipCount = userDtos.size() - usersToAdd.size() - usersToUpdate.size();
return successCount > 0 ?
Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条",
successCount, usersToAdd.size(), usersToUpdate.size(), skipCount)) :
Result.failure("没有有效数据可导入");
} catch (Exception e) {
LOGGER.error("导入用户失败", e);
return Result.failure("导入失败: " + e.getMessage());
}
}
@Override
public void removeUserById(Long id) {
//关联删除user_detail
@ -221,6 +274,24 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
return this.update(updateWrapper);
}
@Override
public Result<String> logout(String token) {
if (StringUtils.isBlank(token)) {
return Result.failure("Token为空");
}
String username = redisTemplate.opsForValue().get(token);
if (StringUtils.isBlank(username)) {
return Result.failure("无效的Token");
}
redisTemplate.delete(token);
return Result.success("登出成功");
}
private User convertToEntity(UserImportDto dto) {
User user = new User();
user.setJwcode(dto.getJwcode());
@ -234,7 +305,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
return user;
}
private void validateUser(UserImportDto dto, int rowNum, Set<String> existingCodes, Set<String> processedCodes) {
private void validateUser(UserImportDto dto, int rowNum) {
if (StringUtils.isBlank(dto.getJwcode())) {
throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空");
}
@ -243,13 +314,13 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
throw new IllegalArgumentException("第" + rowNum + "行: 姓名不能为空");
}
if (existingCodes.contains(dto.getJwcode())) {
throw new IllegalArgumentException("第" + rowNum + "行: 精网号已存在");
}
if (processedCodes.contains(dto.getJwcode())) {
throw new IllegalArgumentException("第" + rowNum + "行: 精网号在当前文件中重复");
}
// if (existingCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException("第" + rowNum + "行: 精网号已存在");
// }
//
// if (processedCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException("第" + rowNum + "行: 精网号在当前文件中重复");
// }
}
}

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

@ -3,6 +3,7 @@ package com.lottery.api.service.Impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.admin.controller.AdminPrizeController;
import com.lottery.admin.mapper.AdminPrizeMapper;
import com.lottery.admin.mapper.AdminWinMapper;
import com.lottery.api.mapper.IGradeMapper;
@ -17,6 +18,8 @@ import com.lottery.entity.WinnerRecord;
import com.lottery.exception.SomeException;
import com.lottery.vo.UserVo;
import com.lottery.vo.LotteryVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -266,21 +269,46 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
.collect(Collectors.toList());
}
private final static Logger LOGGER = LoggerFactory.getLogger(UserDetailServiceImpl.class);
// 标记用户为中奖状态
private void markUsersAsWinners(List<User> winners, StartLotteryDto startLotteryDto) {
for (User user : winners) {
user.setIsWin(1); // 1表示已中奖
//把中奖的用户添加到中奖表里面
// WinnerRecord winnerRecord = new WinnerRecord();
// winnerRecord.setUserId(user.getId());
// 1. 检查该用户是否已有有效中奖记录(is_del=0)
LambdaQueryWrapper<WinnerRecord> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WinnerRecord::getUserId, user.getId())
.eq(WinnerRecord::getIsDel, 0); // 只查询未删除的记录
if (adminWinMapper.selectCount(queryWrapper) > 0) {
LOGGER.warn("用户已存在有效中奖记录,跳过插入: userId={}", user.getId());
continue; // 已有有效记录跳过插入
}
WinnerRecord winnerRecord = WinnerRecord.builder()
.userId(user.getId())
.winTime(new Date())
.prizeId(startLotteryDto.getPrizeId()).build();
// 2. 检查是否存在已删除的记录(is_del=1)
LambdaQueryWrapper<WinnerRecord> deletedQuery = new LambdaQueryWrapper<>();
deletedQuery.eq(WinnerRecord::getUserId, user.getId())
.eq(WinnerRecord::getIsDel, 1); // 查询已删除的记录
WinnerRecord existingRecord = adminWinMapper.selectOne(deletedQuery);
if (existingRecord != null) {
// 3. 如果存在已删除记录则更新该记录
existingRecord.setIsDel(0); // 恢复记录
existingRecord.setWinTime(new Date());
existingRecord.setPrizeId(startLotteryDto.getPrizeId());
adminWinMapper.updateById(existingRecord);
} else {
// 4. 如果不存在任何记录则插入新记录
WinnerRecord winnerRecord = WinnerRecord.builder()
.userId(user.getId())
.winTime(new Date())
.prizeId(startLotteryDto.getPrizeId())
.isDel(0) // 明确设置为未删除
.build();
adminWinMapper.insert(winnerRecord);
}
adminWinMapper.insert(winnerRecord);
// 5. 更新用户中奖状态
user.setIsWin(1);
userMapper.updateById(user);
}
}

15
lottery-system/lottery-service/src/main/resources/application.yml

@ -26,14 +26,13 @@ spring:
host: 39.98.127.73
port: 7001
password: 2TOVfFeJ0pyi9Wtj
database: 0 # 默认DB索引
jedis:
database: 8 # 默认DB索引
lettuce:
pool:
max-active: 8 # 最大连接数
max-wait: 5000ms # 最大等待时间
max-idle: 4 # 最大空闲连接
min-idle: 1 # 最小空闲连接
timeout: 3000ms # 连接超时时间
max-active: 100 # 最大连接数
max-wait: 300 # 最大等待时间
max-idle: 20 # 最大空闲连接
min-idle: 10 # 最小空闲连接
# ========== MyBatis 配置(如果使用MyBatis代替JPA) ==========
@ -57,7 +56,7 @@ lottery:
#用户端JWT
user-secret-key: willier_need_at_least_32_chars_secure_key_12345
user-ttl: 7200000
user-token-name: authentication
user-token-name: token
max-draw-times: 3 # 用户每日最大抽奖次数

Loading…
Cancel
Save