diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserQueryDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserQueryDto.java new file mode 100644 index 0000000..92e8a51 --- /dev/null +++ b/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; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java index f636085..7d84224 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/User.java @@ -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; // 更新时间 } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java index 6e95e09..8b38adc 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/WinnerRecord.java +++ b/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; // 领取时间 } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/WinUserVo.java new file mode 100644 index 0000000..2065e46 --- /dev/null +++ b/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; // 中奖时间; +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java index 2f239d4..72c32cf 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java +++ b/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> 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 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 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()); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java index af63738..f83f5d5 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java @@ -28,7 +28,7 @@ public class AdminPrizeController { private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class); - @GetMapping("list") + @PostMapping("list") public Result> 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 selectById(@RequestParam Long id) { + LOGGER.info("根据id查询奖品:{}",id); return Result.success(adminPrizeService.getPrizeById(id)); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminWInController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminWInController.java new file mode 100644 index 0000000..9efbf56 --- /dev/null +++ b/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: 2025−07-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> WInController(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize, + @RequestBody WinUserQueryDto winUserQueryDto) { + LOGGER.info("分页查询所有中奖用户"); + return Result.success(adminWinService.listWinUser(pageNum, pageSize, winUserQueryDto)); + } + +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/WInController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/WInController.java deleted file mode 100644 index 1e1de1e..0000000 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/WInController.java +++ /dev/null @@ -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: 2025−07-12 17:18 - * @Version 1.0 - **/ -@Controller -@RequestMapping("/admin/win") -public class WInController { - - @Autowired - private IWinService iWinService; - - @GetMapping("/search") - public Result>> searchWinRecords( - @RequestParam(required = false) String username, - @RequestParam(required = false) String jwcode, - @RequestParam(required = false) String gradeName) { - - List> winRecords = iWinService.getWinRecordsByConditions(username, jwcode, gradeName); - return Result.success(winRecords); - } - -} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java index 02a4704..a00edfa 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java +++ b/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 { Page pageListPrize(Page page, LambdaQueryWrapper prizeLambdaQueryWrapper); + + @Select("select id from prize where grade_name = #{prizeName}") + Long selectByName(String prizeName); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IWinMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminWinMapper.java similarity index 63% rename from lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IWinMapper.java rename to lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminWinMapper.java index 9307054..2ff45ea 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/IWinMapper.java +++ b/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 { - - List> selectWinRecordsByConditions(Map params); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java new file mode 100644 index 0000000..adb1a91 --- /dev/null +++ b/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: 2025−07-12 17:20 + * @Version 1.0 + **/ + +public interface AdminWinService extends IService { + + PageInfo listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto); +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IWinService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IWinService.java deleted file mode 100644 index 74de8a6..0000000 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/IWinService.java +++ /dev/null @@ -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: 2025−07-12 17:20 - * @Version 1.0 - **/ - -public interface IWinService { - - List> getWinRecordsByConditions(String username, String jwcode, String gradeName); -} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java index 988be9a..5833204 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java @@ -93,13 +93,45 @@ public class AdminPrizeServiceImpl extends ServiceImpl String gradeName = prizeDto.getGradeName(); Grade grade = adminGradeMapper.selectByName(gradeName); - LambdaQueryWrapper 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 wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Prize::getGradeId, targetGrade.getId()); + if (this.count(wrapper) > 0) { + return false; // 目标等级已有奖品,不能修改 + } + } + + // 4. 检查奖品名称是否重复(排除自己) + LambdaQueryWrapper nameCheckWrapper = new LambdaQueryWrapper<>(); + nameCheckWrapper.eq(Prize::getPrizeName, prizeDto.getPrizeName()) + .ne(Prize::getId, prizeDto.getId()); + if (this.count(nameCheckWrapper) > 0) { + return false; // 奖品名称已存在 + } + + +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(Prize::getGradeId, grade.getId()); +// 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()); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java index 092b83d..9b4e91f 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java @@ -57,7 +57,7 @@ public class AdminUserServiceImpl extends ServiceImpl imp Map 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"; diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java new file mode 100644 index 0000000..60f21de --- /dev/null +++ b/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: 2025−07-12 17:20 + * @Version 1.0 + **/ +@Service +public class AdminWinServiceImpl extends ServiceImpl implements AdminWinService { + + @Autowired + private AdminWinMapper adminWinMapper; + + @Autowired + private AdminUserService adminUserService; + + @Autowired + private AdminGradeService adminGradeService; + + @Autowired + private AdminPrizeService adminPrizeService; + + @Override + public PageInfo listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto) { + // 1. 创建分页对象(直接查询WinnerRecord表) + Page page = new Page<>(pageNum, pageSize); + + // 2. 构建查询条件 + LambdaQueryWrapper 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 recordPage = adminWinMapper.selectPage(page, recordWrapper); + + // 4. 批量获取关联数据(优化性能) + List userIds = recordPage.getRecords().stream() + .map(WinnerRecord::getUserId) + .collect(Collectors.toList()); + List prizeIds = recordPage.getRecords().stream() + .map(WinnerRecord::getPrizeId) + .distinct() + .collect(Collectors.toList()); + + // 4.1 查询用户基本信息 + Map userMap = adminUserService.listByIds(userIds).stream() + .collect(Collectors.toMap(User::getId, u -> u)); + + // 4.2 查询奖品及对应等级信息 + Map prizeMap = adminPrizeService.listByIds(prizeIds).stream() + .collect(Collectors.toMap(Prize::getId, p -> p)); + + List gradeIds = prizeMap.values().stream() + .map(Prize::getGradeId) + .collect(Collectors.toList()); + Map gradeMap = adminGradeService.listByIds(gradeIds).stream() + .collect(Collectors.toMap(Grade::getId, g -> g)); + + // 5. 转换为VO + List 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 userPage = this.adminUserMapper.selectPage(page, queryWrapper); +// List userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class); +// return PageInfo.of(userPage, userVolist); + } +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/IWinServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/IWinServiceImpl.java deleted file mode 100644 index c7425bc..0000000 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/IWinServiceImpl.java +++ /dev/null @@ -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: 2025−07-12 17:20 - * @Version 1.0 - **/ -@Service -public class IWinServiceImpl implements IWinService { - - @Autowired - private IWinMapper iWinMapper; - - @Override - public List> getWinRecordsByConditions(String username, String jwcode, String gradeName) { - // 如果所有条件都为空,可以返回空列表或抛出异常,避免全表扫描 - if (username == null && jwcode == null && gradeName == null) { - return Collections.emptyList(); // 或者抛出异常 - } - - Map params = new HashMap<>(); - params.put("username", username); - params.put("jwcode", jwcode); - params.put("gradeName", gradeName); - - return iWinMapper.selectWinRecordsByConditions(params); - } -} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java index f462ef4..b757b3a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java +++ b/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 StartLottery(@RequestBody StartLotteryDto startLotteryDto){ + @GetMapping("/start") + public Result> 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 userVos = userDetailService.StartLottery(startLotteryDto); + return Result.success(userVos); } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/PrizeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/PrizeController.java index 729ad00..93c359a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/PrizeController.java +++ b/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> getAllPrizeAnd(){ LOGGER.info("查询所有礼品和对应等级,按照sort值排序"); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java index 171a666..7df5256 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java @@ -67,7 +67,7 @@ public class UserController { return Result.success(userLoginVo); } - @GetMapping("/list") + @PostMapping("/list") public Result> getAllUser(){ LOGGER.info("查询所有用户"); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java index 104ca29..1be1636 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java +++ b/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 { - void StartLottery(StartLotteryDto startLotteryDto); + List StartLottery(StartLotteryDto startLotteryDto); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java index 3848f95..945b0c7 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java @@ -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 StartLottery(StartLotteryDto startLotteryDto) { +// +// Long gradeId = gradeMapper.selectByName(startLotteryDto.getGradeName()); +// if (gradeId == null) { +// throw new SomeException("未找到指定等级:" + startLotteryDto.getGradeName()); +// } +// +// LambdaQueryWrapper userDetailLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// userDetailLambdaQueryWrapper +// .eq(UserDetail::getGradeId, gradeId) +// .eq(UserDetail::getIsFixed, 1); +// +// //该等级下的所有内定人员 +// List userDetails = userDetailMapper.selectList(userDetailLambdaQueryWrapper); +// +// if (userDetails.isEmpty()) { +// System.out.println("无内定"); +// +// //从user表中随机抽取startLotteryDto.getPerWin()人 +// LambdaQueryWrapper UserQueryWrapper = new LambdaQueryWrapper<>(); +// List users = randomSelectFromAllUser(userMapper.selectList(UserQueryWrapper), startLotteryDto.getPerWin()); +// +// List userVos = ConvertBeanUtil.convertList(users, UserVo.class); +// return userVos; +// } +// +// if (startLotteryDto.getPerWin() > userDetails.size()) { +// //抽取人数大于内定人数,所有内定人员均中奖,剩余的从总的user表抽取 +// List 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 UserQueryWrapper = new LambdaQueryWrapper<>(); +// List 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 winners = randomSelectFixUser(userDetails, startLotteryDto.getPerWin()); +// +// List 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 StartLottery(StartLotteryDto startLotteryDto) { + // 1. 获取年级ID Long gradeId = gradeMapper.selectByName(startLotteryDto.getGradeName()); if (gradeId == null) { throw new SomeException("未找到指定等级:" + startLotteryDto.getGradeName()); } - LambdaQueryWrapper userDetailLambdaQueryWrapper = new LambdaQueryWrapper<>(); - userDetailLambdaQueryWrapper - .eq(UserDetail::getGradeId, gradeId) + // 2. 查询该年级下所有内定人员 + LambdaQueryWrapper userDetailWrapper = new LambdaQueryWrapper<>(); + userDetailWrapper.eq(UserDetail::getGradeId, gradeId) .eq(UserDetail::getIsFixed, 1); + List fixedUsers = userDetailMapper.selectList(userDetailWrapper); + + // 3. 准备中奖用户结果集 + List winners = new ArrayList<>(); + int requiredWinners = startLotteryDto.getPerWin(); - //该等级下的内定人员 - List userDetails = userDetailMapper.selectList(userDetailLambdaQueryWrapper); + // 4. 先处理内定用户(过滤掉已中奖的) + List availableFixedUsers = getAvailableFixedUsers(fixedUsers); + int fixedWinnersCount = Math.min(availableFixedUsers.size(), requiredWinners); - if (userDetails.isEmpty()) { - System.out.println("无内定"); - //从user表中抽取 + if (fixedWinnersCount > 0) { //证明该等级下的内定用户还有没中奖的,先从内定用户抽取 + List fixedWinners = randomSelectUsers(availableFixedUsers, fixedWinnersCount); + winners.addAll(convertToUserVoList(fixedWinners)); + markUsersAsWinners(fixedWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面 } - if (startLotteryDto.getPerWin() > userDetails.size()) { - //抽取人数大于内定人数,所有内定人员均中奖,剩余的从总的user表抽取 - - List 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 UserQueryWrapper = new LambdaQueryWrapper<>(); - List 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 allAvailableUsers = getAllAvailableUsers(); + List supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size())); + winners.addAll(convertToUserVoList(supplementWinners)); + markUsersAsWinners(supplementWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面 } + return winners; + } - if (startLotteryDto.getPerWin() <= userDetails.size()) { - //抽取人数小于等于内定人数,从内定人数中随机抽取 - List winners = randomSelect(userDetails, startLotteryDto.getPerWin()); - - List 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 getAvailableFixedUsers(List fixedUsers) { + List 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 randomSelect(List users, int count) { - List shuffled = new ArrayList<>(users); // 避免修改原集合 - Collections.shuffle(shuffled); // 随机打乱顺序 - return shuffled.subList(0, count); // 取前N个 + + // 获取全体可用用户(未中奖的) + private List getAllAvailableUsers() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getIsWin, 0); // 只查询未中奖的 + return userMapper.selectList(wrapper); } - // 随机选择指定数量的用户(总名单中) - private List randomSelectFromAll(List user, int count) { - List shuffled = new ArrayList<>(user); // 避免修改原集合 - Collections.shuffle(shuffled); // 随机打乱顺序 - return shuffled.subList(0, count); // 取前N个 + // 随机选择用户 + private List randomSelectUsers(List users, int count) { + if (users.size() <= count) { + return new ArrayList<>(users); + } + Collections.shuffle(users); + return users.subList(0, count); + } + + // 转换为UserVo列表 + private List convertToUserVoList(List users) { + List 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 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 randomSelectFixUser(List users, int count) { +// List shuffled = new ArrayList<>(users); // 避免修改原集合 +// Collections.shuffle(shuffled); // 随机打乱顺序 +// return shuffled.subList(0, count); // 取前N个 +// } +// +// // 随机选择指定数量的用户(总名单中) +// private List randomSelectFromAllUser(List user, int count) { +// List shuffled = new ArrayList<>(user); // 避免修改原集合 +// Collections.shuffle(shuffled); // 随机打乱顺序 +// return shuffled.subList(0, count); // 取前N个 +// } } diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminWinMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminWinMapper.xml new file mode 100644 index 0000000..5c1ae73 --- /dev/null +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminWinMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/winMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/winMapper.xml deleted file mode 100644 index a50d813..0000000 --- a/lottery-system/lottery-service/src/main/resources/mapper/admin/winMapper.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - \ No newline at end of file