Browse Source

完成中奖逻辑和后台其他接口

feature/0725lihuilin
willy 1 month ago
parent
commit
b5fda80ec8
  1. 20
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserQueryDto.java
  2. 4
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java
  3. 9
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java
  4. 28
      lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java
  5. 12
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java
  6. 5
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java
  7. 40
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminWInController.java
  8. 39
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/WInController.java
  9. 4
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java
  10. 6
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminWinMapper.java
  11. 24
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java
  12. 18
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IWinService.java
  13. 44
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  14. 2
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  15. 140
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java
  16. 41
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/IWinServiceImpl.java
  17. 12
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java
  18. 3
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/PrizeController.java
  19. 2
      lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java
  20. 5
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java
  21. 251
      lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java
  22. 5
      lottery-system/lottery-service/src/main/resources/mapper/admin/AdminWinMapper.xml
  23. 34
      lottery-system/lottery-service/src/main/resources/mapper/admin/winMapper.xml

20
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserQueryDto.java

@ -0,0 +1,20 @@
package com.lottery.dto;
import lombok.Data;
/**
* @program: lottery
* @ClassName WinUserQuertDto
* @description:
* @author: wwl
* @create: 2025-07-17 14:12
* @Version 1.0
**/
@Data
public class WinUserQueryDto {
private String username;
private String jwcode;
private String gradeName;
}

4
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java

@ -28,15 +28,15 @@ public class User {
@TableId(type = IdType.AUTO)
private Long id; // 主键ID表中未显示但建议添加
private String username; // 用户名
private String password; //密码
private String jwcode; // 手机号
private Date createTime; // 创建时间
private int isWin; //是否中奖
private Date createTime; // 创建时间
private Date updateTime; // 更新时间
}

9
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java

