feat: 补充IM个人资料同步 + 群成员头像导入修复

1. 在8处头像/名称变更点补充imHelloApi.accountReg()调用,同步更新IM个人资料:
   - SysUserController.updateUserAvatar 用户换头像
   - SysUserController.appEdit 移动端编辑资料
   - SysUserController.edit 后台编辑用户
   - EmergencyProfessionUserServiceImpl.customEdit 应急人员编辑
   - EmergencyCenterAdminServiceImpl.updateAdmin 中心管理员编辑
   - HealthUserEmployeeExServiceImpl.updateUserInfo 员工编辑
   - ConDoctorApiController.update 专家端个人简介修改
   - AsyncExportService.importDoctor 批量导入医生
   所有syncImProfile方法内部try-catch兜底,失败不影响主流程。
2. AddGroupMemberDTO新增memberAvatar字段,TencentCloudImUtil.addGroupMember
   导入IM账号时传递FaceUrl,EmergencyApiServiceImpl.addGroupUser构建头像映射。
3. jeecg-system-biz/pom.xml新增health-im-api依赖。

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-04 20:03:20 +08:00
co-authored by Claude
parent 0ae963c4cf
commit 4a15ebe0d2
11 changed files with 198 additions and 5 deletions
@@ -1384,11 +1384,17 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
if (newMemberList.isEmpty()) {
ExceptionAssertsUtil.fail("所选成员已在群聊中");
}
// 查询成员名称用于IM账号导入
// 查询成员名称和头像用于IM账号导入
Map<String, String> memberNameMap = new HashMap<>();
Map<String, String> memberAvatarMap = new HashMap<>();
List<EmergencyProfessionUser> profUsers = emergencyProfessionUserMapper.selectList(
new LambdaQueryWrapper<EmergencyProfessionUser>().in(EmergencyProfessionUser::getUserId, newMemberList));
profUsers.forEach(u -> memberNameMap.put(u.getUserId(), u.getRealname()));
profUsers.forEach(u -> {
memberNameMap.put(u.getUserId(), u.getRealname());
if (StrUtil.isNotBlank(u.getAvatar())) {
memberAvatarMap.put(u.getUserId(), u.getAvatar());
}
});
List<String> remainingIds = newMemberList.stream()
.filter(id -> !memberNameMap.containsKey(id)).collect(Collectors.toList());
if (!remainingIds.isEmpty()) {
@@ -1396,6 +1402,9 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
if (StrUtil.isNotBlank(u.getRealname())) {
memberNameMap.put(id, u.getRealname());
}
if (StrUtil.isNotBlank(u.getAvatar())) {
memberAvatarMap.put(id, u.getAvatar());
}
});
}
AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO();
@@ -1404,6 +1413,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
AddGroupMemberDTO.MemberListDTO memberListDTO = new AddGroupMemberDTO.MemberListDTO();
memberListDTO.setMemberAccount(userId);
memberListDTO.setMemberName(memberNameMap.get(userId));
memberListDTO.setMemberAvatar(memberAvatarMap.get(userId));
return memberListDTO;
}).collect(Collectors.toList()));
//添加群成员
@@ -14,8 +14,14 @@ import com.renkang.emergency.entity.EmergencyCenterAdmin;
import com.renkang.emergency.manager.EmergencyCloudManager;
import com.renkang.emergency.mapper.EmergencyCenterAdminMapper;
import com.renkang.emergency.service.IEmergencyCenterAdminService;
import com.renkang.im.api.IMHelloApi;
import com.renkang.im.entity.ConSessionRequestDO;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.bean.request.ListUser;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.exception.ExceptionAssertsUtil;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.vo.LoginUserNew;
import org.jeecg.common.system.vo.SysUserModel;
import org.jeecg.common.util.CheckPasswordUtil;
import org.jeecg.common.util.PasswordUtil;
@@ -37,6 +43,7 @@ import java.util.List;
* @Author YangYuanChen
* @Data 20242024/8/21下午2:06
*/
@Slf4j
@Service
public class EmergencyCenterAdminServiceImpl extends ServiceImpl<EmergencyCenterAdminMapper, EmergencyCenterAdmin> implements IEmergencyCenterAdminService {
@@ -44,6 +51,10 @@ public class EmergencyCenterAdminServiceImpl extends ServiceImpl<EmergencyCenter
private EmergencyCloudManager cloudManager;
@Autowired
private RedisStreamUtil redisStreamUtil;
@Autowired
private IMHelloApi imHelloApi;
@Autowired
private ISysBaseAPI sysBaseAPI;
@Override
public IPage<EmergencyCenterAdmin> customPage(String centerId, String type, String realName, Integer pageNo, Integer pageSize) {
@@ -101,6 +112,21 @@ public class EmergencyCenterAdminServiceImpl extends ServiceImpl<EmergencyCenter
// 修改system
updateUserStream(byId.getUserId(), admin.getRealname());
// 同步IM个人资料
syncImProfile(byId.getUserId());
}
private void syncImProfile(String userId) {
try {
List<LoginUserNew> users = sysBaseAPI.listUserByIds(new ListUser(Collections.singletonList(userId)));
if (CollUtil.isNotEmpty(users)) {
ConSessionRequestDO req = new ConSessionRequestDO();
req.setAccountList(Collections.singletonList(users.get(0)));
imHelloApi.accountReg(req);
}
} catch (Exception e) {
log.error("同步IM个人资料失败, userId: {}", userId, e);
}
}
@Override
@@ -17,8 +17,14 @@ import com.renkang.emergency.manager.PermissionManager;
import com.renkang.emergency.mapper.EmergencyProfessionUserMapper;
import com.renkang.emergency.mapper.EmergencySchedulesNewItemMapper;
import com.renkang.emergency.service.EmergencyProfessionUserService;
import com.renkang.im.api.IMHelloApi;
import com.renkang.im.entity.ConSessionRequestDO;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.bean.request.ListUser;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.exception.ExceptionAssertsUtil;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.vo.LoginUserNew;
import org.jeecg.common.system.vo.SysUserModel;
import org.jeecg.common.util.PasswordUtil;
import org.jeecg.redis.RedisStreamKeyEnum;
@@ -27,6 +33,7 @@ import org.jeecg.util.RSAEncryptUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -37,6 +44,7 @@ import java.util.stream.Collectors;
* @author stan
* @since 2024-09-12 09:38:13
*/
@Slf4j
@Service
public class EmergencyProfessionUserServiceImpl extends ServiceImpl<EmergencyProfessionUserMapper, EmergencyProfessionUser> implements EmergencyProfessionUserService {
@@ -48,6 +56,10 @@ public class EmergencyProfessionUserServiceImpl extends ServiceImpl<EmergencyPro
private PermissionManager permissionManager;
@Autowired
private EmergencySchedulesNewItemMapper emergencySchedulesNewItemMapper;
@Autowired
private IMHelloApi imHelloApi;
@Autowired
private ISysBaseAPI sysBaseAPI;
@Override
public IPage<EmergencyProfessionUser> customPage(String name, String centerId, int type, int pageNo, int pageSize) {
@@ -145,6 +157,21 @@ public class EmergencyProfessionUserServiceImpl extends ServiceImpl<EmergencyPro
}
// 修改system
updateUserStream(oldData.getUserId(), data.getRealname(), data.getAvatar());
// 同步IM个人资料
syncImProfile(oldData.getUserId());
}
private void syncImProfile(String userId) {
try {
List<LoginUserNew> users = sysBaseAPI.listUserByIds(new ListUser(Collections.singletonList(userId)));
if (CollUtil.isNotEmpty(users)) {
ConSessionRequestDO req = new ConSessionRequestDO();
req.setAccountList(Collections.singletonList(users.get(0)));
imHelloApi.accountReg(req);
}
} catch (Exception e) {
log.error("同步IM个人资料失败, userId: {}", userId, e);
}
}
@Override