release: 修改会员,是否永久会员

release-2024-08-08
huangyw 4 months ago
parent 11b49e598f
commit a0d580aaf1

@ -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;

@ -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<String> 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<String> 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<List<String>> generateMembershipCodeBatch(
@RequestHeader(value = "Authorization", required = true) String authorization,
@NotNull Integer duration,
@NotNull Integer count) {
List<String> 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<List<String>> generateMembershipCodeBatch(
@RequestHeader(value = "Authorization", required = true) String authorization,
@NotNull Integer duration,
@NotNull Integer count,
@NotNull Integer life) {
List<String> 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<Void> 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<Void> 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<PageResult<MembershipCode>> 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<PageResult<MembershipCode>> 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));
}
}

@ -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")

@ -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<String> generateMembershipCodeBatch(String token, Integer duration, Integer count) {
List<String> 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<String> generateMembershipCodeBatch(String token, Integer duration, Integer count, Integer life) {
List<String> 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<MembershipCode> 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<MembershipCode> specification = buildSearchSpecification(membershipCodeSearchDto);
Page<MembershipCode> membershipCodePage = membershipCodeDao.findAll(specification, pageRequest);
long totalElements = membershipCodePage.getTotalElements();
return new PageResult<>(totalElements, membershipCodePage.getContent());
}
private Specification<MembershipCode> buildSearchSpecification(MembershipCodeSearchDto param) {
return (Root<MembershipCode> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) -> {
List<Predicate> predicateList = new ArrayList<Predicate>();
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<MembershipCode> 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<MembershipCode> specification = buildSearchSpecification(membershipCodeSearchDto);
Page<MembershipCode> membershipCodePage = membershipCodeDao.findAll(specification, pageRequest);
long totalElements = membershipCodePage.getTotalElements();
return new PageResult<>(totalElements, membershipCodePage.getContent());
}
private Specification<MembershipCode> buildSearchSpecification(MembershipCodeSearchDto param) {
return (Root<MembershipCode> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) -> {
List<Predicate> predicateList = new ArrayList<Predicate>();
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()]));
};
}
}

@ -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
(

Loading…
Cancel
Save