@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -20,7 +21,8 @@ import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName("winner_record")
@TableName("winning_record")
@Builder
public class WinnerRecord {
@TableId(type = IdType.AUTO)
@ -30,11 +32,6 @@ public class WinnerRecord {
private Long prizeId; // 奖品ID
private Long roundId; // 轮次ID
private Date winTime; // 中奖时间
private Boolean isClaimed; // 是否已领取tinyint映射为Boolean
private Date claimTime; // 领取时间
}

28
lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java

@ -0,0 +1,28 @@
package com.lottery.vo;
import lombok.Data;
import java.util.Date;
/**
* @program: lottery
* @ClassName WinUserVo
* @description:
* @author: wwl
* @create: 2025-07-17 14:09
* @Version 1.0
**/
@Data
public class WinUserVo {
private String username;
private String jwcode;
private String gradeName;
private String prizeName;
private Date winTime; // 中奖时间;
}

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

@ -5,6 +5,7 @@ import com.lottery.admin.service.AdminGradeService;
import com.lottery.dto.GradeDto;
import com.lottery.entity.Grade;
import com.lottery.exception.SomeException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.lottery.result.Result;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.vo.GradeVo;
@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
/**
* @program: lottery-system
* @ClassName GradeController
@ -39,7 +41,7 @@ public class AdminGradeController {
private final static Logger LOGGER = LoggerFactory.getLogger(AdminGradeController.class);
@GetMapping("/list")
@PostMapping("/list")
public Result<PageInfo<GradeVo>> selectGrade( @RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize){
LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageNum, pageSize);
@ -48,7 +50,7 @@ public class AdminGradeController {
return Result.success(pageSelectGrade);
}
@GetMapping("/details")
@PostMapping("/details")
public Result<GradeVo> selectById(@RequestParam Long id){
LOGGER.info("根据id查找等级:{}",id);
return Result.success(ConvertBeanUtil.convert(adminGradeService.getById(id), GradeVo.class));
@ -64,6 +66,12 @@ public class AdminGradeController {
return Result.failure("所有字段都必须填写");
}
LambdaQueryWrapper<Grade> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName());
if (adminGradeService.count(queryWrapper) > 0) {
return Result.failure("等级已存在,新增失败");
}
Grade grade = ConvertBeanUtil.convert(gradeDto, Grade.class);
grade.setCreateTime(new Date());

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

@ -28,7 +28,7 @@ public class AdminPrizeController {
private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class);
@GetMapping("list")
@PostMapping("list")
public Result<PageInfo<PrizeVo>> listPrize(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) {
LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageNum, pageSize);
@ -36,8 +36,9 @@ public class AdminPrizeController {
return Result.success(pageInfo);
}
@GetMapping("/details")
@PostMapping("/details")
public Result<PrizeVo> selectById(@RequestParam Long id) {
LOGGER.info("根据id查询奖品:{}",id);
return Result.success(adminPrizeService.getPrizeById(id));
}

40
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminWInController.java

@ -0,0 +1,40 @@
package com.lottery.admin.controller;
import com.lottery.admin.service.AdminWinService;
import com.lottery.dto.UserQueryDto;
import com.lottery.dto.WinUserQueryDto;
import com.lottery.result.Result;
import com.lottery.vo.PageInfo;
import com.lottery.vo.UserVo;
import com.lottery.vo.WinUserVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @program: lottery-system
* @ClassName wincontroller
* @description:
* @author:wwl
* @create: 202507-17 15:18
* @Version 1.0
**/
@RestController
@RequestMapping("/admin/win")
public class AdminWInController {
@Autowired
private AdminWinService adminWinService;
private final static Logger LOGGER = LoggerFactory.getLogger(AdminWInController.class);
@PostMapping("/list")
public Result<PageInfo<WinUserVo>> WInController(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize,
@RequestBody WinUserQueryDto winUserQueryDto) {
LOGGER.info("分页查询所有中奖用户");
return Result.success(adminWinService.listWinUser(pageNum, pageSize, winUserQueryDto));
}
}

39
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/WInController.java

@ -1,39 +0,0 @@
package com.lottery.admin.controller;
import com.lottery.admin.service.IWinService;
import com.lottery.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
/**
* @program: lottery-system
* @ClassName wincontroller
* @description:
* @author:jihaipeng
* @create: 202507-12 17:18
* @Version 1.0
**/
@Controller
@RequestMapping("/admin/win")
public class WInController {
@Autowired
private IWinService iWinService;
@GetMapping("/search")
public Result<List<Map<String, Object>>> searchWinRecords(
@RequestParam(required = false) String username,
@RequestParam(required = false) String jwcode,
@RequestParam(required = false) String gradeName) {
List<Map<String, Object>> winRecords = iWinService.getWinRecordsByConditions(username, jwcode, gradeName);
return Result.success(winRecords);
}
}

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

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lottery.entity.Prize;
import org.apache.ibatis.annotations.Select;
/**
* @program: lottery
@ -16,4 +17,7 @@ import com.lottery.entity.Prize;
public interface AdminPrizeMapper extends BaseMapper<Prize> {
Page<Prize> pageListPrize(Page<Prize> page, LambdaQueryWrapper<Prize> prizeLambdaQueryWrapper);
@Select("select id from prize where grade_name = #{prizeName}")
Long selectByName(String prizeName);
}

6
lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IWinMapper.java → lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminWinMapper.java

@ -1,5 +1,7 @@
package com.lottery.admin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lottery.entity.WinnerRecord;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@ -14,8 +16,6 @@ import java.util.Map;
* @Version 1.0
**/
@Mapper
public interface IWinMapper {
public interface AdminWinMapper extends BaseMapper<WinnerRecord> {
List<Map<String, Object>> selectWinRecordsByConditions(Map<String, Object> params);
}

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

@ -0,0 +1,24 @@
package com.lottery.admin.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lottery.dto.WinUserQueryDto;
import com.lottery.entity.WinnerRecord;
import com.lottery.vo.PageInfo;
import com.lottery.vo.WinUserVo;
import java.util.List;
import java.util.Map;
/**
* @program: lottery-system
* @ClassName IWinService
* @description:
* @author:jihaipeng
* @create: 202507-12 17:20
* @Version 1.0
**/
public interface AdminWinService extends IService<WinnerRecord> {
PageInfo<WinUserVo> listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto);
}

18
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IWinService.java

@ -1,18 +0,0 @@
package com.lottery.admin.service;
import java.util.List;
import java.util.Map;
/**
* @program: lottery-system
* @ClassName IWinService
* @description:
* @author:jihaipeng
* @create: 202507-12 17:20
* @Version 1.0
**/
public interface IWinService {
List<Map<String, Object>> getWinRecordsByConditions(String username, String jwcode, String gradeName);
}

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

@ -93,13 +93,45 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
String gradeName = prizeDto.getGradeName();
Grade grade = adminGradeMapper.selectByName(gradeName);
LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Prize::getGradeId, grade.getId());
if (this.count(wrapper) > 0) {
// return Result.failure("该等级已存在奖品,不能重复添加");
// throw new SomeException("heheh");
return false;
//TODO 修改自己的等奖会失败
// 2. 检查是否是修改现有奖品需要传入prizeId
// 1. 查询原奖品信息
Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId());
if (originalPrize == null) {
return false; // 原奖品不存在
}
// 2. 查询目标等级信息
Grade targetGrade = adminGradeMapper.selectByName(prizeDto.getGradeName());
if (targetGrade == null) {
return false; // 目标等级不存在
}
// 3. 如果修改后的等级和原等级不同检查目标等级是否已有奖品
if (!targetGrade.getId().equals(originalPrize.getGradeId())) {
LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Prize::getGradeId, targetGrade.getId());
if (this.count(wrapper) > 0) {
return false; // 目标等级已有奖品不能修改
}
}
// 4. 检查奖品名称是否重复排除自己
LambdaQueryWrapper<Prize> nameCheckWrapper = new LambdaQueryWrapper<>();
nameCheckWrapper.eq(Prize::getPrizeName, prizeDto.getPrizeName())
.ne(Prize::getId, prizeDto.getId());
if (this.count(nameCheckWrapper) > 0) {
return false; // 奖品名称已存在
}
// LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>();
// wrapper.eq(Prize::getGradeId, grade.getId());
// if (this.count(wrapper) > 0) {
//// return Result.failure("该等级已存在奖品,不能重复添加");
//// throw new SomeException("heheh");
// return false;
// }
Prize prize = ConvertBeanUtil.convert(prizeDto, Prize.class);
prize.setUpdateTime(new Date());
prize.setGradeId(grade.getId());

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

