Commit 33ade855 by hewei

Merge branch 'upay-test' into 'upay-prod'

Upay test

See merge request !31
parents 51116217 f78c4891
......@@ -22,7 +22,7 @@
##redis6(必须本地开启)
### docker安装redis
docker run -p 6379:6379 -d --restart=always --name redis6 -v $PWD/dockerData/redis6:/data redis:6 --appendonly yes
docker run -p 6379:6379 -d --restart=always --name redis6 redis:6.0 redis-server --appendonly yes --requirepass "123456"
##mysql5.7(如果本地不开,可以连上测试环境)
### docker 安装mysql
......
package com.wecloud.im.controller.serverapi;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.vo.MyConversationListVo;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 会话表 控制器
*
* @author wei
* @since 2021-05-07
*/
@Slf4j
@RestController
@RequestMapping("/server/conversation")
@Api(value = "会话表API", tags = {"会话表"})
public class ApiImConversationController extends BaseController {
@Autowired
private ImConversationService imConversationService;
@Autowired
private ImApplicationService imApplicationService;
/**
* 获取会话表详情
*/
@GetMapping("/info")
@ApiOperation(value = "会话表详情")
public ApiResult<MyConversationListVo> getImConversation(@RequestParam("conversationId") Long conversationId
, @RequestHeader String appkey, @RequestHeader String appSecret) throws Exception {
// 根据appKey从数据库查询密钥
ImApplication imApplication = imApplicationService.getOneByAppKey(appkey);
if (imApplication == null) {
return ApiResult.result(ApiCode.FAIL, null);
}
// 校验appkey 和appSecret
if (!imApplication.getAppSecret().equals(appSecret)) {
return ApiResult.result(ApiCode.FAIL, null);
}
MyConversationListVo imConversationQueryVo = imConversationService.getImConversationInfoByIdForServerApi(conversationId);
return ApiResult.ok(imConversationQueryVo);
}
}
package com.wecloud.im.controller.serverapi;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.param.ApiImConversationMembersInfoPageParam;
import com.wecloud.im.param.ApiImConversationMembersInfoQueryVo;
import com.wecloud.im.param.ApiImConversationMembersPageParam;
import com.wecloud.im.param.ApiImConversationMembersQueryVo;
import com.wecloud.im.param.add.ImConversationMemApiAdd;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImConversationMembersService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.core.validator.groups.Add;
import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
import io.swagger.annotations.Api;
......@@ -44,6 +49,28 @@ public class ApiImConversationMembersController extends BaseController {
/**
* 会话成员表分页列表
*/
@PostMapping("/findInfoList")
@OperationLog(name = "rest-api-会话成员信息表分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "rest-api-会话成员信息表分页列表")
public ApiResult<Paging<ApiImConversationMembersInfoQueryVo>> getApiImConversationMembersInfoList(@Validated @RequestBody ApiImConversationMembersInfoPageParam apiImConversationMembersInfoPageParam,
@RequestHeader String appkey, @RequestHeader String appSecret) {
// 根据appKey从数据库查询密钥
ImApplication imApplication = imApplicationService.getOneByAppKey(appkey);
if (imApplication == null) {
return ApiResult.result(ApiCode.FAIL, null);
}
// 校验appkey 和appSecret
if (!imApplication.getAppSecret().equals(appSecret)) {
return ApiResult.result(ApiCode.FAIL, null);
}
return imConversationMembersService.getApiImConversationMembersInfoList(apiImConversationMembersInfoPageParam, imApplication);
}
/**
* 会话成员表分页列表
*/
@PostMapping("/findList")
@OperationLog(name = "rest-api-会话成员表分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "rest-api-会话成员表分页列表")
......@@ -64,16 +91,27 @@ public class ApiImConversationMembersController extends BaseController {
return imConversationMembersService.getRestApiImConversationMembersList(apiImConversationMembersPageParam, imApplication);
}
// /**
// * 添加会话成员表
// */
// @PostMapping("/add")
// @OperationLog(name = "添加会话成员表", type = OperationLogType.ADD)
// @ApiOperation(value = "添加会话成员表")
// public ApiResult<Boolean> addImConversationMembers(@Validated(Add.class) @RequestBody ImConversationMembers imConversationMembers) throws Exception {
// boolean flag = imConversationMembersService.saveImConversationMembers(imConversationMembers);
// return ApiResult.result(flag);
// }
/**
* 服务端api调用 将一名用户添加至会话: ${clientID}通过${type}加入会话 -1014
*/
@PostMapping("/add")
@ApiOperation(value = "服务端api调用 将一名用户添加至会话:${clientID}通过${type}加入会话 -1014")
public ApiResult<Boolean> addImConversationMembers(@Validated(Add.class) @RequestBody ImConversationMemApiAdd imConversationMemApiAdd
, @RequestHeader String appkey, @RequestHeader String appSecret) throws Exception {
// 根据appKey从数据库查询密钥
ImApplication imApplication = imApplicationService.getOneByAppKey(appkey);
if (imApplication == null) {
return ApiResult.result(ApiCode.FAIL, null);
}
// 校验appkey 和appSecret
if (!imApplication.getAppSecret().equals(appSecret)) {
return ApiResult.result(ApiCode.FAIL, null);
}
boolean flag = imConversationMembersService.addImConversationMembersApi(imConversationMemApiAdd, imApplication);
return ApiResult.result(flag);
}
//
// /**
// * 修改会话成员表
......
......@@ -50,6 +50,8 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
MyConversationListVo getImConversationAndMsgCountById(@Param("clientId") Long clientId, @Param("conversationId") Long conversationId);
MyConversationListVo getImConversationInfoByIdForServerApi(@Param("conversationId") Long conversationId);
/**
* 查询用户加入的所有会话
*
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.param.ApiImConversationMembersInfoQueryVo;
import com.wecloud.im.param.ApiImConversationMembersQueryVo;
import com.wecloud.im.param.ImConversationMembersPageParam;
import com.wecloud.im.param.ImConversationMembersQueryVo;
......@@ -34,6 +35,8 @@ public interface ImConversationMembersMapper extends BaseMapper<ImConversationMe
List<ApiImConversationMembersQueryVo> getRestApiImConversationMembersList(@Param("conversationId") Long conversationId);
IPage<ApiImConversationMembersInfoQueryVo> getApiImConversationMembersInfoList(@Param("page") Page page, @Param("conversationId") Long conversationId);
List<ImConversationMemberListVo> getImConversationMembersList(@Param("conversationId") Long conversationId);
......
......@@ -44,7 +44,7 @@ public class NettyChannelInitializer extends ChannelInitializer<SocketChannel> {
* allIdleTime—状态为IdleState的IdleStateEvent。在一定时间内不读不写会触发ALL_IDLE。指定0禁用。
* unit—readerIdleTime、writeIdleTime和allIdleTime的时间单位
*/
pipeline.addLast(new IdleStateHandler(35, 0, 0, TimeUnit.SECONDS));
pipeline.addLast(new IdleStateHandler(150, 0, 0, TimeUnit.SECONDS));
}
}
......@@ -114,8 +114,8 @@ public class WsReadHandler extends SimpleChannelInboundHandler<TextWebSocketFram
break;
}
log.info(clientId + "超时事件:" + eventType);
if (readIdleTimes >= 5) {
log.info(clientId + ".读空闲超过5次关闭连接");
if (readIdleTimes >= 2) {
log.info(clientId + ".读空闲超过2次关闭连接");
ctx.channel().close();
}
}
......
package com.wecloud.im.param;
import io.geekidea.springbootplus.framework.core.pagination.BasePageOrderParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* <pre>
* 会话成员表 分页参数对象
* </pre>
*
* @author wei
* @date 2021-05-07
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "ApiImConversationMembersInfoPageParam")
public class ApiImConversationMembersInfoPageParam extends BasePageOrderParam {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "会话表id", required = true)
private Long conversationId;
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <pre>
* 会话成员信息表 查询结果对象
* </pre>
*
* @author wei
* @date 2021-05-07
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "ApiImConversationMembersInfoQueryVo")
public class ApiImConversationMembersInfoQueryVo implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("会话中client的备注名")
private String clientRemarkName;
@ApiModelProperty("头像")
private String headPortrait;
@ApiModelProperty("主昵称")
private String nickname;
@ApiModelProperty("clientId")
private String clientId;
}
\ No newline at end of file
package com.wecloud.im.param.add;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* api添加会话成员
*
* @author wei
* @since 2022年05月16日14:13:46
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "ImConversationMemAttrApiAdd")
public class ImConversationMemApiAdd extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "会话表id",required = true)
private Long conversationId;
@ApiModelProperty("操作者client ID,可为空")
private String operator="";
@ApiModelProperty(value = "被操作的client ID",required = true)
private String passivityOperator;
@ApiModelProperty("加入的类型, link或qrCode等")
private String joinType="";
}
......@@ -2,12 +2,15 @@ package com.wecloud.im.service;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.param.ApiImConversationMembersInfoPageParam;
import com.wecloud.im.param.ApiImConversationMembersInfoQueryVo;
import com.wecloud.im.param.ApiImConversationMembersPageParam;
import com.wecloud.im.param.ApiImConversationMembersQueryVo;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ImConversationMembersListParam;
import com.wecloud.im.param.ImConversationMembersPageParam;
import com.wecloud.im.param.ImConversationMembersQueryVo;
import com.wecloud.im.param.add.ImConversationMemApiAdd;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
import com.wecloud.im.vo.ImConversationMemberListVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
......@@ -34,10 +37,10 @@ public interface ImConversationMembersService extends BaseService<ImConversation
*/
ApiResult<List<ApiImConversationMembersQueryVo>> getRestApiImConversationMembersList(ApiImConversationMembersPageParam apiImConversationMembersPageParam, ImApplication imApplication);
ApiResult<Paging<ApiImConversationMembersInfoQueryVo>> getApiImConversationMembersInfoList(ApiImConversationMembersInfoPageParam apiImConversationMembersInfoPageParam, ImApplication imApplication);
ApiResult<Boolean> saveOrUpdateClientRemarkName(ImConvMemeClientRemarkNameParam imConvMemeClientRemarkNameParam);
/**
* 会话成员表分页列表
*
......@@ -59,6 +62,9 @@ public interface ImConversationMembersService extends BaseService<ImConversation
*/
boolean saveImConversationMembers(ImConversationMembers imConversationMembers) throws Exception;
boolean addImConversationMembersApi(ImConversationMemApiAdd imConversationMemApiAdd, ImApplication imApplication);
/**
* 修改
*
......
......@@ -107,6 +107,7 @@ public interface ImConversationService extends BaseService<ImConversation> {
MyConversationListVo getImConversationInfoById(Long id) throws Exception;
MyConversationListVo getImConversationInfoByIdForServerApi(Long id) throws Exception;
/**
* 获取分页对象
......
......@@ -9,14 +9,19 @@ import com.fasterxml.jackson.databind.json.JsonMapper;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.mapper.ImConversationMembersMapper;
import com.wecloud.im.param.ApiImConversationMembersInfoPageParam;
import com.wecloud.im.param.ApiImConversationMembersInfoQueryVo;
import com.wecloud.im.param.ApiImConversationMembersPageParam;
import com.wecloud.im.param.ApiImConversationMembersQueryVo;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ImConversationMembersListParam;
import com.wecloud.im.param.ImConversationMembersPageParam;
import com.wecloud.im.param.ImConversationMembersQueryVo;
import com.wecloud.im.param.add.ImConversationMemApiAdd;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
......@@ -24,19 +29,27 @@ import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ImConversationMemberListVo;
import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponseModel;
import com.wecloud.im.ws.service.WriteDataService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import io.geekidea.springbootplus.framework.shiro.util.SnowflakeUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 会话成员表 服务实现类
......@@ -48,8 +61,7 @@ import java.util.List;
@Service
public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversationMembersMapper, ImConversationMembers> implements ImConversationMembersService {
// private static final JsonMapper JSON_MAPPER = new JsonMapper();
private static final JsonMapper JSON_MAPPER = new JsonMapper();
@Autowired
private WriteDataService writeDataService;
......@@ -83,6 +95,21 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
}
@Override
public ApiResult<Paging<ApiImConversationMembersInfoQueryVo>> getApiImConversationMembersInfoList(ApiImConversationMembersInfoPageParam apiImConversationMembersInfoPageParam, ImApplication imApplication) {
OrderItem orderItem = new OrderItem();
orderItem.setColumn("im_conversation_members.create_time");
orderItem.setAsc(false);
Page<ImConversationMembersQueryVo> page = new PageInfo<>(apiImConversationMembersInfoPageParam, orderItem);
IPage<ApiImConversationMembersInfoQueryVo> iPage = imConversationMembersMapper.getApiImConversationMembersInfoList(page, apiImConversationMembersInfoPageParam.getConversationId());
Paging<ApiImConversationMembersInfoQueryVo> paging = new Paging<>(iPage);
return ApiResult.ok(paging);
}
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> saveOrUpdateClientRemarkName(ImConvMemeClientRemarkNameParam imConvMemeClientRemarkNameParam) {
......@@ -202,6 +229,151 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
return super.save(imConversationMembers);
}
@Override
public boolean addImConversationMembersApi(ImConversationMemApiAdd imConversationMemApiAdd, ImApplication imApplication) {
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imConversationMemApiAdd.getConversationId())
);
if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imConversationMemApiAdd.getConversationId());
return true;
}
ImClient operatorClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, imConversationMemApiAdd.getOperator()));
ImClient passivityOperatorClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, imConversationMemApiAdd.getPassivityOperator()));
// 判断用户是否已经在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imConversationMemApiAdd.getConversationId())
.eq(ImConversationMembers::getFkClientId, passivityOperatorClient.getId())
);
// 已经在该会话 则跳过
if (members != null) {
return true;
}
Long imConversationMembersId2 = SnowflakeUtil.getId();
ImConversationMembers imConversationMembers2 = new ImConversationMembers();
imConversationMembers2.setId(imConversationMembersId2);
imConversationMembers2.setCreateTime(new Date());
imConversationMembers2.setFkAppid(imApplication.getId());
imConversationMembers2.setFkConversationId(imConversationMemApiAdd.getConversationId());
imConversationMembers2.setFkClientId(passivityOperatorClient.getId());
// 添加到会话
imConversationMembersService.save(imConversationMembers2);
// ws邀请事件通知给群内其他人 ----------
// 生成消息id
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>();
content.put("operator", imConversationMemApiAdd.getOperator()); //操作的client ID
content.put("passivityOperator", imConversationMemApiAdd.getPassivityOperator()); //被操作的client ID
content.put("joinType", imConversationMemApiAdd.getJoinType()); //被操作的client ID
content.put("type", MsgTypeEnum.SERVER_INVITE_CLIENT_JOIN_CONVERSATION.getUriCode()); // 服务端api调用 将一名用户添加至会话: ${clientID}通过${type}加入会话 -1014
try {
String contentString = JSON_MAPPER.writeValueAsString(content);
imMessage.setContent(contentString);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
// 保存消息至消息表
imMessage.setId(messageId);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(operatorClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystem(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversationMemApiAdd.getConversationId());
boolean save = imMessageService.save(imMessage);
//推送到被拉入方
Long fkConversationId = imConversationMemApiAdd.getConversationId();
String clientId = imConversationMemApiAdd.getOperator();
String toClientId = passivityOperatorClient.getClientId();
String imApplicationAppKey = imApplication.getAppKey();
sendEventMsg(messageId, (HashMap) content, fkConversationId, clientId, toClientId, imApplicationAppKey);
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender("");
imMessageOnlineSend.setContent((HashMap) content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
}
return true;
}
private void sendEventMsg(long messageId, HashMap content, Long fkConversationId, String clientId, String toClientId, String imApplicationAppKey) {
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender(clientId);
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(fkConversationId);
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplicationAppKey, toClientId);
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean updateImConversationMembers(ImConversationMembers imConversationMembers) throws Exception {
......
......@@ -229,11 +229,20 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// shiro线程中获取当前token
JwtToken curentJwtToken = JwtUtil.getCurentJwtToken();
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getOneByAppKey(curentJwtToken.getAppKey());
ImClient imClientSender = imClientService.getCurentClient();
if (addMember(imClientToConversation, curentJwtToken.getAppKey(), imClientSender)) {
return ApiResult.fail();
}
return ApiResult.ok();
}
private boolean addMember(ImClientToConversation imClientToConversation, String appKey, ImClient imClientSender) {
// 根据appKey查询application
ImApplication imApplication = imApplicationService.getOneByAppKey(appKey);
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
......@@ -244,7 +253,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
);
if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
return ApiResult.fail();
return true;
}
// 将他人添加到会话
......@@ -305,6 +314,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setFkConversationId(imClientToConversation.getConversationId());
boolean save = imMessageService.save(imMessage);
//推送到被拉入方
Long fkConversationId = imClientToConversation.getConversationId();
String clientId = imClientSender.getClientId();
String toClientId = client2.getClientId();
String imApplicationAppKey = imApplication.getAppKey();
sendEventMsg(messageId, (HashMap) content, fkConversationId, clientId, toClientId, imApplicationAppKey);
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
......@@ -317,31 +334,35 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent((HashMap) content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
sendEventMsg(messageId, (HashMap) content, conversationMembers.getFkConversationId(), imClientSender.getClientId(), imClientReceiver.getClientId(), imApplication.getAppKey());
}
}
return ApiResult.ok();
return false;
}
private void sendEventMsg(long messageId, HashMap content, Long fkConversationId, String clientId, String toClientId, String imApplicationAppKey) {
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender(clientId);
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(fkConversationId);
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplicationAppKey, toClientId);
}
@Override
......@@ -434,24 +455,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent((HashMap) content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
sendEventMsg(messageId, (HashMap) content, conversationMembers.getFkConversationId(), imClientSender.getClientId(), imClientReceiver.getClientId(), imApplication.getAppKey());
}
......@@ -546,24 +550,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent((HashMap) content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponseModel<ImMessageOnlineSend> responseModel = new WsResponseModel<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
writeDataService.write(responseModel, imApplication.getAppKey(), imClientReceiver.getClientId());
sendEventMsg(messageId, (HashMap) content, conversationMembers.getFkConversationId(), imClientSender.getClientId(), imClientReceiver.getClientId(), imApplication.getAppKey());
}
......@@ -808,6 +795,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
@Override
public MyConversationListVo getImConversationInfoByIdForServerApi(Long id) throws Exception {
MyConversationListVo imConversationAndMsgCountById = imConversationMapper.getImConversationInfoByIdForServerApi(id);
JsonMapper jsonMapper = new JsonMapper();
HashMap attributess = jsonMapper.readValue(imConversationAndMsgCountById.getAttribute(), HashMap.class);
imConversationAndMsgCountById.setAttributes(attributess);
return imConversationAndMsgCountById;
}
@Override
public Paging<ImConversationQueryVo> getImConversationPageList(ImConversationPageParam imConversationPageParam) throws Exception {
Page<ImConversationQueryVo> page = new PageInfo<>(imConversationPageParam, OrderItem.desc(getLambdaColumn(ImConversation::getCreateTime)));
IPage<ImConversationQueryVo> iPage = imConversationMapper.getImConversationPageList(page, imConversationPageParam);
......
......@@ -29,6 +29,8 @@ public enum MsgTypeEnum {
// 成为新群主 -1013
CONVERSATION_NEW_CREATOR(-1013),
// 服务端api调用 将一名用户添加至会话: ${clientID}通过${type}加入会话 -1014
SERVER_INVITE_CLIENT_JOIN_CONVERSATION(-1014),
;
private final int uriCode;
......
......@@ -136,5 +136,29 @@
GROUP BY imConversation.id
</select>
<select id="getImConversationInfoByIdForServerApi" resultType="com.wecloud.im.vo.MyConversationListVo">
SELECT imConversation.id,
imConversation.create_time,
imConversation.`name`,
imConversation.attributes AS attribute,
imConversation.system,
im_client.client_id AS creator,
(
SELECT GROUP_CONCAT(im_client.client_id)
FROM im_conversation_members AS im_conversation_members
INNER JOIN im_client AS im_client ON im_client.id = im_conversation_members.fk_client_id
WHERE im_conversation_members.fk_conversation_id = imConversation.id
) AS members,
(SELECT COUNT(*)
FROM im_conversation_members
WHERE fk_conversation_id = imConversation.id) AS memberCount
FROM im_conversation AS imConversation
INNER JOIN im_client AS im_client ON im_client.id = imConversation.creator
WHERE imConversation.id = #{conversationId}
GROUP BY imConversation.id
</select>
</mapper>
......@@ -42,5 +42,19 @@
WHERE im_conversation_members.fk_conversation_id = #{conversationId}
</select>
<select id="getApiImConversationMembersInfoList"
resultType="com.wecloud.im.param.ApiImConversationMembersInfoQueryVo">
SELECT im_client.client_id as clientId,
im_conversation_members.client_remark_name as clientRemarkName,
im_client.head_portrait as headPortrait,
im_client.nickname,
im_conversation_members.attributes AS memberAttributes,
im_client.attributes AS clientAttributes
FROM im_conversation_members AS im_conversation_members
INNER JOIN im_client AS im_client ON im_client.id = im_conversation_members.fk_client_id
WHERE im_conversation_members.fk_conversation_id = #{conversationId}
</select>
</mapper>
......@@ -28,7 +28,7 @@ spring:
redis:
database: 0
host: localhost
password:
password: 123456
port: 6379
cloud:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment