package com.ruoyi.rongcloud.service.Impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.dtflys.forest.exceptions.ForestRuntimeException;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.entity.SysConfig;
|
import com.ruoyi.common.core.domain.entity.SysUser;
|
import com.ruoyi.common.core.redis.RedisCache;
|
import com.ruoyi.common.utils.SecurityUtils;
|
import com.ruoyi.rongcloud.mapper.ArdRongGroupMapper;
|
import com.ruoyi.rongcloud.mapper.ArdRongGroupUserMapper;
|
import com.ruoyi.rongcloud.domain.*;
|
import com.ruoyi.rongcloud.param.*;
|
import com.ruoyi.rongcloud.service.RongCloudService;
|
import com.ruoyi.system.mapper.SysConfigMapper;
|
import com.ruoyi.system.mapper.SysUserMapper;
|
import com.ruoyi.utils.forest.RongCloudClient;
|
import lombok.extern.slf4j.Slf4j;
|
import okhttp3.*;
|
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.io.IOException;
|
import java.lang.reflect.Field;
|
import java.util.*;
|
|
/**
|
* @Description: 通融业务服务
|
* @ClassName: RongCloudServiceImpl
|
* @Author: 刘苏义
|
* @Date: 2023年07月15日16:49:12
|
* @Version: 1.0
|
**/
|
@Service
|
@Slf4j(topic = "rongCloud")
|
public class RongCloudServiceImpl implements RongCloudService {
|
|
@Resource
|
RongCloudClient rongCloudClient;
|
@Resource
|
RedisCache redisCache;
|
@Resource
|
private ArdRongGroupMapper ardRongGroupMapper;
|
@Resource
|
private ArdRongGroupUserMapper ardRongGroupUserMapper;
|
@Resource
|
private SysUserMapper sysUserMapper;
|
@Resource
|
private SysConfigMapper sysConfigMapper;
|
|
/**
|
* 获取融云token
|
*
|
* @param userId 用户id
|
* @param name 用户姓名
|
*/
|
@Override
|
public String getToken(String userId, String name) {
|
|
String token = "";
|
try {
|
RongCloudParam param = new RongCloudParam();
|
param.setUserId(userId);
|
param.setName(name);
|
Map<String, Object> map = rongCloudClient.getToken(getRongCloudHead(), param);
|
token = (String) map.get("token");
|
log.debug("用户" + userId + "获取到融云token:" + token);
|
}catch(ForestRuntimeException ex)
|
{
|
log.error("获取融云token异常:" + ex.getMessage());
|
}
|
return token;
|
}
|
|
@Override
|
public Map<String, Object> checkOnline(List<String> userIds) {
|
Map<String, Object> onlineMap = new HashMap<>();
|
for (String userId : userIds) {
|
RongCloudParam param = new RongCloudParam();
|
param.setUserId(userId);
|
Map<String, Object> isOnline = rongCloudClient.checkOnline(getRongCloudHead(), param);
|
onlineMap.put(userId, isOnline.get("status"));
|
}
|
return onlineMap;
|
}
|
|
@Override
|
public Boolean checkOnline(String userId) {
|
RongCloudParam param = new RongCloudParam();
|
param.setUserId(userId);
|
Map<String, Object> isOnline = rongCloudClient.checkOnline(getRongCloudHead(), param);
|
return isOnline.get("status").equals("1");
|
}
|
|
@Override
|
public AjaxResult groupCreate(RongCloudGroupParam group) {
|
group.setGroupId(String.valueOf(UUID.randomUUID()));
|
//Map<String, Object> groupMap = rongCloudClient.groupCreate(getRongCloudHead(), group);
|
SysConfig sysConfig = new SysConfig();
|
sysConfig.setConfigKey("rongyun");
|
SysConfig rySysConfig = sysConfigMapper.selectConfig(sysConfig);
|
String url = rySysConfig.getConfigValue() + "/group/create.json";
|
String appKey = redisCache.getCacheObject("sys_config:RongCloudAppKey");
|
String appSecret = redisCache.getCacheObject("sys_config:RongCloudAppSecret");
|
Map<String, Object> groupMap = createGroupChat(url, appSecret, appKey,group.getUserId(),group.getGroupId(),group.getGroupName());
|
Integer code = (Integer) groupMap.get("code");
|
if (code.equals(200)) {
|
ArdRongGroup ardRongGroup = new ArdRongGroup();
|
ardRongGroup.setGroupId(group.getGroupId());
|
ardRongGroup.setGroupName(group.getGroupName());
|
ardRongGroup.setCreateName(SecurityUtils.getUserId());
|
ardRongGroup.setCreateTime(new Date());
|
ardRongGroupMapper.insert(ardRongGroup);
|
List<String> userList = group.getUserId();
|
for (int i = 0; i < userList.size(); i++) {
|
ArdRongGroupUser ardRongGroupUser = new ArdRongGroupUser();
|
ardRongGroupUser.setId(String.valueOf(UUID.randomUUID()));
|
ardRongGroupUser.setGroupId(group.getGroupId());
|
ardRongGroupUser.setUserId(userList.get(i));
|
ardRongGroupUserMapper.insert(ardRongGroupUser);
|
}
|
}
|
groupMap.put("userId", group.getUserId());
|
groupMap.put("groupId", group.getGroupId());
|
groupMap.put("group", group.getGroupName());
|
return AjaxResult.success(groupMap);
|
}
|
|
public Map<String,Object> createGroupChat(String url,String AppSecret,String AppKey,List<String> usersIdList,String groupId,String groupName){
|
OkHttpClient okHttpClient = new OkHttpClient();
|
FormBody.Builder builder = new FormBody.Builder();
|
for(String usersId : usersIdList){
|
builder.add("userId", usersId);
|
}
|
|
RequestBody formBody = builder.add("groupId", groupId)
|
.add("groupName", groupName).build();
|
|
String Nonce = String.valueOf(Math.random()).split("\\.")[1];
|
String Timestamp = String.valueOf(new Date().getTime());
|
String Signature = DigestUtils.sha1Hex(AppSecret + Nonce + Timestamp);//App Secret + Nonce + T
|
/*System.out.println(Nonce);
|
System.out.println(Timestamp);
|
System.out.println(AppSecret + Nonce + Timestamp);
|
System.out.println(Signature);*/
|
|
Request request = new Request.Builder().url(url).post(formBody)
|
.addHeader("Host","api-cn.ronghub.com")
|
.addHeader("App-Key", AppKey)
|
.addHeader("Nonce", Nonce)
|
.addHeader("Timestamp", Timestamp)
|
.addHeader("Signature", Signature)
|
.addHeader("Content-Type", "application/x-www-form-urlencoded").build();
|
|
Response response = null;
|
try {
|
response = okHttpClient.newCall(request).execute();
|
} catch (IOException e1) {
|
// TODO Auto-generated catch block
|
e1.printStackTrace();
|
}
|
|
ResponseBody responseBody = response.body();
|
|
try {
|
String message = responseBody.string();
|
Map<String,Object> result = (Map<String, Object>) JSON.parse(message);
|
return result;
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
return new HashMap();
|
}
|
}
|
|
@Override
|
public AjaxResult groupDismiss(RongCloudGroupDisParam groupDis) {
|
Map<String, Object> groupMap = rongCloudClient.groupDismiss(getRongCloudHead(), groupDis);
|
Integer code = (Integer) groupMap.get("code");
|
if (code.equals(200)) {
|
ardRongGroupMapper.deleteById(groupDis.getGroupId());
|
QueryWrapper<ArdRongGroupUser> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("group_id", groupDis.getGroupId());
|
ardRongGroupUserMapper.delete(queryWrapper);
|
}
|
groupMap.put("groupId", groupDis.getGroupId());
|
groupMap.put("userId", groupDis.getUserId());
|
return AjaxResult.success(groupMap);
|
}
|
|
@Override
|
public AjaxResult groupJoin(RongCloudGroupParam groupParam) {
|
Map<String, Object> groupMap = rongCloudClient.groupJoin(getRongCloudHead(), groupParam);
|
Integer code = (Integer) groupMap.get("code");
|
if (code.equals(200)) {
|
if (groupParam.getGroupName() != null) {
|
ArdRongGroup ardRongGroup = ardRongGroupMapper.selectById(groupParam.getGroupId());
|
ardRongGroup.setGroupName(groupParam.getGroupName());
|
ardRongGroupMapper.updateById(ardRongGroup);
|
}
|
List<String> userList = groupParam.getUserId();
|
for (int i = 0; i < userList.size(); i++) {
|
ArdRongGroupUser ardRongGroupUser = new ArdRongGroupUser();
|
ardRongGroupUser.setId(String.valueOf(UUID.randomUUID()));
|
ardRongGroupUser.setGroupId(groupParam.getGroupId());
|
ardRongGroupUser.setUserId(userList.get(i));
|
ardRongGroupUserMapper.insert(ardRongGroupUser);
|
}
|
}
|
groupMap.put("groupId", groupParam.getGroupId());
|
if (groupParam.getGroupName() != null) {
|
groupMap.put("groupName", groupParam.getGroupId());
|
} else {
|
ArdRongGroup ardRongGroup = ardRongGroupMapper.selectById(groupParam.getGroupId());
|
groupMap.put("groupName", ardRongGroup.getGroupName());
|
}
|
groupMap.put("userId", groupParam.getUserId());
|
return AjaxResult.success(groupMap);
|
}
|
|
@Override
|
public AjaxResult groupQuit(RongCloudGroupParam groupParam) {
|
Map<String, Object> groupMap = rongCloudClient.groupQuit(getRongCloudHead(), groupParam);
|
Integer code = (Integer) groupMap.get("code");
|
if (code.equals(200)) {
|
List<String> list = groupParam.getUserId();
|
for (int i = 0; i < list.size(); i++) {
|
String userId = list.get(i);
|
QueryWrapper<ArdRongGroupUser> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("group_id",groupParam.getGroupId())
|
.eq("user_id",userId);
|
ardRongGroupUserMapper.delete(queryWrapper);
|
}
|
}
|
groupMap.put("groupId", groupParam.getGroupId());
|
groupMap.put("groupName", groupParam.getGroupName());
|
return AjaxResult.success(groupMap);
|
}
|
|
@Override
|
public AjaxResult groupUserQuery(RongCloudGroupParam groupId) {
|
Map<String, Object> groupMap = rongCloudClient.groupUserQuery(getRongCloudHead(), groupId);
|
Integer code = (Integer) groupMap.get("code");
|
List<SysUser> sysUsers = new ArrayList<>();
|
if (code.equals(200)) {
|
List<Map<String, String>> list = (List<Map<String, String>>) groupMap.get("users");
|
for (int i = 0; i < list.size(); i++) {
|
String id = list.get(i).get("id");
|
SysUser sysUser = sysUserMapper.selectUserById(id);
|
sysUsers.add(sysUser);
|
}
|
}
|
return AjaxResult.success(sysUsers);
|
}
|
|
@Override
|
public AjaxResult groupRefresh(RongCloudGroupParam groupParam) {
|
Map<String, Object> groupMap = rongCloudClient.groupRefresh(getRongCloudHead(), groupParam);
|
Integer code = (Integer) groupMap.get("code");
|
if (code.equals(200)) {
|
String groupId = groupParam.getGroupId();
|
String groupName = groupParam.getGroupName();
|
QueryWrapper<ArdRongGroup> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("group_id",groupId);
|
ArdRongGroup ardRongGroup = ardRongGroupMapper.selectOne(queryWrapper);
|
ardRongGroup.setGroupName(groupName);
|
ardRongGroupMapper.updateById(ardRongGroup);
|
}
|
groupMap.put("groupId", groupParam.getGroupId());
|
groupMap.put("groupName", groupParam.getGroupName());
|
return AjaxResult.success(groupMap);
|
}
|
|
@Override
|
public AjaxResult userGroupQuery(RongCloudGroupUserParam userParam) {
|
return AjaxResult.success(rongCloudClient.userGroupQuery(getRongCloudHead(), userParam));
|
}
|
|
@Override
|
public AjaxResult groupSync(RongCloudGroupSyncParam syncParam) {
|
RongCloudGroupSyncEndParam endParam = new RongCloudGroupSyncEndParam();
|
endParam.setUserId(syncParam.getUserId());
|
List<RongCloudGroupSyncTwoParam> twoParams = syncParam.getList();
|
for (int i = 0; i < twoParams.size(); i++) {
|
RongCloudGroupSyncTwoParam syncTwoParam = twoParams.get(i);
|
String groupId = syncTwoParam.getGroupId();
|
String groupName = syncTwoParam.getGroupName();
|
try {
|
Class clazz = endParam.getClass();
|
// 动态添加属性
|
Field ageField = clazz.getDeclaredField("group[" + groupId + "]");
|
ageField.setAccessible(true); // 设置私有属性可访问
|
ageField.set(endParam, groupName);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
Map<String, Object> groupMap = rongCloudClient.groupSync(getRongCloudHead(), endParam);
|
return AjaxResult.success(groupMap);
|
}
|
|
@Override
|
public AjaxResult groupInfo(String groupId) {
|
Map<String,Object> map = new HashMap<>();
|
QueryWrapper<ArdRongGroup> ardRongGroupQueryWrapper = new QueryWrapper<>();
|
ardRongGroupQueryWrapper.eq("group_id",groupId);
|
ArdRongGroup ardRongGroup = ardRongGroupMapper.selectOne(ardRongGroupQueryWrapper);
|
map.put("group",ardRongGroup);
|
QueryWrapper<ArdRongGroupUser> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("group_id",groupId);
|
List<ArdRongGroupUser> list = ardRongGroupUserMapper.selectList(queryWrapper);
|
List<SysUser> sysUsers = new ArrayList<>();
|
for (int i = 0; i < list.size(); i++) {
|
String userId = list.get(i).getUserId();
|
SysUser sysUser = sysUserMapper.selectUserById(userId);
|
sysUsers.add(sysUser);
|
}
|
map.put("user",sysUsers);
|
return AjaxResult.success(map);
|
}
|
|
@Override
|
public AjaxResult groupUserAll(String groupId) {
|
ArdRongGroup ardRongGroup = ardRongGroupMapper.selectById(groupId);
|
QueryWrapper<ArdRongGroupUser> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("group_id",ardRongGroup.getGroupId());
|
List<ArdRongGroupUser> list = ardRongGroupUserMapper.selectList(queryWrapper);
|
List<String> userList = new ArrayList<>();
|
for (int i = 0; i < list.size(); i++) {
|
userList.add(list.get(i).getUserId());
|
}
|
QueryWrapper<SysUser> queryWrapper1 = new QueryWrapper<>();
|
if(userList.size()>0){
|
queryWrapper1.notIn("user_id",userList).eq("del_flag","0");
|
}else {
|
queryWrapper1.eq("del_flag","0");
|
}
|
List<SysUser> sysUsers = sysUserMapper.selectList(queryWrapper1);
|
return AjaxResult.success(sysUsers);
|
}
|
|
/**
|
* 获取融云签名信息
|
*/
|
public Map<String, Object> getRongCloudHead() {
|
String appKey = redisCache.getCacheObject("sys_config:RongCloudAppKey");
|
String appSecret = redisCache.getCacheObject("sys_config:RongCloudAppSecret");
|
String nonce = RandomStringUtils.randomNumeric(18);
|
String timestamp = String.valueOf(System.currentTimeMillis());
|
String signature = DigestUtils.sha1Hex(appSecret + nonce + timestamp);//App Secret + Nonce + T
|
Map<String, Object> headerMap = new HashMap<>();
|
headerMap.put("App-Key", appKey);
|
headerMap.put("Nonce", nonce);
|
headerMap.put("Timestamp", timestamp);
|
headerMap.put("Signature", signature);
|
return headerMap;
|
}
|
}
|