@ -57,7 +57,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
Map<String, String> params = new HashMap<>();
params.put("username", adminLogin.getUsername()); // 替换为实际用户名
params.put("password", adminLogin.getPassword()); // 替换为实际密码
params.put("app_from", "en"); // canshu
params.put("app_from", "toujiao"); // canshu
// 2. 调用登录API
String loginUrl = "http://39.101.133.168:8828/hljwgo/api/user/login_jwcode";

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

@ -0,0 +1,140 @@
package com.lottery.admin.service.Impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.LotteryApplication;
import com.lottery.admin.mapper.AdminGradeMapper;
import com.lottery.admin.mapper.AdminUserMapper;
import com.lottery.admin.mapper.AdminWinMapper;
import com.lottery.admin.service.AdminGradeService;
import com.lottery.admin.service.AdminPrizeService;
import com.lottery.admin.service.AdminUserService;
import com.lottery.admin.service.AdminWinService;
import com.lottery.dto.UserQueryDto;
import com.lottery.dto.WinUserQueryDto;
import com.lottery.entity.*;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.vo.PageInfo;
import com.lottery.vo.UserVo;
import com.lottery.vo.WinUserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @program: lottery-system
* @ClassName IWinServiceImpl
* @description:
* @author:jihaipeng
* @create: 202507-12 17:20
* @Version 1.0
**/
@Service
public class AdminWinServiceImpl extends ServiceImpl<AdminWinMapper, WinnerRecord> implements AdminWinService {
@Autowired
private AdminWinMapper adminWinMapper;
@Autowired
private AdminUserService adminUserService;
@Autowired
private AdminGradeService adminGradeService;
@Autowired
private AdminPrizeService adminPrizeService;
@Override
public PageInfo<WinUserVo> listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto) {
// 1. 创建分页对象直接查询WinnerRecord表
Page<WinnerRecord> page = new Page<>(pageNum, pageSize);
// 2. 构建查询条件
LambdaQueryWrapper<WinnerRecord> recordWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(winUserQueryDto.getUsername())){
// 需要关联用户表查询用户名
recordWrapper.exists(
"SELECT 1 FROM user u WHERE u.id = winner_record.user_id AND u.username LIKE {0}",
"%" + winUserQueryDto.getUsername() + "%"
);
}
if (StringUtils.isNotBlank(winUserQueryDto.getJwcode())) {
// 需要关联用户表查询jw号
recordWrapper.exists(
"SELECT 1 FROM user u WHERE u.id = winner_record.user_id AND u.jwcode LIKE {0}",
"%" + winUserQueryDto.getJwcode() + "%"
);
}
// 3. 执行分页查询WinnerRecord表
Page<WinnerRecord> recordPage = adminWinMapper.selectPage(page, recordWrapper);
// 4. 批量获取关联数据优化性能
List<Long> userIds = recordPage.getRecords().stream()
.map(WinnerRecord::getUserId)
.collect(Collectors.toList());
List<Long> prizeIds = recordPage.getRecords().stream()
.map(WinnerRecord::getPrizeId)
.distinct()
.collect(Collectors.toList());
// 4.1 查询用户基本信息
Map<Long, User> userMap = adminUserService.listByIds(userIds).stream()
.collect(Collectors.toMap(User::getId, u -> u));
// 4.2 查询奖品及对应等级信息
Map<Long, Prize> prizeMap = adminPrizeService.listByIds(prizeIds).stream()
.collect(Collectors.toMap(Prize::getId, p -> p));
List<Long> gradeIds = prizeMap.values().stream()
.map(Prize::getGradeId)
.collect(Collectors.toList());
Map<Long, Grade> gradeMap = adminGradeService.listByIds(gradeIds).stream()
.collect(Collectors.toMap(Grade::getId, g -> g));
// 5. 转换为VO
List<WinUserVo> voList = recordPage.getRecords().stream()
.map(record -> {
WinUserVo vo = new WinUserVo();
// 设置用户信息
User user = userMap.get(record.getUserId());
if (user != null) {
vo.setUsername(user.getUsername());
vo.setJwcode(user.getJwcode());
}
// 设置奖品和等级信息
Prize prize = prizeMap.get(record.getPrizeId());
if (prize != null) {
vo.setPrizeName(prize.getPrizeName());
Grade grade = gradeMap.get(prize.getGradeId());
if (grade != null) {
vo.setGradeName(grade.getGradeName());
}
}
// 设置中奖时间
vo.setWinTime(record.getWinTime());
return vo;
})
.collect(Collectors.toList());
// 6. 返回分页结果
return PageInfo.of(recordPage, voList);
// Page<User> userPage = this.adminUserMapper.selectPage(page, queryWrapper);
// List<UserVo> userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class);
// return PageInfo.of(userPage, userVolist);
}
}

