diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java index 45c6c84..87f3983 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java @@ -17,5 +17,5 @@ public class FixUserDto { private String jwcode; - private String GradeName; + private Long GradeId; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java index 2ad9d87..b0b1706 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java @@ -21,7 +21,7 @@ public class PrizeDto { private String prizeName; - private String gradeName; + private Long gradeId; private String imageUrl; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/StartLotteryDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/StartLotteryDto.java index 6459937..6c32edd 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/StartLotteryDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/StartLotteryDto.java @@ -14,7 +14,13 @@ import lombok.Data; public class StartLotteryDto { private int perWin; - private String gradeName; + private Long gradeId; - private String PrizeName; + private Long PrizeId; + + private int remainNum; + +// private String gradeName; + +// private String prizeName; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java index 108e4a9..3730ceb 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java @@ -16,4 +16,8 @@ public class UserQueryDto { private String username; private String jwcode; + + private Integer pageNum; + + private Integer pageSize; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserExportDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserExportDto.java new file mode 100644 index 0000000..5ae78c4 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/WinUserExportDto.java @@ -0,0 +1,31 @@ +package com.lottery.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import lombok.Data; + +import java.util.Date; + +@Data +public class WinUserExportDto { + + @ExcelProperty("序号") + private int index; + + @ExcelProperty("姓名") + private String username; + + @ExcelProperty("精网号") + private String jwcode; + + @ExcelProperty("中奖等级") + private String GradeName; + + @ExcelProperty("所中礼品") + private String prizeName; + + @ExcelProperty("中奖时间") + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") + private Date winTime; + +} \ No newline at end of file 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 index 92e8a51..3310b32 100644 --- 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 @@ -2,6 +2,8 @@ package com.lottery.dto; import lombok.Data; +import javax.persistence.criteria.CriteriaBuilder; + /** * @program: lottery * @ClassName WinUserQuertDto @@ -14,7 +16,11 @@ import lombok.Data; public class WinUserQueryDto { private String username; - private String jwcode; + private String jwcode; + + private Long gradeId; + + private Integer pageNum; - private String gradeName; + private Integer pageSize; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java index cde609b..e240cdd 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java @@ -27,14 +27,17 @@ public class Grade { @TableId(type = IdType.AUTO) // 主键自增策略 private Long id; - private String GradeName; // 等级名称 + private String gradeName; // 等级名称 private int amount; //等级数量 private int sort; @TableField("per_win") - private int perWin; + private int perWin; //每轮抽取人数 + + @TableField("remain_num") + private int remainNum; @TableField(value = "create_time", fill = FieldFill.INSERT) // 自动填充创建时间 private Date createTime; 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 8b38adc..89ecb0d 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 @@ -11,6 +11,7 @@ package com.lottery.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -32,6 +33,7 @@ public class WinnerRecord { private Long prizeId; // 奖品ID + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date winTime; // 中奖时间 } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeSimpleVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeSimpleVo.java new file mode 100644 index 0000000..f5061cb --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeSimpleVo.java @@ -0,0 +1,18 @@ +package com.lottery.vo; + +import lombok.Data; + +/** + * @program: lottery + * @ClassName GradeSimpleVo + * @description: + * @author: wwl + * @create: 2025-07-19 11:50 + * @Version 1.0 + **/ +@Data +public class GradeSimpleVo { + + private String gradeName; + private int id; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java index 6cf4238..39a243d 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java @@ -17,7 +17,7 @@ import java.util.Date; @Data public class GradeVo { -// private Long id; + private Long id; private String GradeName; // 等级名称 diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LotteryVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LotteryVo.java new file mode 100644 index 0000000..cd559db --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/LotteryVo.java @@ -0,0 +1,21 @@ +package com.lottery.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @program: lottery + * @ClassName lotteryVo + * @description: + * @author: wwl + * @create: 2025-07-19 10:45 + * @Version 1.0 + **/ + +@Data +public class LotteryVo { + + private List data; // 只包含jwcode和username + private Boolean round; // 整体是否还有下一轮 +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeAndGradeVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeAndGradeVo.java index 9079d77..f1b7f74 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeAndGradeVo.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeAndGradeVo.java @@ -23,4 +23,16 @@ public class PrizeAndGradeVo { private int perWin; + private int remainNum; + + private int gradeId; + + private int prizeId; + +// private Integer isRound; +// +// private Integer currentRound; + + // 总轮次 + } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java index 13ea326..0e55cc1 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java @@ -16,7 +16,7 @@ import java.util.Date; @Data public class PrizeVo { -// private Long id; + private Long id; private String PrizeName; diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/UserVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/UserVo.java index 2b861c6..6c8e742 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/UserVo.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/UserVo.java @@ -13,6 +13,7 @@ import lombok.Data; @Data public class UserVo { + private Long id; private String jwcode; private String username; } 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 index 2065e46..5525c80 100644 --- 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 @@ -1,5 +1,6 @@ package com.lottery.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; @@ -16,6 +17,8 @@ import java.util.Date; @Data public class WinUserVo { + private Long id; + private String username; private String jwcode; @@ -24,5 +27,7 @@ public class WinUserVo { private String prizeName; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date winTime; // 中奖时间; } diff --git a/lottery-system/lottery-service/pom.xml b/lottery-system/lottery-service/pom.xml index 6236cb6..c72b15a 100644 --- a/lottery-system/lottery-service/pom.xml +++ b/lottery-system/lottery-service/pom.xml @@ -30,6 +30,12 @@ lottery-common 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-data-jpa + + com.alibaba easyexcel 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 3a592b9..89daef9 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 @@ -8,6 +8,7 @@ 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.GradeSimpleVo; import com.lottery.vo.GradeVo; import com.lottery.vo.PageInfo; import org.slf4j.Logger; @@ -57,12 +58,11 @@ public class AdminGradeController { } @PostMapping("/allGradeName") - public Result> selectAllGrade(){ - //TODo 按照grade的sort返回 + public Result> selectAllGrade(){ + LOGGER.info("查询所有等级,仅反等级名和id,为了下拉框"); return Result.success(adminGradeService.selectAllGrade()); } - @PostMapping("/add") public Result add(@RequestBody GradeDto gradeDto){ @@ -78,17 +78,11 @@ public class AdminGradeController { return Result.failure("等级已存在,新增失败"); } - Grade grade = ConvertBeanUtil.convert(gradeDto, Grade.class); - - grade.setCreateTime(new Date()); - grade.setUpdateTime(new Date()); - - if (!adminGradeService.save(grade)) return Result.failure("新增失败"); + if (!adminGradeService.saveGrade(gradeDto)) return Result.failure("新增失败"); return Result.success(); } - @PostMapping("/update") public Result update(@RequestBody GradeDto gradeDto){ @@ -102,6 +96,12 @@ public class AdminGradeController { return Result.failure("修改的id不存在"); } + 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.setUpdateTime(new Date()); @@ -109,7 +109,6 @@ public class AdminGradeController { return Result.success(); } - @PostMapping("/delete") public Result delete(@RequestParam Long id){ LOGGER.info("删除id为:{} 的等级" ,id); @@ -118,5 +117,4 @@ public class AdminGradeController { } return Result.success(); } - } 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 227071c..76f1ce3 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 @@ -47,7 +47,7 @@ public class AdminPrizeController { public Result addPrize(@RequestBody PrizeDto prizeDto) { LOGGER.info("新增奖品:{}", prizeDto); if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null|| - prizeDto.getGradeName() == null) { + prizeDto.getGradeId() == null) { return Result.failure("所有字段都必须填写"); } if(!adminPrizeService.add(prizeDto)){ @@ -61,7 +61,7 @@ public class AdminPrizeController { public Result updatePrize(@RequestBody PrizeDto prizeDto) { LOGGER.info("修改奖品信息:{}",prizeDto); if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null|| - prizeDto.getGradeName() == null) { + prizeDto.getGradeId() == null) { return Result.failure("所有字段都必须填写"); } @@ -86,6 +86,7 @@ public class AdminPrizeController { return Result.success(); } + //新增内定 @PostMapping("/addFixUser") public Result addWinUser(@RequestBody FixUserDto fixUserDto) { diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java index 6cf8dd7..7adb143 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java @@ -57,11 +57,15 @@ public class AdminUserController { } @PostMapping("/list") - public Result> getAllUser(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize, - @RequestBody UserQueryDto userQueryDto ){ + public Result> getAllUser(@RequestBody UserQueryDto userQueryDto ){ LOGGER.info("分页查询所有用户"); - - return Result.success(adminUserService.listUser(pageNum,pageSize,userQueryDto)); + if (userQueryDto.getPageNum() == null) { + userQueryDto.setPageNum(1); + } + if (userQueryDto.getPageSize() == null) { + userQueryDto.setPageSize(10); + } + return Result.success(adminUserService.listUser(userQueryDto.getPageNum(), userQueryDto.getPageSize(), userQueryDto)); } @@ -108,10 +112,15 @@ public class AdminUserController { @PostMapping("/list/fix") - public Result> getAllFixUser(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize, - @RequestBody UserQueryDto userQueryDto ){ + public Result> getAllFixUser(@RequestBody UserQueryDto userQueryDto){ LOGGER.info("分页查询所有内定用户"); - return Result.success(adminUserDetailService.listFixUser(pageNum,pageSize,userQueryDto)); + if (userQueryDto.getPageNum() == null) { + userQueryDto.setPageNum(1); + } + if (userQueryDto.getPageSize() == null) { + userQueryDto.setPageSize(10); + } + return Result.success(adminUserDetailService.listFixUser(userQueryDto.getPageNum(),userQueryDto.getPageSize(),userQueryDto)); } @@ -134,7 +143,7 @@ public class AdminUserController { //TODO 导入有点问题 @PostMapping("/import/fix") - public Result importFixUsers(@RequestParam("file") MultipartFile file, @RequestParam String gradeName) { + public Result importFixUsers(@RequestParam("file") MultipartFile file, @RequestParam Long gradeId) { LOGGER.info("开始导入内定用户Excel文件: {}", file.getOriginalFilename()); // 1. 基本文件校验 @@ -146,7 +155,7 @@ public class AdminUserController { if (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls")) { return Result.failure("仅支持Excel文件(.xlsx, .xls)"); } - return adminUserDetailService.importUsers(file,gradeName); + return adminUserDetailService.importFixUsers(file,gradeId); } } 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 index 9a62d11..2b2a748 100644 --- 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 @@ -36,10 +36,16 @@ public class AdminWInController { @PostMapping("/list") - public Result> WInController(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize, - @RequestBody WinUserQueryDto winUserQueryDto) { + public Result> WInController(@RequestBody WinUserQueryDto winUserQueryDto) { LOGGER.info("分页查询所有中奖用户"); - return Result.success(adminWinService.listWinUser(pageNum, pageSize, winUserQueryDto)); + + if (winUserQueryDto.getPageNum() == null) { + winUserQueryDto.setPageNum(1); + } + if (winUserQueryDto.getPageSize() == null) { + winUserQueryDto.setPageSize(10); + } + return Result.success(adminWinService.listWinUser(winUserQueryDto.getPageNum(), winUserQueryDto.getPageSize(), winUserQueryDto)); } @@ -48,6 +54,4 @@ public class AdminWInController { log.info("导出中奖用户数据"); adminWinService.exportWinUser(winUserQueryDto, response); } - - } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java index 0e5e15d..0cd104f 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java @@ -2,6 +2,7 @@ package com.lottery.admin.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lottery.entity.Grade; +import com.lottery.vo.GradeSimpleVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; @@ -22,6 +23,6 @@ public interface AdminGradeMapper extends BaseMapper { @Select("select * from grade where grade_name = #{gradeName}") Grade selectByName(String gradeName); - @Select("select grade_name from grade order by sort desc ") - List selectAllGrade(); + @Select("select grade_name, id from grade order by sort desc ") + List selectAllGrade(); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminGradeService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminGradeService.java index a66b7e4..0a65ea4 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminGradeService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminGradeService.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.lottery.dto.GradeDto; import com.lottery.entity.Grade; +import com.lottery.vo.GradeSimpleVo; import com.lottery.vo.GradeVo; import com.lottery.vo.PageInfo; import org.springframework.stereotype.Service; @@ -27,7 +28,11 @@ import java.util.List; public interface AdminGradeService extends IService { PageInfo pageSelectGrade(Integer pageNum, Integer pageSize); - List selectAllGrade(); + List selectAllGrade(); + + boolean saveGrade(GradeDto gradeDto); + +// boolean updateGradeById(GradeDto GradeDto); // boolean updateGrade(GradeDto gradeDto); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java index cf67720..17ff9e6 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java @@ -21,5 +21,5 @@ import org.springframework.web.multipart.MultipartFile; public interface AdminUserDetailService extends IService { PageInfo listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto); - Result importUsers(MultipartFile file, String gradeName); + Result importFixUsers(MultipartFile file, Long gradeId); } 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 index 84ba50a..9cf50ae 100644 --- 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 @@ -7,6 +7,7 @@ import com.lottery.vo.PageInfo; import com.lottery.vo.WinUserVo; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Map; @@ -24,5 +25,5 @@ public interface AdminWinService extends IService { PageInfo listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto); - void exportWinUser(WinUserQueryDto winUserQueryDto, HttpServletResponse response) throws UnsupportedEncodingException; + void exportWinUser(WinUserQueryDto winUserQueryDto, HttpServletResponse response) throws IOException; } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java index 884dd22..942cc6e 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java @@ -11,6 +11,7 @@ import com.lottery.entity.Grade; import com.lottery.exception.SomeException; import com.lottery.result.Result; import com.lottery.utils.ConvertBeanUtil; +import com.lottery.vo.GradeSimpleVo; import com.lottery.vo.GradeVo; import com.lottery.vo.PageInfo; import org.springframework.beans.factory.annotation.Autowired; @@ -59,9 +60,23 @@ public class AdminGradeServiceImpl extends ServiceImpl } @Override - public List selectAllGrade() { + public List selectAllGrade() { // List GradeNameList = new ArrayList<>(); - return adminGradeMapper.selectAllGrade(); + List gradeSimpleVos = adminGradeMapper.selectAllGrade(); + return gradeSimpleVos; + } + + @Override + public boolean saveGrade(GradeDto gradeDto) { + Grade grade = ConvertBeanUtil.convert(gradeDto, Grade.class); + + grade.setRemainNum(gradeDto.getAmount()); + grade.setCreateTime(new Date()); + grade.setUpdateTime(new Date()); + if (this.save(grade)){ + return true; + }; + return false; } // @Autowired 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 66f64ad..7c1e1fb 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 @@ -60,8 +60,8 @@ public class AdminPrizeServiceImpl extends ServiceImpl @Override public boolean add(PrizeDto prizeDto) { - String gradeName = prizeDto.getGradeName(); - Grade grade = adminGradeMapper.selectByName(gradeName); + Long gradeId = prizeDto.getGradeId(); + Grade grade = adminGradeMapper.selectById(gradeId); // if (grade == null) { //// return Result.failure("等级不存在"); // throw new SomeException("heheh"); @@ -85,15 +85,13 @@ public class AdminPrizeServiceImpl extends ServiceImpl .build(); return this.save(prize); - } @Override public boolean updatePrize(PrizeDto prizeDto) { - String gradeName = prizeDto.getGradeName(); - Grade grade = adminGradeMapper.selectByName(gradeName); + Long gradeId = prizeDto.getGradeId(); + Grade grade = adminGradeMapper.selectById(gradeId); - //TODO 修改自己的等奖会失败 // 2. 检查是否是修改现有奖品(需要传入prizeId) // 1. 查询原奖品信息 Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId()); @@ -102,7 +100,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl } // 2. 查询目标等级信息 - Grade targetGrade = adminGradeMapper.selectByName(prizeDto.getGradeName()); + Grade targetGrade = adminGradeMapper.selectById(gradeId); if (targetGrade == null) { return false; // 目标等级不存在 } @@ -124,7 +122,6 @@ public class AdminPrizeServiceImpl extends ServiceImpl return false; // 奖品名称已存在 } - // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(Prize::getGradeId, grade.getId()); // if (this.count(wrapper) > 0) { @@ -167,8 +164,8 @@ public class AdminPrizeServiceImpl extends ServiceImpl adminUserMapper.insert(user); //不存在,插入总表 } - Grade grade = adminGradeMapper.selectByName(fixUserDto.getGradeName()); - Long gradeId = grade.getId(); +// Grade grade = adminGradeMapper.selectByName(fixUserDto.getGradeName()); + Long gradeId = fixUserDto.getGradeId(); Long userIdd = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java index 33bffa1..efc13ee 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java @@ -84,7 +84,7 @@ public class AdminUserDetailServiceImpl extends ServiceImpl userDtos = EasyExcel.read(file.getInputStream()) @@ -92,29 +92,33 @@ public class AdminUserDetailServiceImpl extends ServiceImpl existingCodes = adminUserMapper.selectAllUserCodes(); - List users = new ArrayList<>(); + // 2. 准备数据集合 + List newUsers = new ArrayList<>(); // 新用户(需要插入user表) + List existingUsers = new ArrayList<>(); // 已存在用户(从数据库查询) List userDetails = new ArrayList<>(); Set processedCodes = new HashSet<>(); int successCount = 0; int skipCount = 0; + // 3. 查询所有已存在的jwcode + Set existingCodes = adminUserMapper.selectAllUserCodes(); + for (int i = 0; i < userDtos.size(); i++) { UserImportDto dto = userDtos.get(i); try { - validateUser(dto, i + 2, existingCodes, processedCodes); - - // 转换User实体 - User user = convertToEntity(dto); - users.add(user); - - // 生成UserDetail - UserDetail detail = new UserDetail(); - detail.setUserId(user.getId()); // 会在保存后自动填充 - detail.setGradeId(adminGradeMapper.selectByName(gradeName).getId()); // 默认等级 - detail.setIsFixed(1); // 默认未固定 - userDetails.add(detail); + 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++; @@ -124,24 +128,30 @@ public class AdminUserDetailServiceImpl extends ServiceImpl 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); // 标记为内定用户 + userDetails.add(detail); + } - if (userSaved && detailSaved) { - return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); - } - return Result.failure("部分数据导入失败"); + // 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); @@ -149,18 +159,7 @@ public class AdminUserDetailServiceImpl extends ServiceImpl existingCodes, Set processedCodes) { + private void validateUser(UserImportDto dto, int rowNum, Set processedCodes) { if (StringUtils.isBlank(dto.getJwcode())) { throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空"); } @@ -169,12 +168,19 @@ public class AdminUserDetailServiceImpl extends ServiceImpl recordPage = adminWinMapper.selectPage(page, recordWrapper); @@ -92,18 +100,19 @@ public class AdminWinServiceImpl extends ServiceImpl userMap = adminUserService.listByIds(userIds).stream() + // 4.1 查询用户基本信息 //如果ids为空,返回空列表 + Map userMap = userIds.isEmpty() ? new HashMap<>() : adminUserService.listByIds(userIds).stream() .collect(Collectors.toMap(User::getId, u -> u)); // 4.2 查询奖品及对应等级信息 - Map prizeMap = adminPrizeService.listByIds(prizeIds).stream() + Map prizeMap = prizeIds.isEmpty() ? new HashMap<>(): 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() + + Map gradeMap =gradeIds.isEmpty() ? new HashMap<>():adminGradeService.listByIds(gradeIds).stream() .collect(Collectors.toMap(Grade::getId, g -> g)); // 5. 转换为VO @@ -131,7 +140,7 @@ public class AdminWinServiceImpl extends ServiceImpl list = listWinUser(1,10,winUserQueryDto); -// -// EasyExcel.write(response.getOutputStream(), FundingExport.class) -// .excelType(ExcelTypeEnum.XLSX) -// .sheet("获奖记录") -// .doWrite(list); + // 1. 设置响应内容类型和编码 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("UTF-8"); + + // 2. 设置文件名(处理中文乱码) + String fileName = "中奖名单_" + System.currentTimeMillis() + ".xlsx"; + String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName); + + // 3. 查询中奖用户数据 +// List winUsers = listWinUser(1, 1000, winUserQueryDto); + + //全部放进一页里面,直接取 + PageInfo winUserVoPageInfo = listWinUser(1, Integer.MAX_VALUE, winUserQueryDto); + + // 4. 使用EasyExcel导出 + EasyExcel.write(response.getOutputStream(), WinUserExportDto.class) + .excelType(ExcelTypeEnum.XLSX) + .sheet("中奖名单") + .doWrite(convertToExportDto(winUserVoPageInfo.getList())); } + + // Vo 转 ExportDto 的转换方法 + private List convertToExportDto(List voList) { + List result = new ArrayList<>(); + + for (int i = 0; i < voList.size(); i++) { + WinUserVo vo = voList.get(i); + WinUserExportDto dto = new WinUserExportDto(); + + // 设置序号 + dto.setIndex(i + 1); + + // 复制其他字段 + dto.setJwcode(vo.getJwcode()); + dto.setUsername(vo.getUsername()); + dto.setPrizeName(vo.getPrizeName()); + dto.setWinTime(vo.getWinTime()); + dto.setGradeName(vo.getGradeName()); + result.add(dto); + } + return result; + } } 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 5cb1adf..a32d8eb 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 @@ -1,18 +1,14 @@ package com.lottery.api.controller; import com.lottery.api.service.IUserDetailService; -import com.lottery.api.service.Impl.UserDetailServiceImpl; import com.lottery.dto.StartLotteryDto; -import com.lottery.entity.User; import com.lottery.result.Result; -import com.lottery.vo.UserVo; +import com.lottery.vo.LotteryVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.List; - /** * @program: lottery * @ClassName LotteryController @@ -31,11 +27,12 @@ public class LotteryController { @Autowired private IUserDetailService userDetailService; + //TODO 一个用户内定多个等奖会出现bug? @PostMapping("/start") - public Result> StartLottery(@RequestBody StartLotteryDto startLotteryDto){ + public Result StartLottery(@RequestBody StartLotteryDto startLotteryDto){ - LOGGER.info("开始抽奖: 等级是:{},奖品是:{},抽取人数:{}",startLotteryDto.getGradeName(),startLotteryDto.getPrizeName(),startLotteryDto.getPerWin()); - List userVos = userDetailService.StartLottery(startLotteryDto); + LOGGER.info("开始抽奖: 等级是:{},奖品是:{},抽取人数:{}",startLotteryDto.getGradeId(),startLotteryDto.getPrizeId(),startLotteryDto.getPerWin()); + LotteryVo userVos = userDetailService.StartLottery(startLotteryDto); return Result.success(userVos); } } 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 7df5256..802f498 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 @@ -68,6 +68,8 @@ public class UserController { } @PostMapping("/list") + + //TODO 返回数据给前端最大140条,数据库不够140条凑够140条 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 1be1636..5de8eb2 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,9 +3,7 @@ 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; +import com.lottery.vo.LotteryVo; /** * @program: lottery @@ -16,5 +14,5 @@ import java.util.List; * @Version 1.0 **/ public interface IUserDetailService extends IService { - List StartLottery(StartLotteryDto startLotteryDto); + LotteryVo StartLottery(StartLotteryDto startLotteryDto); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/PrizeServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/PrizeServiceImpl.java index 0ecf407..96c5e80 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/PrizeServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/PrizeServiceImpl.java @@ -1,5 +1,6 @@ package com.lottery.api.service.Impl; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lottery.api.mapper.IGradeMapper; import com.lottery.api.mapper.IPrizeMapper; @@ -8,11 +9,15 @@ import com.lottery.api.service.IPrizeService; import com.lottery.entity.Prize; import com.lottery.vo.PrizeAndGradeVo; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.persistence.criteria.CriteriaBuilder; import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Map; /** * @program: lottery-system @@ -32,10 +37,59 @@ public class PrizeServiceImpl extends ServiceImpl implement @Autowired private IGradeMapper gradeMapper; +// @Autowired +// private RedisTemplate redisTemplate; // 使用Integer类型的RedisTemplate +// +// private static final String REDIS_KEY_PREFIX = "grade:"; @Override public List getAllPrizeAndGrade() { - return prizeMapper.selectPrizeAndGrade(); + List prizeAndGradeVos = prizeMapper.selectPrizeAndGrade(); + +// for (PrizeAndGradeVo vo : prizeAndGradeVos) { +// String redisKey = REDIS_KEY_PREFIX + vo.getGradeId(); +// +// // 从Redis获取已抽取数量,如果没有则返回0 +// Integer drawedCount = redisTemplate.opsForValue().get(redisKey); +// if (drawedCount == null) { +// drawedCount = 0; +// } +// +// // 计算剩余数量 = 总数 - 已抽取数 - 每轮抽取数 +// int remainNum = vo.getAmount() - drawedCount - vo.getPerWin(); +// vo.setRemainNum(remainNum); +// +// // 计算是否还有下一轮(剩余数量 >= 0) 也放在抽奖之后 +// Integer isRound = 0; +// if ((vo.getAmount() - drawedCount) - vo.getPerWin() >= 0){ +// isRound = 1; +// } +// vo.setIsRound(isRound); +// +// // 计算当前轮次 +// int currentRound = (drawedCount / vo.getPerWin()) + 1; +// vo.setCurrentRound(currentRound); +// } +// return prizeAndGradeVos; +// } +// +// +// @Transactional +// public List drawWinners(Long gradeId, int winnerCount) { +// String redisKey = REDIS_KEY_PREFIX + gradeId; +// +// // 原子性增加已抽取数量 +// redisTemplate.opsForValue().increment(redisKey, winnerCount); +// +// // 返回更新后的奖品信息 +// return getAllPrizeAndGrade(); +// } +// +// public void resetDrawCount(Long gradeId) { +// String redisKey = REDIS_KEY_PREFIX + gradeId; +// redisTemplate.delete(redisKey); +// } + return prizeAndGradeVos; } } 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 72b8e8c..d18fc9f 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 @@ -1,8 +1,8 @@ package com.lottery.api.service.Impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.lottery.LotteryApplication; import com.lottery.admin.mapper.AdminPrizeMapper; import com.lottery.admin.mapper.AdminWinMapper; import com.lottery.api.mapper.IGradeMapper; @@ -15,18 +15,14 @@ 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 com.lottery.vo.LotteryVo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * @program: lottery @@ -138,24 +134,27 @@ public class UserDetailServiceImpl extends ServiceImpl StartLottery(StartLotteryDto startLotteryDto) { - // 1. 获取年级ID - Long gradeId = gradeMapper.selectByName(startLotteryDto.getGradeName()); - if (gradeId == null) { - throw new SomeException("未找到指定等级:" + startLotteryDto.getGradeName()); + public LotteryVo StartLottery(StartLotteryDto startLotteryDto) { + // 校验 + Grade grade = gradeMapper.selectById(startLotteryDto.getGradeId()); + if (grade == null) { + throw new SomeException("未找到指定等级:" + startLotteryDto.getGradeId()); } - // 2. 查询该年级下所有内定人员 + // 该等奖下所有内定人员集合 LambdaQueryWrapper userDetailWrapper = new LambdaQueryWrapper<>(); - userDetailWrapper.eq(UserDetail::getGradeId, gradeId) + userDetailWrapper.eq(UserDetail::getGradeId, startLotteryDto.getGradeId()) .eq(UserDetail::getIsFixed, 1); List fixedUsers = userDetailMapper.selectList(userDetailWrapper); - // 3. 准备中奖用户结果集 + // 该等奖下该轮中奖用户结果(即winners.size() = perwin, 但是也有特殊情况,per_win > 剩余人数,只抽剩余人数就行) List winners = new ArrayList<>(); int requiredWinners = startLotteryDto.getPerWin(); + if (requiredWinners > startLotteryDto.getRemainNum()) { + requiredWinners = startLotteryDto.getRemainNum(); + } - // 4. 先处理内定用户(过滤掉已中奖的) + // 先处理内定用户(过滤掉已中奖的) List availableFixedUsers = getAvailableFixedUsers(fixedUsers); int fixedWinnersCount = Math.min(availableFixedUsers.size(), requiredWinners); @@ -165,15 +164,30 @@ public class UserDetailServiceImpl extends ServiceImpl allAvailableUsers = getAllAvailableUsers(); +// List allAvailableUsers = getAllAvailableUsers(); +// List supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size())); +// winners.addAll(convertToUserVoList(supplementWinners)); +// markUsersAsWinners(supplementWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面 + + List allAvailableUsers = getAllAvailableUsers(startLotteryDto.getGradeId()); //过滤别的等级下内定的用户和已中奖的用户 List supplementWinners = randomSelectUsers(allAvailableUsers, Math.min(remaining, allAvailableUsers.size())); winners.addAll(convertToUserVoList(supplementWinners)); - markUsersAsWinners(supplementWinners, startLotteryDto); // 标记为已中奖,并加入到中奖记录表里面 + markUsersAsWinners(supplementWinners, startLotteryDto); } - return winners; + + //剩余人数 + int lastNum = startLotteryDto.getRemainNum() - winners.size(); + updateRemainNum(grade, lastNum); + + boolean hasNextRound = lastNum > 0; + + LotteryVo lotteryVo = new LotteryVo(); + lotteryVo.setData(winners); + lotteryVo.setRound(hasNextRound); + return lotteryVo; } // 获取可用的内定用户(未中奖的) @@ -188,11 +202,37 @@ public class UserDetailServiceImpl extends ServiceImpl getAllAvailableUsers() { + // 获取所有其他等奖的内定用户(排除当前等级) + private List getOtherGradeFixedUsers(Long excludeGradeId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.ne(UserDetail::getGradeId, excludeGradeId) // 排除当前等级 + .eq(UserDetail::getIsFixed, 1); + + List otherFixedUsers = userDetailMapper.selectList(wrapper); + return otherFixedUsers.stream() + .map(userDetail -> userMapper.selectById(userDetail.getUserId())) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + + //获取全体可用用户(未中奖且非其他等奖内定用户) + private List getAllAvailableUsers(Long currentGradeId) { + // 获取所有其他等奖的内定用户 + List otherFixedUsers = getOtherGradeFixedUsers(currentGradeId); + Set otherFixedUserIds = otherFixedUsers.stream() + .map(User::getId) + .collect(Collectors.toSet()); + + // 查询所有未中奖用户 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(User::getIsWin, 0); // 只查询未中奖的 - return userMapper.selectList(wrapper); + wrapper.eq(User::getIsWin, 0); + List allUsers = userMapper.selectList(wrapper); + + // 过滤掉其他等奖的内定用户 + return allUsers.stream() + .filter(user -> !otherFixedUserIds.contains(user.getId())) + .collect(Collectors.toList()); } // 随机选择用户 @@ -206,14 +246,15 @@ public class UserDetailServiceImpl extends ServiceImpl 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; + return users.stream() + .map(user -> { + UserVo vo = new UserVo(); + vo.setUsername(user.getUsername()); + vo.setJwcode(user.getJwcode()); + vo.setId((long) user.getId()); + return vo; + }) + .collect(Collectors.toList()); } // 标记用户为中奖状态 @@ -228,12 +269,27 @@ public class UserDetailServiceImpl extends ServiceImpl lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(Grade::getId, grade.getId()) + .set(Grade::getRemainNum, drawnCount) + .set(Grade::getUpdateTime, new Date()); + gradeMapper.update(null, lambdaUpdateWrapper); + } // // 随机选择指定数量的用户(内定名单中) // private List randomSelectFixUser(List users, int count) { // List shuffled = new ArrayList<>(users); // 避免修改原集合 diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java index 4d0429a..56d334b 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java @@ -1,6 +1,9 @@ package com.lottery.api.service.Impl; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lottery.constant.RedisCacheConstant; import com.lottery.dto.UserLoginDto; @@ -14,6 +17,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Random; /** * @program: lottery-system @@ -49,8 +53,30 @@ public class UserServiceImpl extends ServiceImpl implements I @Override public List listAllUser() { - List list = this.list(); - //redisTemplate.opsForValue().set(RedisCacheConstant.ALL_USER_CACHE, JSON.toJSONString(list)); - return list; +// 1. 查询前140条用户,直接分页逻辑查就行, + Page page = new Page<>(1, 140); + IPage userPage = this.page(page); + List users = userPage.getRecords(); + + // 2. 如果不足140条,随机补充 + if (users.size() < 140) { + int needed = 140 - users.size(); + Random random = new Random(); + + for (int i = 0; i < needed; i++) { + User randomUser = users.get(random.nextInt(users.size())); + users.add(cloneUser(randomUser)); + } + } + + return users; + } + + private User cloneUser(User original) { + User clone = new User(); + clone.setId(original.getId()); + clone.setUsername(original.getUsername()); + clone.setJwcode(original.getJwcode()); + return clone; } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/config/RedisConfig.java b/lottery-system/lottery-service/src/main/java/com/lottery/config/RedisConfig.java new file mode 100644 index 0000000..3e4de70 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/config/RedisConfig.java @@ -0,0 +1,75 @@ +package com.lottery.config; + +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; + + @Configuration + public class RedisConfig { + +// @Bean +// public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { +// RedisTemplate template = new RedisTemplate<>(); +// template.setConnectionFactory(redisConnectionFactory); +// +// // 设置 key 的序列化器 +// template.setKeySerializer(new StringRedisSerializer()); +// +// // 使用 Jackson2JsonRedisSerializer 来序列化/反序列化 Object 类型的 value +// Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); +// ObjectMapper objectMapper = new ObjectMapper(); +// jackson2JsonRedisSerializer.setObjectMapper(objectMapper); +// +// // 设置 value 的序列化器 +// template.setValueSerializer(jackson2JsonRedisSerializer); +// +// return template; +// } + +// @Bean +// public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { +// RedisTemplate template = new RedisTemplate<>(); +// template.setConnectionFactory(redisConnectionFactory); +// template.setKeySerializer(new StringRedisSerializer()); +// +// // 创建支持 Java 8 时间的序列化器 +// Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); +// +// // 配置 ObjectMapper +// ObjectMapper objectMapper = new ObjectMapper(); +// // 注册 Java 8 时间支持模块 +// objectMapper.registerModule(new JavaTimeModule()); +// // 禁用时间戳格式(避免日期被序列化成数字) +// objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); +// +// serializer.setObjectMapper(objectMapper); +// template.setValueSerializer(serializer); +// +// return template; +// } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setHashKeySerializer(new StringRedisSerializer()); + + // 使用GenericJackson2JsonRedisSerializer来序列化和反序列化redis的value值 + template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + + template.afterPropertiesSet(); + return template; + } + } + diff --git a/lottery-system/lottery-service/src/main/resources/application.yml b/lottery-system/lottery-service/src/main/resources/application.yml index 0390cd6..733c039 100644 --- a/lottery-system/lottery-service/src/main/resources/application.yml +++ b/lottery-system/lottery-service/src/main/resources/application.yml @@ -19,20 +19,20 @@ spring: idle-timeout: 600000 # 空闲连接超时时间(默认 10 分钟) max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟) leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s) - - # ========== Redis 配置 ========== -# redis: -# host: 127.0.0.1 -# port: 6379 -# password: # 若无密码则留空 -# database: 0 # 默认DB索引 -# jedis: -# pool: -# max-active: 8 # 最大连接数 -# max-wait: 5000ms # 最大等待时间 -# max-idle: 4 # 最大空闲连接 -# min-idle: 1 # 最小空闲连接 -# timeout: 3000ms # 连接超时时间 +# +# ========== Redis 配置 ========== + redis: + host: 39.98.127.73 + port: 7001 + password: 2TOVfFeJ0pyi9Wtj + database: 0 # 默认DB索引 + jedis: + pool: + max-active: 8 # 最大连接数 + max-wait: 5000ms # 最大等待时间 + max-idle: 4 # 最大空闲连接 + min-idle: 1 # 最小空闲连接 + timeout: 3000ms # 连接超时时间 # ========== MyBatis 配置(如果使用MyBatis代替JPA) ========== diff --git a/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml index 710af8c..fdde639 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml @@ -3,7 +3,7 @@