diff --git a/luoo_common/src/main/java/enums/PointEnums.java b/luoo_common/src/main/java/enums/PointEnums.java index 2205570..5a11378 100644 --- a/luoo_common/src/main/java/enums/PointEnums.java +++ b/luoo_common/src/main/java/enums/PointEnums.java @@ -31,6 +31,9 @@ public enum PointEnums { LOTTERY_RESULT_WIN(1, "中奖"), LOTTERY_RESULT_LOSE(2, "未中奖"), + MEMBERSHIP_LIFE(1, "永久会员"), + MEMBERSHIP_NOT_LIFE(2, "非永久会员"), + ; private final Integer code; private final String description; diff --git a/luoo_user/src/main/java/com/luoo/user/controller/MembershipController.java b/luoo_user/src/main/java/com/luoo/user/controller/MembershipController.java index 396f9c4..d2006d5 100644 --- a/luoo_user/src/main/java/com/luoo/user/controller/MembershipController.java +++ b/luoo_user/src/main/java/com/luoo/user/controller/MembershipController.java @@ -8,7 +8,9 @@ import com.luoo.user.pojo.MembershipCode; import com.luoo.user.service.MembershipCodeService; import controller.BaseController; import io.swagger.annotations.*; + import java.util.List; + import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -29,60 +31,64 @@ import javax.validation.constraints.NotNull; @Api(tags = "会员模块") public class MembershipController extends BaseController { - @Autowired - private MembershipCodeService membershipCodeService; + @Autowired + private MembershipCodeService membershipCodeService; - @ApiOperation(value = "1.生成会员码", notes = "仅限admin权限用户调用") - @GetMapping("/code/generate") - @GlobalInterceptor(checkAdminLogin = true) - @ApiImplicitParams(value = { - @ApiImplicitParam(name = "duration", value = "会员时长(天)", required = true, dataType = "Integer", paramType = "query") - }) - public Result generateMembershipCode( - @RequestHeader(value = "Authorization", required = true) String authorization, - @NotNull Integer duration) { - return Result.success(membershipCodeService.generateMembershipCode(authorization, duration)); - } + @ApiOperation(value = "1.生成会员码", notes = "仅限admin权限用户调用") + @GetMapping("/code/generate") + @GlobalInterceptor(checkAdminLogin = true) + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "duration", value = "会员时长(天)", required = true, dataType = "Integer", paramType = "query"), + @ApiImplicitParam(name = "life", value = "是否永久会员 1-是 2-否", required = true, dataType = "Integer", paramType = "query") + }) + public Result generateMembershipCode( + @RequestHeader(value = "Authorization", required = true) String authorization, + @NotNull Integer duration, + @NotNull Integer life) { + return Result.success(membershipCodeService.generateMembershipCode(authorization, duration, life)); + } - @ApiOperation(value = "1.1 批量生成会员码", notes = "仅限admin权限用户调用") - @GetMapping("/code/generate/batch") - @GlobalInterceptor(checkAdminLogin = true) - @ApiImplicitParams(value = { - @ApiImplicitParam(name = "duration", value = "会员时长(天)", required = true, dataType = "Integer", paramType = "query"), - @ApiImplicitParam(name = "count", value = "生成数量", required = true, dataType = "Integer", paramType = "query") - }) - public Result> generateMembershipCodeBatch( - @RequestHeader(value = "Authorization", required = true) String authorization, - @NotNull Integer duration, - @NotNull Integer count) { - List list = membershipCodeService.generateMembershipCodeBatch(authorization, - duration, count); - return Result.success(list); - } + @ApiOperation(value = "1.1 批量生成会员码", notes = "仅限admin权限用户调用") + @GetMapping("/code/generate/batch") + @GlobalInterceptor(checkAdminLogin = true) + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "duration", value = "会员时长(天)", required = true, dataType = "Integer", paramType = "query"), + @ApiImplicitParam(name = "count", value = "生成数量", required = true, dataType = "Integer", paramType = "query"), + @ApiImplicitParam(name = "life", value = "是否永久会员 1-是 2-否", required = true, dataType = "Integer", paramType = "query") + }) + public Result> generateMembershipCodeBatch( + @RequestHeader(value = "Authorization", required = true) String authorization, + @NotNull Integer duration, + @NotNull Integer count, + @NotNull Integer life) { + List list = membershipCodeService.generateMembershipCodeBatch(authorization, + duration, count, life); + return Result.success(list); + } - @ApiOperation(value = "2.绑定会员码", notes = "仅限app用户调用") - @PostMapping("/code/bind") - @GlobalInterceptor(checkAppUserLogin = true) - @ApiImplicitParams(value = { - @ApiImplicitParam(name = "code", value = "会员码", required = true, dataType = "String", paramType = "query") - }) - public Result bindMembershipCode( - @RequestHeader(value = "Authorization", required = true) String authorization, - @NotNull String code) { - membershipCodeService.bindMembershipCode(authorization, code); - return Result.success(); - } + @ApiOperation(value = "2.绑定会员码", notes = "仅限app用户调用") + @PostMapping("/code/bind") + @GlobalInterceptor(checkAppUserLogin = true) + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "code", value = "会员码", required = true, dataType = "String", paramType = "query") + }) + public Result bindMembershipCode( + @RequestHeader(value = "Authorization", required = true) String authorization, + @NotNull String code) { + membershipCodeService.bindMembershipCode(authorization, code); + return Result.success(); + } - @ApiOperation(value = "3.查询会员码", notes = "仅限admin权限用户调用") - @GetMapping("/code/list") - @GlobalInterceptor(checkAdminLogin = true) - public Result> queryMembershipCode( - @RequestHeader(value = "Authorization", required = true) String authorization, - @RequestBody @ApiParam(value = "查询参数", required = true) MembershipCodeSearchDto membershipCodeSearchDto, - @ApiParam(value = "页码", required = true) @PathVariable Integer page, - @ApiParam(value = "每页条数", required = true) @PathVariable Integer size) { - return Result.success(membershipCodeService.getMembershipCodeList(authorization, page, size, - membershipCodeSearchDto)); - } + @ApiOperation(value = "3.查询会员码", notes = "仅限admin权限用户调用") + @GetMapping("/code/list{page}/{size}") + @GlobalInterceptor(checkAdminLogin = true) + public Result> queryMembershipCode( + @RequestHeader(value = "Authorization", required = true) String authorization, + @RequestBody @ApiParam(value = "查询参数", required = true) MembershipCodeSearchDto membershipCodeSearchDto, + @ApiParam(value = "页码", required = true) @PathVariable Integer page, + @ApiParam(value = "每页条数", required = true) @PathVariable Integer size) { + return Result.success(membershipCodeService.getMembershipCodeList(authorization, page, size, + membershipCodeSearchDto)); + } } diff --git a/luoo_user/src/main/java/com/luoo/user/pojo/MembershipCode.java b/luoo_user/src/main/java/com/luoo/user/pojo/MembershipCode.java index d7ab07b..92f3422 100644 --- a/luoo_user/src/main/java/com/luoo/user/pojo/MembershipCode.java +++ b/luoo_user/src/main/java/com/luoo/user/pojo/MembershipCode.java @@ -45,6 +45,10 @@ public class MembershipCode implements Serializable { @ApiModelProperty(value = "时长") private Integer duration; + @Column(name = "life") + @ApiModelProperty(value = "是否永久会员 1-是 2-否") + private Integer life; + @Size(max = 20) @Column(name = "user_id", length = 20) @ApiModelProperty(value = "用户id") diff --git a/luoo_user/src/main/java/com/luoo/user/service/MembershipCodeService.java b/luoo_user/src/main/java/com/luoo/user/service/MembershipCodeService.java index 39b1a31..3fd148f 100644 --- a/luoo_user/src/main/java/com/luoo/user/service/MembershipCodeService.java +++ b/luoo_user/src/main/java/com/luoo/user/service/MembershipCodeService.java @@ -10,14 +10,17 @@ import com.luoo.user.pojo.UserInfo; import com.luoo.user.pojo.UserPointLog; import dto.UserLoginDto; import enums.MembershipEnums; +import enums.PointEnums; import enums.UserVipStatusEnum; import exception.BizException; + import java.util.ArrayList; import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; + import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.data.domain.Page; @@ -47,146 +50,157 @@ import java.util.UUID; @Slf4j public class MembershipCodeService { - private final MembershipCodeDao membershipCodeDao; - - private final IdWorker idWorker; - - private final JwtUtil jwtUtil; - - private final UserInfoDao userInfoDao; - - public MembershipCodeService(JwtUtil jwtUtil, IdWorker idWorker, - MembershipCodeDao membershipCodeDao, UserInfoDao userInfoDao) { - this.jwtUtil = jwtUtil; - this.idWorker = idWorker; - this.membershipCodeDao = membershipCodeDao; - this.userInfoDao = userInfoDao; - } - - /** - * 创建会员码并保存 会员码取UUID - * - * @param token token - * @param duration 会员时长(天) - * @return 会员码 - */ - @Transactional(rollbackFor = Exception.class) - public String generateMembershipCode(String token, Integer duration) { - UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); - - // UUID作为会员码 - String code = UUID.randomUUID().toString(); - MembershipCode build = MembershipCode.builder() - .id(String.valueOf(idWorker.nextId())) - .code(code) - .status(MembershipEnums.CREATED.getCode()) - .duration(duration) - .createUser(userLoginDto.getUserId()) - .build(); - membershipCodeDao.save(build); - return code; - } - - /** - * 批量生成会员码 - * - * @param token token - * @param duration 会员时长(天) - * @param count 生成会员码数量 - * @return 会员码list - */ - @Transactional(rollbackFor = Exception.class) - public List generateMembershipCodeBatch(String token, Integer duration, Integer count) { - List result = new ArrayList<>(); - for (int i = 0; i < count; i++) { - String code = generateMembershipCode(token, duration); - result.add(code); + private final MembershipCodeDao membershipCodeDao; + + private final IdWorker idWorker; + + private final JwtUtil jwtUtil; + + private final UserInfoDao userInfoDao; + + public MembershipCodeService(JwtUtil jwtUtil, IdWorker idWorker, + MembershipCodeDao membershipCodeDao, UserInfoDao userInfoDao) { + this.jwtUtil = jwtUtil; + this.idWorker = idWorker; + this.membershipCodeDao = membershipCodeDao; + this.userInfoDao = userInfoDao; + } + + /** + * 创建会员码并保存 会员码取UUID + * + * @param token token + * @param duration 会员时长(天) + * @param life 是否永久会员 + * @return 会员码 + */ + @Transactional(rollbackFor = Exception.class) + public String generateMembershipCode(String token, Integer duration, Integer life) { + UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); + + // UUID作为会员码 + String code = UUID.randomUUID().toString(); + MembershipCode build = MembershipCode.builder() + .id(String.valueOf(idWorker.nextId())) + .code(code) + .status(MembershipEnums.CREATED.getCode()) + .duration(duration) + .life(life) + .createUser(userLoginDto.getUserId()) + .build(); + membershipCodeDao.save(build); + return code; + } + + /** + * 批量生成会员码 + * + * @param token token + * @param duration 会员时长(天) + * @param count 生成会员码数量 + * @param life 是否永久会员 + * @return 会员码list + */ + @Transactional(rollbackFor = Exception.class) + public List generateMembershipCodeBatch(String token, Integer duration, Integer count, Integer life) { + List result = new ArrayList<>(); + for (int i = 0; i < count; i++) { + String code = generateMembershipCode(token, duration, life); + result.add(code); + } + return result; } - return result; - } - - /** - * 绑定会员码 - * - * @param token token - * @param code 会员码 - */ - @Transactional(rollbackFor = Exception.class) - public void bindMembershipCode(String token, String code) { - UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); - MembershipCode membershipCode = membershipCodeDao.findMembershipCodeByCodeAndStatus(code, - MembershipEnums.CREATED.getCode()); - if (membershipCode == null) { - throw new BizException("会员码不存在"); + + /** + * 绑定会员码 + * + * @param token token + * @param code 会员码 + */ + @Transactional(rollbackFor = Exception.class) + public void bindMembershipCode(String token, String code) { + UserLoginDto userLoginDto = jwtUtil.getUserLoginDto(token); + MembershipCode membershipCode = membershipCodeDao.findMembershipCodeByCodeAndStatus(code, + MembershipEnums.CREATED.getCode()); + if (membershipCode == null) { + throw new BizException("会员码不存在"); + } + // 处理会员码表 + membershipCode.setStatus(MembershipEnums.BIND.getCode()); + membershipCode.setUserId(userLoginDto.getUserId()); + membershipCode.setUpdateUser(userLoginDto.getUserId()); + membershipCodeDao.save(membershipCode); + + // 处理用户表 + UserInfo userInfo = userInfoDao.findById(userLoginDto.getUserId()).get(); + + // 永久会员码 + if(Objects.equals(membershipCode.getLife(), PointEnums.MEMBERSHIP_LIFE.getCode())) { + userInfo.setVipStatus(UserVipStatusEnum.LIFE.getCode()); + } else { + // 非永久会员码 + // 计算会员到期时间 + LocalDate vipExpireTime; + if (Objects.equals(UserVipStatusEnum.INITIAL.getCode(), userInfo.getVipStatus())) { + vipExpireTime = userInfo.getVipExpireTime().plusDays(membershipCode.getDuration()); + } else { + // 从今天开始,增加membershipCode的duration天 + userInfo.setVipStatus(UserVipStatusEnum.INITIAL.getCode()); + vipExpireTime = LocalDate.now().plusDays(membershipCode.getDuration()); + } + userInfo.setVipExpireTime(vipExpireTime); + // 无论如何当即设置为会员生效状态 + userInfo.setVipStatus(UserVipStatusEnum.ACTIVE.getCode()); + } + + userInfoDao.save(userInfo); + } - // 处理会员码表 - membershipCode.setStatus(MembershipEnums.BIND.getCode()); - membershipCode.setUserId(userLoginDto.getUserId()); - membershipCode.setUpdateUser(userLoginDto.getUserId()); - membershipCodeDao.save(membershipCode); - - // 处理用户表 - UserInfo userInfo = userInfoDao.findById(userLoginDto.getUserId()).get(); - // 计算会员到期时间 - LocalDate vipExpireTime; - if (Objects.equals(UserVipStatusEnum.INITIAL.getCode(), userInfo.getVipStatus())) { - vipExpireTime = userInfo.getVipExpireTime().plusDays(membershipCode.getDuration()); - } else { - // 从今天开始,增加membershipCode的duration天 - userInfo.setVipStatus(UserVipStatusEnum.INITIAL.getCode()); - vipExpireTime = LocalDate.now().plusDays(membershipCode.getDuration()); + + public PageResult getMembershipCodeList(String token, Integer page, Integer size, + MembershipCodeSearchDto membershipCodeSearchDto) { + + Sort sort = new Sort(Direction.DESC, "createTime"); + PageRequest pageRequest = PageRequest.of(page - 1, size, sort); + + Specification specification = buildSearchSpecification(membershipCodeSearchDto); + Page membershipCodePage = membershipCodeDao.findAll(specification, pageRequest); + + long totalElements = membershipCodePage.getTotalElements(); + return new PageResult<>(totalElements, membershipCodePage.getContent()); + } + + private Specification buildSearchSpecification(MembershipCodeSearchDto param) { + return (Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) -> { + List predicateList = new ArrayList(); + + if (StringUtils.isNotBlank(param.getCode())) { + predicateList.add( + criteriaBuilder.and(criteriaBuilder.equal(root.get("code"), param.getCode()))); + } + + if (StringUtils.isNotBlank(param.getCreateUser())) { + predicateList.add( + criteriaBuilder.and( + criteriaBuilder.equal(root.get("createUser"), param.getCreateUser()))); + } + + if (StringUtils.isNotBlank(param.getUserId())) { + predicateList.add( + criteriaBuilder.and(criteriaBuilder.equal(root.get("userId"), param.getUserId()))); + } + + if (param.getStatus() != null) { + predicateList.add( + criteriaBuilder.and(criteriaBuilder.equal(root.get("status"), param.getStatus()))); + } + + if (param.getDuration() != null) { + predicateList.add( + criteriaBuilder.and(criteriaBuilder.equal(root.get("duration"), param.getDuration()))); + } + + return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); + }; } - userInfo.setVipExpireTime(vipExpireTime); - // 无论如何当即设置为会员生效状态 - userInfo.setVipStatus(UserVipStatusEnum.ACTIVE.getCode()); - userInfoDao.save(userInfo); - - } - - public PageResult getMembershipCodeList(String token, Integer page, Integer size, - MembershipCodeSearchDto membershipCodeSearchDto) { - - Sort sort = new Sort(Direction.DESC, "createTime"); - PageRequest pageRequest = PageRequest.of(page - 1, size, sort); - - Specification specification = buildSearchSpecification(membershipCodeSearchDto); - Page membershipCodePage = membershipCodeDao.findAll(specification, pageRequest); - - long totalElements = membershipCodePage.getTotalElements(); - return new PageResult<>(totalElements, membershipCodePage.getContent()); - } - - private Specification buildSearchSpecification(MembershipCodeSearchDto param) { - return (Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) -> { - List predicateList = new ArrayList(); - - if (StringUtils.isNotBlank(param.getCode())) { - predicateList.add( - criteriaBuilder.and(criteriaBuilder.equal(root.get("code"), param.getCode()))); - } - - if (StringUtils.isNotBlank(param.getCreateUser())) { - predicateList.add( - criteriaBuilder.and( - criteriaBuilder.equal(root.get("createUser"), param.getCreateUser()))); - } - - if (StringUtils.isNotBlank(param.getUserId())) { - predicateList.add( - criteriaBuilder.and(criteriaBuilder.equal(root.get("userId"), param.getUserId()))); - } - - if (param.getStatus() != null) { - predicateList.add( - criteriaBuilder.and(criteriaBuilder.equal(root.get("status"), param.getStatus()))); - } - - if (param.getDuration() != null) { - predicateList.add( - criteriaBuilder.and(criteriaBuilder.equal(root.get("duration"), param.getDuration()))); - } - - return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); - }; - } } diff --git a/luoo_user/src/main/resources/sql/20240719.sql b/luoo_user/src/main/resources/sql/20240719.sql index 0627155..07706d5 100644 --- a/luoo_user/src/main/resources/sql/20240719.sql +++ b/luoo_user/src/main/resources/sql/20240719.sql @@ -3,14 +3,16 @@ create table tb_membership_code id varchar(20) not null comment 'id' primary key, code varchar(50) null comment '会员码', - status tinyint null comment '状态 1-已生成 2-已绑定 3-已退款 4-已废弃', - duration int null comment '会员时长(天)', + status tinyint null comment '状态 1-已生成 2-已绑定 3-已退款 4-已废弃', + duration int null comment '会员时长(天)', + life tinyint null comment '是否永久会员 1-是 2-否', user_id varchar(20) null comment '使用用户', - create_time datetime null comment '创建时间', - update_time datetime null comment '修改时间', + create_time datetime null comment '创建时间', + update_time datetime null comment '修改时间', create_user varchar(20) null comment '创建人', update_user varchar(20) null comment '修改人' -) comment '会员码'; +) + comment '会员码'; create table tb_user_point_log (