diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lottery-system/lottery-common/src/main/java/com/lottery/utils/LoginHttpUtils.java b/lottery-system/lottery-common/src/main/java/com/lottery/utils/LoginHttpUtils.java new file mode 100644 index 0000000..741d974 --- /dev/null +++ b/lottery-system/lottery-common/src/main/java/com/lottery/utils/LoginHttpUtils.java @@ -0,0 +1,30 @@ +//package com.lottery.utils; +// +//import org.springframework.stereotype.Component; +// +///** +// * @program: lottery +// * @ClassName LoginHttpUtils +// * @description: +// * @author: wwl +// * @create: 2025-07-16 10:07 +// * @Version 1.0 +// **/ +// +//@Component +//public class LoginHttpUtils { +// private final RestTemplate restTemplate; +// +// public HttpUtil(RestTemplateBuilder restTemplateBuilder) { +// this.restTemplate = restTemplateBuilder.build(); +// } +// +// public T post(String url, Object request, Class responseType) { +// HttpHeaders headers = new HttpHeaders(); +// headers.setContentType(MediaType.APPLICATION_JSON); +// HttpEntity entity = new HttpEntity<>(request, headers); +// +// ResponseEntity response = restTemplate.postForEntity(url, entity, responseType); +// return response.getBody(); +// } +//} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java new file mode 100644 index 0000000..b77e1c6 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/AdminLogin.java @@ -0,0 +1,17 @@ +package com.lottery.dto; + +import lombok.Data; + +/** + * @program: lottery + * @ClassName AdminLogin + * @description: + * @author: wwl + * @create: 2025-07-16 10:19 + * @Version 1.0 + **/ +@Data +public class AdminLogin { + private String username; + private String password; +} 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 new file mode 100644 index 0000000..45c6c84 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java @@ -0,0 +1,21 @@ +package com.lottery.dto; + +import lombok.Data; + +/** + * @program: lottery + * @ClassName WinUserDto + * @description: + * @author: wwl + * @create: 2025-07-16 14:01 + * @Version 1.0 + **/ +@Data +public class FixUserDto { + + private String username; + + private String jwcode; + + private String GradeName; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java index d885ef6..f291316 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java @@ -16,7 +16,7 @@ public class GradeDto { private Long id; - private String GradeName; // 等级名称 + private String gradeName; // 等级名称 private Integer amount; //等级数量 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 new file mode 100644 index 0000000..6459937 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/StartLotteryDto.java @@ -0,0 +1,20 @@ +package com.lottery.dto; + +import lombok.Data; + +/** + * @program: lottery + * @ClassName StartLotteryDto + * @description: + * @author: wwl + * @create: 2025-07-16 16:49 + * @Version 1.0 + **/ +@Data +public class StartLotteryDto { + private int perWin; + + private String gradeName; + + private String PrizeName; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/UserDetail.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/UserDetail.java new file mode 100644 index 0000000..1f60e45 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/UserDetail.java @@ -0,0 +1,32 @@ +package com.lottery.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @program: lottery + * @ClassName UserDetail + * @description: + * @author: wwl + * @create: 2025-07-16 9:32 + * @Version 1.0 + **/ +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("user_detail") +public class UserDetail { + + @TableId(type = IdType.AUTO) + private Long id; // 主键ID(表中未显示但建议添加) + + private Long userId; + + private Long gradeId; + + private int isFixed; +} diff --git a/lottery-system/lottery-service/pom.xml b/lottery-system/lottery-service/pom.xml index a6a2048..6236cb6 100644 --- a/lottery-system/lottery-service/pom.xml +++ b/lottery-system/lottery-service/pom.xml @@ -17,6 +17,7 @@ org.springframework.boot spring-boot-starter-web + com.lottery lottery-pojo 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 686afbc..2f239d4 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 @@ -75,7 +75,7 @@ public class AdminGradeController { } - @PutMapping("/update") + @PostMapping("/update") public Result update(@RequestBody GradeDto gradeDto){ if (gradeDto.getGradeName() == null || gradeDto.getAmount() == null|| @@ -96,7 +96,7 @@ public class AdminGradeController { } - @DeleteMapping("/delete") + @PostMapping("/delete") public Result delete(@RequestParam Long id){ LOGGER.info("删除id为:{} 的等级" ,id); if (!adminGradeService.removeById(id)){ 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 064eb8a..af63738 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 @@ -2,6 +2,7 @@ package com.lottery.admin.controller; import com.lottery.admin.service.AdminPrizeService; import com.lottery.dto.PrizeDto; +import com.lottery.dto.FixUserDto; import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; @@ -50,10 +51,11 @@ public class AdminPrizeController { if(!adminPrizeService.add(prizeDto)){ return Result.failure("该等级下已有礼物"); }; + //TODO 新增的时候选择不存在的等级,给前端返回错误信息 return Result.success(); } - @PutMapping("/update") + @PostMapping("/update") public Result updatePrize(@RequestBody PrizeDto prizeDto) { LOGGER.info("修改奖品信息:{}",prizeDto); if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null|| @@ -68,10 +70,12 @@ public class AdminPrizeController { if(!adminPrizeService.updatePrize(prizeDto)){ return Result.failure("该等级下已有礼物"); }; + + //TODO 修改的时候选择不存在的等级,给前端返回错误信息 return Result.success(); } - @DeleteMapping("/delete") + @PostMapping("/delete") public Result deletePrize(@RequestParam Long id) { LOGGER.info("根基id:{},删除奖品",id); if (!adminPrizeService.removeById(id)){ @@ -80,5 +84,13 @@ public class AdminPrizeController { return Result.success(); } + @PostMapping("/addFixUser") + public Result addWinUser(@RequestBody FixUserDto fixUserDto) { + if (fixUserDto.getUsername() == null || fixUserDto.getJwcode() == null) { + return Result.failure("所有字段都必须填写"); + } + adminPrizeService.addWinUser(fixUserDto); + return Result.success(); + } } 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 5e8d009..bef394d 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 @@ -1,6 +1,8 @@ package com.lottery.admin.controller; +import com.lottery.admin.service.AdminUserDetailService; import com.lottery.admin.service.AdminUserService; +import com.lottery.dto.AdminLogin; import com.lottery.dto.UserDto; import com.lottery.dto.UserImportDto; import com.lottery.dto.UserQueryDto; @@ -10,6 +12,7 @@ import com.lottery.utils.ConvertBeanUtil; import com.lottery.utils.ExcelUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.UserVo; +import org.apache.logging.log4j.util.PerformanceSensitive; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +38,9 @@ public class AdminUserController { @Autowired private AdminUserService adminUserService; + @Autowired + private AdminUserDetailService adminUserDetailService; + private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); @PostMapping("/add") @@ -44,7 +50,9 @@ public class AdminUserController { if (userDto.getUsername() == null || userDto.getJwcode() == null) { return Result.failure("所有字段都必须填写"); } - adminUserService.addUser(userDto); + if (!adminUserService.addUser(userDto)){ + return Result.failure("精网号已存在,无法添加"); + } return Result.success(); } @@ -58,16 +66,14 @@ public class AdminUserController { - @GetMapping() - - @DeleteMapping("/delete") + @PostMapping("/delete") public Result delete(@RequestParam Long id) { LOGGER.info("根据id删除用户:{}",id); adminUserService.removeById(id); return Result.success(); } - @DeleteMapping("/delete/batch") + @PostMapping("/delete/batch") public Result deleteBatch(@RequestParam List ids) { LOGGER.info("批量删除用户:{}",ids); if (ids == null || ids.size() == 0) { @@ -93,4 +99,53 @@ public class AdminUserController { return adminUserService.importUsers(file); } + @PostMapping("/login") + public Result login(@RequestBody AdminLogin adminLogin) { + + LOGGER.info("管理员登录:{}",adminLogin); + return adminUserService.AdminUserlogin(adminLogin); + } + + + @PostMapping("/list/fix") + public Result> getAllFixUser(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize, + @RequestBody UserQueryDto userQueryDto ){ + LOGGER.info("分页查询所有内定用户"); + return Result.success(adminUserDetailService.listFixUser(pageNum,pageSize,userQueryDto)); + } + + + @PostMapping("/delete/fix") + public Result deleteFix(@RequestParam Long id) { + LOGGER.info("根据id删除内定用户:{}",id); + adminUserDetailService.removeById(id); + return Result.success(); + } + + @PostMapping("/delete/fix/batch") + public Result deleteBatchFix(@RequestParam List ids) { + LOGGER.info("批量删除内定用户:{}",ids); + if (ids == null || ids.size() == 0) { + return Result.failure("ids is null"); + } + adminUserDetailService.removeBatchByIds(ids); + return Result.success(); + } + + @PostMapping("/import/fix") + public Result importFixUsers(@RequestParam("file") MultipartFile file, @RequestParam String gradeName) { + LOGGER.info("开始导入内定用户Excel文件: {}", file.getOriginalFilename()); + + // 1. 基本文件校验 + if (file.isEmpty()) { + return Result.failure("请上传文件"); + } + + String fileName = file.getOriginalFilename(); + if (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls")) { + return Result.failure("仅支持Excel文件(.xlsx, .xls)"); + } + return adminUserDetailService.importUsers(file,gradeName); + } + } 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 fdb2bf2..daf7281 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 @@ -16,4 +16,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface AdminGradeMapper extends BaseMapper { Grade selectByName(String gradeName); + } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java new file mode 100644 index 0000000..dd21e17 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserDetailMapper.java @@ -0,0 +1,23 @@ +package com.lottery.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lottery.entity.UserDetail; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Set; + +/** + * @program: lottery + * @ClassName IUserDetailMapper + * @description: + * @author: wwl + * @create: 2025-07-16 9:47 + * @Version 1.0 + **/ + +@Mapper +public interface AdminUserDetailMapper extends BaseMapper { + @Select("select jwcode from user_detail") + Set selectAllUserCodes(); +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java index c65eb0d..96ac205 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java @@ -20,4 +20,6 @@ public interface AdminUserMapper extends BaseMapper { @Select("select jwcode from user") Set selectAllUserCodes(); + + Long selectByJwcode(String jwcode); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java index 43a947f..f81db54 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java @@ -2,8 +2,8 @@ package com.lottery.admin.service; import com.baomidou.mybatisplus.extension.service.IService; import com.lottery.dto.PrizeDto; +import com.lottery.dto.FixUserDto; import com.lottery.entity.Prize; -import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; @@ -23,4 +23,6 @@ public interface AdminPrizeService extends IService { boolean updatePrize(PrizeDto prizeDto); PrizeVo getPrizeById(Long id); + + void addWinUser(FixUserDto fixUserDto); } 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 new file mode 100644 index 0000000..cf67720 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserDetailService.java @@ -0,0 +1,25 @@ +package com.lottery.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.lottery.dto.UserQueryDto; +import com.lottery.entity.UserDetail; +import com.lottery.result.Result; +import com.lottery.vo.PageInfo; +import com.lottery.vo.UserVo; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +/** + * @program: lottery + * @ClassName IUserDetail + * @description: + * @author: wwl + * @create: 2025-07-16 9:36 + * @Version 1.0 + **/ + +public interface AdminUserDetailService extends IService { + PageInfo listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto); + + Result importUsers(MultipartFile file, String gradeName); +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java index 5ee2c88..a74ee5c 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java @@ -1,6 +1,7 @@ package com.lottery.admin.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.lottery.dto.AdminLogin; import com.lottery.dto.UserDto; import com.lottery.dto.UserQueryDto; import com.lottery.entity.User; @@ -23,7 +24,14 @@ import java.util.List; @Service public interface AdminUserService extends IService { - void addUser(UserDto userDto); + + + + + Result AdminUserlogin(AdminLogin adminLogin); + + + boolean addUser(UserDto userDto); PageInfo listUser(int pageNum, int pageSize, UserQueryDto userQueryDto); 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 bcb2b44..988be9a 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 @@ -1,28 +1,25 @@ package com.lottery.admin.service.Impl; -import ch.qos.logback.classic.spi.EventArgUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.lottery.admin.mapper.AdminGradeMapper; import com.lottery.admin.mapper.AdminPrizeMapper; +import com.lottery.admin.mapper.AdminUserDetailMapper; +import com.lottery.admin.mapper.AdminUserMapper; import com.lottery.admin.service.AdminPrizeService; -import com.lottery.api.mapper.IGradeMapper; -import com.lottery.api.mapper.IPrizeMapper; import com.lottery.dto.PrizeDto; +import com.lottery.dto.FixUserDto; import com.lottery.entity.Grade; import com.lottery.entity.Prize; -import com.lottery.exception.SomeException; -import com.lottery.result.Result; +import com.lottery.entity.User; +import com.lottery.entity.UserDetail; import com.lottery.utils.ConvertBeanUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; -import net.bytebuddy.implementation.auxiliary.AuxiliaryType; -import org.hibernate.engine.jdbc.connections.internal.ConnectionValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.lang.module.Configuration; import java.util.Date; import java.util.List; @@ -43,6 +40,12 @@ public class AdminPrizeServiceImpl extends ServiceImpl @Autowired private AdminPrizeMapper adminPrizeMapper; + @Autowired + private AdminUserDetailMapper adminUserDetailMapper; + + @Autowired + private AdminUserMapper adminUserMapper; + @Override public PageInfo pageListPrize(int pageNum, int pageSize) { Page page = new Page<>(pageNum, pageSize); @@ -116,4 +119,24 @@ public class AdminPrizeServiceImpl extends ServiceImpl prizeVo.setGradeName(grade.getGradeName()); return prizeVo; } + + @Override + public void addWinUser(FixUserDto fixUserDto) { + //先判断新增的内定用户是否在总的抽奖用户中 + Long userId = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); + if (userId == null) { + adminUserMapper.insert(ConvertBeanUtil.convert(fixUserDto, User.class)); //不存在,插入总表 + } + + Grade grade = adminGradeMapper.selectByName(fixUserDto.getGradeName()); + Long gradeId = grade.getId(); + + Long userIdd = adminUserMapper.selectByJwcode(fixUserDto.getJwcode()); + + UserDetail userDetail = new UserDetail(); + userDetail.setUserId(userIdd); + userDetail.setGradeId(gradeId); + userDetail.setIsFixed(1); + adminUserDetailMapper.insert(userDetail); + } } 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 new file mode 100644 index 0000000..33bffa1 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java @@ -0,0 +1,180 @@ +package com.lottery.admin.service.Impl; + +import com.alibaba.excel.EasyExcel; +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.admin.mapper.AdminGradeMapper; +import com.lottery.admin.mapper.AdminUserDetailMapper; +import com.lottery.admin.mapper.AdminUserMapper; +import com.lottery.admin.service.AdminUserDetailService; +import com.lottery.admin.service.AdminUserService; +import com.lottery.api.mapper.IUserDetailMapper; +import com.lottery.api.service.IUserDetailService; +import com.lottery.api.service.IUserService; +import com.lottery.dto.UserImportDto; +import com.lottery.dto.UserQueryDto; +import com.lottery.entity.Grade; +import com.lottery.entity.User; +import com.lottery.entity.UserDetail; +import com.lottery.result.Result; +import com.lottery.utils.ConvertBeanUtil; +import com.lottery.vo.PageInfo; +import com.lottery.vo.UserVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @program: lottery + * @ClassName UserDetailServiceImpl + * @description: + * @author: wwl + * @create: 2025-07-16 9:43 + * @Version 1.0 + **/ +@Service +public class AdminUserDetailServiceImpl extends ServiceImpl implements AdminUserDetailService { + + @Autowired + private AdminUserMapper adminUserMapper; + @Autowired + private AdminUserDetailMapper adminUserDetailMapper; + + @Autowired + private AdminUserService adminUserService; + + private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserDetailServiceImpl.class); + + @Autowired + private AdminGradeMapper adminGradeMapper; + + @Override + public PageInfo listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { + + //查UserDetail表吧所有的userid取出来,然后在从user表根据id查就行了。 + List list = this.list(); + List UserIds = list.stream().map(UserDetail::getUserId).collect(Collectors.toList()); + + Page page = new Page<>(pageNum, pageSize); + + //user表根据id批量查询 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(User::getId, UserIds); + + + if (StringUtils.isNotBlank(userQueryDto.getUsername())) { + queryWrapper.like(User::getUsername, userQueryDto.getUsername()); + } + if(StringUtils.isNotBlank(userQueryDto.getJwcode())){ + queryWrapper.like(User::getPassword, userQueryDto.getJwcode()); + } + + Page userPage = this.adminUserMapper.selectPage(page, queryWrapper); + List userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class); + return PageInfo.of(userPage, userVolist); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result importUsers(MultipartFile file, String gradeName) { + try { + // 1. 解析Excel + List userDtos = EasyExcel.read(file.getInputStream()) + .head(UserImportDto.class) + .sheet() + .doReadSync(); + + // 2. 数据校验和去重 + Set existingCodes = adminUserMapper.selectAllUserCodes(); + List users = new ArrayList<>(); + List userDetails = new ArrayList<>(); + Set processedCodes = new HashSet<>(); + int successCount = 0; + int skipCount = 0; + + 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); + + processedCodes.add(dto.getJwcode()); + successCount++; + } catch (IllegalArgumentException e) { + LOGGER.warn("导入数据校验失败: {}", e.getMessage()); + skipCount++; + } + } + + // 3. 批量保存 + if (!users.isEmpty()) { + // 批量保存用户 + boolean userSaved = adminUserService.saveBatch(users); + + // 设置userDetail的userId + for (int i = 0; i < users.size(); i++) { + userDetails.get(i).setUserId(users.get(i).getId()); + } + + // 批量保存用户详情 + boolean detailSaved = this.saveBatch(userDetails); + + if (userSaved && detailSaved) { + return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); + } + return Result.failure("部分数据导入失败"); + } + return Result.failure("没有有效数据可导入"); + } catch (Exception e) { + LOGGER.error("导入用户失败", e); + return Result.failure("导入失败: " + e.getMessage()); + } + } + + private User convertToEntity(UserImportDto dto) { + User user = new User(); + user.setJwcode(dto.getJwcode()); + user.setUsername(dto.getUsername()); + user.setCreateTime(new Date()); + user.setUpdateTime(new Date()); + // 密码加密 + user.setPassword("123456"); + return user; + } + + private void validateUser(UserImportDto dto, int rowNum, Set existingCodes, Set processedCodes) { + if (StringUtils.isBlank(dto.getJwcode())) { + throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空"); + } + + if (StringUtils.isBlank(dto.getUsername())) { + throw new IllegalArgumentException("第" + rowNum + "行: 姓名不能为空"); + } + + if (existingCodes.contains(dto.getJwcode())) { + throw new IllegalArgumentException("第" + rowNum + "行: 精网号已存在"); + } + + if (processedCodes.contains(dto.getJwcode())) { + throw new IllegalArgumentException("第" + rowNum + "行: 精网号在当前文件中重复"); + } + } +} 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 7c9074f..092b83d 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 @@ -10,6 +10,7 @@ import com.lottery.admin.controller.AdminUserController; import com.lottery.admin.mapper.AdminUserMapper; import com.lottery.admin.service.AdminUserService; import com.lottery.api.service.Impl.UserServiceImpl; +import com.lottery.dto.AdminLogin; import com.lottery.dto.UserDto; import com.lottery.dto.UserImportDto; import com.lottery.dto.UserQueryDto; @@ -27,9 +28,12 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import org.json.JSONObject; import java.util.*; +import static com.lottery.utils.HttpUtils.postUrlencoded; + /** * @program: lottery * @ClassName AdminUserServiceImpl @@ -46,8 +50,52 @@ public class AdminUserServiceImpl extends ServiceImpl imp private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); @Override - public void addUser(UserDto userDto) { - this.save(ConvertBeanUtil.convert(userDto, User.class)); + public Result AdminUserlogin(AdminLogin adminLogin) { + + try { + // 1. 准备请求参数 + Map params = new HashMap<>(); + params.put("username", adminLogin.getUsername()); // 替换为实际用户名 + params.put("password", adminLogin.getPassword()); // 替换为实际密码 + params.put("app_from", "en"); // canshu + + // 2. 调用登录API + String loginUrl = "http://39.101.133.168:8828/hljwgo/api/user/login_jwcode"; + String response = postUrlencoded(loginUrl, params); + + // 3. 处理响应 + LOGGER.info("登录成功,响应数据:{} " , response); + + JSONObject jsonResponse = new JSONObject(response); + + // 检查状态码 + if (jsonResponse.getInt("code") == 200) { + JSONObject data = jsonResponse.getJSONObject("data"); + String token = data.getString("token"); + LOGGER.info("登录成功,Token:{} " ,token); + + // 后续可以使用token调用其他API + } else { + LOGGER.error(jsonResponse.getString("msg")); + return Result.failure(jsonResponse.getString("msg")); + } + + } catch (Exception e) { + System.err.println("登录失败: " + e.getMessage()); + return Result.failure("登录失败"); + } + return Result.success(); + } + + @Override + public boolean addUser(UserDto userDto) { + String jwcode = userDto.getJwcode(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(User::getJwcode, jwcode); + if(this.count(lambdaQueryWrapper) > 0) { + return false; + } + return this.save(ConvertBeanUtil.convert(userDto, User.class)); } @Override 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 new file mode 100644 index 0000000..f462ef4 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/LotteryController.java @@ -0,0 +1,39 @@ +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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @program: lottery + * @ClassName LotteryController + * @description: + * @author: wwl + * @create: 2025-07-16 9:29 + * @Version 1.0 + **/ + +@RestController +@RequestMapping("api/lottery") +public class LotteryController { + + private final static Logger LOGGER = LoggerFactory.getLogger(LotteryController.class); + + @Autowired + private IUserDetailService userDetailService; + + @GetMapping() + public Result StartLottery(@RequestBody StartLotteryDto startLotteryDto){ + + LOGGER.info("开始抽奖,{}等级,奖品是:{},抽取人数:{}",startLotteryDto.getGradeName(),startLotteryDto.getPrizeName(),startLotteryDto.getPerWin()); + userDetailService.StartLottery(startLotteryDto); + return Result.success(); + } +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IGradeMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IGradeMapper.java index 9ae58df..62c2c44 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IGradeMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IGradeMapper.java @@ -3,6 +3,7 @@ package com.lottery.api.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lottery.entity.Grade; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; /** * @program: lottery-system @@ -15,4 +16,6 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface IGradeMapper extends BaseMapper { + @Select("select id from grade where grade_name = #{gradeName}") + Long selectByName(String gradeName); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserDetailMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserDetailMapper.java new file mode 100644 index 0000000..60a7971 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IUserDetailMapper.java @@ -0,0 +1,18 @@ +package com.lottery.api.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lottery.entity.UserDetail; +import org.apache.ibatis.annotations.Mapper; + +/** + * @program: lottery + * @ClassName IUserDetailMapper + * @description: + * @author: wwl + * @create: 2025-07-16 9:47 + * @Version 1.0 + **/ + +@Mapper +public interface IUserDetailMapper extends BaseMapper { +} 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 new file mode 100644 index 0000000..104ca29 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserDetailService.java @@ -0,0 +1,17 @@ +package com.lottery.api.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.lottery.dto.StartLotteryDto; +import com.lottery.entity.UserDetail; + +/** + * @program: lottery + * @ClassName IUserDetail + * @description: + * @author: wwl + * @create: 2025-07-16 9:36 + * @Version 1.0 + **/ +public interface IUserDetailService extends IService { + void 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 new file mode 100644 index 0000000..3848f95 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java @@ -0,0 +1,129 @@ +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.api.mapper.IGradeMapper; +import com.lottery.api.mapper.IUserDetailMapper; +import com.lottery.api.mapper.IUserMapper; +import com.lottery.api.service.IUserDetailService; +import com.lottery.dto.StartLotteryDto; +import com.lottery.entity.Grade; +import com.lottery.entity.User; +import com.lottery.entity.UserDetail; +import com.lottery.exception.SomeException; +import com.lottery.vo.UserVo; +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.List; + +/** + * @program: lottery + * @ClassName UserDetailServiceImpl + * @description: + * @author: wwl + * @create: 2025-07-16 9:43 + * @Version 1.0 + **/ +@Service +public class UserDetailServiceImpl extends ServiceImpl implements IUserDetailService { + @Autowired + private IUserMapper userMapper; + + @Autowired + private IGradeMapper gradeMapper; + + @Autowired + private IUserDetailMapper userDetailMapper; + + + @Override + public void 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表中抽取 + } + 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()); + } + } + + 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 randomSelect(List users, int count) { + List shuffled = new ArrayList<>(users); // 避免修改原集合 + Collections.shuffle(shuffled); // 随机打乱顺序 + return shuffled.subList(0, count); // 取前N个 + } + + // 随机选择指定数量的用户(总名单中) + private List randomSelectFromAll(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/java/com/lottery/api/service/Impl/UserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java index 9f03fd5..4d0429a 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 @@ -50,7 +50,7 @@ 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)); + //redisTemplate.opsForValue().set(RedisCacheConstant.ALL_USER_CACHE, JSON.toJSONString(list)); return list; } } diff --git a/lottery-system/lottery-service/src/main/resources/application.yml b/lottery-system/lottery-service/src/main/resources/application.yml index 4e88bf4..0390cd6 100644 --- a/lottery-system/lottery-service/src/main/resources/application.yml +++ b/lottery-system/lottery-service/src/main/resources/application.yml @@ -8,10 +8,17 @@ spring: username: link password: tEhdERkaGprEA7nT driver-class-name: com.mysql.cj.jdbc.Driver +# hikari: +# pool-name: LotteryHikariCP +# maximum-pool-size: 10 # 连接池大小 +# connection-timeout: 30000 + hikari: - pool-name: LotteryHikariCP - maximum-pool-size: 10 # 连接池大小 - connection-timeout: 30000 + maximum-pool-size: 20 # 默认一般是 10,根据并发量调整 + connection-timeout: 30000 # 连接超时时间(毫秒),默认 30s + idle-timeout: 600000 # 空闲连接超时时间(默认 10 分钟) + max-lifetime: 1800000 # 连接最大生命周期(默认 30 分钟) + leak-detection-threshold: 5000 # 连接泄漏检测(毫秒,建议 5s) # ========== Redis 配置 ========== # redis: diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserDetailMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserDetailMapper.xml new file mode 100644 index 0000000..ebee85c --- /dev/null +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserDetailMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml index 165b190..620b4c4 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml @@ -3,4 +3,7 @@ + \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml index e85625e..881a719 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml @@ -2,7 +2,4 @@ - \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/api/userDetailMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/api/userDetailMapper.xml new file mode 100644 index 0000000..85827e9 --- /dev/null +++ b/lottery-system/lottery-service/src/main/resources/mapper/api/userDetailMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lottery-system/pom.xml b/lottery-system/pom.xml index cba774a..a025741 100644 --- a/lottery-system/pom.xml +++ b/lottery-system/pom.xml @@ -42,6 +42,12 @@ 2.2.2 + + org.json + json + 20231013 + + mysql