41
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/IWinServiceImpl.java

@ -1,41 +0,0 @@
package com.lottery.admin.service.Impl;
import com.lottery.admin.mapper.IWinMapper;
import com.lottery.admin.service.IWinService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @program: lottery-system
* @ClassName IWinServiceImpl
* @description:
* @author:jihaipeng
* @create: 202507-12 17:20
* @Version 1.0
**/
@Service
public class IWinServiceImpl implements IWinService {
@Autowired
private IWinMapper iWinMapper;
@Override
public List<Map<String, Object>> getWinRecordsByConditions(String username, String jwcode, String gradeName) {
// 如果所有条件都为空可以返回空列表或抛出异常避免全表扫描
if (username == null && jwcode == null && gradeName == null) {
return Collections.emptyList(); // 或者抛出异常
}
Map<String, Object> params = new HashMap<>();
params.put("username", username);
params.put("jwcode", jwcode);
params.put("gradeName", gradeName);
return iWinMapper.selectWinRecordsByConditions(params);
}
}

12
lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java

@ -11,6 +11,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @program: lottery
* @ClassName LotteryController
@ -29,11 +31,11 @@ public class LotteryController {
@Autowired
private IUserDetailService userDetailService;
@GetMapping()
public Result<UserVo> StartLottery(@RequestBody StartLotteryDto startLotteryDto){
@GetMapping("/start")
public Result<List<UserVo>> StartLottery(@RequestBody StartLotteryDto startLotteryDto){
LOGGER.info("开始抽奖,{}等级,奖品是:{},抽取人数:{}",startLotteryDto.getGradeName(),startLotteryDto.getPrizeName(),startLotteryDto.getPerWin());
userDetailService.StartLottery(startLotteryDto);
return Result.success();
LOGGER.info("开始抽奖: 等级是:{},奖品是:{},抽取人数:{}",startLotteryDto.getGradeName(),startLotteryDto.getPrizeName(),startLotteryDto.getPerWin());
List<UserVo> userVos = userDetailService.StartLottery(startLotteryDto);
return Result.success(userVos);
}
}

3
lottery-system/lottery-service/src/main/java/com/lottery/api/controller/PrizeController.java

@ -10,6 +10,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -32,7 +33,7 @@ public class PrizeController {
private final static Logger LOGGER = LoggerFactory.getLogger(PrizeController.class);
@GetMapping("/list")
@PostMapping("/list")
public Result<List<PrizeAndGradeVo>> getAllPrizeAnd(){
LOGGER.info("查询所有礼品和对应等级,按照sort值排序");

2
lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java

@ -67,7 +67,7 @@ public class UserController {
return Result.success(userLoginVo);
}
@GetMapping("/list")
@PostMapping("/list")
public Result<List<UserVo>> getAllUser(){
LOGGER.info("查询所有用户");

5
lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java

@ -3,6 +3,9 @@ package com.lottery.api.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lottery.dto.StartLotteryDto;
import com.lottery.entity.UserDetail;
import com.lottery.vo.UserVo;
import java.util.List;
/**
* @program: lottery
@ -13,5 +16,5 @@ import com.lottery.entity.UserDetail;
* @Version 1.0
**/
public interface IUserDetailService extends IService<UserDetail> {
void StartLottery(StartLotteryDto startLotteryDto);
List<UserVo> StartLottery(StartLotteryDto startLotteryDto);
}

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

@ -3,6 +3,8 @@ package com.lottery.api.service.Impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lottery.LotteryApplication;
import com.lottery.admin.mapper.AdminPrizeMapper;
import com.lottery.admin.mapper.AdminWinMapper;
import com.lottery.api.mapper.IGradeMapper;
import com.lottery.api.mapper.IUserDetailMapper;
import com.lottery.api.mapper.IUserMapper;
@ -11,14 +13,18 @@ import com.lottery.dto.StartLotteryDto;
import com.lottery.entity.Grade;
import com.lottery.entity.User;
import com.lottery.entity.UserDetail;
import com.lottery.entity.WinnerRecord;
import com.lottery.exception.SomeException;
import com.lottery.utils.ConvertBeanUtil;
import com.lottery.vo.UserVo;
import com.lottery.vo.WinUserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
/**
@ -38,92 +44,205 @@ public class UserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, UserDe
private IGradeMapper gradeMapper;
@Autowired
private AdminPrizeMapper adminPrizeMapper;
@Autowired
private IUserDetailMapper userDetailMapper;
@Autowired
private AdminWinMapper adminWinMapper;
// public List<UserVo> StartLottery(StartLotteryDto startLotteryDto) {
//
// Long gradeId = gradeMapper.selectByName(startLotteryDto.getGradeName());
// if (gradeId == null) {
// throw new SomeException("未找到指定等级:" + startLotteryDto.getGradeName());
// }
//
// LambdaQueryWrapper<UserDetail> userDetailLambdaQueryWrapper = new LambdaQueryWrapper<>();
// userDetailLambdaQueryWrapper
// .eq(UserDetail::getGradeId, gradeId)
// .eq(UserDetail::getIsFixed, 1);
//
// //该等级下的所有内定人员
// List<UserDetail> userDetails = userDetailMapper.selectList(userDetailLambdaQueryWrapper);
//
// if (userDetails.isEmpty()) {
// System.out.println("无内定");
//
// //从user表中随机抽取startLotteryDto.getPerWin()
// LambdaQueryWrapper<User> UserQueryWrapper = new LambdaQueryWrapper<>();
// List<User> users = randomSelectFromAllUser(userMapper.selectList(UserQueryWrapper), startLotteryDto.getPerWin());
//
// List<UserVo> userVos = ConvertBeanUtil.convertList(users, UserVo.class);
// return userVos;
// }
//
// if (startLotteryDto.getPerWin() > userDetails.size()) {
// //抽取人数大于内定人数所有内定人员均中奖剩余的从总的user表抽取
// List<UserVo> userVoList = new ArrayList<>();
//
// //内定中奖的
// for (UserDetail userDetail : userDetails) {
// User user = userMapper.selectById(userDetail.getUserId());
// if (user == null) {
// throw new SomeException("未找到用户ID:" + userDetail.getUserId());
// }
//
// UserVo userVo = new UserVo();
// userVo.setUsername(user.getUsername());
// userVo.setJwcode(user.getJwcode());
// userVoList.add(userVo);
// }
//
// //总中奖人数 - 内定人数 = 剩余从总用户表中抽取
// int lastNum = startLotteryDto.getPerWin() - userVoList.size();
// LambdaQueryWrapper<User> UserQueryWrapper = new LambdaQueryWrapper<>();
// List<User> users = randomSelectFromAllUser(userMapper.selectList(UserQueryWrapper), lastNum);
// for (User user : users) {
// UserVo userVo = new UserVo();
// userVo.setUsername(user.getUsername());
// userVo.setJwcode(user.getJwcode());
// userVoList.add(userVo);
// }
// return userVoList;
// }
//
// if (startLotteryDto.getPerWin() <= userDetails.size()) {
// //抽取人数小于等于内定人数从内定人数中随机抽取
// List<UserDetail> winners = randomSelectFixUser(userDetails, startLotteryDto.getPerWin());
//
// List<UserVo> userVoList = new ArrayList<>();
// // 遍历所有中奖用户
// for (UserDetail userDetail : winners) {
// // 关联查询user表获取详细信息
// User user = userMapper.selectById(userDetail.getUserId());
//
// // 检查用户是否存在
// if (user == null) {
// throw new SomeException("未找到用户ID:" + userDetail.getUserId());
// }
//
// // 创建UserVo对象并添加到结果列表
// UserVo userVo = new UserVo();
// userVo.setUsername(user.getUsername());
// userVo.setJwcode(user.getJwcode());
// userVoList.add(userVo);
// }
// return userVoList;
// }
// return new ArrayList<>();
// }
@Override
public void StartLottery(StartLotteryDto startLotteryDto) {
public List<UserVo> StartLottery(StartLotteryDto startLotteryDto) {
// 1. 获取年级ID
Long gradeId = gradeMapper.selectByName(startLotteryDto.getGradeName());
if (gradeId == null) {
throw new SomeException("未找到指定等级:" + startLotteryDto.getGradeName());
}
LambdaQueryWrapper<UserDetail> userDetailLambdaQueryWrapper = new LambdaQueryWrapper<>();
userDetailLambdaQueryWrapper
.eq(UserDetail::getGradeId, gradeId)
// 2. 查询该年级下所有内定人员
LambdaQueryWrapper<UserDetail> userDetailWrapper = new LambdaQueryWrapper<>();
userDetailWrapper.eq(UserDetail::getGradeId, gradeId)
.eq(UserDetail::getIsFixed, 1);
List<UserDetail> fixedUsers = userDetailMapper.selectList(userDetailWrapper);
// 3. 准备中奖用户结果集
List<UserVo> winners = new ArrayList<>();
int requiredWinners = startLotteryDto.getPerWin();
//该等级下的内定人员
List<UserDetail> userDetails = userDetailMapper.selectList(userDetailLambdaQueryWrapper);
// 4. 先处理内定用户过滤掉已中奖的
List<User> availableFixedUsers = getAvailableFixedUsers(fixedUsers);
int fixedWinnersCount = Math.min(availableFixedUsers.size(), requiredWinners);
if (userDetails.isEmpty()) {
System.out.println("无内定");
//从user表中抽取
if (fixedWinnersCount > 0) { //证明该等级下的内定用户还有没中奖的先从内定用户抽取
List<User> fixedWinners = randomSelectUsers(availableFixedUsers, fixedWinnersCount);
winners.addAll(convertToUserVoList(fixedWinners));
markUsersAsWinners(fixedWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面
}
if (startLotteryDto.getPerWin() > userDetails.size()) {
//抽取人数大于内定人数所有内定人员均中奖剩余的从总的user表抽取
List<UserVo> userVoList = new ArrayList<>();
//内定中奖的
for (UserDetail userDetail : userDetails) {
User user = userMapper.selectById(userDetail.getUserId());
if (user == null) {
throw new SomeException("未找到用户ID:" + userDetail.getUserId());
}
UserVo userVo = new UserVo();
userVo.setUsername(user.getUsername());
userVo.setJwcode(user.getJwcode());
userVoList.add(userVo);
}
//总中奖人数 - 内定人数 = 剩余从总用户表中抽取
int lastNum = startLotteryDto.getPerWin() - userVoList.size();
LambdaQueryWrapper<User> UserQueryWrapper = new LambdaQueryWrapper<>();
List<User> users = randomSelectFromAll(userMapper.selectList(UserQueryWrapper), lastNum);
for (User user : users) {
UserVo userVo = new UserVo();
userVo.setUsername(user.getUsername());
userVo.setJwcode(user.getJwcode());
}
// 5. 如果人数不足从全体用户补充同样过滤掉已中奖的
if (winners.size() < requiredWinners) {
int remaining = requiredWinners - winners.size();
List<User> allAvailableUsers = getAllAvailableUsers();
List<User> supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size()));
winners.addAll(convertToUserVoList(supplementWinners));
markUsersAsWinners(supplementWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面
}
return winners;
}
if (startLotteryDto.getPerWin() <= userDetails.size()) {
//抽取人数小于等于内定人数从内定人数中随机抽取
List<UserDetail> winners = randomSelect(userDetails, startLotteryDto.getPerWin());
List<UserVo> userVoList = new ArrayList<>();
// 遍历所有中奖用户
for (UserDetail userDetail : winners) {
// 关联查询user表获取详细信息
User user = userMapper.selectById(userDetail.getUserId());
// 检查用户是否存在
if (user == null) {
throw new SomeException("未找到用户ID:" + userDetail.getUserId());
}
// 创建UserVo对象并添加到结果列表
UserVo userVo = new UserVo();
userVo.setUsername(user.getUsername());
userVo.setJwcode(user.getJwcode());
userVoList.add(userVo);
// 获取可用的内定用户未中奖的
private List<User> getAvailableFixedUsers(List<UserDetail> fixedUsers) {
List<User> availableUsers = new ArrayList<>();
for (UserDetail userDetail : fixedUsers) {
User user = userMapper.selectById(userDetail.getUserId());
if (user != null && user.getIsWin() == 0) { // 0表示未中奖
availableUsers.add(user);
}
}
return availableUsers;
}
// 随机选择指定数量的用户(内定名单中)
private List<UserDetail> randomSelect(List<UserDetail> users, int count) {
List<UserDetail> shuffled = new ArrayList<>(users); // 避免修改原集合
Collections.shuffle(shuffled); // 随机打乱顺序
return shuffled.subList(0, count); // 取前N个
// 获取全体可用用户未中奖的
private List<User> getAllAvailableUsers() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getIsWin, 0); // 只查询未中奖的
return userMapper.selectList(wrapper);
}
// 随机选择指定数量的用户(总名单中)
private List<User> randomSelectFromAll(List<User> user, int count) {
List<User> shuffled = new ArrayList<>(user); // 避免修改原集合
Collections.shuffle(shuffled); // 随机打乱顺序
return shuffled.subList(0, count); // 取前N个
// 随机选择用户
private List<User> randomSelectUsers(List<User> users, int count) {
if (users.size() <= count) {
return new ArrayList<>(users);
}
Collections.shuffle(users);
return users.subList(0, count);
}
// 转换为UserVo列表
private List<UserVo> convertToUserVoList(List<User> users) {
List<UserVo> result = new ArrayList<>();
for (User user : users) {
UserVo vo = new UserVo();
vo.setUsername(user.getUsername());
vo.setJwcode(user.getJwcode());
result.add(vo);
}
return result;
}
// 标记用户为中奖状态
private void markUsersAsWinners(List<User> winners, StartLotteryDto startLotteryDto) {
for (User user : winners) {
user.setIsWin(1); // 1表示已中奖
//把中奖的用户添加到中奖表里面
// WinnerRecord winnerRecord = new WinnerRecord();
// winnerRecord.setUserId(user.getId());
WinnerRecord winnerRecord = WinnerRecord.builder()
.userId(user.getId())
.winTime(new Date())
.prizeId(adminPrizeMapper.selectByName(startLotteryDto.getPrizeName())).build();
adminWinMapper.insert(winnerRecord);
userMapper.updateById(user);
}
}
// // 随机选择指定数量的用户(内定名单中)
// private List<UserDetail> randomSelectFixUser(List<UserDetail> users, int count) {
// List<UserDetail> shuffled = new ArrayList<>(users); // 避免修改原集合
// Collections.shuffle(shuffled); // 随机打乱顺序
// return shuffled.subList(0, count); // 取前N个
// }
//
// // 随机选择指定数量的用户(总名单中)
// private List<User> randomSelectFromAllUser(List<User> user, int count) {
// List<User> shuffled = new ArrayList<>(user); // 避免修改原集合
// Collections.shuffle(shuffled); // 随机打乱顺序
// return shuffled.subList(0, count); // 取前N个
// }
}

5
lottery-system/lottery-service/src/main/resources/mapper/admin/AdminWinMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lottery.admin.mapper.AdminWinMapper">
</mapper>

34
lottery-system/lottery-service/src/main/resources/mapper/admin/winMapper.xml

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lottery.admin.mapper.IWinMapper">
<select id="selectWinRecordsByConditions" parameterType="map" resultType="map">
SELECT
wr.id AS record_id,
u.username,
u.jwcode,
p.name,
g.name,
wr.win_time
FROM
winning_record as wr
JOIN
user u ON wr.user_id = u.id
JOIN
prize p ON wr.prize_id = p.id
JOIN
grade g ON p.grade_id = g.id
WHERE
1=1
<if test="username != null and username != ''">
AND u.username = #{username}
</if>
<if test="jwcode != null and jwcode != ''">
AND u.jwcode = #{jwcode}
</if>
<if test="gradeName != null and gradeName != ''">
AND g.name = #{gradeName}
</if>
</select>
</mapper>
Loading…
Cancel
Save