Browse Source

Merge branch 'milestone-20250723-wwl' into jihaipeng/feature-20250714184358-抽奖众筹

# Conflicts: 合并代码
#	lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
#	lottery-system/lottery-service/src/main/resources/application.yml
feature/0725lihuilin
jihaipeng 4 weeks ago
parent
commit
35f9583ba1
  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. 19
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java
  5. 5
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java
  6. 4
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java
  7. 34
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java
  8. 45
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java
  9. 23
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java
  10. 11
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java
  11. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java
  12. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java
  13. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java
  14. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java
  15. 69
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  16. 415
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  17. 104
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  18. 8
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  19. 40
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java
  20. 42
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java
  21. 6
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java
  22. 15
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java
  23. 14
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java
  24. 11
      lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java
  25. 14
      lottery-system/lottery-service/src/main/resources/application.yml
  26. 2
      lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml

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

@ -63,5 +63,12 @@ public class JwtUtil {
.parseClaimsJws(token).getBody(); .parseClaimsJws(token).getBody();
return claims; 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 lombok.Data;
import javax.validation.constraints.NotNull;
/** /**
* @program: lottery * @program: lottery
* @ClassName WinUserDto * @ClassName WinUserDto
@ -13,9 +15,12 @@ import lombok.Data;
@Data @Data
public class FixUserDto { public class FixUserDto {
@NotNull(message = "用户名不能为空")
private String username; private String username;
@NotNull(message = "精网号不能为空")
private String jwcode; private String jwcode;
@NotNull(message = "等级不能为空")
private Long GradeId; 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 com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
/** /**
* @program: lottery-system * @program: lottery-system
* @ClassName GradeDto * @ClassName GradeDto
@ -16,12 +18,16 @@ public class GradeDto {
private Long id; private Long id;
@NotNull(message = "等级名称不能为空")
private String gradeName; // 等级名称 private String gradeName; // 等级名称
@NotNull(message = "数量不能为空")
private Integer amount; //等级数量 private Integer amount; //等级数量
@NotNull(message = "排序数不能为空")
private Integer sort; private Integer sort;
@NotNull(message = "每轮人数不能为空")
private Integer perWin; private Integer perWin;
} }

19
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java

@ -0,0 +1,19 @@
package com.lottery.dto;
import lombok.Data;
/**
* @program: lottery
* @ClassName PageSimpleDto
* @description:
* @author: wwl
* @create: 2025-07-22 16:50
* @Version 1.0
**/
@Data
public class PageSimpleDto {
private Integer pageNum;
private Integer pageSize;
}

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

4
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java

@ -3,6 +3,8 @@ package com.lottery.dto;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
/** /**
* @program: lottery * @program: lottery
* @ClassName UserDto * @ClassName UserDto
@ -17,7 +19,9 @@ import lombok.Data;
public class UserDto { public class UserDto {
private int id; private int id;
@NotNull(message = "用户名不能为空")
private String username; private String username;
@NotNull(message = "精网号不能为空")
private String jwcode; private String jwcode;
} }

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

@ -3,6 +3,7 @@ package com.lottery.admin.controller;
import com.lottery.admin.mapper.AdminGradeMapper; import com.lottery.admin.mapper.AdminGradeMapper;
import com.lottery.admin.service.AdminGradeService; import com.lottery.admin.service.AdminGradeService;
import com.lottery.dto.GradeDto; import com.lottery.dto.GradeDto;
import com.lottery.dto.PageSimpleDto;
import com.lottery.entity.Grade; import com.lottery.entity.Grade;
import com.lottery.exception.SomeException; import com.lottery.exception.SomeException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -17,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -45,11 +47,17 @@ public class AdminGradeController {
@PostMapping("/list") @PostMapping("/list")
public Result<PageInfo<GradeVo>> selectGrade( @RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize){
LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageNum, pageSize);
public Result<PageInfo<GradeVo>> selectGrade(@RequestBody PageSimpleDto pageSimpleDto){
if (pageSimpleDto.getPageNum() == null) {
pageSimpleDto.setPageNum(1);
}
if (pageSimpleDto.getPageSize() == null) {
pageSimpleDto.setPageSize(10);
}
PageInfo<GradeVo> pageSelectGrade = adminGradeService.pageSelectGrade(pageNum, pageSize);
LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize());
PageInfo<GradeVo> pageSelectGrade = adminGradeService.pageSelectGrade(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize());
return Result.success(pageSelectGrade); return Result.success(pageSelectGrade);
} }
@ -66,18 +74,13 @@ public class AdminGradeController {
} }
@PostMapping("/add") @PostMapping("/add")
public Result add(@RequestBody GradeDto gradeDto){
public Result add(@RequestBody @Valid GradeDto gradeDto){
LOGGER.info("新增等级:{}", 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<>(); LambdaQueryWrapper<Grade> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName()) queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName())
.eq(Grade::getIsDel, 0);;
.eq(Grade::getIsDel, 0);
if (adminGradeService.count(queryWrapper) > 0) { if (adminGradeService.count(queryWrapper) > 0) {
return Result.failure("等级已存在,新增失败"); return Result.failure("等级已存在,新增失败");
} }
@ -90,20 +93,15 @@ public class AdminGradeController {
@PostMapping("/update") @PostMapping("/update")
public Result update(@RequestBody GradeDto gradeDto){ 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); LOGGER.info("修改等级:{}", gradeDto);
if (adminGradeService.getById(gradeDto.getId())== null) { if (adminGradeService.getById(gradeDto.getId())== null) {
return Result.failure("修改的id不存在"); return Result.failure("修改的id不存在");
} }
//TOdo 修改自己会失败
LambdaQueryWrapper<Grade> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Grade> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName()) queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName())
.eq(Grade::getIsDel, 0);
.eq(Grade::getIsDel, 0)
.ne(Grade::getId, gradeDto.getId());
if (adminGradeService.count(queryWrapper) > 0) { if (adminGradeService.count(queryWrapper) > 0) {
return Result.failure("等级已存在,修改失败"); return Result.failure("等级已存在,修改失败");
} }

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

@ -1,6 +1,7 @@
package com.lottery.admin.controller; package com.lottery.admin.controller;
import com.lottery.admin.service.AdminPrizeService; import com.lottery.admin.service.AdminPrizeService;
import com.lottery.dto.PageSimpleDto;
import com.lottery.dto.PrizeDto; import com.lottery.dto.PrizeDto;
import com.lottery.dto.FixUserDto; import com.lottery.dto.FixUserDto;
import com.lottery.result.Result; import com.lottery.result.Result;
@ -11,6 +12,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/** /**
* @program: lottery * @program: lottery
* @ClassName AdminPrizeController * @ClassName AdminPrizeController
@ -29,10 +32,16 @@ public class AdminPrizeController {
private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class); private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class);
@PostMapping("list") @PostMapping("list")
public Result<PageInfo<PrizeVo>> listPrize(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) {
LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageNum, pageSize);
public Result<PageInfo<PrizeVo>> listPrize(@RequestBody PageSimpleDto pageSimpleDto) {
if (pageSimpleDto.getPageNum() == null) {
pageSimpleDto.setPageNum(1);
}
if (pageSimpleDto.getPageSize() == null) {
pageSimpleDto.setPageSize(10);
}
LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize());
PageInfo<PrizeVo> pageInfo = adminPrizeService.pageListPrize(pageNum, pageSize);
PageInfo<PrizeVo> pageInfo = adminPrizeService.pageListPrize(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize());
return Result.success(pageInfo); return Result.success(pageInfo);
} }
@ -44,37 +53,20 @@ public class AdminPrizeController {
//TODO 添加图片oss //TODO 添加图片oss
@PostMapping("/add") @PostMapping("/add")
public Result addPrize(@RequestBody PrizeDto prizeDto) {
public Result addPrize(@RequestBody @Valid PrizeDto prizeDto) {
LOGGER.info("新增奖品:{}", 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") @PostMapping("/update")
public Result updatePrize(@RequestBody PrizeDto prizeDto) {
public Result updatePrize(@RequestBody @Valid PrizeDto prizeDto) {
LOGGER.info("修改奖品信息:{}",prizeDto); LOGGER.info("修改奖品信息:{}",prizeDto);
if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null||
prizeDto.getGradeId() == null) {
return Result.failure("所有字段都必须填写");
}
if (adminPrizeService.getById(prizeDto.getId())== null) { if (adminPrizeService.getById(prizeDto.getId())== null) {
return Result.failure("修改的id不存在"); return Result.failure("修改的id不存在");
} }
if(!adminPrizeService.updatePrize(prizeDto)){
return Result.failure("该等级下已有礼物");
};
//TODO 修改的时候选择不存在的等级给前端返回错误信息
return Result.success();
return adminPrizeService.updatePrize(prizeDto);
} }
@PostMapping("/delete") @PostMapping("/delete")
@ -88,11 +80,8 @@ public class AdminPrizeController {
//新增内定 //新增内定
@PostMapping("/addFixUser") @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); return adminPrizeService.addWinUser(fixUserDto);
} }

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

@ -20,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -44,13 +46,13 @@ public class AdminUserController {
private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class);
@Autowired
private com.lottery.propertise.jwtPropertice jwtPropertice;
@PostMapping("/add") @PostMapping("/add")
public Result add(@RequestBody UserDto userDto) {
public Result add(@RequestBody @Valid UserDto userDto) {
LOGGER.info("新增用户:{}",userDto); LOGGER.info("新增用户:{}",userDto);
if (userDto.getUsername() == null || userDto.getJwcode() == null) {
return Result.failure("所有字段都必须填写");
}
if (!adminUserService.addUser(userDto)){ if (!adminUserService.addUser(userDto)){
return Result.failure("精网号已存在,无法添加"); return Result.failure("精网号已存在,无法添加");
} }
@ -82,7 +84,7 @@ public class AdminUserController {
public Result deleteBatch(@RequestParam List<Long> ids) { public Result deleteBatch(@RequestParam List<Long> ids) {
LOGGER.info("批量删除用户:{}",ids); LOGGER.info("批量删除用户:{}",ids);
if (ids == null || ids.size() == 0) { if (ids == null || ids.size() == 0) {
return Result.failure("ids is null");
return Result.failure("请传入id");
} }
if (adminUserService.removeUserBatchByIds(ids)){ if (adminUserService.removeUserBatchByIds(ids)){
return Result.success(); return Result.success();
@ -164,4 +166,15 @@ public class AdminUserController {
return adminUserDetailService.importFixUsers(file,gradeId); return adminUserDetailService.importFixUsers(file,gradeId);
} }
/**
* 退出
* @return
*/
@PostMapping("/logout")
public Result<String> logout(HttpServletRequest request) {
LOGGER.info("用户登出");
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.Select;
import org.apache.ibatis.annotations.Update; import org.apache.ibatis.annotations.Update;
import java.util.Collection;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@ -26,4 +28,13 @@ public interface AdminUserMapper extends BaseMapper<User> {
@Update("update user set is_del = 1 where id = #{id}") @Update("update user set is_del = 1 where id = #{id}")
void deleteUserById(Long 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> { public interface AdminPrizeService extends IService<Prize> {
PageInfo<PrizeVo> pageListPrize(int pageNum, int pageSize); 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); 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); void removeUserById(Long id);
boolean removeUserBatchByIds(List<Long> ids); boolean removeUserBatchByIds(List<Long> ids);
Result<String> logout(String token);
} }

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

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

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

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

69
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 @Override
public boolean add(PrizeDto prizeDto) {
public Result add(PrizeDto prizeDto) {
// Long gradeId = prizeDto.getGradeId(); // Long gradeId = prizeDto.getGradeId();
// Grade grade = adminGradeMapper.selectById(gradeId); // Grade grade = adminGradeMapper.selectById(gradeId);
// if (grade == null) { // if (grade == null) {
//// return Result.failure("等级不存在");
// throw new SomeException("heheh");
// return Result.failure("等级不存在");
// } // }
// 3. 检查该等级是否已有奖品 // 3. 检查该等级是否已有奖品
@ -80,7 +79,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// 1. 查询关联的等级grade状态 // 1. 查询关联的等级grade状态
Grade grade = adminGradeMapper.selectById(prizeDto.getGradeId()); // 假设 gradeId 是传入的等级ID Grade grade = adminGradeMapper.selectById(prizeDto.getGradeId()); // 假设 gradeId 是传入的等级ID
if (grade.getIsDel() == 1) { if (grade.getIsDel() == 1) {
return false; // 等级不存在直接返回失败
return Result.failure("等级不存在"); // 等级不存在直接返回失败
} }
// 2. 检查逻辑仅当等级未删除is_del=0且已存在奖品时才拒绝添加 // 2. 检查逻辑仅当等级未删除is_del=0且已存在奖品时才拒绝添加
@ -89,7 +88,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
wrapper.eq(Prize::getGradeId, prizeDto.getGradeId()) wrapper.eq(Prize::getGradeId, prizeDto.getGradeId())
.eq(Prize::getIs_del, 0); // 只统计未删除的奖品; .eq(Prize::getIs_del, 0); // 只统计未删除的奖品;
if (this.count(wrapper) > 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()); // grade.setUpdateTime(new Date());
// adminGradeMapper.updateById(grade); // adminGradeMapper.updateById(grade);
// } // }
return isPrizeSaved;
if (!isPrizeSaved) {
return Result.failure("未知错误,添加失败,122行");
}
return Result.success();
} }
@Override @Override
@Transactional @Transactional
public boolean updatePrize(PrizeDto prizeDto) {
public Result updatePrize(PrizeDto prizeDto) {
Long gradeId = prizeDto.getGradeId(); Long gradeId = prizeDto.getGradeId();
Grade grade = adminGradeMapper.selectById(gradeId); Grade grade = adminGradeMapper.selectById(gradeId);
@ -121,19 +123,19 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// 1. 查询原奖品信息 // 1. 查询原奖品信息
Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId()); Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId());
if (originalPrize == null) { if (originalPrize == null) {
return false; // 原奖品不存在
return Result.failure("奖品不存在"); // 原奖品不存在
} }
// 2. 查询目标等级信息 // 2. 查询目标等级信息
Grade targetGrade = adminGradeMapper.selectById(gradeId); Grade targetGrade = adminGradeMapper.selectById(gradeId);
if (targetGrade == null) { if (targetGrade == null) {
return false; // 目标等级不存在
return Result.failure("目标等级不存在"); // 目标等级不存在
} }
// 如果目标等级已删除(is_del=1)禁止修改 // 如果目标等级已删除(is_del=1)禁止修改
if (targetGrade.getIsDel() == 1) { if (targetGrade.getIsDel() == 1) {
return false; // 目标等级已删除不允许修改
return Result.failure("目标等级不存在"); // 目标等级已删除不允许修改
} }
// 3. 如果修改后的等级和原等级不同检查目标等级是否已有奖品 // 3. 如果修改后的等级和原等级不同检查目标等级是否已有奖品
@ -141,7 +143,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Prize::getGradeId, targetGrade.getId()); wrapper.eq(Prize::getGradeId, targetGrade.getId());
if (this.count(wrapper) > 0) { 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.setUpdateTime(new Date());
prize.setGradeId(grade.getId()); prize.setGradeId(grade.getId());
if (adminPrizeMapper.updateById(prize) > 0){ if (adminPrizeMapper.updateById(prize) > 0){
return true;
return Result.success();
}; };
return false;
return Result.failure("未知错误");
} }
@Override @Override
@ -230,26 +232,51 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
// 2. 检查该等级下是否已存在未删除的内定用户 // 2. 检查该等级下是否已存在未删除的内定用户
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDetail::getGradeId, gradeId)
// .eq(UserDetail::getIsFixed, 1)
wrapper.eq(UserDetail::getUserId, userId)
.eq(UserDetail::getIsFixed, 1) //已经内定的用户不能内定
.eq(UserDetail::getIsDel, 0); // 只检查未删除的记录 .eq(UserDetail::getIsDel, 0); // 只检查未删除的记录
if (adminUserDetailMapper.selectCount(wrapper) > 0) { if (adminUserDetailMapper.selectCount(wrapper) > 0) {
return Result.failure("该等级下已存在内定用户,不可重复添加");
return Result.failure("该用户已是其他等级的内定用户,一个用户只能内定一个等级");
} }
// 3. 检查是否存在已删除的内定用户is_del=1
// // 检查该等级下是否已存在未删除的内定用户
// LambdaQueryWrapper<UserDetail> gradeWrapper = new LambdaQueryWrapper<>();
// gradeWrapper.eq(UserDetail::getGradeId, gradeId)
// .eq(UserDetail::getIsFixed, 1)
// .eq(UserDetail::getIsDel, 0);
//
// if (adminUserDetailMapper.selectCount(gradeWrapper) > 0) {
// return Result.failure("该等级下已存在内定用户");
// }
// // 3. 检查是否存在已删除的内定用户is_del=1
// LambdaQueryWrapper<UserDetail> deletedWrapper = new LambdaQueryWrapper<>();
// deletedWrapper.eq(UserDetail::getGradeId, gradeId)
// .eq(UserDetail::getIsFixed, 1)
// .eq(UserDetail::getIsDel, 1)
// .last("LIMIT 1"); // 只取第一条
//
// UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper);
// if (deletedUserDetail != null) {
// // 如果存在已删除的记录先物理删除
// adminUserDetailMapper.deleteById(deletedUserDetail.getId());
// }
// 3. 检查该等级下是否存在已删除的内定用户is_del=1并全部物理删除
LambdaQueryWrapper<UserDetail> deletedWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserDetail> deletedWrapper = new LambdaQueryWrapper<>();
deletedWrapper.eq(UserDetail::getGradeId, gradeId) deletedWrapper.eq(UserDetail::getGradeId, gradeId)
.eq(UserDetail::getIsFixed, 1) .eq(UserDetail::getIsFixed, 1)
.eq(UserDetail::getIsDel, 1);
.eq(UserDetail::getIsDel, 1); // 查询所有已删除的内定用户
UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper);
if (deletedUserDetail != null) {
// 如果存在已删除的记录先物理删除
List<UserDetail> deletedDetails = adminUserDetailMapper.selectList(deletedWrapper);
if (!deletedDetails.isEmpty()) {
// 批量删除所有已标记为删除的记录
deletedDetails.forEach(deletedUserDetail -> {
adminUserDetailMapper.deleteById(deletedUserDetail.getId()); adminUserDetailMapper.deleteById(deletedUserDetail.getId());
});
} }
// 4. 添加新内定用户 // 4. 添加新内定用户
UserDetail userDetail = new UserDetail(); UserDetail userDetail = new UserDetail();
userDetail.setUserId(userId); userDetail.setUserId(userId);

