邀请 新增我的邀请人信息查询接口

This commit is contained in:
tianfeng 2025-10-28 18:28:17 +08:00
parent ad69f67c4a
commit b0199267a0
7 changed files with 252 additions and 17 deletions

View File

@ -2,18 +2,11 @@ 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.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.*;
import com.red.circle.other.app.dto.clientobject.activity.InviteActivityCO.InviteActivityInfoCO;
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.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 com.red.circle.other.app.dto.clientobject.activity.InviteIncomeStatisticsCO;
import com.red.circle.other.app.dto.clientobject.activity.ValidInviteUserCO;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
@ -203,4 +196,16 @@ public class InviteUserActivityRestController {
return users;
}
/**
* 获取我的邀请人信息
* <p>
* 返回当前用户的基本信息及其邀请人的信息
*
* @return 我的邀请人信息
*/
@GetMapping("/my-inviter-info")
public MyInviterInfoCO getMyInviterInfo(AppExtCommand cmd) {
return inviteUserActivityService.getMyInviterInfo(cmd);
}
}

View File

@ -0,0 +1,85 @@
package com.red.circle.other.app.command.activity.query;
import com.red.circle.other.app.dto.clientobject.activity.MyInviterInfoCO;
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.other.inner.endpoint.user.user.UserProfileClient;
import com.red.circle.other.inner.model.dto.user.UserProfileDTO;
import com.red.circle.tool.core.date.TimestampUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
import java.util.Objects;
/**
* 查询我的邀请人信息执行器
*
* @author Claude
* @since 2025-10-28
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MyInviterInfoQryExe {
private final UserInviteUserService inviteUserService;
private final UserProfileClient userProfileClient;
public MyInviterInfoCO execute(Long userId) {
// 1. 获取当前用户信息
UserProfileDTO currentUser = userProfileClient.getByUserId(userId).getBody();
if (currentUser == null) {
log.warn("用户不存在, userId: {}", userId);
return null;
}
// 2. 构建返回对象 - 当前用户信息
MyInviterInfoCO result = new MyInviterInfoCO();
MyInviterInfoCO.UserBasicInfoCO userBasicInfoCO = new MyInviterInfoCO.UserBasicInfoCO();
userBasicInfoCO.setUserId(currentUser.getId());
userBasicInfoCO.setUserName(currentUser.getUserNickname());
userBasicInfoCO.setAvatar(currentUser.getUserAvatar());
userBasicInfoCO.setCreateTime(currentUser.getCreateTime());
// 校验用户创建时间是否超过3天
Timestamp createTime = currentUser.getCreateTime();
if (createTime != null) {
long createTimeMillis = createTime.getTime();
long currentTime = TimestampUtils.now().getTime();
long threeDaysInMillis = 3 * 24 * 60 * 60 * 1000L; // 3天的毫秒数
long timeDiff = currentTime - createTimeMillis;
if (timeDiff > threeDaysInMillis) {
userBasicInfoCO.setExpired(true);
}
}
result.setMyInfo(userBasicInfoCO);
// 3. 查询邀请关系
UserInviteUser inviteRelation = inviteUserService.query()
.eq(UserInviteUser::getInviteUserId, userId)
.last("limit 1")
.getOne();
if (inviteRelation == null || inviteRelation.getInviteUserId() == null) {
// 没有邀请人直接返回
return result;
}
// 4. 获取邀请人信息
Long inviterUserId = inviteRelation.getUserId();
UserProfileDTO inviterUser = userProfileClient.getByUserId(inviterUserId).getBody();
if (inviterUser != null) {
MyInviterInfoCO.UserBasicInfoCO inviter = new MyInviterInfoCO.UserBasicInfoCO();
inviter.setUserId(inviterUser.getId());
inviter.setUserName(inviterUser.getUserNickname());
inviter.setAvatar(inviterUser.getUserAvatar());
inviter.setCreateTime(inviterUser.getCreateTime());
result.setInviterInfo(inviter);
}
return result;
}
}

View File

@ -10,20 +10,14 @@ import com.red.circle.other.app.command.activity.InviteUserListExe;
import com.red.circle.other.app.command.activity.InviteUserReceiveAwardExe;
import com.red.circle.other.app.command.activity.InviteUserSummaryExe;
import com.red.circle.other.app.command.activity.query.InviteUserQuantityAwardQueryExe;
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.command.activity.query.MyInviterInfoQryExe;
import com.red.circle.other.app.dto.clientobject.activity.*;
import com.red.circle.other.app.dto.clientobject.activity.InviteActivityCO.InviteActivityInfoCO;
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.command.activity.GetIncomeStatisticsExe;
import com.red.circle.other.app.command.activity.GetValidInviteUsersExe;
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.clientobject.activity.InviteIncomeStatisticsCO;
import com.red.circle.other.app.dto.clientobject.activity.ValidInviteUserCO;
import com.red.circle.other.app.dto.cmd.activity.InviteUserActivityLimitCmd;
import java.util.List;
import lombok.RequiredArgsConstructor;
@ -53,6 +47,7 @@ public class InviteUserActivityServiceImpl implements InviteUserActivityService
private final BindInviteCodeExe bindInviteCodeExe;
private final GetIncomeStatisticsExe getIncomeStatisticsExe;
private final GetValidInviteUsersExe getValidInviteUsersExe;
private final MyInviterInfoQryExe myInviterInfoQryExe;
@Override
public InviteUserActivitySummaryCO getSummary(AppExtCommand cmd) {
@ -114,4 +109,9 @@ public class InviteUserActivityServiceImpl implements InviteUserActivityService
public List<ValidInviteUserCO> getValidInviteUsers(AppExtCommand cmd) {
return getValidInviteUsersExe.execute(cmd);
}
@Override
public MyInviterInfoCO getMyInviterInfo(AppExtCommand cmd) {
return myInviterInfoQryExe.execute(cmd.getReqUserId());
}
}

View File

@ -0,0 +1,66 @@
package com.red.circle.other.app.dto.clientobject;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 我的邀请人信息 CO
*
* @author Claude
* @since 2025-10-28
*/
@Data
public class MyInviterInfoCO {
/**
* 用户ID
*/
private Long userId;
/**
* 用户昵称
*/
private String nickname;
/**
* 用户头像
*/
private String avatar;
/**
* 用户创建时间
*/
private LocalDateTime createTime;
/**
* 邀请人信息
*/
private InviterInfo inviter;
/**
* 邀请人信息内部类
*/
@Data
public static class InviterInfo {
/**
* 邀请人ID
*/
private Long userId;
/**
* 邀请人昵称
*/
private String nickname;
/**
* 邀请人头像
*/
private String avatar;
/**
* 邀请人创建时间
*/
private LocalDateTime createTime;
}
}

