邀请绑定用户接口新增

This commit is contained in:
tianfeng 2025-10-21 18:55:11 +08:00
parent 93367e2874
commit d550a51bb8
7 changed files with 277 additions and 2 deletions

View File

@ -2,8 +2,6 @@ package com.red.circle.other.adapter.app.activity;
import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.common.business.dto.cmd.app.AppIdLongCmd;
import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.framework.core.response.CommonErrorCode;
import com.red.circle.other.app.dto.clientobject.activity.ActivityUserRewardPropsCO;
import com.red.circle.other.app.dto.clientobject.activity.InviteActivityCO;
import com.red.circle.other.app.dto.clientobject.activity.InviteActivityCO.InviteActivityInfoCO;
@ -12,6 +10,12 @@ import com.red.circle.other.app.dto.clientobject.activity.InviteUserCO;
import com.red.circle.other.app.dto.clientobject.activity.InviteUserCommissionDetailsCO;
import com.red.circle.other.app.dto.cmd.activity.InviteUserActivityLimitCmd;
import com.red.circle.other.app.service.activity.InviteUserActivityService;
import com.red.circle.other.app.dto.cmd.activity.BindInviteCodeCmd;
import com.red.circle.other.app.dto.clientobject.activity.InviteCodeCO;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -142,5 +146,31 @@ public class InviteUserActivityRestController {
// ResponseAssert.failure(CommonErrorCode.API_DEPRECATED);
inviteUserActivityService.receiveAward(cmd);
}
/**
* 获取我的邀请码.
*
* @eo.name 获取我的邀请码
* @eo.url /my/invite/code
* @eo.method get
* @eo.request-type formdata
*/
@GetMapping("/my/invite/code")
public InviteCodeCO getMyInviteCode(AppExtCommand cmd) {
InviteCodeCO inviteCode = inviteUserActivityService.getMyInviteCode(cmd);
return inviteCode;
}
/**
* 绑定邀请码.
*
* @eo.name 绑定邀请码
* @eo.url /bind/invite/code
* @eo.method post
* @eo.request-type json
*/
@PostMapping("/bind/invite/code")
public void bindInviteCode(@Validated @RequestBody BindInviteCodeCmd cmd) {
inviteUserActivityService.bindInviteCode(cmd);
}
}

View File

@ -0,0 +1,82 @@
package com.red.circle.other.app.command.activity;
import com.red.circle.other.app.dto.cmd.activity.BindInviteCodeCmd;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.domain.model.user.UserProfile;
import com.red.circle.other.infra.database.rds.entity.user.user.UserInviteUser;
import com.red.circle.other.infra.database.rds.service.user.user.UserInviteUserService;
import com.red.circle.tool.core.date.TimestampUtils;
import com.red.circle.tool.core.sequence.IdWorkerUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
/**
* 绑定邀请码执行器
*
* @author system
* @date 2025-01-21
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class BindInviteCodeExe {
private final UserProfileGateway userProfileGateway;
private final UserInviteUserService userInviteUserService;
/**
* 执行绑定邀请码
*
* @param cmd 绑定命令
*/
@Transactional(rollbackFor = Exception.class)
public void execute(BindInviteCodeCmd cmd) {
Long userId = cmd.getReqUserId();
String inviteCode = cmd.getInviteCode();
String sysOrigin = cmd.getReqSysOrigin().getOrigin();
log.info("开始绑定邀请码, userId={}, inviteCode={}", userId, inviteCode);
// 1. 校验用户是否存在
UserProfile userProfile = userProfileGateway.getByUserId(userId);
if (userProfile == null) {
throw new RuntimeException("The user does not exist.");
}
// 2. 校验是否已绑定过邀请人
List<UserInviteUser> existingInvite = userInviteUserService.query().eq(UserInviteUser::getUserId, userId).list();
if (existingInvite != null && !existingInvite.isEmpty()) {
throw new RuntimeException("The inviter has been bound before and cannot be bound again");
}
// 3. 根据邀请码查找邀请人邀请码即为用户账号
UserProfile inviterProfile = userProfileGateway.getByAccount(sysOrigin, inviteCode);
if (inviterProfile == null) {
throw new RuntimeException("The invitation code is invalid and the corresponding user was not found");
}
// 4. 校验不能邀请自己
if (Objects.equals(userId, inviterProfile.getId())) {
throw new RuntimeException("You cannot bind your own invitation code");
}
// 5. 保存邀请关系
UserInviteUser inviteUser = new UserInviteUser();
inviteUser.setId(IdWorkerUtils.getId());
inviteUser.setSysOrigin(sysOrigin);
inviteUser.setUserId(userId);
inviteUser.setInviteUserId(inviterProfile.getId());
inviteUser.setCreateTime(TimestampUtils.now());
inviteUser.setUpdateTime(TimestampUtils.now());
userInviteUserService.save(inviteUser);
log.info("绑定邀请码成功, userId={}, inviterUserId={}, inviteCode={}",
userId, inviterProfile.getId(), inviteCode);
}
}

View File

@ -0,0 +1,70 @@
package com.red.circle.other.app.command.activity;
import com.red.circle.common.business.dto.cmd.AppExtCommand;
import com.red.circle.other.app.dto.clientobject.activity.InviteCodeCO;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.domain.model.user.UserProfile;
import com.red.circle.other.infra.database.rds.dao.user.user.UserInviteUserDAO;
import com.red.circle.other.infra.database.rds.entity.user.user.UserInviteUser;
import com.red.circle.other.infra.database.rds.service.user.user.UserInviteUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 获取我的邀请码执行器
*
* @author system
* @date 2025-01-21
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class GetMyInviteCodeExe {
private final UserProfileGateway userProfileGateway;
private final UserInviteUserService userInviteUserService;
/**
* 执行获取我的邀请码
*
* @param cmd 命令
* @return 邀请码信息
*/
public InviteCodeCO execute(AppExtCommand cmd) {
Long userId = cmd.getReqUserId();
// 获取用户信息
UserProfile userProfile = userProfileGateway.getByUserId(userId);
if (userProfile == null) {
log.warn("用户不存在, userId={}", userId);
return null;
}
InviteCodeCO inviteCodeCO = new InviteCodeCO();
inviteCodeCO.setUserId(userId);
inviteCodeCO.setInviteCode(userProfile.getAccount()); // 使用用户账号作为邀请码
// 查询是否已绑定邀请人
List<UserInviteUser> inviteUserList = userInviteUserService.query().eq(UserInviteUser::getUserId, userId).list();
if (inviteUserList != null && !inviteUserList.isEmpty()) {
UserInviteUser inviteUser = inviteUserList.get(0);
inviteCodeCO.setHasBound(true);
inviteCodeCO.setInviterUserId(inviteUser.getInviteUserId());
// 获取邀请人信息
UserProfile inviterProfile = userProfileGateway.getByUserId(inviteUser.getInviteUserId());
if (inviterProfile != null) {
inviteCodeCO.setInviterAccount(inviterProfile.getAccount());
}
} else {
inviteCodeCO.setHasBound(false);
}
log.info("获取邀请码成功, userId={}, inviteCode={}", userId, inviteCodeCO.getInviteCode());
return inviteCodeCO;
}
}

View File

@ -16,6 +16,10 @@ import com.red.circle.other.app.dto.clientobject.activity.InviteActivityCO.Invit
import com.red.circle.other.app.dto.clientobject.activity.InviteUserActivitySummaryCO;
import com.red.circle.other.app.dto.clientobject.activity.InviteUserCO;
import com.red.circle.other.app.dto.clientobject.activity.InviteUserCommissionDetailsCO;
import com.red.circle.other.app.command.activity.GetMyInviteCodeExe;
import com.red.circle.other.app.command.activity.BindInviteCodeExe;
import com.red.circle.other.app.dto.cmd.activity.BindInviteCodeCmd;
import com.red.circle.other.app.dto.clientobject.activity.InviteCodeCO;
import com.red.circle.other.app.dto.cmd.activity.InviteUserActivityLimitCmd;
import java.util.List;
import lombok.RequiredArgsConstructor;
@ -41,6 +45,8 @@ public class InviteUserActivityServiceImpl implements InviteUserActivityService
private final InviteUserCommissionDetailsExe inviteUserCommissionDetailsExe;
private final InviteUserQuantityAwardQueryExe inviteUserQuantityAwardQueryExe;
private final InviteActivityExtractedListCmdExe inviteActivityExtractedListCmdExe;
private final GetMyInviteCodeExe getMyInviteCodeExe;
private final BindInviteCodeExe bindInviteCodeExe;
@Override
public InviteUserActivitySummaryCO getSummary(AppExtCommand cmd) {
@ -82,4 +88,14 @@ public class InviteUserActivityServiceImpl implements InviteUserActivityService
public List<InviteActivityInfoCO> extractList(AppExtCommand cmd) {
return inviteActivityExtractedListCmdExe.execute(cmd);
}
@Override
public InviteCodeCO getMyInviteCode(AppExtCommand cmd) {
return getMyInviteCodeExe.execute(cmd);
}
@Override
public void bindInviteCode(BindInviteCodeCmd cmd) {
bindInviteCodeExe.execute(cmd);
}
}

View File

@ -0,0 +1,44 @@
package com.red.circle.other.app.dto.clientobject.activity;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 邀请码客户端对象
*
* @author system
* @date 2025-01-21
*/
@Data
@Accessors(chain = true)
public class InviteCodeCO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 邀请码
*/
private String inviteCode;
/**
* 是否已绑定邀请人
*/
private Boolean hasBound;
/**
* 绑定的邀请人ID
*/
private Long inviterUserId;
/**
* 绑定的邀请人账号
*/
private String inviterAccount;
}

View File

@ -0,0 +1,21 @@
package com.red.circle.other.app.dto.cmd.activity;
import com.red.circle.common.business.dto.cmd.AppExtCommand;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 绑定邀请码命令
*
* @author system
* @date 2025-01-21
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class BindInviteCodeCmd extends AppExtCommand {
@NotBlank(message = "邀请码不能为空")
private String inviteCode;
}

View File

@ -10,6 +10,8 @@ import com.red.circle.other.app.dto.clientobject.activity.InviteUserActivitySumm
import com.red.circle.other.app.dto.clientobject.activity.InviteUserCO;
import com.red.circle.other.app.dto.clientobject.activity.InviteUserCommissionDetailsCO;
import com.red.circle.other.app.dto.cmd.activity.InviteUserActivityLimitCmd;
import com.red.circle.other.app.dto.cmd.activity.BindInviteCodeCmd;
import com.red.circle.other.app.dto.clientobject.activity.InviteCodeCO;
import java.util.List;
/**
@ -58,4 +60,14 @@ public interface InviteUserActivityService {
* 已提取列表.
*/
List<InviteActivityInfoCO> extractList(AppExtCommand cmd);
/**
* 获取我的邀请码.
*/
InviteCodeCO getMyInviteCode(AppExtCommand cmd);
/**
* 绑定邀请码.
*/
void bindInviteCode(BindInviteCodeCmd cmd);
}