415
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 org.springframework.web.multipart.MultipartFile;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -57,74 +58,83 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Override @Override
public PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { public PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) {
// //查UserDetail表吧所有的userid取出来然后在从user表根据id查就行了
// List<UserDetail> list = this.list();
// List<Long> UserIds = list.stream().map(UserDetail::getUserId).collect(Collectors.toList());
//
// Page<User> page = new Page<>(pageNum, pageSize);
// //
// //user表根据id批量查询
// LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// queryWrapper.in(User::getId, UserIds);
// // 如果没有有效用户返回空分页结果
// if (CollectionUtils.isEmpty(validUserIds)) {
// return emptyPageInfo(pageNum, pageSize);
// }
// //
// // 2. 构建用户表查询条件
// LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>();
// userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内
// //
// // 添加动态查询条件
// if (StringUtils.isNotBlank(userQueryDto.getUsername())) { // if (StringUtils.isNotBlank(userQueryDto.getUsername())) {
// queryWrapper.like(User::getUsername, userQueryDto.getUsername());
// userWrapper.like(User::getUsername, userQueryDto.getUsername());
// } // }
// if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { // 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);
// 1. 先查询有效的用户ID列表过滤掉 is_del = 1 的记录
// 1. 查询有效的用户详情记录过滤掉 is_del = 1 的记录
LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.select(UserDetail::getUserId) // 只查询user_id字段
.eq(UserDetail::getIsDel, 0); // 未删除的记录
detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录
List<Long> validUserIds = this.list(detailWrapper)
.stream()
.map(UserDetail::getUserId)
.collect(Collectors.toList());
// 2. 执行分页查询直接查询UserDetail表
Page<UserDetail> detailPage = new Page<>(pageNum, pageSize);
Page<UserDetail> detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper);
// 如果没有有效用户返回空分页结果
if (CollectionUtils.isEmpty(validUserIds)) {
// 3. 如果没有数据返回空分页结果
if (CollectionUtils.isEmpty(detailPageResult.getRecords())) {
return emptyPageInfo(pageNum, pageSize); return emptyPageInfo(pageNum, pageSize);
} }
// 2. 构建用户表查询条件
LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>();
userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内
// 添加动态查询条件
if (StringUtils.isNotBlank(userQueryDto.getUsername())) {
userWrapper.like(User::getUsername, userQueryDto.getUsername());
}
if (StringUtils.isNotBlank(userQueryDto.getJwcode())) {
userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); // 注意字段名是否匹配
}
// 4. 批量获取关联的User信息
List<Long> userIds = detailPageResult.getRecords().stream()
.map(UserDetail::getUserId)
.collect(Collectors.toList());
// 3. 执行分页查询
Page<User> page = new Page<>(pageNum, pageSize);
Page<User> userPage = adminUserMapper.selectPage(page, userWrapper);
Map<Long, User> userMap = adminUserMapper.selectBatchIds(userIds).stream()
.collect(Collectors.toMap(User::getId, Function.identity()));
// 4. 转换为VO对象
List<UserVo> userVoList = userPage.getRecords().stream()
.map(user -> {
// 5. 构建VO对象
List<UserVo> userVoList = detailPageResult.getRecords().stream()
.map(detail -> {
UserVo vo = new UserVo(); UserVo vo = new UserVo();
// 这里做属性拷贝可以使用BeanUtils或MapStruct等工具
vo.setId(user.getId());
vo.setId(detail.getId()); // 这里使用user_detail表的ID
// 设置User表的信息
User user = userMap.get(detail.getUserId());
if (user != null) {
vo.setUsername(user.getUsername()); vo.setUsername(user.getUsername());
// ...其他字段拷贝
vo.setJwcode(user.getJwcode());
// 其他需要从User表获取的字段...
}
return vo; return vo;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
// 5. 构建分页结果
return PageInfo.of(userPage, userVoList);
// 6. 构建分页结果
return PageInfo.of(detailPageResult, userVoList);
} }
// 返回空分页结果的辅助方法 // 返回空分页结果的辅助方法
@ -138,9 +148,223 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
return pageInfo; 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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Result importFixUsers(MultipartFile file, Long gradeId) { public Result importFixUsers(MultipartFile file, Long gradeId) {
// try {
// // 1. 解析Excel
// List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
// .head(UserImportDto.class)
// .sheet()
// .doReadSync();
//
// // 2. 准备数据集合
// List<User> newUsers = new ArrayList<>(); // 需要新增到user表的用户
// List<User> usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户
// List<UserDetail> newUserDetails = new ArrayList<>(); // 新增的userDetail
// List<UserDetail> detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail
//
// Set<String> processedCodes = new HashSet<>();
// int successCount = 0;
// int skipCount = 0;
//
// // 3. 查询所有已存在的jwcodeuser表
// Set<String> existingJwCodes = adminUserMapper.selectAllUserCodes();
//
// // 4. 查询所有已存在的user_detail记录避免N+1查询
// Map<String, UserDetail> existingDetails = adminUserDetailMapper.selectList(null)
// .stream()
// .collect(Collectors.toMap(
// detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(),
// detail -> detail
// ));
//
// for (int i = 0; i < userDtos.size(); i++) {
// UserImportDto dto = userDtos.get(i);
// try {
// validateUser(dto, i + 2, processedCodes);
//
// // 检查是否已在当前文件中处理过
// if (processedCodes.contains(dto.getJwcode())) {
// throw new IllegalArgumentException("精网号在当前文件中重复: " + dto.getJwcode());
// }
// processedCodes.add(dto.getJwcode());
//
// // 处理逻辑
// if (existingJwCodes.contains(dto.getJwcode())) {
// // --- 用户已存在 ---
// User existingUser = adminUserMapper.selectUserByJwcode(dto.getJwcode());
//
// // 检查user表状态
// if (existingUser.getIsDel() == 1) {
// // user表已删除恢复用户
// existingUser.setIsDel(0);
// usersToRecover.add(existingUser);
// }
//
//// // 检查user_detail状态
//// UserDetail existingDetail = existingDetails.get(dto.getJwcode());
//// if (existingDetail != null) {
//// if (existingDetail.getIsDel() == 1) {
//// // user_detail已删除恢复记录
//// existingDetail.setIsDel(0);
//// existingDetail.setGradeId(gradeId);
//// detailsToRecover.add(existingDetail);
//// } else {
//// // user_detail已存在且未删除跳过
//// throw new IllegalArgumentException("用户已存在且未删除: " + dto.getJwcode());
//// }
//// } else {
//// // user_detail不存在新增
//// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId));
//// }
//// } else {
//// // --- 全新用户 ---
//// User newUser = convertToEntity(dto);
//// newUsers.add(newUser);
//// }
//// successCount++;
//// } catch (IllegalArgumentException e) {
//// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
//// skipCount++;
//// }
//// }
// // 检查用户是否已经是其他等级的内定用户
// UserDetail existingFixedDetail = existingDetails.get(existingUser.getId());
// if (existingFixedDetail != null) {
// if (existingFixedDetail.getGradeId().equals(gradeId)) {
// // 已经是当前等级的内定用户
// if (existingFixedDetail.getIsDel() == 1) {
// // 恢复已删除的记录
// existingFixedDetail.setIsDel(0);
// detailsToRecover.add(existingFixedDetail);
// } else {
// throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode());
// }
// } else {
// // 已经是其他等级的内定用户
// throw new IllegalArgumentException("用户已是其他等级的内定用户,无法添加到本等级: " + dto.getJwcode());
// }
// } else {
// // 不是任何等级的内定用户可以添加
// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId));
// }
// } else {
// // --- 全新用户 ---
// User newUser = convertToEntity(dto);
// newUsers.add(newUser);
// }
// successCount++;
// } catch (IllegalArgumentException e) {
// LOGGER.warn("导入数据校验失败: {}", e.getMessage());
// skipCount++;
// }
// }
// // 5. 批量操作数据库
// if (!newUsers.isEmpty()) {
// adminUserService.saveBatch(newUsers);
// // 为新用户创建userDetail
// newUsers.forEach(user ->
// newUserDetails.add(createUserDetail(user.getId(), gradeId)));
// }
//
// if (!usersToRecover.isEmpty()) {
// adminUserService.updateBatchById(usersToRecover);
// }
//
// if (!detailsToRecover.isEmpty()) {
// this.updateBatchById(detailsToRecover);
// }
//
// if (!newUserDetails.isEmpty()) {
// this.saveBatch(newUserDetails);
// }
//
// return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
// } catch (Exception e) {
// LOGGER.error("导入用户失败", e);
// return Result.failure("导入失败: " + e.getMessage());
// }
try { try {
// 1. 解析Excel // 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream()) List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
@ -148,72 +372,81 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
.sheet() .sheet()
.doReadSync(); .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 successCount = 0;
int skipCount = 0; int skipCount = 0;
// 3. 查询所有已存在的jwcode
Set<String> existingCodes = adminUserMapper.selectAllUserCodes();
Set<String> processedCodes = new HashSet<>();
for (int i = 0; i < userDtos.size(); i++) { for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i); UserImportDto dto = userDtos.get(i);
try { try {
validateUser(dto, i + 2, processedCodes); // 移除了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);
processedCodes.add(dto.getJwcode());
// 2. 查询用户是否存在按jwcode
User user = adminUserMapper.selectUserByJwcode(dto.getJwcode());
if (user == null) {
// 新增用户
user = convertToEntity(dto);
adminUserMapper.insert(user);
} else if (user.getIsDel() == 1) {
// 恢复已删除用户
user.setIsDel(0);
adminUserMapper.updateById(user);
}
// 3. 检查用户是否已经是其他等级的内定用户全局检查
LambdaQueryWrapper<UserDetail> globalCheckWrapper = new LambdaQueryWrapper<>();
globalCheckWrapper.eq(UserDetail::getUserId, user.getId())
.eq(UserDetail::getIsFixed, 1)
.eq(UserDetail::getIsDel, 0)
.ne(UserDetail::getGradeId, gradeId); // 排除当前等级
if (adminUserDetailMapper.selectCount(globalCheckWrapper) > 0) {
throw new IllegalArgumentException("用户已是其他等级的内定用户,无法重复内定: " + dto.getJwcode());
}
// 3. 检查是否已是当前gradeId的内定用户
LambdaQueryWrapper<UserDetail> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserDetail::getUserId, user.getId())
.eq(UserDetail::getGradeId, gradeId)
.eq(UserDetail::getIsFixed, 1);
UserDetail existingDetail = adminUserDetailMapper.selectOne(wrapper);
if (existingDetail != null) {
if (existingDetail.getIsDel() == 0) {
throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode());
} else { } else {
// 用户不存在创建新用户
User newUser = convertToEntity(dto);
newUsers.add(newUser);
// 物理删除旧记录再新增一条
adminUserDetailMapper.deleteById(existingDetail.getId());
}
} }
processedCodes.add(dto.getJwcode());
// 4. 新增内定记录
UserDetail newDetail = createUserDetail(user.getId(), gradeId);
adminUserDetailMapper.insert(newDetail);
successCount++; successCount++;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
LOGGER.warn("导入数据校验失败: {}", e.getMessage());
LOGGER.warn("导入失败(行{}): {}", i + 2, e.getMessage());
skipCount++; skipCount++;
} }
} }
// 4. 批量保存新用户
if (!newUsers.isEmpty()) {
adminUserService.saveBatch(newUsers);
return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount));
} catch (Exception e) {
LOGGER.error("导入失败", e);
return Result.failure("导入失败: " + e.getMessage());
}
} }
// 5. 准备userDetail数据 (包括新用户和已存在用户)
List<User> allUsers = new ArrayList<>();
allUsers.addAll(newUsers);
allUsers.addAll(existingUsers);
for (User user : allUsers) {
// 辅助方法创建UserDetail
private UserDetail createUserDetail(Long userId, Long gradeId) {
UserDetail detail = new UserDetail(); UserDetail detail = new UserDetail();
detail.setUserId(user.getId());
detail.setUserId(userId);
detail.setGradeId(gradeId); detail.setGradeId(gradeId);
detail.setIsFixed(1); 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());
}
detail.setIsDel(0);
return detail;
} }
@Override @Override

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