View File

@ -0,0 +1,73 @@
package com.red.circle.other.app.dto.clientobject.activity;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.time.LocalDateTime;
/**
* 我的邀请人信息客户端对象.
*
* @author tf
* @since 2025-10-28
*/
@Data
public class MyInviterInfoCO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 我的用户信息.
*/
private UserBasicInfoCO myInfo;
/**
* 邀请人信息.
*/
private UserBasicInfoCO inviterInfo;
/**
* 用户基本信息.
*/
@Data
public static class UserBasicInfoCO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID.
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long userId;
/**
* 用户名.
*/
private String userName;
/**
* 头像.
*/
private String avatar;
/**
* 邀请码.
*/
private String inviteCode;
/**
* 用户创建时间.
*/
private Timestamp createTime;
/**
* 是否超过三天过期
*/
private boolean expired;
}
}

View File

@ -13,6 +13,7 @@ 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 com.red.circle.other.app.dto.clientobject.activity.InviteIncomeStatisticsCO;
import com.red.circle.other.app.dto.clientobject.activity.MyInviterInfoCO;
import com.red.circle.other.app.dto.clientobject.activity.ValidInviteUserCO;
import java.util.List;
@ -82,4 +83,9 @@ public interface InviteUserActivityService {
* 有效邀请用户列表.
*/
List<ValidInviteUserCO> getValidInviteUsers(AppExtCommand cmd);
/**
* 获取我的邀请人信息.
*/
MyInviterInfoCO getMyInviterInfo(AppExtCommand cmd);
}

View File

@ -42,7 +42,7 @@ public class UserInviteUser extends TimestampBaseEntity {
private Long userId;
/**
* 邀请我的用户ID
* 被邀请人userId
*/
@TableField("invite_user_id")
private Long inviteUserId;