feat: (REQ-3057) 获取用户详情/人员变更更新头像
This commit is contained in:
parent
90e2b203f2
commit
d207897a2b
@ -3,8 +3,11 @@ package cn.axzo.im.center.api.feign;
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupChangeOwnerReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupCreateReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupGetUinfosReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupJoinTeamsReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupSendDingDingMsgReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupUpdateImAccountReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.GroupHistoryMsgQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.KickChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ListCrowTypesReq;
|
||||
@ -12,6 +15,7 @@ import cn.axzo.im.center.api.vo.req.chatgroup.PrivateHistoryMsgQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.UserAddChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupCreateResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupCrowTypeResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupGetUinfosResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupJoinTeamsResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupQueryResp;
|
||||
import cn.axzo.im.center.api.vo.resp.HistoryMsgQueryResp;
|
||||
@ -85,4 +89,22 @@ public interface ChatGroupApi {
|
||||
@PostMapping("api/im/chat/group/historyMsgQuery")
|
||||
ApiResult<HistoryMsgQueryResp> groupHistoryMsgQuery(@RequestBody @Validated GroupHistoryMsgQueryReq req);
|
||||
|
||||
/**
|
||||
* 群聊-更新im账号
|
||||
*/
|
||||
@PostMapping("api/im/chat/group/updateImAccount")
|
||||
ApiResult<String> updateImAccount(@RequestBody @Validated ChatGroupUpdateImAccountReq req);
|
||||
|
||||
/**
|
||||
* 群聊-发送钉钉
|
||||
*/
|
||||
@PostMapping("api/im/chat/group/sendDingDingMsg")
|
||||
ApiResult<Void> sendDingDingMsg(@RequestBody @Validated ChatGroupSendDingDingMsgReq req);
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
*/
|
||||
@PostMapping("api/im/chat/group/getUinfos")
|
||||
ApiResult<ChatGroupGetUinfosResp> getUinfos(@RequestBody @Validated ChatGroupGetUinfosReq req);
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
package cn.axzo.im.center.api.vo.req.chatgroup;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
* @author xudawei
|
||||
* @date 2024/11/19
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ChatGroupGetUinfosReq implements Serializable {
|
||||
|
||||
/**
|
||||
* 用户帐号 ID 列表,例如:["id1", "id2", "id3"]。格式错误会返回 414 参数错误。
|
||||
* 一次最多查询 200 个账号。
|
||||
*/
|
||||
@NotEmpty(message = "群id不能为空")
|
||||
private List<String> accids;
|
||||
|
||||
/**
|
||||
* 是否返回功能模块的禁言状态,默认为 false
|
||||
*/
|
||||
private Boolean muteStatus;
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
package cn.axzo.im.center.api.vo.req.chatgroup;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 更新Im账号
|
||||
* @author xudawei
|
||||
* @date 2024/11/20
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ChatGroupSendDingDingMsgReq implements Serializable {
|
||||
|
||||
/**
|
||||
* 内容
|
||||
*/
|
||||
@NotEmpty(message = "内容不能为空")
|
||||
private String content;
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package cn.axzo.im.center.api.vo.req.chatgroup;
|
||||
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupCrowTypeResp;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 更新Im账号
|
||||
* @author xudawei
|
||||
* @date 2024/11/20
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ChatGroupUpdateImAccountReq implements Serializable {
|
||||
|
||||
/**
|
||||
* id集合
|
||||
*/
|
||||
@NotEmpty(message = "id集合为空")
|
||||
private String ids;
|
||||
}
|
||||
@ -0,0 +1,94 @@
|
||||
package cn.axzo.im.center.api.vo.resp;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
* @author xudawei@axzo.cn
|
||||
* @date 2024/11/19
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ChatGroupGetUinfosResp {
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
*/
|
||||
private List<UInfo> uinfos;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public static class UInfo {
|
||||
/**
|
||||
* 云信 IM 账号
|
||||
*/
|
||||
private String accid;
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
private String name;;
|
||||
/**
|
||||
* 头像
|
||||
*/
|
||||
private String icon;
|
||||
/**
|
||||
* 签名
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
private String email;
|
||||
/**
|
||||
* 生日
|
||||
*/
|
||||
private String birth;
|
||||
/**
|
||||
* 手机号码
|
||||
*/
|
||||
private String mobile;
|
||||
/**
|
||||
* 自定义扩展信息
|
||||
*/
|
||||
private String ex;
|
||||
|
||||
/**
|
||||
* 性别
|
||||
*/
|
||||
private String gender;
|
||||
/**
|
||||
* 是否有效
|
||||
*/
|
||||
private String valid;
|
||||
/**
|
||||
* 是否全局禁言
|
||||
*/
|
||||
private String mute;
|
||||
/**
|
||||
* 账号在单聊模块中是否被禁言
|
||||
*/
|
||||
private String muteP2P;
|
||||
/**
|
||||
* 账号在群组模块中是否被禁言
|
||||
*/
|
||||
private String muteQChat;
|
||||
/**
|
||||
* 账号在群组模块中是否被禁言
|
||||
*/
|
||||
private String muteTeam;
|
||||
/**
|
||||
* 账号在聊天室模块中是否被禁言
|
||||
*/
|
||||
private String muteRoom;
|
||||
}
|
||||
|
||||
}
|
||||
@ -137,6 +137,12 @@
|
||||
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
|
||||
<version>2.0.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.axzo</groupId>
|
||||
<artifactId>riven-api</artifactId>
|
||||
<version>2.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
@ -9,6 +9,7 @@ import cn.axzo.im.channel.netease.dto.ChangeOwnerRequest;
|
||||
import cn.axzo.im.channel.netease.dto.ChangeOwnerResponse;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupCreateRequest;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupCreateResponse;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupGetUinfosResponse;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupJoinTeamsResponse;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupQueryResponse;
|
||||
import cn.axzo.im.channel.netease.dto.HistoryMsgQueryResponse;
|
||||
@ -706,6 +707,43 @@ public class NimChannelService implements IMChannelProvider {
|
||||
return historyMsgQueryResp;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
*/
|
||||
public ChatGroupGetUinfosResponse getUinfos(List<String> accids, Boolean muteStatus) {
|
||||
//构建创建群聊对象
|
||||
HashMap<String, Object> paramMap = this.buildGetUinfos(accids, muteStatus);
|
||||
|
||||
Map<String, String> authHeaderMap = buildAuthHeader(getProviderAppKey(), getProviderAppSecret());
|
||||
log.info("getUinfos-请求网易云信,URL:{},Header:{},请求参数:{}", NIM_ACCOUNT_QUERY_URL,
|
||||
JSONUtil.toJsonStr(authHeaderMap), JSONUtil.toJsonStr(paramMap));
|
||||
HttpResponse response = HttpRequest.post(NIM_ACCOUNT_QUERY_URL).addHeaders(authHeaderMap)
|
||||
.form(paramMap).timeout(5000).execute();
|
||||
String result = response.body();
|
||||
log.info("getUinfos-请求网易云信,result:{}", result);
|
||||
if (response.getStatus() != SUCCESS_CODE) {
|
||||
log.warn("getUinfos-请求网易云信Server:{},异常:{}", NIM_ACCOUNT_QUERY_URL, result);
|
||||
}
|
||||
ChatGroupGetUinfosResponse resp = JSONUtil.toBean(result, ChatGroupGetUinfosResponse.class);
|
||||
if (resp == null) {
|
||||
log.warn("getUinfos-请求网易云信Server:{},异常:{}", NIM_ACCOUNT_QUERY_URL, result);
|
||||
}
|
||||
if (resp.getCode() != SUCCESS_CODE) {
|
||||
log.warn("getUinfos-请求网易云信Server:{},异常:{}", NIM_ACCOUNT_QUERY_URL, result);
|
||||
}
|
||||
return resp;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户名片
|
||||
*/
|
||||
private HashMap<String, Object> buildGetUinfos(List<String> accids, Boolean muteStatus) {
|
||||
HashMap<String, Object> paramMap = Maps.newHashMap();
|
||||
paramMap.put("accids", JSON.toJSONString(accids));
|
||||
paramMap.put("muteStatus", muteStatus);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 私聊-查询历史数据
|
||||
*/
|
||||
|
||||
@ -0,0 +1,104 @@
|
||||
package cn.axzo.im.channel.netease.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
* @author xudawei@axzo.cn
|
||||
* @date 2024/11/19
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class ChatGroupGetUinfosResponse {
|
||||
|
||||
/**
|
||||
* 状态码
|
||||
*/
|
||||
private Integer code;
|
||||
|
||||
/**
|
||||
* 描述
|
||||
*/
|
||||
private String desc;
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
*/
|
||||
private List<UInfo> uinfos;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public static class UInfo {
|
||||
/**
|
||||
* 云信 IM 账号
|
||||
*/
|
||||
private String accid;
|
||||
/**
|
||||
* 昵称
|
||||
*/
|
||||
private String name;;
|
||||
/**
|
||||
* 头像
|
||||
*/
|
||||
private String icon;
|
||||
/**
|
||||
* 签名
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 邮箱
|
||||
*/
|
||||
private String email;
|
||||
/**
|
||||
* 生日
|
||||
*/
|
||||
private String birth;
|
||||
/**
|
||||
* 手机号码
|
||||
*/
|
||||
private String mobile;
|
||||
/**
|
||||
* 自定义扩展信息
|
||||
*/
|
||||
private String ex;
|
||||
|
||||
/**
|
||||
* 性别
|
||||
*/
|
||||
private String gender;
|
||||
/**
|
||||
* 是否有效
|
||||
*/
|
||||
private String valid;
|
||||
/**
|
||||
* 是否全局禁言
|
||||
*/
|
||||
private String mute;
|
||||
/**
|
||||
* 账号在单聊模块中是否被禁言
|
||||
*/
|
||||
private String muteP2P;
|
||||
/**
|
||||
* 账号在群组模块中是否被禁言
|
||||
*/
|
||||
private String muteQChat;
|
||||
/**
|
||||
* 账号在群组模块中是否被禁言
|
||||
*/
|
||||
private String muteTeam;
|
||||
/**
|
||||
* 账号在聊天室模块中是否被禁言
|
||||
*/
|
||||
private String muteRoom;
|
||||
}
|
||||
|
||||
}
|
||||
@ -93,7 +93,7 @@ public class RocketMQEventConfiguration {
|
||||
@Slf4j
|
||||
@Component
|
||||
@RocketMQMessageListener(topic = "topic_im_center_${spring.profiles.active}",
|
||||
consumerGroup = "GID_chat_group_create_${spring.application.name}_${spring.profiles.active}",
|
||||
consumerGroup = "GID_topic_chat_group_user_add_${spring.application.name}_${spring.profiles.active}",
|
||||
consumeMode = ConsumeMode.ORDERLY,
|
||||
nameServer = "${rocketmq.name-server}"
|
||||
)
|
||||
@ -112,7 +112,7 @@ public class RocketMQEventConfiguration {
|
||||
@Slf4j
|
||||
@Component
|
||||
@RocketMQMessageListener(topic = "topic_profile_${spring.profiles.active}",
|
||||
consumerGroup = "GID_chat_group_create_${spring.application.name}_${spring.profiles.active}",
|
||||
consumerGroup = "GID_topic_chat_group_update_avatar_${spring.application.name}_${spring.profiles.active}",
|
||||
consumeMode = ConsumeMode.ORDERLY,
|
||||
nameServer = "${rocketmq.name-server}"
|
||||
)
|
||||
@ -131,7 +131,7 @@ public class RocketMQEventConfiguration {
|
||||
@Slf4j
|
||||
@Component
|
||||
@RocketMQMessageListener(topic = "topic_organizational_${spring.profiles.active}",
|
||||
consumerGroup = "GID_chat_group_create_${spring.application.name}_${spring.profiles.active}",
|
||||
consumerGroup = "GID_topic_chat_group_user_change_${spring.application.name}_${spring.profiles.active}",
|
||||
consumeMode = ConsumeMode.ORDERLY,
|
||||
nameServer = "${rocketmq.name-server}"
|
||||
)
|
||||
@ -150,7 +150,7 @@ public class RocketMQEventConfiguration {
|
||||
@Slf4j
|
||||
@Component
|
||||
@RocketMQMessageListener(topic = "topic_tyr_${spring.profiles.active}",
|
||||
consumerGroup = "GID_chat_group_change_owner_${spring.application.name}_${spring.profiles.active}",
|
||||
consumerGroup = "GID_topic_chat_group_change_owner_${spring.application.name}_${spring.profiles.active}",
|
||||
consumeMode = ConsumeMode.ORDERLY,
|
||||
nameServer = "${rocketmq.name-server}"
|
||||
)
|
||||
|
||||
@ -4,8 +4,11 @@ import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.im.center.api.feign.ChatGroupApi;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupChangeOwnerReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupCreateReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupGetUinfosReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupJoinTeamsReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupSendDingDingMsgReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupUpdateImAccountReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.GroupHistoryMsgQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.KickChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ListCrowTypesReq;
|
||||
@ -13,13 +16,19 @@ import cn.axzo.im.center.api.vo.req.chatgroup.PrivateHistoryMsgQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.UserAddChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupCreateResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupCrowTypeResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupGetUinfosResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupJoinTeamsResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupQueryResp;
|
||||
import cn.axzo.im.center.api.vo.resp.HistoryMsgQueryResp;
|
||||
import cn.axzo.im.center.common.enums.ChatGroupUserDataSourceEnum;
|
||||
import cn.axzo.im.job.UpdateImAccountPersonInfoJob;
|
||||
import cn.axzo.im.service.ChatGroupService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@ -34,11 +43,18 @@ import java.util.Set;
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RefreshScope
|
||||
public class ChatGroupController implements ChatGroupApi {
|
||||
|
||||
@Resource
|
||||
private ChatGroupService chatGroupService;
|
||||
|
||||
@Resource
|
||||
private UpdateImAccountPersonInfoJob updateImAccountPersonInfoJob;
|
||||
|
||||
@Value("${chatgroup.updateImAccountFlag:true}")
|
||||
private Boolean updateImAccountFlag;
|
||||
|
||||
/**
|
||||
* 创建群聊
|
||||
*/
|
||||
@ -61,7 +77,7 @@ public class ChatGroupController implements ChatGroupApi {
|
||||
*/
|
||||
@Override
|
||||
public ApiResult<Void> userAddChatGroup(@RequestBody @Validated UserAddChatGroupReq req) {
|
||||
chatGroupService.userAddChatGroup(req);
|
||||
chatGroupService.userAddChatGroup(req, ChatGroupUserDataSourceEnum.API_HANDLE);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@ -116,4 +132,39 @@ public class ChatGroupController implements ChatGroupApi {
|
||||
return ApiResult.ok(chatGroupService.groupHistoryMsgQuery(req));
|
||||
}
|
||||
|
||||
/**
|
||||
* 群聊-更新im账号
|
||||
*/
|
||||
@Override
|
||||
public ApiResult<String> updateImAccount(@RequestBody @Validated ChatGroupUpdateImAccountReq req) {
|
||||
try {
|
||||
if (updateImAccountFlag) {
|
||||
updateImAccountPersonInfoJob.execute(req.getIds());
|
||||
return ApiResult.ok("ok");
|
||||
}
|
||||
return ApiResult.ok("开关未打开");
|
||||
} catch (Exception e) {
|
||||
log.warn("updateImAccount-exception", e);
|
||||
return ApiResult.ok("异常");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 群聊-发送钉钉
|
||||
*/
|
||||
@Override
|
||||
public ApiResult<Void> sendDingDingMsg(@RequestBody @Validated ChatGroupSendDingDingMsgReq req) {
|
||||
this.chatGroupService.sendDingRobot(req.getContent());
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
*/
|
||||
@Override
|
||||
public ApiResult<ChatGroupGetUinfosResp> getUinfos(@RequestBody @Validated ChatGroupGetUinfosReq req) {
|
||||
ChatGroupGetUinfosResp uinfos = this.chatGroupService.getUinfos(req);
|
||||
return ApiResult.ok(uinfos);
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,34 @@
|
||||
package cn.axzo.im.gateway;
|
||||
|
||||
import cn.axzo.riven.client.common.enums.DingTalkMsgTypeEnum;
|
||||
import cn.axzo.riven.client.feign.DingDingMsgApi;
|
||||
import cn.axzo.riven.client.model.ReplyMessage;
|
||||
import cn.axzo.riven.client.req.DingDingSendRebootGroupMsgReq;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service("dingDingMsgApiGateway")
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class DingDingMsgApiGateway {
|
||||
|
||||
private final DingDingMsgApi dingDingMsgApi;
|
||||
|
||||
/**
|
||||
* 发送消息
|
||||
*/
|
||||
public void sendMsg(DingTalkMsgTypeEnum msgType, ReplyMessage replyMessage, String dingDingScene) {
|
||||
DingDingSendRebootGroupMsgReq req = new DingDingSendRebootGroupMsgReq();
|
||||
req.setMsgType(msgType);
|
||||
req.setReplyMessage(replyMessage);
|
||||
req.setDingDingScene(dingDingScene);
|
||||
try {
|
||||
dingDingMsgApi.sendRebootGroupMsg(req);
|
||||
} catch (Exception e) {
|
||||
log.warn("DingDingMsgApiGateway-sendMsg Exception, req:{}", JSON.toJSONString(replyMessage), e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -132,7 +132,7 @@ public class ChatGroupChangeOwnerEventHandler implements EventHandler, Initializ
|
||||
continue;
|
||||
}
|
||||
// 2 用户添加进群/更换群主
|
||||
this.chatGroupService.userAddChatGroup(UserAddChatGroupReq.builder().chatGroupId(chatGroup.getId()).members(Sets.newHashSet(newImAccountOwner)).build());
|
||||
this.chatGroupService.userAddChatGroup(UserAddChatGroupReq.builder().chatGroupId(chatGroup.getId()).members(Sets.newHashSet(newImAccountOwner)).build(), ChatGroupUserDataSourceEnum.USER_CHANGE);
|
||||
this.chatGroupService.changeOwner(chatGroup.getId(), chatGroup.getGroupOwner(), newImAccountOwner, ChatGroupUserDataSourceEnum.USER_CHANGE);
|
||||
break;
|
||||
case OU:
|
||||
@ -141,7 +141,7 @@ public class ChatGroupChangeOwnerEventHandler implements EventHandler, Initializ
|
||||
continue;
|
||||
}
|
||||
// 2 用户添加进群/更换群主
|
||||
this.chatGroupService.userAddChatGroup(UserAddChatGroupReq.builder().chatGroupId(chatGroup.getId()).members(Sets.newHashSet(newImAccountOwner)).build());
|
||||
this.chatGroupService.userAddChatGroup(UserAddChatGroupReq.builder().chatGroupId(chatGroup.getId()).members(Sets.newHashSet(newImAccountOwner)).build(),ChatGroupUserDataSourceEnum.USER_CHANGE);
|
||||
this.chatGroupService.changeOwner(chatGroup.getId(), chatGroup.getGroupOwner(), newImAccountOwner, ChatGroupUserDataSourceEnum.USER_CHANGE);
|
||||
break;
|
||||
case TEAM:
|
||||
|
||||
@ -14,15 +14,19 @@ import cn.axzo.im.entity.AccountRegister;
|
||||
import cn.axzo.im.service.AccountService;
|
||||
import cn.axzo.im.utils.BizAssertions;
|
||||
import cn.axzo.maokai.api.util.Ref;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.util.concurrent.RateLimiter;
|
||||
import com.xxl.job.core.biz.model.ReturnT;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
import com.xxl.job.core.log.XxlJobLogger;
|
||||
import lombok.Data;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.math.NumberUtils;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -51,7 +55,8 @@ public class UpdateImAccountPersonInfoJob {
|
||||
public ReturnT<String> execute(String jsonStr) throws Exception {
|
||||
try {
|
||||
log.info("job start");
|
||||
executeImpl();
|
||||
//执行
|
||||
doExecute(jsonStr);
|
||||
log.info("job end");
|
||||
return ReturnT.SUCCESS;
|
||||
} catch (Exception e) {
|
||||
@ -60,37 +65,71 @@ public class UpdateImAccountPersonInfoJob {
|
||||
}
|
||||
}
|
||||
|
||||
private void executeImpl() {
|
||||
/**
|
||||
* 执行
|
||||
*/
|
||||
private void doExecute(String jsonStr) {
|
||||
|
||||
ParamParse dictData = null;
|
||||
if (org.springframework.util.StringUtils.hasText(jsonStr)) {
|
||||
dictData = JSON.parseObject(jsonStr, ParamParse.class);
|
||||
}
|
||||
//
|
||||
if (Objects.nonNull(dictData) && !CollectionUtils.isEmpty(dictData.getIds())) {
|
||||
XxlJobLogger.log("根据Ids更新im账号-start,ids:{}", dictData.getIds());
|
||||
List<AccountRegister> accounts = accountRegisterDao
|
||||
.lambdaQuery()
|
||||
.eq(AccountRegister::getAccountType, AccountTypeEnum.USER.getCode())
|
||||
.eq(AccountRegister::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.in(AccountRegister::getId, dictData.getIds())
|
||||
.orderByAsc(AccountRegister::getId)
|
||||
.list();
|
||||
this.updateImAccountByAccountRegis(accounts);
|
||||
XxlJobLogger.log("根据Ids更新im账号-end,ids:{}", CollectionUtils.isEmpty(accounts) ? "" : accounts.stream().map(AccountRegister::getId).collect(toList()));
|
||||
return;
|
||||
}
|
||||
|
||||
Supplier<List<AccountRegister>> cursor = accountsCursor();
|
||||
int count = 0;
|
||||
for (List<AccountRegister> accounts = cursor.get(); !accounts.isEmpty(); accounts = cursor.get()) {
|
||||
log.info("update account info, count: {}", count += accounts.size());
|
||||
//1 获取IM账号
|
||||
GetAccountInfoResponse imAccountList = accountService.getImAccount(accounts);
|
||||
|
||||
if (!imAccountList.isSuccess()) {
|
||||
log.warn("get account info failed, {}", imAccountList);
|
||||
this.updateImAccountByAccountRegis(accounts);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据账号注册表,更新Im账号
|
||||
*/
|
||||
private void updateImAccountByAccountRegis(List<AccountRegister> accounts) {
|
||||
if (CollectionUtils.isEmpty(accounts)) {
|
||||
return;
|
||||
}
|
||||
log.info("updateImAccountByAccountRegis, count: {}", accounts.size());
|
||||
//1 获取IM账号
|
||||
GetAccountInfoResponse imAccountList = accountService.getImAccount(accounts);
|
||||
|
||||
if (!imAccountList.isSuccess()) {
|
||||
log.warn("get account info failed, {}", imAccountList);
|
||||
return;
|
||||
}
|
||||
//2 构建PersonProfile
|
||||
Map<Long, PersonProfileDto> id2PersonProfile = this.buildPersonProfileMap(accounts);
|
||||
for (AccountRegister account : accounts) {
|
||||
GetAccountInfoResponse.AccountInfo imAccount = imAccountList.findImAccountInfo(account.getImAccount()).orElse(null);
|
||||
if (imAccount == null) continue;
|
||||
//3 获取personProfile
|
||||
PersonProfileDto person = this.fetchPersonById(account.getAccountId(), id2PersonProfile);
|
||||
if (Objects.isNull(person) || Objects.isNull(person.getId())) {
|
||||
log.info("personProfile为空,personId:{}", account.getAccountId());
|
||||
continue;
|
||||
}
|
||||
//2 构建PersonProfile
|
||||
Map<Long, PersonProfileDto> id2PersonProfile = this.buildPersonProfileMap(accounts);
|
||||
for (AccountRegister account : accounts) {
|
||||
GetAccountInfoResponse.AccountInfo imAccount = imAccountList.findImAccountInfo(account.getImAccount()).orElse(null);
|
||||
if (imAccount == null) continue;
|
||||
//3 获取personProfile
|
||||
PersonProfileDto person = this.fetchPersonById(account.getAccountId(), id2PersonProfile);
|
||||
if (Objects.isNull(person) || Objects.isNull(person.getId())) {
|
||||
log.info("personProfile为空,personId:{}", account.getAccountId());
|
||||
continue;
|
||||
}
|
||||
//4 更新IM账号
|
||||
UpdateAccountInfoResponse updateAccountInfoResponse
|
||||
= accountService.syncImAccount(account.getAccountId(), imAccount.getAccid()
|
||||
,imAccount.getOrCreateExtObject(), person.getAvatarUrl(), person.getRealName());
|
||||
//日志打印
|
||||
this.successLog(updateAccountInfoResponse);
|
||||
}
|
||||
//4 更新IM账号
|
||||
UpdateAccountInfoResponse updateAccountInfoResponse
|
||||
= accountService.syncImAccount(account.getAccountId(), imAccount.getAccid()
|
||||
,imAccount.getOrCreateExtObject(), person.getAvatarUrl(), person.getRealName());
|
||||
//日志打印
|
||||
this.successLog(updateAccountInfoResponse);
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,4 +214,9 @@ public class UpdateImAccountPersonInfoJob {
|
||||
};
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class ParamParse {
|
||||
private List<Long> ids;
|
||||
}
|
||||
|
||||
}
|
||||
@ -4,12 +4,14 @@ import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupChangeOwnerReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupCreateReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupGenericSearchReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupGetUinfosReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.GroupHistoryMsgQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.KickChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.PrivateHistoryMsgQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.UserAddChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupCreateResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupGetUinfosResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupJoinTeamsResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupQueryResp;
|
||||
import cn.axzo.im.center.api.vo.resp.HistoryMsgQueryResp;
|
||||
@ -68,7 +70,7 @@ public interface ChatGroupService extends IService<ChatGroup> {
|
||||
/**
|
||||
* 拉人进群
|
||||
*/
|
||||
void userAddChatGroup(UserAddChatGroupReq req);
|
||||
void userAddChatGroup(UserAddChatGroupReq req, ChatGroupUserDataSourceEnum dataSource);
|
||||
|
||||
/**
|
||||
* 拉人进群
|
||||
@ -131,4 +133,9 @@ public interface ChatGroupService extends IService<ChatGroup> {
|
||||
*/
|
||||
String registerAccountIfAbsent(String appType, String personId, Long ouId);
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
*/
|
||||
ChatGroupGetUinfosResp getUinfos(ChatGroupGetUinfosReq req);
|
||||
|
||||
}
|
||||
|
||||
@ -7,4 +7,10 @@ public interface DingDingRobotService {
|
||||
* @param content
|
||||
*/
|
||||
void send(String content);
|
||||
|
||||
/**
|
||||
* 对接riven发送钉钉
|
||||
* @param content 内容
|
||||
*/
|
||||
void sendMsg(String content);
|
||||
}
|
||||
|
||||
@ -9,6 +9,7 @@ import cn.axzo.im.center.api.vo.req.AccountAbsentQuery;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupChangeOwnerReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupCreateReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupGenericSearchReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupGetUinfosReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.ChatGroupUserGenericSearchReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.GroupHistoryMsgQueryReq;
|
||||
@ -16,6 +17,7 @@ import cn.axzo.im.center.api.vo.req.chatgroup.KickChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.PrivateHistoryMsgQueryReq;
|
||||
import cn.axzo.im.center.api.vo.req.chatgroup.UserAddChatGroupReq;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupCreateResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupGetUinfosResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupJoinTeamsResp;
|
||||
import cn.axzo.im.center.api.vo.resp.ChatGroupQueryResp;
|
||||
import cn.axzo.im.center.api.vo.resp.HistoryMsgQueryResp;
|
||||
@ -31,6 +33,7 @@ import cn.axzo.im.channel.netease.NimChannelService;
|
||||
import cn.axzo.im.channel.netease.dto.ChangeOwnerRequest;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupCreateRequest;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupCreateResponse;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupGetUinfosResponse;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupJoinTeamsResponse;
|
||||
import cn.axzo.im.channel.netease.dto.ChatGroupQueryResponse;
|
||||
import cn.axzo.im.channel.netease.dto.HistoryMsgQueryResponse;
|
||||
@ -51,6 +54,7 @@ import cn.axzo.im.gateway.WorkspaceApiGateway;
|
||||
import cn.axzo.im.service.AccountService;
|
||||
import cn.axzo.im.service.ChatGroupService;
|
||||
import cn.axzo.im.service.ChatGroupUserService;
|
||||
import cn.axzo.im.service.DingDingRobotService;
|
||||
import cn.axzo.im.service.OperateLogService;
|
||||
import cn.axzo.im.utils.BizAssertions;
|
||||
import cn.axzo.im.utils.DingTalkUtil;
|
||||
@ -130,7 +134,7 @@ public class ChatGroupServiceImpl extends ServiceImpl<ChatGroupMapper, ChatGrou
|
||||
private OrganizationalNodeUserApiGateway organizationalNodeUserApiGateway;
|
||||
|
||||
@Autowired
|
||||
private OrgJobApiGateway orgJobApiGateway;
|
||||
private DingDingRobotService dingDingRobotService;
|
||||
|
||||
@Value("${spring.profiles.active}")
|
||||
private String env;
|
||||
@ -495,9 +499,9 @@ public class ChatGroupServiceImpl extends ServiceImpl<ChatGroupMapper, ChatGrou
|
||||
* 拉人进群
|
||||
*/
|
||||
@Override
|
||||
public void userAddChatGroup(UserAddChatGroupReq req) {
|
||||
public void userAddChatGroup(UserAddChatGroupReq req, ChatGroupUserDataSourceEnum dataSource) {
|
||||
ChatGroup chatGroup = this.getById(req.getChatGroupId());
|
||||
this.userAddChatGroup(chatGroup.getId(), chatGroup.getTid(), chatGroup.getGroupOwner(), req.getMembers(), chatGroup.getName(), ChatGroupUserDataSourceEnum.API_HANDLE);
|
||||
this.userAddChatGroup(chatGroup.getId(), chatGroup.getTid(), chatGroup.getGroupOwner(), req.getMembers(), chatGroup.getName(), dataSource);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -605,6 +609,16 @@ public class ChatGroupServiceImpl extends ServiceImpl<ChatGroupMapper, ChatGrou
|
||||
return HistoryMsgQueryResp.builder().msgs(historyMsgQueryResponse.getMsgs()).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户卡片
|
||||
*/
|
||||
@Override
|
||||
public ChatGroupGetUinfosResp getUinfos(ChatGroupGetUinfosReq req) {
|
||||
ChatGroupGetUinfosResponse response = nimChannelService.getUinfos(req.getAccids(), req.getMuteStatus());
|
||||
List<ChatGroupGetUinfosResp.UInfo> uInfos = BeanUtil.copyToList(response.getUinfos(), ChatGroupGetUinfosResp.UInfo.class);
|
||||
return ChatGroupGetUinfosResp.builder().uinfos(uInfos).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册IM账号(支持幂等性)
|
||||
*/
|
||||
@ -628,7 +642,8 @@ public class ChatGroupServiceImpl extends ServiceImpl<ChatGroupMapper, ChatGrou
|
||||
log.info("DingTalkBotEnabled = false,屏蔽钉钉消息发送。content = {}", content);
|
||||
return;
|
||||
}
|
||||
DingTalkUtil.sendMessage("【环境:" + env + "】\n" + content, chatGroupConfig.getDingTalkBotAccessToken(), chatGroupConfig.getDingTalkBotSecret());
|
||||
this.dingDingRobotService.sendMsg("【环境:" + env + "】\n" + content);
|
||||
// DingTalkUtil.sendMessage("【环境:" + env + "】\n" + content, chatGroupConfig.getDingTalkBotAccessToken(), chatGroupConfig.getDingTalkBotSecret());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,8 +1,13 @@
|
||||
package cn.axzo.im.service.impl;
|
||||
|
||||
import cn.axzo.im.config.ChatGroupConfig;
|
||||
import cn.axzo.im.gateway.DingDingMsgApiGateway;
|
||||
import cn.axzo.im.service.DingDingRobotService;
|
||||
import cn.axzo.im.utils.DingTalkUtil;
|
||||
import cn.axzo.riven.client.common.enums.DingTalkMsgTypeEnum;
|
||||
import cn.axzo.riven.client.model.ReplyMessage;
|
||||
import cn.axzo.riven.client.model.SampleMarkdown;
|
||||
import lombok.Data;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
@ -16,6 +21,9 @@ public class DingDingRobotServiceImpl implements DingDingRobotService {
|
||||
@Value("${spring.profiles.active}")
|
||||
private String env;
|
||||
private final ChatGroupConfig chatGroupConfig;
|
||||
private final DingDingMsgApiGateway dingDingMsgApiGateway;
|
||||
|
||||
private final String IM_CHAT_GROUP_WARN = "IM_CHAT_GROUP_WARN";
|
||||
|
||||
@Override
|
||||
public void send(String content) {
|
||||
@ -25,4 +33,33 @@ public class DingDingRobotServiceImpl implements DingDingRobotService {
|
||||
}
|
||||
DingTalkUtil.sendMessage("【环境:" + env + "】\n" + content, chatGroupConfig.getDingTalkBotAccessToken(), chatGroupConfig.getDingTalkBotSecret());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMsg(String content) {
|
||||
if (BooleanUtils.isNotTrue(chatGroupConfig.getDingTalkBotEnabled())) {
|
||||
log.info("DingTalkBotEnabled = false,屏蔽钉钉消息发送。content = {}", content);
|
||||
return;
|
||||
}
|
||||
String title = "群聊相关告警";
|
||||
dingDingMsgApiGateway.sendMsg(DingTalkMsgTypeEnum.sampleMarkdown, new SampleMarkdown(title,content), IM_CHAT_GROUP_WARN);
|
||||
}
|
||||
}
|
||||
|
||||
@Data
|
||||
class SampleReply implements ReplyMessage<String> {
|
||||
|
||||
private String content;
|
||||
|
||||
public SampleReply(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
@Override
|
||||
public DingTalkMsgTypeEnum msgType() {
|
||||
return DingTalkMsgTypeEnum.sampleText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String messageBody() {
|
||||
return content;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user