@ -21,9 +21,11 @@ import com.lottery.entity.UserDetail;
import com.lottery.entity.WinnerRecord; import com.lottery.entity.WinnerRecord;
import com.lottery.result.Result; import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil; import com.lottery.utils.ConvertBeanUtil;
import com.lottery.utils.JwtUtil;
import com.lottery.vo.PageInfo; import com.lottery.vo.PageInfo;
import com.lottery.vo.UserLoginVo; import com.lottery.vo.UserLoginVo;
import com.lottery.vo.UserVo; import com.lottery.vo.UserVo;
import io.jsonwebtoken.Claims;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -64,6 +66,9 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
@Autowired @Autowired
private AdminWinMapper adminWinMapper; private AdminWinMapper adminWinMapper;
@Autowired
private com.lottery.propertise.jwtPropertice jwtPropertice;
@Autowired @Autowired
private AdminIsLoginMapper adminIsLoginMapper; private AdminIsLoginMapper adminIsLoginMapper;
@ -172,37 +177,74 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
public Result importUsers(MultipartFile file) { public Result importUsers(MultipartFile file) {
try { try {
// 2. 解析Excel
// List<UserImportDto> userDtos = ExcelUtil.parseExcel(file, UserImportDto.class);
// 1. 解析Excel
List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream()) List<UserImportDto> userDtos = EasyExcel.read(file.getInputStream())
.head(UserImportDto.class) .head(UserImportDto.class)
.sheet() .sheet()
.doReadSync(); .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<>(); // 用于当前文件内的去重 Set<String> processedCodes = new HashSet<>(); // 用于当前文件内的去重
for (int i = 0; i < userDtos.size(); i++) { for (int i = 0; i < userDtos.size(); i++) {
UserImportDto dto = userDtos.get(i); UserImportDto dto = userDtos.get(i);
try { try {
validateUser(dto, i + 2, 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()); 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) { } catch (IllegalArgumentException e) {
LOGGER.warn("导入数据校验失败: {}", e.getMessage()); 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;
} }
return Result.failure("没有有效数据可导入");
if (!usersToUpdate.isEmpty()) {
boolean updateSuccess = this.updateBatchById(usersToUpdate);
successCount += updateSuccess ? usersToUpdate.size() : 0;
}
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) { } catch (Exception e) {
LOGGER.error("导入用户失败", e); LOGGER.error("导入用户失败", e);
return Result.failure("导入失败: " + e.getMessage()); return Result.failure("导入失败: " + e.getMessage());
@ -240,6 +282,24 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
return this.update(updateWrapper); 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:" + token);
if (StringUtils.isBlank(username)) {
return Result.failure("无效的Token");
}
redisTemplate.delete("token:" + token);
return Result.success("登出成功");
}
private User convertToEntity(UserImportDto dto) { private User convertToEntity(UserImportDto dto) {
User user = new User(); User user = new User();
user.setJwcode(dto.getJwcode()); user.setJwcode(dto.getJwcode());
@ -253,7 +313,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
return user; 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())) { if (StringUtils.isBlank(dto.getJwcode())) {
throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空"); throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空");
} }
@ -262,13 +322,13 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
throw new IllegalArgumentException("第" + rowNum + "行: 姓名不能为空"); 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 + "行: 精网号在当前文件中重复");
// }
} }
} }

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

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

