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:
+25
@@ -15,24 +15,31 @@ import com.renkang.consultation.entity.ConDoctorExAndUser;
|
|||||||
import com.renkang.consultation.service.IConDoctorService;
|
import com.renkang.consultation.service.IConDoctorService;
|
||||||
import com.renkang.consultation.util.TempUtil;
|
import com.renkang.consultation.util.TempUtil;
|
||||||
import com.renkang.consultation.vo.ConDoctorVO;
|
import com.renkang.consultation.vo.ConDoctorVO;
|
||||||
|
import com.renkang.im.api.IMHelloApi;
|
||||||
|
import com.renkang.im.entity.ConSessionRequestDO;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
|
import org.jeecg.bean.request.ListUser;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.system.api.ISysBaseAPI;
|
import org.jeecg.common.system.api.ISysBaseAPI;
|
||||||
import org.jeecg.common.system.util.DictUtil;
|
import org.jeecg.common.system.util.DictUtil;
|
||||||
import org.jeecg.common.system.vo.DictModel;
|
import org.jeecg.common.system.vo.DictModel;
|
||||||
import org.jeecg.common.system.vo.LoginUser;
|
import org.jeecg.common.system.vo.LoginUser;
|
||||||
|
import org.jeecg.common.system.vo.LoginUserNew;
|
||||||
import org.jeecg.util.RSAEncryptUtils;
|
import org.jeecg.util.RSAEncryptUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping(RequestPrefix.conDoctor)
|
@RequestMapping(RequestPrefix.conDoctor)
|
||||||
public class ConDoctorApiController {
|
public class ConDoctorApiController {
|
||||||
@@ -46,6 +53,8 @@ public class ConDoctorApiController {
|
|||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DictUtil dictUtil;
|
private DictUtil dictUtil;
|
||||||
|
@Autowired
|
||||||
|
private IMHelloApi imHelloApi;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页列表查询
|
* 分页列表查询
|
||||||
@@ -133,12 +142,28 @@ public class ConDoctorApiController {
|
|||||||
}
|
}
|
||||||
boolean flag = conDoctorService.updateById(conDoctor);
|
boolean flag = conDoctorService.updateById(conDoctor);
|
||||||
if (flag){
|
if (flag){
|
||||||
|
// 同步IM个人资料
|
||||||
|
syncImProfile(conDoctor.getId());
|
||||||
return Result.ok("更新成功!");
|
return Result.ok("更新成功!");
|
||||||
}
|
}
|
||||||
return Result.error("更新失败!");
|
return Result.error("更新失败!");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void syncImProfile(String userId) {
|
||||||
|
try {
|
||||||
|
List<LoginUserNew> users = isysBaseApi.listUserByIds(new ListUser(Collections.singletonList(userId)));
|
||||||
|
if (CollectionUtils.isEmpty(users)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ConSessionRequestDO req = new ConSessionRequestDO();
|
||||||
|
req.setAccountList(Collections.singletonList(users.get(0)));
|
||||||
|
imHelloApi.accountReg(req);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("同步IM个人资料失败, userId: {}", userId, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Operation(summary = "查询医生信息", description = "查询医生信息")
|
@Operation(summary = "查询医生信息", description = "查询医生信息")
|
||||||
@GetMapping("/selectDoctorInfo")
|
@GetMapping("/selectDoctorInfo")
|
||||||
|
|||||||
+20
@@ -19,6 +19,8 @@ import com.renkang.consultation.mapper.ConSessionMapper;
|
|||||||
import com.renkang.consultation.service.IConDoctorService;
|
import com.renkang.consultation.service.IConDoctorService;
|
||||||
import com.renkang.consultation.service.IConSessionService;
|
import com.renkang.consultation.service.IConSessionService;
|
||||||
import com.renkang.consultation.vo.ConDoctorExportVO;
|
import com.renkang.consultation.vo.ConDoctorExportVO;
|
||||||
|
import com.renkang.im.api.IMHelloApi;
|
||||||
|
import com.renkang.im.entity.ConSessionRequestDO;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
@@ -98,6 +100,8 @@ public class AsyncExportService {
|
|||||||
private ConHelperMapper conHelperMapper;
|
private ConHelperMapper conHelperMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private AsyncTaskExecutor taskExecutor;
|
private AsyncTaskExecutor taskExecutor;
|
||||||
|
@Autowired
|
||||||
|
private IMHelloApi imHelloApi;
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void userToDoctorExportXls(ConSessionDTO dto, CommonExportsInfo info, String empFinish, String errCode, String sheetName, String fileName) {
|
public void userToDoctorExportXls(ConSessionDTO dto, CommonExportsInfo info, String empFinish, String errCode, String sheetName, String fileName) {
|
||||||
@@ -580,6 +584,8 @@ public class AsyncExportService {
|
|||||||
BeanUtils.copyProperties(excelVo, conDoctor);
|
BeanUtils.copyProperties(excelVo, conDoctor);
|
||||||
conDoctor.setId(userId);
|
conDoctor.setId(userId);
|
||||||
conDoctorService.saveDoctor(conDoctor);
|
conDoctorService.saveDoctor(conDoctor);
|
||||||
|
// 同步注册IM账号
|
||||||
|
importImAccount(userId);
|
||||||
info.setHandleMsg(index++ + "/" + userList.size());
|
info.setHandleMsg(index++ + "/" + userList.size());
|
||||||
info.setExportStatus("0");
|
info.setExportStatus("0");
|
||||||
info.setId(commonExportsInfo.getId());
|
info.setId(commonExportsInfo.getId());
|
||||||
@@ -598,6 +604,20 @@ public class AsyncExportService {
|
|||||||
sysBaseAPI.updateExportsInfo(info);
|
sysBaseAPI.updateExportsInfo(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void importImAccount(String userId) {
|
||||||
|
try {
|
||||||
|
List<LoginUserNew> users = sysBaseAPI.listUserByIds(new ListUser(Collections.singletonList(userId)));
|
||||||
|
if (CollectionUtils.isEmpty(users)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ConSessionRequestDO req = new ConSessionRequestDO();
|
||||||
|
req.setAccountList(java.util.Collections.singletonList(users.get(0)));
|
||||||
|
imHelloApi.accountReg(req);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("导入IM账号失败, userId: {}", userId, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class UserToDoctorExportHandler implements PoiExportHandler<UserToDoctorExport, SessionFilter> {
|
private class UserToDoctorExportHandler implements PoiExportHandler<UserToDoctorExport, SessionFilter> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+12
-2
@@ -1384,11 +1384,17 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
|||||||
if (newMemberList.isEmpty()) {
|
if (newMemberList.isEmpty()) {
|
||||||
ExceptionAssertsUtil.fail("所选成员已在群聊中");
|
ExceptionAssertsUtil.fail("所选成员已在群聊中");
|
||||||
}
|
}
|
||||||
// 查询成员名称用于IM账号导入
|
// 查询成员名称和头像用于IM账号导入
|
||||||
Map<String, String> memberNameMap = new HashMap<>();
|
Map<String, String> memberNameMap = new HashMap<>();
|
||||||
|
Map<String, String> memberAvatarMap = new HashMap<>();
|
||||||
List<EmergencyProfessionUser> profUsers = emergencyProfessionUserMapper.selectList(
|
List<EmergencyProfessionUser> profUsers = emergencyProfessionUserMapper.selectList(
|
||||||
new LambdaQueryWrapper<EmergencyProfessionUser>().in(EmergencyProfessionUser::getUserId, newMemberList));
|
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()
|
List<String> remainingIds = newMemberList.stream()
|
||||||
.filter(id -> !memberNameMap.containsKey(id)).collect(Collectors.toList());
|
.filter(id -> !memberNameMap.containsKey(id)).collect(Collectors.toList());
|
||||||
if (!remainingIds.isEmpty()) {
|
if (!remainingIds.isEmpty()) {
|
||||||
@@ -1396,6 +1402,9 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
|||||||
if (StrUtil.isNotBlank(u.getRealname())) {
|
if (StrUtil.isNotBlank(u.getRealname())) {
|
||||||
memberNameMap.put(id, u.getRealname());
|
memberNameMap.put(id, u.getRealname());
|
||||||
}
|
}
|
||||||
|
if (StrUtil.isNotBlank(u.getAvatar())) {
|
||||||
|
memberAvatarMap.put(id, u.getAvatar());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO();
|
AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO();
|
||||||
@@ -1404,6 +1413,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
|||||||
AddGroupMemberDTO.MemberListDTO memberListDTO = new AddGroupMemberDTO.MemberListDTO();
|
AddGroupMemberDTO.MemberListDTO memberListDTO = new AddGroupMemberDTO.MemberListDTO();
|
||||||
memberListDTO.setMemberAccount(userId);
|
memberListDTO.setMemberAccount(userId);
|
||||||
memberListDTO.setMemberName(memberNameMap.get(userId));
|
memberListDTO.setMemberName(memberNameMap.get(userId));
|
||||||
|
memberListDTO.setMemberAvatar(memberAvatarMap.get(userId));
|
||||||
return memberListDTO;
|
return memberListDTO;
|
||||||
}).collect(Collectors.toList()));
|
}).collect(Collectors.toList()));
|
||||||
//添加群成员
|
//添加群成员
|
||||||
|
|||||||
+26
@@ -14,8 +14,14 @@ import com.renkang.emergency.entity.EmergencyCenterAdmin;
|
|||||||
import com.renkang.emergency.manager.EmergencyCloudManager;
|
import com.renkang.emergency.manager.EmergencyCloudManager;
|
||||||
import com.renkang.emergency.mapper.EmergencyCenterAdminMapper;
|
import com.renkang.emergency.mapper.EmergencyCenterAdminMapper;
|
||||||
import com.renkang.emergency.service.IEmergencyCenterAdminService;
|
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.constant.CommonConstant;
|
||||||
import org.jeecg.common.exception.ExceptionAssertsUtil;
|
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.system.vo.SysUserModel;
|
||||||
import org.jeecg.common.util.CheckPasswordUtil;
|
import org.jeecg.common.util.CheckPasswordUtil;
|
||||||
import org.jeecg.common.util.PasswordUtil;
|
import org.jeecg.common.util.PasswordUtil;
|
||||||
@@ -37,6 +43,7 @@ import java.util.List;
|
|||||||
* @Author YangYuanChen
|
* @Author YangYuanChen
|
||||||
* @Data 20242024/8/21下午2:06
|
* @Data 20242024/8/21下午2:06
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
public class EmergencyCenterAdminServiceImpl extends ServiceImpl<EmergencyCenterAdminMapper, EmergencyCenterAdmin> implements IEmergencyCenterAdminService {
|
public class EmergencyCenterAdminServiceImpl extends ServiceImpl<EmergencyCenterAdminMapper, EmergencyCenterAdmin> implements IEmergencyCenterAdminService {
|
||||||
|
|
||||||
@@ -44,6 +51,10 @@ public class EmergencyCenterAdminServiceImpl extends ServiceImpl<EmergencyCenter
|
|||||||
private EmergencyCloudManager cloudManager;
|
private EmergencyCloudManager cloudManager;
|
||||||
@Autowired
|
@Autowired
|
||||||
private RedisStreamUtil redisStreamUtil;
|
private RedisStreamUtil redisStreamUtil;
|
||||||
|
@Autowired
|
||||||
|
private IMHelloApi imHelloApi;
|
||||||
|
@Autowired
|
||||||
|
private ISysBaseAPI sysBaseAPI;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<EmergencyCenterAdmin> customPage(String centerId, String type, String realName, Integer pageNo, Integer pageSize) {
|
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
|
// 修改system
|
||||||
updateUserStream(byId.getUserId(), admin.getRealname());
|
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
|
@Override
|
||||||
|
|||||||
+27
@@ -17,8 +17,14 @@ import com.renkang.emergency.manager.PermissionManager;
|
|||||||
import com.renkang.emergency.mapper.EmergencyProfessionUserMapper;
|
import com.renkang.emergency.mapper.EmergencyProfessionUserMapper;
|
||||||
import com.renkang.emergency.mapper.EmergencySchedulesNewItemMapper;
|
import com.renkang.emergency.mapper.EmergencySchedulesNewItemMapper;
|
||||||
import com.renkang.emergency.service.EmergencyProfessionUserService;
|
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.constant.CommonConstant;
|
||||||
import org.jeecg.common.exception.ExceptionAssertsUtil;
|
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.system.vo.SysUserModel;
|
||||||
import org.jeecg.common.util.PasswordUtil;
|
import org.jeecg.common.util.PasswordUtil;
|
||||||
import org.jeecg.redis.RedisStreamKeyEnum;
|
import org.jeecg.redis.RedisStreamKeyEnum;
|
||||||
@@ -27,6 +33,7 @@ import org.jeecg.util.RSAEncryptUtils;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -37,6 +44,7 @@ import java.util.stream.Collectors;
|
|||||||
* @author stan
|
* @author stan
|
||||||
* @since 2024-09-12 09:38:13
|
* @since 2024-09-12 09:38:13
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
public class EmergencyProfessionUserServiceImpl extends ServiceImpl<EmergencyProfessionUserMapper, EmergencyProfessionUser> implements EmergencyProfessionUserService {
|
public class EmergencyProfessionUserServiceImpl extends ServiceImpl<EmergencyProfessionUserMapper, EmergencyProfessionUser> implements EmergencyProfessionUserService {
|
||||||
|
|
||||||
@@ -48,6 +56,10 @@ public class EmergencyProfessionUserServiceImpl extends ServiceImpl<EmergencyPro
|
|||||||
private PermissionManager permissionManager;
|
private PermissionManager permissionManager;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmergencySchedulesNewItemMapper emergencySchedulesNewItemMapper;
|
private EmergencySchedulesNewItemMapper emergencySchedulesNewItemMapper;
|
||||||
|
@Autowired
|
||||||
|
private IMHelloApi imHelloApi;
|
||||||
|
@Autowired
|
||||||
|
private ISysBaseAPI sysBaseAPI;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<EmergencyProfessionUser> customPage(String name, String centerId, int type, int pageNo, int pageSize) {
|
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
|
// 修改system
|
||||||
updateUserStream(oldData.getUserId(), data.getRealname(), data.getAvatar());
|
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
|
@Override
|
||||||
|
|||||||
@@ -55,5 +55,10 @@ public class AddGroupMemberDTO {
|
|||||||
* 群成员名称(可选,仅用于IM账号导入,不发送到腾讯IM)
|
* 群成员名称(可选,仅用于IM账号导入,不发送到腾讯IM)
|
||||||
*/
|
*/
|
||||||
private String memberName;
|
private String memberName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 群成员头像URL(可选,仅用于IM账号导入,不发送到腾讯IM)
|
||||||
|
*/
|
||||||
|
private String memberAvatar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -554,13 +554,16 @@ public class TencentCloudImUtil {
|
|||||||
try {
|
try {
|
||||||
// 先导入账号及其名称,确保成员在IM系统中已注册
|
// 先导入账号及其名称,确保成员在IM系统中已注册
|
||||||
if (dto.getMemberList() != null && !dto.getMemberList().isEmpty()) {
|
if (dto.getMemberList() != null && !dto.getMemberList().isEmpty()) {
|
||||||
// 构建腾讯IM新版 AccountList 格式(含昵称)
|
// 构建腾讯IM新版 AccountList 格式(含昵称和头像)
|
||||||
List<JSONObject> accountList = dto.getMemberList().stream().map(member -> {
|
List<JSONObject> accountList = dto.getMemberList().stream().map(member -> {
|
||||||
JSONObject account = new JSONObject();
|
JSONObject account = new JSONObject();
|
||||||
account.put("UserID", member.getMemberAccount());
|
account.put("UserID", member.getMemberAccount());
|
||||||
if (StringUtils.isNotEmpty(member.getMemberName())) {
|
if (StringUtils.isNotEmpty(member.getMemberName())) {
|
||||||
account.put("Nick", member.getMemberName());
|
account.put("Nick", member.getMemberName());
|
||||||
}
|
}
|
||||||
|
if (StringUtils.isNotEmpty(member.getMemberAvatar())) {
|
||||||
|
account.put("FaceUrl", member.getMemberAvatar());
|
||||||
|
}
|
||||||
return account;
|
return account;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
importAccountsWithNames(accountList);
|
importAccountsWithNames(accountList);
|
||||||
@@ -570,11 +573,13 @@ public class TencentCloudImUtil {
|
|||||||
String httpsUrl = getHttpsUrl(TencentCloudImApiConstant.GroupManage.ADD_GROUP_MEMBER, random);
|
String httpsUrl = getHttpsUrl(TencentCloudImApiConstant.GroupManage.ADD_GROUP_MEMBER, random);
|
||||||
String jsonString = objectMapper.writeValueAsString(dto);
|
String jsonString = objectMapper.writeValueAsString(dto);
|
||||||
JSONObject jsonObject = JSONObject.parseObject(jsonString);
|
JSONObject jsonObject = JSONObject.parseObject(jsonString);
|
||||||
// 移除 memberName 字段,腾讯IM API 不接受此字段
|
// 移除内部字段,腾讯IM API 不接受
|
||||||
JSONArray memberList = jsonObject.getJSONArray("MemberList");
|
JSONArray memberList = jsonObject.getJSONArray("MemberList");
|
||||||
if (memberList != null) {
|
if (memberList != null) {
|
||||||
for (int i = 0; i < memberList.size(); i++) {
|
for (int i = 0; i < memberList.size(); i++) {
|
||||||
memberList.getJSONObject(i).remove("memberName");
|
JSONObject member = memberList.getJSONObject(i);
|
||||||
|
member.remove("memberName");
|
||||||
|
member.remove("memberAvatar");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.info("腾讯云im添加群成员,请求参数:{}", jsonObject);
|
log.info("腾讯云im添加群成员,请求参数:{}", jsonObject);
|
||||||
|
|||||||
@@ -84,6 +84,10 @@
|
|||||||
<groupId>com.renkang</groupId>
|
<groupId>com.renkang</groupId>
|
||||||
<artifactId>xj-anyan-api</artifactId>
|
<artifactId>xj-anyan-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.renkang</groupId>
|
||||||
|
<artifactId>health-im-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|||||||
+27
@@ -1,6 +1,7 @@
|
|||||||
package org.jeecg.modules.system.controller;
|
package org.jeecg.modules.system.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.http.HtmlUtil;
|
import cn.hutool.http.HtmlUtil;
|
||||||
import com.alibaba.fastjson.JSON;
|
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.conditions.update.UpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
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 io.swagger.v3.oas.annotations.Parameter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||||
import org.apache.shiro.authz.annotation.RequiresRoles;
|
import org.apache.shiro.authz.annotation.RequiresRoles;
|
||||||
|
import org.jeecg.bean.request.ListUser;
|
||||||
import org.jeecg.bean.request.PeoplePsyAssessPlanVO;
|
import org.jeecg.bean.request.PeoplePsyAssessPlanVO;
|
||||||
import org.jeecg.bean.request.PeopleStatisticVO;
|
import org.jeecg.bean.request.PeopleStatisticVO;
|
||||||
import org.jeecg.common.api.vo.Result;
|
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.config.TenantContext;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.SymbolConstant;
|
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.ResetPassword;
|
||||||
import org.jeecg.common.system.bean.request.SimpleUser;
|
import org.jeecg.common.system.bean.request.SimpleUser;
|
||||||
import org.jeecg.common.system.bean.response.BaseUser;
|
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.query.QueryGenerator;
|
||||||
import org.jeecg.common.system.util.JwtUtil;
|
import org.jeecg.common.system.util.JwtUtil;
|
||||||
import org.jeecg.common.system.vo.LoginUser;
|
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.system.vo.SysUserModel;
|
||||||
import org.jeecg.common.util.*;
|
import org.jeecg.common.util.*;
|
||||||
import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
|
import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
|
||||||
@@ -130,6 +136,10 @@ public class SysUserController {
|
|||||||
private ISysUserPostService sysUserPostService;
|
private ISysUserPostService sysUserPostService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserCacheManager userCacheManager;
|
private UserCacheManager userCacheManager;
|
||||||
|
@Autowired
|
||||||
|
private IMHelloApi imHelloApi;
|
||||||
|
@Autowired
|
||||||
|
private ISysBaseAPI sysBaseAPI;
|
||||||
@GetMapping("userRoles")
|
@GetMapping("userRoles")
|
||||||
public Result<?> userRoles(@RequestParam String userId) {
|
public Result<?> userRoles(@RequestParam String userId) {
|
||||||
if (StrUtil.isBlank(userId)) {
|
if (StrUtil.isBlank(userId)) {
|
||||||
@@ -524,6 +534,8 @@ public class SysUserController {
|
|||||||
//获取租户ids
|
//获取租户ids
|
||||||
String relTenantIds = jsonObject.getString("relTenantIds");
|
String relTenantIds = jsonObject.getString("relTenantIds");
|
||||||
sysUserService.editUser(user, roles, departs, relTenantIds);
|
sysUserService.editUser(user, roles, departs, relTenantIds);
|
||||||
|
// 同步IM个人资料
|
||||||
|
syncImProfile(user.getId());
|
||||||
result.success("修改成功!");
|
result.success("修改成功!");
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -1711,6 +1723,8 @@ public class SysUserController {
|
|||||||
}
|
}
|
||||||
sysUser.setUpdateTime(new Date());
|
sysUser.setUpdateTime(new Date());
|
||||||
sysUserService.updateById(sysUser);
|
sysUserService.updateById(sysUser);
|
||||||
|
// 同步IM个人资料
|
||||||
|
syncImProfile(sysUser.getId());
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
@@ -2335,4 +2349,17 @@ public class SysUserController {
|
|||||||
Page<ScopeUserVO> page = new Page<>(pageNo, pageSize);
|
Page<ScopeUserVO> page = new Page<>(pageNo, pageSize);
|
||||||
return Result.ok(sysUserService.scopeUserList(query,page));
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
@@ -16,6 +16,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|||||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
import com.renkang.consultation.api.ConSessionHelloApi;
|
import com.renkang.consultation.api.ConSessionHelloApi;
|
||||||
import com.renkang.consultation.vo.FamilyNum;
|
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 com.renkang.watch.api.WatchApi;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.compress.utils.Lists;
|
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.entity.UserDataRecordBmi;
|
||||||
import org.jeecg.bean.enums.UserDataSourceEnum;
|
import org.jeecg.bean.enums.UserDataSourceEnum;
|
||||||
import org.jeecg.bean.request.HealthMealsWeightQueryVO;
|
import org.jeecg.bean.request.HealthMealsWeightQueryVO;
|
||||||
|
import org.jeecg.bean.request.ListUser;
|
||||||
import org.jeecg.bean.request.QueryWeightSignUserParam;
|
import org.jeecg.bean.request.QueryWeightSignUserParam;
|
||||||
import org.jeecg.bean.response.*;
|
import org.jeecg.bean.response.*;
|
||||||
import org.jeecg.common.api.vo.Result;
|
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.api.ISysBaseAPI;
|
||||||
import org.jeecg.common.system.util.DictUtil;
|
import org.jeecg.common.system.util.DictUtil;
|
||||||
import org.jeecg.common.system.vo.LoginUser;
|
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.system.vo.SysUserModel;
|
||||||
import org.jeecg.common.util.*;
|
import org.jeecg.common.util.*;
|
||||||
import org.jeecg.config.mybatis.AnalyzeTableManager;
|
import org.jeecg.config.mybatis.AnalyzeTableManager;
|
||||||
@@ -122,6 +126,8 @@ public class HealthUserEmployeeExServiceImpl extends ServiceImpl<HealthUserEmplo
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ConSessionHelloApi conSessionHelloApi;
|
private ConSessionHelloApi conSessionHelloApi;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
private IMHelloApi imHelloApi;
|
||||||
|
@Autowired
|
||||||
private WatchApi watchApi;
|
private WatchApi watchApi;
|
||||||
@Autowired
|
@Autowired
|
||||||
private CommonExportsInfoController commonExportsInfoController;
|
private CommonExportsInfoController commonExportsInfoController;
|
||||||
@@ -993,6 +999,8 @@ public class HealthUserEmployeeExServiceImpl extends ServiceImpl<HealthUserEmplo
|
|||||||
if (com.xkcoding.http.util.StringUtil.isNotEmpty(orgCode)) {
|
if (com.xkcoding.http.util.StringUtil.isNotEmpty(orgCode)) {
|
||||||
sendUpdateMsgToRedisStream(userEmployee.getId(), orgCode);
|
sendUpdateMsgToRedisStream(userEmployee.getId(), orgCode);
|
||||||
}
|
}
|
||||||
|
// 同步IM个人资料
|
||||||
|
syncImProfile(userEmployee.getId());
|
||||||
return Result.ok("编辑成功");
|
return Result.ok("编辑成功");
|
||||||
} else {
|
} else {
|
||||||
return Result.error("编辑失败");
|
return Result.error("编辑失败");
|
||||||
@@ -1010,6 +1018,19 @@ public class HealthUserEmployeeExServiceImpl extends ServiceImpl<HealthUserEmplo
|
|||||||
redisStreamUtil.add(RedisStreamKeyEnum.CHANGE_USER_DEPART, userModel);
|
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) {
|
public boolean updateByIdAndUser(UserEmployee userEmployee) {
|
||||||
// 添加账号 电话 身份证号校验
|
// 添加账号 电话 身份证号校验
|
||||||
/* List<String> checkExistUser = sysBaseAPI.checkExistUser(userEmployee.getId(), userEmployee.getUsername(), userEmployee.getPhone(), userEmployee.getIdCard());
|
/* List<String> checkExistUser = sysBaseAPI.checkExistUser(userEmployee.getId(), userEmployee.getUsername(), userEmployee.getPhone(), userEmployee.getIdCard());
|
||||||
|
|||||||
+23
@@ -19,6 +19,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
|
import com.renkang.im.api.IMHelloApi;
|
||||||
|
import com.renkang.im.entity.ConSessionRequestDO;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
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.enums.UserDataSourceEnum;
|
||||||
import org.jeecg.bean.request.PeoplePsyAssessPlanVO;
|
import org.jeecg.bean.request.PeoplePsyAssessPlanVO;
|
||||||
import org.jeecg.bean.request.PeopleStatisticVO;
|
import org.jeecg.bean.request.PeopleStatisticVO;
|
||||||
|
import org.jeecg.bean.request.ListUser;
|
||||||
import org.jeecg.bean.response.BaseEmployeeInfo;
|
import org.jeecg.bean.response.BaseEmployeeInfo;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.common.bean.request.StatAllReq;
|
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.ExceptionAssertsUtil;
|
||||||
import org.jeecg.common.exception.JeecgBootException;
|
import org.jeecg.common.exception.JeecgBootException;
|
||||||
import org.jeecg.common.export.PoiExportHandler;
|
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.ResetPassword;
|
||||||
import org.jeecg.common.system.bean.request.SimpleUser;
|
import org.jeecg.common.system.bean.request.SimpleUser;
|
||||||
import org.jeecg.common.system.bean.request.SysUserInfoDO;
|
import org.jeecg.common.system.bean.request.SysUserInfoDO;
|
||||||
@@ -197,6 +201,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
private UserDataRecordBWHMapper bwhMapper;
|
private UserDataRecordBWHMapper bwhMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserDataRecordBmiMapper bmiMapper;
|
private UserDataRecordBmiMapper bmiMapper;
|
||||||
|
@Autowired
|
||||||
|
private IMHelloApi imHelloApi;
|
||||||
|
@Autowired
|
||||||
|
private ISysBaseAPI sysBaseAPI;
|
||||||
|
|
||||||
private final GroupUserExportHandler groupUserExportHandler = new GroupUserExportHandler();
|
private final GroupUserExportHandler groupUserExportHandler = new GroupUserExportHandler();
|
||||||
|
|
||||||
@@ -1811,6 +1819,21 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
userModel.setId(loginUser.getId());
|
userModel.setId(loginUser.getId());
|
||||||
userModel.setAvatar(avatar);
|
userModel.setAvatar(avatar);
|
||||||
redisStreamUtil.add(RedisStreamKeyEnum.UPDATE_USER_INFO, RedisConstant.REDIS_STREAM_KEY_FIELD, userModel);
|
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
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user