fix(emergency): getActualGroupMemberList兜底补拉关爱/急救人员 + addGroupUser加9人上限

- 调用getActualGroupMemberList时先执行addCareUsersToGroup重新查询安眼系统,兜底补拉发起应急时未注册的关爱联络员/急救人员
- addCareUsersToGroup改为public,暴露给EmergencyOrderApiService调用
- addGroupUser增加9人群成员上限校验

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-22 11:13:40 +08:00
co-authored by Claude
parent df41e0c8ce
commit 1167ac792e
3 changed files with 24 additions and 9 deletions
@@ -45,5 +45,10 @@ public interface EmergencyApiService {
boolean addGroupUser(AddOtherMemberDTO dto); boolean addGroupUser(AddOtherMemberDTO dto);
/**
* 拉入关爱联络员和急救人员到群聊(兜底补拉用,失败不抛异常)
*/
void addCareUsersToGroup(String userId, String groupId, String orderId);
boolean removeGroupUser(RemoveGroupMemberDTO dto); boolean removeGroupUser(RemoveGroupMemberDTO dto);
} }
@@ -1001,7 +1001,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
* @param groupId IM群组ID * @param groupId IM群组ID
* @param orderId 应急工单ID * @param orderId 应急工单ID
*/ */
private void addCareUsersToGroup(String userId, String groupId, String orderId) { public void addCareUsersToGroup(String userId, String groupId, String orderId) {
try { try {
// 1. 获取发起人工号 // 1. 获取发起人工号
List<BaseEmployeeInfo> employeeInfos = sysBaseAPI.queryBaseEmployeeInfo(Collections.singleton(userId)); List<BaseEmployeeInfo> employeeInfos = sysBaseAPI.queryBaseEmployeeInfo(Collections.singleton(userId));
@@ -83,6 +83,8 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService {
private ISysBaseAPI sysBaseAPI; private ISysBaseAPI sysBaseAPI;
@Autowired @Autowired
private EmergencyCloudManager emergencyCloudManager; private EmergencyCloudManager emergencyCloudManager;
@Autowired
private com.renkang.emergency.api.service.EmergencyApiService emergencyApiService;
@Override @Override
public IPage<InitUserOrder> initUserOrderPage(Page<Order> page) { public IPage<InitUserOrder> initUserOrderPage(Page<Order> page) {
@@ -735,7 +737,15 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService {
} }
String orderId = order.getId(); String orderId = order.getId();
// 2. 查order_operator表获取本地参与人员 // 2. 兜底补拉关爱联络员+急救人员1+急救人员2(重新查询安眼系统)
// 发起应急时这些人员可能还未注册,此处兜底
try {
emergencyApiService.addCareUsersToGroup(order.getInitiatorUserId(), sessionId, orderId);
} catch (Exception e) {
log.warn("兜底补拉关爱/急救人员异常, sessionId={}", sessionId, e);
}
// 3. 查order_operator表获取本地参与人员
List<OrderOperator> orderOperators = orderOperatorMapper.selectList( List<OrderOperator> orderOperators = orderOperatorMapper.selectList(
new LambdaQueryWrapper<OrderOperator>() new LambdaQueryWrapper<OrderOperator>()
.eq(OrderOperator::getOrderId, orderId)); .eq(OrderOperator::getOrderId, orderId));
@@ -746,7 +756,7 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
// 3. 调腾讯IM获取实际群成员 // 4. 调腾讯IM获取实际群成员
Set<String> imMemberAccounts = new HashSet<>(); Set<String> imMemberAccounts = new HashSet<>();
boolean imSuccess = false; boolean imSuccess = false;
try { try {
@@ -762,18 +772,18 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService {
log.error("获取腾讯IM群成员失败,sessionId: {},降级使用本地参与人员", sessionId, e); log.error("获取腾讯IM群成员失败,sessionId: {},降级使用本地参与人员", sessionId, e);
} }
// 4. 自动补拉预设成员入群(仅IM可用时) // 5. 自动补拉其他遗漏的预设成员(仅IM可用时)
if (imSuccess) { if (imSuccess) {
autoInvitePresetMembers(sessionId, order, imMemberAccounts, localUserIds, loginUser); autoInvitePresetMembers(sessionId, order, imMemberAccounts, localUserIds, loginUser);
} }
// 5. 如果IM调用失败,降级使用本地成员全集 // 6. 如果IM调用失败,降级使用本地成员全集
final Set<String> validAccounts = imSuccess ? imMemberAccounts : new HashSet<>(localUserIds); final Set<String> validAccounts = imSuccess ? imMemberAccounts : new HashSet<>(localUserIds);
if (!imSuccess) { if (!imSuccess) {
log.warn("腾讯IM调用失败,降级返回本地参与人员 {} 人, sessionId: {}", localUserIds.size(), sessionId); log.warn("腾讯IM调用失败,降级返回本地参与人员 {} 人, sessionId: {}", localUserIds.size(), sessionId);
} }
// 6. 发起人:匹配验证集 // 7. 发起人:匹配验证集
if (validAccounts.contains(order.getInitiatorUserId())) { if (validAccounts.contains(order.getInitiatorUserId())) {
handleGroupMember(groupMemberVos, orderId, handleGroupMember(groupMemberVos, orderId,
order.getInitiatorUserId(), order.getInitiatorUserId(),
@@ -783,7 +793,7 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService {
1, -1); 1, -1);
} }
// 7. 查order_operator表,匹配验证集 // 8. 查order_operator表,匹配验证集
if (CollectionUtils.isNotEmpty(orderOperators)) { if (CollectionUtils.isNotEmpty(orderOperators)) {
// 查询专业用户信息 // 查询专业用户信息
Map<String, EmergencyProfessionUser> profUserMap = new HashMap<>(); Map<String, EmergencyProfessionUser> profUserMap = new HashMap<>();
@@ -831,7 +841,7 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService {
} }
} }
// 8. 标记本人 // 9. 标记本人
String currentUserId = loginUser.getId(); String currentUserId = loginUser.getId();
groupMemberVos.forEach(vo -> vo.setIsSelf(currentUserId.equals(vo.getUserId()) ? 1 : 0)); groupMemberVos.forEach(vo -> vo.setIsSelf(currentUserId.equals(vo.getUserId()) ? 1 : 0));
return groupMemberVos; return groupMemberVos;
@@ -852,7 +862,7 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService {
/** /**
* 自动补拉预设成员入群 * 自动补拉预设成员入群
* 预设成员:被救助人 + order_operator 所有参与人员(操作人员、专业人员、紧急联系人、健康联络员) * 预设成员:被救助人 + order_operator 所有参与人员
* 群成员总数不超过9人 * 群成员总数不超过9人
*/ */
private void autoInvitePresetMembers(String sessionId, Order order, Set<String> imMemberAccounts, private void autoInvitePresetMembers(String sessionId, Order order, Set<String> imMemberAccounts,