40
lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java

@ -0,0 +1,40 @@
package com.lottery.api.controller;
import com.lottery.admin.mapper.AdminUserMapper;
import com.lottery.admin.service.AdminWinService;
import com.lottery.api.service.WinUserService;
import com.lottery.result.Result;
import com.lottery.vo.PageInfo;
import com.lottery.vo.WinUserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.logging.Logger;
/**
* @program: lottery
* @ClassName WinUserController
* @description:
* @author: wwl
* @create: 2025-07-22 15:05
* @Version 1.0
**/
@RestController
@RequestMapping("/api/winUser")
public class WinUserController {
private final static Logger LOGGER = Logger.getLogger(WinUserController.class.getName());
@Autowired
private AdminWinService adminWinService;
@PostMapping("/list")
public Result<PageInfo<WinUserVo>> list(){
LOGGER.info("查询所有中奖用户");
return Result.success(adminWinService.listWinUserWin());
//return Result.success();
}
}

42
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.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.AdminPrizeMapper;
import com.lottery.admin.mapper.AdminWinMapper; import com.lottery.admin.mapper.AdminWinMapper;
import com.lottery.api.mapper.IGradeMapper; import com.lottery.api.mapper.IGradeMapper;
@ -17,6 +18,8 @@ import com.lottery.entity.WinnerRecord;
import com.lottery.exception.SomeException; import com.lottery.exception.SomeException;
import com.lottery.vo.UserVo; import com.lottery.vo.UserVo;
import com.lottery.vo.LotteryVo; import com.lottery.vo.LotteryVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -266,21 +269,46 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private final static Logger LOGGER = LoggerFactory.getLogger(UserDetailServiceImpl.class);
// 标记用户为中奖状态 // 标记用户为中奖状态
private void markUsersAsWinners(List<User> winners, StartLotteryDto startLotteryDto) { private void markUsersAsWinners(List<User> winners, StartLotteryDto startLotteryDto) {
for (User user : winners) { 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; // 已有有效记录跳过插入
}
// 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() WinnerRecord winnerRecord = WinnerRecord.builder()
.userId(user.getId()) .userId(user.getId())
.winTime(new Date()) .winTime(new Date())
.prizeId(startLotteryDto.getPrizeId()).build();
.prizeId(startLotteryDto.getPrizeId())
.isDel(0) // 明确设置为未删除
.build();
adminWinMapper.insert(winnerRecord); adminWinMapper.insert(winnerRecord);
}
// 5. 更新用户中奖状态
user.setIsWin(1);
userMapper.updateById(user); userMapper.updateById(user);
} }
} }

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

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

