diff --git a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/activity/InviteUserActivityRestController.java b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/activity/InviteUserActivityRestController.java index 5a74c272..25469738 100644 --- a/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/activity/InviteUserActivityRestController.java +++ b/rc-service/rc-service-other/other-adapter/src/main/java/com/red/circle/other/adapter/app/activity/InviteUserActivityRestController.java @@ -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; } + + /** + * 获取我的邀请人信息 + *

+ * 返回当前用户的基本信息及其邀请人的信息 + * + * @return 我的邀请人信息 + */ + @GetMapping("/my-inviter-info") + public MyInviterInfoCO getMyInviterInfo(AppExtCommand cmd) { + return inviteUserActivityService.getMyInviterInfo(cmd); + } } diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/MyInviterInfoQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/MyInviterInfoQryExe.java new file mode 100644 index 00000000..ffaa96f4 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/activity/query/MyInviterInfoQryExe.java @@ -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; + } +} \ No newline at end of file diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityServiceImpl.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityServiceImpl.java index 4ab72525..67c18fa6 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityServiceImpl.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityServiceImpl.java @@ -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 getValidInviteUsers(AppExtCommand cmd) { return getValidInviteUsersExe.execute(cmd); } + + @Override + public MyInviterInfoCO getMyInviterInfo(AppExtCommand cmd) { + return myInviterInfoQryExe.execute(cmd.getReqUserId()); + } } diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/MyInviterInfoCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/MyInviterInfoCO.java new file mode 100644 index 00000000..c85bbb6c --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/MyInviterInfoCO.java @@ -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; + } +} \ No newline at end of file diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/activity/MyInviterInfoCO.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/activity/MyInviterInfoCO.java new file mode 100644 index 00000000..240d2988 --- /dev/null +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/dto/clientobject/activity/MyInviterInfoCO.java @@ -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; + + } + +} diff --git a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityService.java b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityService.java index 8f16b53b..285f5471 100644 --- a/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityService.java +++ b/rc-service/rc-service-other/other-client/src/main/java/com/red/circle/other/app/service/activity/InviteUserActivityService.java @@ -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 getValidInviteUsers(AppExtCommand cmd); + + /** + * 获取我的邀请人信息. + */ + MyInviterInfoCO getMyInviterInfo(AppExtCommand cmd); } diff --git a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserInviteUser.java b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserInviteUser.java index 2cd5a180..704efb4f 100644 --- a/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserInviteUser.java +++ b/rc-service/rc-service-other/other-infrastructure/src/main/java/com/red/circle/other/infra/database/rds/entity/user/user/UserInviteUser.java @@ -42,7 +42,7 @@ public class UserInviteUser extends TimestampBaseEntity { private Long userId; /** - * 邀请我的用户ID + * 被邀请人userId */ @TableField("invite_user_id") private Long inviteUserId;