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
+4
View File
@@ -84,6 +84,10 @@
<groupId>com.renkang</groupId>
<artifactId>xj-anyan-api</artifactId>
</dependency>
<dependency>
<groupId>com.renkang</groupId>
<artifactId>health-im-api</artifactId>
</dependency>
</dependencies>
@@ -1,6 +1,7 @@
package org.jeecg.modules.system.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HtmlUtil;
import com.alibaba.fastjson.JSON;
@@ -11,12 +12,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.renkang.im.api.IMHelloApi;
import com.renkang.im.entity.ConSessionRequestDO;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.jeecg.bean.request.ListUser;
import org.jeecg.bean.request.PeoplePsyAssessPlanVO;
import org.jeecg.bean.request.PeopleStatisticVO;
import org.jeecg.common.api.vo.Result;
@@ -25,6 +29,7 @@ import org.jeecg.common.aspect.annotation.PermissionData;
import org.jeecg.common.config.TenantContext;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.bean.request.ResetPassword;
import org.jeecg.common.system.bean.request.SimpleUser;
import org.jeecg.common.system.bean.response.BaseUser;
@@ -32,6 +37,7 @@ import org.jeecg.common.system.bean.response.GroupUser;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.util.JwtUtil;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.LoginUserNew;
import org.jeecg.common.system.vo.SysUserModel;
import org.jeecg.common.util.*;
import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
@@ -130,6 +136,10 @@ public class SysUserController {
private ISysUserPostService sysUserPostService;
@Autowired
private UserCacheManager userCacheManager;
@Autowired
private IMHelloApi imHelloApi;
@Autowired
private ISysBaseAPI sysBaseAPI;
@GetMapping("userRoles")
public Result<?> userRoles(@RequestParam String userId) {
if (StrUtil.isBlank(userId)) {
@@ -524,6 +534,8 @@ public class SysUserController {
//获取租户ids
String relTenantIds = jsonObject.getString("relTenantIds");
sysUserService.editUser(user, roles, departs, relTenantIds);
// 同步IM个人资料
syncImProfile(user.getId());
result.success("修改成功!");
}
} catch (Exception e) {
@@ -1711,6 +1723,8 @@ public class SysUserController {
}
sysUser.setUpdateTime(new Date());
sysUserService.updateById(sysUser);
// 同步IM个人资料
syncImProfile(sysUser.getId());
}
} catch (Exception e) {
log.error(e.getMessage(), e);
@@ -2335,4 +2349,17 @@ public class SysUserController {
Page<ScopeUserVO> page = new Page<>(pageNo, pageSize);
return Result.ok(sysUserService.scopeUserList(query,page));
}
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);
}
}
}
@@ -16,6 +16,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.renkang.consultation.api.ConSessionHelloApi;
import com.renkang.consultation.vo.FamilyNum;
import com.renkang.im.api.IMHelloApi;
import com.renkang.im.entity.ConSessionRequestDO;
import com.renkang.watch.api.WatchApi;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.Lists;
@@ -24,6 +26,7 @@ import org.jeecg.bean.entity.UserDataRecordBWH;
import org.jeecg.bean.entity.UserDataRecordBmi;
import org.jeecg.bean.enums.UserDataSourceEnum;
import org.jeecg.bean.request.HealthMealsWeightQueryVO;
import org.jeecg.bean.request.ListUser;
import org.jeecg.bean.request.QueryWeightSignUserParam;
import org.jeecg.bean.response.*;
import org.jeecg.common.api.vo.Result;
@@ -34,6 +37,7 @@ import org.jeecg.common.export.PoiExportHandler;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.util.DictUtil;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.LoginUserNew;
import org.jeecg.common.system.vo.SysUserModel;
import org.jeecg.common.util.*;
import org.jeecg.config.mybatis.AnalyzeTableManager;
@@ -122,6 +126,8 @@ public class HealthUserEmployeeExServiceImpl extends ServiceImpl<HealthUserEmplo
@Autowired
private ConSessionHelloApi conSessionHelloApi;
@Autowired
private IMHelloApi imHelloApi;
@Autowired
private WatchApi watchApi;
@Autowired
private CommonExportsInfoController commonExportsInfoController;
@@ -993,6 +999,8 @@ public class HealthUserEmployeeExServiceImpl extends ServiceImpl<HealthUserEmplo
if (com.xkcoding.http.util.StringUtil.isNotEmpty(orgCode)) {
sendUpdateMsgToRedisStream(userEmployee.getId(), orgCode);
}
// 同步IM个人资料
syncImProfile(userEmployee.getId());
return Result.ok("编辑成功");
} else {
return Result.error("编辑失败");
@@ -1010,6 +1018,19 @@ public class HealthUserEmployeeExServiceImpl extends ServiceImpl<HealthUserEmplo
redisStreamUtil.add(RedisStreamKeyEnum.CHANGE_USER_DEPART, userModel);
}
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);
}
}
public boolean updateByIdAndUser(UserEmployee userEmployee) {
// 添加账号 电话 身份证号校验
/* List<String> checkExistUser = sysBaseAPI.checkExistUser(userEmployee.getId(), userEmployee.getUsername(), userEmployee.getPhone(), userEmployee.getIdCard());
@@ -19,6 +19,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.renkang.im.api.IMHelloApi;
import com.renkang.im.entity.ConSessionRequestDO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
@@ -35,6 +37,7 @@ import org.jeecg.bean.entity.UserDataRecordBmi;
import org.jeecg.bean.enums.UserDataSourceEnum;
import org.jeecg.bean.request.PeoplePsyAssessPlanVO;
import org.jeecg.bean.request.PeopleStatisticVO;
import org.jeecg.bean.request.ListUser;
import org.jeecg.bean.response.BaseEmployeeInfo;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.bean.request.StatAllReq;
@@ -50,6 +53,7 @@ import org.jeecg.common.desensitization.annotation.SensitiveEncode;
import org.jeecg.common.exception.ExceptionAssertsUtil;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.export.PoiExportHandler;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.bean.request.ResetPassword;
import org.jeecg.common.system.bean.request.SimpleUser;
import org.jeecg.common.system.bean.request.SysUserInfoDO;
@@ -197,6 +201,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
private UserDataRecordBWHMapper bwhMapper;
@Autowired
private UserDataRecordBmiMapper bmiMapper;
@Autowired
private IMHelloApi imHelloApi;
@Autowired
private ISysBaseAPI sysBaseAPI;
private final GroupUserExportHandler groupUserExportHandler = new GroupUserExportHandler();
@@ -1811,6 +1819,21 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
userModel.setId(loginUser.getId());
userModel.setAvatar(avatar);
redisStreamUtil.add(RedisStreamKeyEnum.UPDATE_USER_INFO, RedisConstant.REDIS_STREAM_KEY_FIELD, userModel);
// 同步IM个人资料
syncImProfile(loginUser.getId());
}
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