15
lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java

@ -0,0 +1,15 @@
package com.lottery.api.service.Impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.api.service.WinUserService;
/**
* @program: lottery
* @ClassName WinUserServiceImpl
* @description:
* @author: wwl
* @create: 2025-07-22 15:21
* @Version 1.0
**/
public class WinUserServiceImpl implements WinUserService {
}

14
lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java

@ -0,0 +1,14 @@
package com.lottery.api.service;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @program: lottery
* @ClassName WinUserService
* @description:
* @author: wwl
* @create: 2025-07-22 15:21
* @Version 1.0
**/
public interface WinUserService {
}

11
lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java

@ -17,9 +17,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
public class CorsConfig implements WebMvcConfigurer { public class CorsConfig implements WebMvcConfigurer {
@Override @Override
public void addCorsMappings(CorsRegistry registry) { public void addCorsMappings(CorsRegistry registry) {
// registry.addMapping("/**")
// .allowedOrigins("*") // 允许所有来源
// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
// .allowedHeaders("*");
registry.addMapping("/**") registry.addMapping("/**")
.allowedOrigins("*") // 允许所有来源
.allowedOriginPatterns("*") // 允许所有来源模式
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*");
.allowedHeaders("*")
.allowCredentials(true); // 允许携带凭证如cookie认证头
} }
} }

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

