cp系统完善

This commit is contained in:
hy001 2026-05-22 15:57:48 +08:00
parent 9e37b347a3
commit 8f573739a2
3 changed files with 164 additions and 6 deletions

View File

@ -128,6 +128,13 @@ task:
topic: ${TASK_CENTER_EVENT_MQ_TOPIC:RC_DEFAULT_APP_ORDINARY}
tag: ${TASK_CENTER_EVENT_MQ_TAG:task_center_event}
cp:
relation-broadcast:
mq:
enabled: ${CP_RELATION_BROADCAST_MQ_ENABLED:false}
topic: ${CP_RELATION_BROADCAST_MQ_TOPIC:RC_DEFAULT_APP_ORDINARY}
tag: ${CP_RELATION_BROADCAST_MQ_TAG:cp_relation_broadcast}
voice-room:
region-broadcast:
go:

View File

@ -4,9 +4,10 @@ import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.external.inner.endpoint.message.ImMessageClient;
import com.red.circle.framework.core.asserts.ResponseAssert;
import com.red.circle.framework.core.response.CommonErrorCode;
import com.red.circle.mq.business.model.event.user.CpApplyEvent;
import com.red.circle.mq.rocket.business.producer.UserMqMessageService;
import com.red.circle.other.app.dto.cmd.user.relation.cp.ProcessApplyCmd;
import com.red.circle.mq.business.model.event.user.CpApplyEvent;
import com.red.circle.mq.rocket.business.producer.UserMqMessageService;
import com.red.circle.other.app.common.cp.CpRelationBroadcastMqClient;
import com.red.circle.other.app.dto.cmd.user.relation.cp.ProcessApplyCmd;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.infra.database.cache.service.cp.CpRelationshipCacheService;
import com.red.circle.other.infra.database.rds.entity.user.user.CpApply;
@ -47,9 +48,10 @@ public class ProcessCpApplyCmd {
private final ImMessageClient imMessageClient;
private final WalletGoldClient walletGoldClient;
private final UserMqMessageService userMqMessageService;
private final CpRelationshipService cpRelationshipService;
private final UserProfileGateway userProfileGateway;
private final CpRelationshipCacheService cpRelationshipCacheService;
private final CpRelationshipService cpRelationshipService;
private final UserProfileGateway userProfileGateway;
private final CpRelationshipCacheService cpRelationshipCacheService;
private final CpRelationBroadcastMqClient cpRelationBroadcastMqClient;
public void execute(ProcessApplyCmd cmd) {
process(cmd);
@ -106,6 +108,8 @@ public class ProcessCpApplyCmd {
refuseStatusWaitIfLimitReached(cmd, cpApply, relationType);
cpRelationshipCacheService.remove(Arrays.asList(cpApply.getSendApplyUserId(), cpApply.getAcceptApplyUserId()));
cpRelationBroadcastMqClient.publish(cmd.requireReqSysOrigin(), cpApply.getId(),
cpApply.getSendApplyUserId(), cpApply.getAcceptApplyUserId(), relationType);
}
private void refuseStatusWaitIfLimitReached(ProcessApplyCmd cmd, CpApply cpApply,

View File

@ -0,0 +1,147 @@
package com.red.circle.other.app.common.cp;
import com.red.circle.component.mq.MessageEvent;
import com.red.circle.mq.rocket.business.service.MessageSenderService;
import com.red.circle.other.domain.gateway.user.UserProfileGateway;
import com.red.circle.other.domain.model.user.UserProfile;
import com.red.circle.other.infra.enums.user.user.CpRelationshipType;
import java.time.Instant;
import java.util.Objects;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RequiredArgsConstructor
public class CpRelationBroadcastMqClient {
private final ObjectProvider<MessageSenderService> messageSenderServiceProvider;
private final UserProfileGateway userProfileGateway;
@Value("${cp.relation-broadcast.mq.enabled:false}")
private boolean mqEnabled;
@Value("${cp.relation-broadcast.mq.topic:RC_DEFAULT_APP_ORDINARY}")
private String mqTopic;
@Value("${cp.relation-broadcast.mq.tag:cp_relation_broadcast}")
private String mqTag;
public void publish(String sysOrigin, Long applyId, Long userId, Long cpUserId, String relationType) {
if (!mqEnabled) {
return;
}
if (Objects.isNull(userId) || Objects.isNull(cpUserId)) {
log.warn("CP relation broadcast mq skip: user id missing. applyId={}, userId={}, cpUserId={}",
applyId, userId, cpUserId);
return;
}
String normalizedRelationType = CpRelationshipType.normalize(relationType);
String eventId = buildEventId(applyId, userId, cpUserId, normalizedRelationType);
CpRelationBroadcastEvent event = new CpRelationBroadcastEvent()
.setSysOrigin(defaultIfBlank(sysOrigin, "LIKEI"))
.setEventId(eventId)
.setApplyId(applyId)
.setRelationType(normalizedRelationType)
.setUserId(userId)
.setCpUserId(cpUserId)
.setSendUserId(userId)
.setAcceptUserId(cpUserId)
.setOccurredAt(Instant.now().toString())
.setUser(loadUser(userId))
.setCpUser(loadUser(cpUserId));
try {
MessageSenderService senderService = messageSenderServiceProvider.getIfAvailable();
if (Objects.isNull(senderService)) {
log.warn("CP relation broadcast mq sender missing, skip. eventId={}", eventId);
return;
}
senderService.sendEventMessage(MessageEvent.builder()
.consumeId(eventId)
.topicString(defaultIfBlank(mqTopic, "RC_DEFAULT_APP_ORDINARY"))
.tag(defaultIfBlank(mqTag, "cp_relation_broadcast"))
.body(event)
.build());
} catch (Exception e) {
log.warn("CP relation broadcast mq publish error. eventId={}", eventId, e);
}
}
private CpRelationUser loadUser(Long userId) {
CpRelationUser fallback = new CpRelationUser()
.setId(userId)
.setUserId(userId)
.setAccount(Objects.toString(userId, ""))
.setUserNickname(Objects.toString(userId, ""));
try {
UserProfile profile = userProfileGateway.getByUserId(userId);
if (Objects.isNull(profile)) {
return fallback;
}
return new CpRelationUser()
.setId(profile.getId())
.setUserId(profile.getId())
.setAccount(defaultIfBlank(profile.getAccount(), fallback.getAccount()))
.setUserNickname(defaultIfBlank(profile.getUserNickname(), fallback.getUserNickname()))
.setNickname(defaultIfBlank(profile.getUserNickname(), fallback.getUserNickname()))
.setUserAvatar(profile.getUserAvatar())
.setAvatar(profile.getUserAvatar())
.setCountryCode(profile.getCountryCode())
.setCountryName(profile.getCountryName())
.setOriginSys(profile.getOriginSys());
} catch (Exception e) {
log.warn("CP relation broadcast load user profile failed. userId={}", userId, e);
return fallback;
}
}
private String buildEventId(Long applyId, Long userId, Long cpUserId, String relationType) {
if (Objects.nonNull(applyId)) {
return "CP_RELATION:" + relationType + ":" + applyId;
}
return "CP_RELATION:" + relationType + ":" + userId + ":" + cpUserId;
}
private String defaultIfBlank(String value, String fallback) {
String normalized = Objects.toString(value, "").trim();
return normalized.isEmpty() ? fallback : normalized;
}
@Data
@Accessors(chain = true)
private static class CpRelationBroadcastEvent {
private String sysOrigin;
private String eventId;
private Long applyId;
private String relationType;
private Long userId;
private Long cpUserId;
private Long sendUserId;
private Long acceptUserId;
private String occurredAt;
private CpRelationUser user;
private CpRelationUser cpUser;
}
@Data
@Accessors(chain = true)
private static class CpRelationUser {
private Long id;
private Long userId;
private String account;
private String nickname;
private String userNickname;
private String avatar;
private String userAvatar;
private String countryCode;
private String countryName;
private String originSys;
}
}