package com.xy.xyaicpzs.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xy.xyaicpzs.common.ErrorCode; import com.xy.xyaicpzs.common.ResultUtils; import com.xy.xyaicpzs.common.requset.GenerateVipCodesRequest; import com.xy.xyaicpzs.common.requset.VipCodeQueryRequest; import com.xy.xyaicpzs.common.response.ApiResponse; import com.xy.xyaicpzs.domain.entity.User; import com.xy.xyaicpzs.domain.entity.VipCode; import com.xy.xyaicpzs.domain.vo.VipCodeVO; import com.xy.xyaicpzs.exception.BusinessException; import com.xy.xyaicpzs.service.OperationHistoryService; import com.xy.xyaicpzs.service.UserService; import com.xy.xyaicpzs.service.VipCodeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import jakarta.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 会员码管理接口 */ @Slf4j @RestController @RequestMapping("/vip-code") @Tag(name = "会员码管理", description = "会员码管理相关接口") public class VipCodeController { @Resource private VipCodeService vipCodeService; @Autowired private UserService userService; @Autowired private OperationHistoryService operationHistoryService; /** * 批量生成会员码 * * @param request 生成会员码请求 * @return 生成成功的数量 */ @PostMapping("/generate") @Operation(summary = "批量生成会员码", description = "管理员批量生成会员码") public ApiResponse generateVipCodes(@RequestBody GenerateVipCodesRequest request, HttpServletRequest httpServletRequest) { User loginUser = userService.getLoginUser(httpServletRequest); if (!userService.isAdmin(loginUser)){ return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "无权限"); } Long userId = loginUser.getId(); String userName = loginUser.getUserName(); if (request == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数不能为空"); } if (request.getNumCodes() == null || request.getNumCodes() <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "生成数量必须大于0"); } if (request.getVipExpireTime() == null || request.getVipExpireTime() <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "会员有效月数必须大于0"); } if (request.getNumCodes() > 1000) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "单次生成数量不能超过1000"); } try { int result = vipCodeService.generateVipCodes(request.getNumCodes(), request.getVipExpireTime(), userId, userName); // 记录操作历史 - 成功 String resultMessage = String.format("%s成功生成%d个会员码,有效月数:%d", userName, result, request.getVipExpireTime()); operationHistoryService.recordOperation(userId, "批量生成会员码", 0, "成功", resultMessage); return ResultUtils.success(result); } catch (IllegalArgumentException e) { log.error("生成会员码参数错误:{}", e.getMessage()); // 记录操作历史 - 失败 String resultMessage = String.format("%s生成会员码失败:%s,请求数量:%d,有效月数:%d", userName, e.getMessage(), request.getNumCodes(), request.getVipExpireTime()); operationHistoryService.recordOperation(userId, "批量生成会员码", 0, "失败", resultMessage); throw new BusinessException(ErrorCode.PARAMS_ERROR, e.getMessage()); } catch (RuntimeException e) { log.error("生成会员码系统错误:{}", e.getMessage()); // 记录操作历史 - 失败 String resultMessage = String.format("%s生成会员码系统错误:%s,请求数量:%d,有效月数:%d", userName, e.getMessage(), request.getNumCodes(), request.getVipExpireTime()); operationHistoryService.recordOperation(userId, "批量生成会员码", 0, "失败", resultMessage); throw new BusinessException(ErrorCode.SYSTEM_ERROR, "生成会员码失败,请稍后重试"); } } /** * 获取一个可用的会员码 * * @param vipExpireTime 会员有效月数(1或12) * @return 可用的会员码 */ @GetMapping("/available") @Operation(summary = "获取可用会员码", description = "根据有效月数获取一个可用的会员码") public ApiResponse getAvailableVipCode(@RequestParam("vipExpireTime") Integer vipExpireTime, HttpServletRequest httpServletRequest) { User loginUser = userService.getLoginUser(httpServletRequest); if (!userService.isAdmin(loginUser)){ return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "无权限"); } Long userId = loginUser.getId(); String userName = loginUser.getUserName(); if (vipExpireTime == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "会员有效月数不能为空"); } if (vipExpireTime != 1 && vipExpireTime != 12) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "会员有效月数只能是1或12"); } try { String code = vipCodeService.getAvailableVipCode(vipExpireTime, userId, userName); if (code == null) { // 记录操作历史 - 失败 String resultMessage = String.format("%s获取可用会员码失败:没有找到可用的会员码,有效月数:%d", userName, vipExpireTime); operationHistoryService.recordOperation(userId, "获取可用会员码", 0, "失败", resultMessage); throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "没有找到可用的会员码"); } // 记录操作历史 - 成功 String resultMessage = String.format("%s成功获取可用会员码:%s,有效月数:%d", userName, code, vipExpireTime); operationHistoryService.recordOperation(userId, "获取可用会员码", 0, "成功", resultMessage); return ResultUtils.success(code); } catch (IllegalArgumentException e) { log.error("获取可用会员码参数错误:{}", e.getMessage()); // 记录操作历史 - 失败 String resultMessage = String.format("%s获取可用会员码参数错误:%s,有效月数:%d", userName, e.getMessage(), vipExpireTime); operationHistoryService.recordOperation(userId, "获取可用会员码", 0, "失败", resultMessage); throw new BusinessException(ErrorCode.PARAMS_ERROR, e.getMessage()); } catch (Exception e) { log.error("获取可用会员码系统错误:{}", e.getMessage()); // 记录操作历史 - 失败 String resultMessage = String.format("%s获取可用会员码系统错误:%s,有效月数:%d", userName, e.getMessage(), vipExpireTime); operationHistoryService.recordOperation(userId, "获取可用会员码", 0, "失败", resultMessage); throw new BusinessException(ErrorCode.SYSTEM_ERROR, "获取可用会员码失败,请生成后获取。"); } } /** * 分页获取会员码列表 * * @param vipCodeQueryRequest 会员码查询请求 * @param httpServletRequest Http请求 * @return 分页会员码列表 */ @GetMapping("/list/page") @Operation(summary = "分页获取会员码列表", description = "分页获取会员码列表,支持根据会员码、使用状态和时间筛选") public ApiResponse> listVipCodesByPage(VipCodeQueryRequest vipCodeQueryRequest, HttpServletRequest httpServletRequest) { // 权限校验 User loginUser = userService.getLoginUser(httpServletRequest); if (!userService.isAdmin(loginUser)){ return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "无权限"); } if (vipCodeQueryRequest == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数不能为空"); } long current = vipCodeQueryRequest.getCurrent(); long pageSize = vipCodeQueryRequest.getPageSize(); // 构建查询条件 QueryWrapper queryWrapper = new QueryWrapper<>(); // 根据会员码模糊查询 if (StringUtils.isNotBlank(vipCodeQueryRequest.getCode())) { queryWrapper.like("code", vipCodeQueryRequest.getCode()); } // 根据使用状态筛选 if (vipCodeQueryRequest.getIsUse() != null) { queryWrapper.eq("isUse", vipCodeQueryRequest.getIsUse()); } // 根据会员有效月数筛选 if (vipCodeQueryRequest.getVipExpireTime() != null) { queryWrapper.eq("vipExpireTime", vipCodeQueryRequest.getVipExpireTime()); } // 根据创建人ID筛选 if (vipCodeQueryRequest.getCreatedUserId() != null) { queryWrapper.eq("createdUserId", vipCodeQueryRequest.getCreatedUserId()); } // 根据创建人名称模糊查询 if (StringUtils.isNotBlank(vipCodeQueryRequest.getCreatedUserName())) { queryWrapper.like("createdUserName", vipCodeQueryRequest.getCreatedUserName()); } // 根据使用人ID筛选 if (vipCodeQueryRequest.getUsedUserId() != null) { queryWrapper.eq("usedUserId", vipCodeQueryRequest.getUsedUserId()); } // 根据创建时间范围筛选 if (vipCodeQueryRequest.getStartTime() != null && vipCodeQueryRequest.getEndTime() != null) { queryWrapper.between("createTime", vipCodeQueryRequest.getStartTime(), vipCodeQueryRequest.getEndTime()); } else if (vipCodeQueryRequest.getStartTime() != null) { queryWrapper.ge("createTime", vipCodeQueryRequest.getStartTime()); } else if (vipCodeQueryRequest.getEndTime() != null) { queryWrapper.le("createTime", vipCodeQueryRequest.getEndTime()); } // 按会员编号升序排序(从小到大) queryWrapper.orderByAsc("vipNumber"); // 执行分页查询 Page vipCodePage = vipCodeService.page(new Page<>(current, pageSize), queryWrapper); // 转换为VO对象 List vipCodeVOList = vipCodePage.getRecords().stream().map(vipCode -> { VipCodeVO vipCodeVO = new VipCodeVO(); BeanUtils.copyProperties(vipCode, vipCodeVO); return vipCodeVO; }).collect(Collectors.toList()); // 创建VO分页对象,确保正确传递所有分页信息 Page vipCodeVOPage = new Page<>(vipCodePage.getCurrent(), vipCodePage.getSize(), vipCodePage.getTotal()); vipCodeVOPage.setRecords(vipCodeVOList); // 手动设置pages值 vipCodeVOPage.setPages(vipCodePage.getPages()); return ResultUtils.success(vipCodeVOPage); } /** * 获取会员码统计数量 * * @param httpServletRequest Http请求 * @return 会员码统计数量 */ @GetMapping("/count") @Operation(summary = "获取会员码统计数量", description = "获取系统中会员码总数、可用会员码和已使用会员码的数量") public ApiResponse> getVipCodeCount(HttpServletRequest httpServletRequest) { // 权限校验 User loginUser = userService.getLoginUser(httpServletRequest); if (!userService.isAdmin(loginUser)){ return ResultUtils.error(ErrorCode.NOT_LOGIN_ERROR, "无权限"); } try { // 构建查询条件 - 总数 long totalCount = vipCodeService.count(); // 构建查询条件 - 已使用的会员码 QueryWrapper usedQueryWrapper = new QueryWrapper<>(); usedQueryWrapper.eq("isUse", 1); long usedCount = vipCodeService.count(usedQueryWrapper); // 构建查询条件 - 可用的会员码 QueryWrapper availableQueryWrapper = new QueryWrapper<>(); availableQueryWrapper.eq("isUse", 0); long availableCount = vipCodeService.count(availableQueryWrapper); // 构造返回结果 Map countMap = new HashMap<>(); countMap.put("totalCount", totalCount); countMap.put("availableCount", availableCount); countMap.put("usedCount", usedCount); return ResultUtils.success(countMap); } catch (Exception e) { log.error("获取会员码统计数量失败:{}", e.getMessage()); throw new BusinessException(ErrorCode.SYSTEM_ERROR, "获取会员码统计数量失败,请稍后重试"); } } }