@ -8,13 +8,14 @@ spring:
username: link username: link
password: tEhdERkaGprEA7nT password: tEhdERkaGprEA7nT
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
hikari: hikari:
maximum-pool-size: 20 # 默认一般是 10,根据并发量调整 maximum-pool-size: 20 # 默认一般是 10,根据并发量调整
connection-timeout: 30000 # 连接超时时间(毫秒),默认 30s connection-timeout: 30000 # 连接超时时间(毫秒),默认 30s
idle-timeout: 600000 # 空闲连接超时时间(默认 10 分钟) idle-timeout: 600000 # 空闲连接超时时间(默认 10 分钟)
max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟) max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟)
leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s) leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s)
#
# ========== Redis 配置 ========== # ========== Redis 配置 ==========
redis: redis:
host: 39.98.127.73 host: 39.98.127.73
@ -23,11 +24,10 @@ spring:
database: 1 # 默认DB索引 database: 1 # 默认DB索引
jedis: jedis:
pool: 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) ========== # ========== MyBatis 配置(如果使用MyBatis代替JPA) ==========
@ -51,7 +51,7 @@ lottery:
#用户端JWT #用户端JWT
user-secret-key: willier_need_at_least_32_chars_secure_key_12345 user-secret-key: willier_need_at_least_32_chars_secure_key_12345
user-ttl: 7200000 user-ttl: 7200000
user-token-name: authentication
user-token-name: token
max-draw-times: 3 # 用户每日最大抽奖次数 max-draw-times: 3 # 用户每日最大抽奖次数

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

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

Loading…
Cancel
Save