From a91dacd442a8582621d57fb895e8952a4eac29c2 Mon Sep 17 00:00:00 2001 From: chenxing Date: Wed, 19 Aug 2026 17:35:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A8=E9=80=81=E8=AE=A2=E9=98=85=E6=9B=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yunhai/userbase/event/DataSyncEvent.java | 2 ++ .../userbase/service/impl/SysUserService.java | 15 ++++++++++- .../userbase/service/push/PushDispatcher.java | 26 ++++++++++++++----- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/yunhai/userbase/event/DataSyncEvent.java b/src/main/java/com/yunhai/userbase/event/DataSyncEvent.java index 8e415cb..c1d667f 100644 --- a/src/main/java/com/yunhai/userbase/event/DataSyncEvent.java +++ b/src/main/java/com/yunhai/userbase/event/DataSyncEvent.java @@ -22,4 +22,6 @@ public class DataSyncEvent { private List groupIds; /** 用户事件携带的受影响用户 id 列表 */ private List userIds; + /** 组维度的关联事件(如删除用户=解除组关系)携带的组 id */ + private Integer groupId; } diff --git a/src/main/java/com/yunhai/userbase/service/impl/SysUserService.java b/src/main/java/com/yunhai/userbase/service/impl/SysUserService.java index 3d87eb5..c547268 100644 --- a/src/main/java/com/yunhai/userbase/service/impl/SysUserService.java +++ b/src/main/java/com/yunhai/userbase/service/impl/SysUserService.java @@ -239,7 +239,8 @@ public class SysUserService implements ISysUserService { } } // 业务语义:从组移除 = 对子应用即删除(不论是否真删账户),统一推送 DELETE_USER - publishUserEvent(PushInterfaceType.DELETE_USER, userIds); + // 因是「解除组关系」,需携带 (userId, groupId) 供子应用精确处理 + publishUserEvent(PushInterfaceType.DELETE_USER, userIds, groupId); } @Override @@ -1019,4 +1020,16 @@ public class SysUserService implements ISysUserService { e.setUserIds(userIds); eventPublisher.publishEvent(e); } + + /** 组维度的用户事件(如 DELETE_USER=解除组关系),额外携带组 id */ + private void publishUserEvent(PushInterfaceType type, List userIds, Integer groupId) { + if (userIds == null || userIds.isEmpty()) { + return; + } + DataSyncEvent e = new DataSyncEvent(); + e.setType(type); + e.setUserIds(userIds); + e.setGroupId(groupId); + eventPublisher.publishEvent(e); + } } diff --git a/src/main/java/com/yunhai/userbase/service/push/PushDispatcher.java b/src/main/java/com/yunhai/userbase/service/push/PushDispatcher.java index 5092623..58515ce 100644 --- a/src/main/java/com/yunhai/userbase/service/push/PushDispatcher.java +++ b/src/main/java/com/yunhai/userbase/service/push/PushDispatcher.java @@ -70,8 +70,9 @@ public class PushDispatcher { if (type == PushInterfaceType.DELETE_GROUP || type == PushInterfaceType.DELETE_USER) { List ids = (type == PushInterfaceType.DELETE_GROUP) ? event.getGroupIds() : event.getUserIds(); + Integer groupId = event.getGroupId(); for (ApplicationInfo app : applicationInfoRepository.findByPushEnabled(1)) { - dispatchDeleteToOne(app, type, ids, "auto"); + dispatchDeleteToOne(app, type, ids, groupId, "auto"); } return; } @@ -188,7 +189,8 @@ public class PushDispatcher { // ===================== 核心 ===================== /** 删除类事件专用投递:跳过 DB 重载与范围过滤,直接用事件携带的 id 构建删除体。 */ - private void dispatchDeleteToOne(ApplicationInfo app, PushInterfaceType type, List ids, String triggerType) { + private void dispatchDeleteToOne(ApplicationInfo app, PushInterfaceType type, List ids, + Integer groupId, String triggerType) { if (app.getPushEnabled() == null || app.getPushEnabled() != 1) { return; } @@ -199,20 +201,32 @@ public class PushDispatcher { if (ids == null || ids.isEmpty()) { return; } - for (Object bodyObj : buildDeleteBodies(type, ids)) { + for (Object bodyObj : buildDeleteBodies(type, ids, groupId)) { sendMessage(app, type, bodyObj, triggerType); } } - /** 删除类接口 body 形态:DELETE_GROUP 每个 id 一条 {id};DELETE_USER 整体一条数组 [id,...]。 */ - private List buildDeleteBodies(PushInterfaceType type, List ids) { + /** + * 删除类接口 body 形态:
+ * DELETE_GROUP:每个 id 一条 {@code {id}};
+ * DELETE_USER:因是「解除组关系」,每行携带 {@code {userId, groupId}}(整体一条数组)。 + */ + private List buildDeleteBodies(PushInterfaceType type, List ids, Integer groupId) { if (type == PushInterfaceType.DELETE_GROUP) { return ids.stream() .map(id -> Collections.singletonMap("id", id)) .collect(Collectors.toList()); } if (type == PushInterfaceType.DELETE_USER) { - return Collections.singletonList(new ArrayList<>(ids)); + // 单组维度批量移出,所有 userId 共享同一 groupId + return ids.stream() + .map(userId -> { + Map item = new LinkedHashMap<>(); + item.put("userId", userId); + item.put("groupId", groupId); + return item; + }) + .collect(Collectors.toList()); } return Collections.emptyList(); }