Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wecloud_im_server
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
hewei
wecloud_im_server
Commits
57f0ea87
Commit
57f0ea87
authored
Mar 09, 2022
by
Future
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
解散群逻辑添加
parent
d8cf426e
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
161 additions
and
19 deletions
+161
-19
core/src/main/java/com/wecloud/im/controller/ImConversationController.java
+13
-1
core/src/main/java/com/wecloud/im/mapper/ImConversationMembersMapper.java
+8
-0
core/src/main/java/com/wecloud/im/param/DisbandConversationParam.java
+22
-0
core/src/main/java/com/wecloud/im/service/ImConversationMembersService.java
+7
-1
core/src/main/java/com/wecloud/im/service/ImConversationService.java
+8
-0
core/src/main/java/com/wecloud/im/service/impl/ImConversationMembersServiceImpl.java
+6
-1
core/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
+90
-16
core/src/main/java/com/wecloud/im/ws/enums/MsgTypeEnum.java
+3
-0
core/src/main/resources/mapper/ImConversationMembersMapper.xml
+4
-0
No files found.
core/src/main/java/com/wecloud/im/controller/ImConversationController.java
View file @
57f0ea87
package
com
.
wecloud
.
im
.
controller
;
import
com.alibaba.fastjson.JSON
;
import
com.wecloud.im.param.DisbandConversationParam
;
import
com.wecloud.im.param.ImConversationQueryParam
;
import
com.wecloud.im.param.MutedGroupParam
;
import
com.wecloud.im.param.SetAdminsParam
;
...
...
@@ -81,12 +82,23 @@ public class ImConversationController extends BaseController {
* 将client从会话移除
*/
@PostMapping
(
"/delClient"
)
@ApiOperation
(
value
=
"将client从会话移除"
,
notes
=
"权限:目前只有
创建者
有权限操作"
)
@ApiOperation
(
value
=
"将client从会话移除"
,
notes
=
"权限:目前只有
群主
有权限操作"
)
public
ApiResult
<
Boolean
>
delClientToConversation
(
@RequestBody
ImClientToConversation
imClientToConversation
)
throws
Exception
{
log
.
info
(
"将client从会话移除入参 {}"
,
JSON
.
toJSONString
(
imClientToConversation
));
return
imConversationService
.
delClientToConversation
(
imClientToConversation
);
}
/**
* 解散群聊
*/
@PostMapping
(
"/disband"
)
@ApiOperation
(
value
=
"解散群聊"
,
notes
=
"权限:目前只有群主有权限操作"
)
public
ApiResult
<
Boolean
>
disband
(
@RequestBody
DisbandConversationParam
param
)
throws
Exception
{
log
.
info
(
"解散群聊入参 {}"
,
JSON
.
toJSONString
(
param
));
imConversationService
.
disband
(
param
);
return
ApiResult
.
ok
();
}
/**
* 将用户添加进会话
...
...
core/src/main/java/com/wecloud/im/mapper/ImConversationMembersMapper.java
View file @
57f0ea87
...
...
@@ -60,4 +60,12 @@ public interface ImConversationMembersMapper extends BaseMapper<ImConversationMe
* @param fkClientIds
*/
void
setAdminsForConversation
(
@Param
(
"conversationId"
)
Long
conversationId
,
@Param
(
"fkClientIds"
)
List
<
Long
>
fkClientIds
,
@Param
(
"role"
)
Integer
role
);
/**
* 根据会话id删除群成员
* @param conversationId
*/
void
deleteByConversationId
(
@Param
(
"conversationId"
)
Long
conversationId
);
}
core/src/main/java/com/wecloud/im/param/DisbandConversationParam.java
0 → 100644
View file @
57f0ea87
package
com
.
wecloud
.
im
.
param
;
import
io.geekidea.springbootplus.framework.common.entity.BaseEntity
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* @Author wenzhida
* @Date 2022/3/9 20:54
* @Description 解散群聊入参
*/
@Data
@ApiModel
(
value
=
"解散群聊入参"
)
public
class
DisbandConversationParam
extends
BaseEntity
{
private
static
final
long
serialVersionUID
=
-
354476295467898641L
;
@ApiModelProperty
(
"会话表id"
)
private
Long
conversationId
;
}
core/src/main/java/com/wecloud/im/service/ImConversationMembersService.java
View file @
57f0ea87
...
...
@@ -76,7 +76,13 @@ public interface ImConversationMembersService extends BaseService<ImConversation
* @return
* @throws Exception
*/
boolean
deleteImConversationMembers
(
Long
id
)
throws
Exception
;
boolean
deleteImConversationMembers
(
Long
id
);
/**
* 根据会话id做删除
* @param conversationId 会话id
*/
void
deleteByConversationId
(
Long
conversationId
);
/**
* 根据ID获取查询对象
...
...
core/src/main/java/com/wecloud/im/service/ImConversationService.java
View file @
57f0ea87
...
...
@@ -2,6 +2,7 @@ package com.wecloud.im.service;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.wecloud.im.entity.ImConversation
;
import
com.wecloud.im.param.DisbandConversationParam
;
import
com.wecloud.im.param.ImConversationPageParam
;
import
com.wecloud.im.param.ImConversationQueryParam
;
import
com.wecloud.im.param.ImConversationQueryVo
;
...
...
@@ -68,6 +69,13 @@ public interface ImConversationService extends BaseService<ImConversation> {
ApiResult
<
Boolean
>
delClientToConversation
(
ImClientToConversation
imClientToConversation
)
throws
Exception
;
/**
* 解散群聊
* @param param
* @return
*/
void
disband
(
DisbandConversationParam
param
);
/**
* client退出会话
*/
ApiResult
<
Boolean
>
leaveConversation
(
ImClientLeaveConversation
imClientToConversation
)
throws
Exception
;
...
...
core/src/main/java/com/wecloud/im/service/impl/ImConversationMembersServiceImpl.java
View file @
57f0ea87
...
...
@@ -197,11 +197,16 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
boolean
deleteImConversationMembers
(
Long
id
)
throws
Exception
{
public
boolean
deleteImConversationMembers
(
Long
id
)
{
return
super
.
removeById
(
id
);
}
@Override
public
void
deleteByConversationId
(
Long
conversationId
)
{
imConversationMembersMapper
.
deleteByConversationId
(
conversationId
);
}
@Override
public
ImConversationMembersQueryVo
getImConversationMembersById
(
Long
id
)
throws
Exception
{
return
imConversationMembersMapper
.
getImConversationMembersById
(
id
);
}
...
...
core/src/main/java/com/wecloud/im/service/impl/ImConversationServiceImpl.java
View file @
57f0ea87
package
com
.
wecloud
.
im
.
service
.
impl
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
...
...
@@ -17,6 +18,7 @@ import com.wecloud.im.enums.ChatTypeEnum;
import
com.wecloud.im.enums.GroupRoleEnum
;
import
com.wecloud.im.enums.MutedEnum
;
import
com.wecloud.im.mapper.ImConversationMapper
;
import
com.wecloud.im.param.DisbandConversationParam
;
import
com.wecloud.im.param.ImClientSimpleDto
;
import
com.wecloud.im.param.ListConversationMembersParam
;
import
com.wecloud.im.param.ImConversationPageParam
;
...
...
@@ -402,14 +404,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
ApiResult
<
Boolean
>
delClientToConversation
(
ImClientToConversation
imClientToConversation
)
throws
Exception
{
// shiro线程中获取当前token
JwtToken
curentJwtToken
=
JwtUtil
.
getCurrentJwtToken
();
// 根据appKey查询application
ImApplication
imApplication
=
imApplicationService
.
getCacheAppByAppKey
(
curentJwtToken
.
getAppKey
());
ImClient
imClientSender
=
imClientService
.
getCurrentClient
();
// 判断是否为群主
ImConversationMembers
conversationMember
=
imConversationMembersService
.
getOne
(
new
QueryWrapper
<
ImConversationMembers
>().
lambda
()
...
...
@@ -432,10 +431,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
int
needAddCount
=
0
;
// 将client从会话移除
for
(
String
clientId
:
imClientToConversation
.
getClientIds
())
{
ImClient
client
2
=
imClientService
.
getOne
(
new
QueryWrapper
<
ImClient
>().
lambda
()
ImClient
client
ToBeRemove
=
imClientService
.
getOne
(
new
QueryWrapper
<
ImClient
>().
lambda
()
.
eq
(
ImClient:
:
getFkAppid
,
imApplication
.
getId
())
.
eq
(
ImClient:
:
getClientId
,
clientId
));
...
...
@@ -443,26 +441,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImConversationMembers
members
=
imConversationMembersService
.
getOne
(
new
QueryWrapper
<
ImConversationMembers
>().
lambda
()
.
eq
(
ImConversationMembers:
:
getFkAppid
,
imApplication
.
getId
())
.
eq
(
ImConversationMembers:
:
getFkConversationId
,
imClientToConversation
.
getConversationId
())
.
eq
(
ImConversationMembers:
:
getFkClientId
,
client
2
.
getId
())
.
eq
(
ImConversationMembers:
:
getFkClientId
,
client
ToBeRemove
.
getId
())
);
// 则跳过
if
(
members
==
null
)
{
continue
;
}
imConversationMembersService
.
deleteImConversationMembers
(
members
.
getId
());
// ws移除事件通知给群内其他人 ----------
needAddCount
--;
// 生成消息id
long
messageId
=
SnowflakeUtil
.
getId
();
ImMessage
imMessage
=
new
ImMessage
();
Map
<
String
,
Object
>
content
=
new
HashMap
<>();
content
.
put
(
"operator"
,
imClientSender
.
getClientId
());
//操作的client ID
content
.
put
(
"passivityOperator"
,
client
2
.
getClientId
());
//被操作的client ID
content
.
put
(
"passivityOperator"
,
client
ToBeRemove
.
getClientId
());
//被操作的client ID
imMessage
.
setContent
(
JsonUtils
.
encodeJson
(
content
));
// 保存消息至消息表
imMessage
.
setId
(
messageId
);
imMessage
.
setMsgType
(
MsgTypeEnum
.
REMOVE_CLIENT_CONVERSATION
.
getUriCode
());
...
...
@@ -476,9 +471,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage
.
setFkConversationId
(
imClientToConversation
.
getConversationId
());
imMessageService
.
save
(
imMessage
);
membersList
.
removeIf
(
e
->
e
.
getId
().
equals
(
members
.
getId
()));
// 遍历发送
for
(
ImConversationMembers
conversationMembers
:
membersList
)
{
// 查询接收方
ImClient
imClientReceiver
=
imClientService
.
getOne
(
new
QueryWrapper
<
ImClient
>().
lambda
()
.
eq
(
ImClient:
:
getFkAppid
,
imApplication
.
getId
())
...
...
@@ -489,7 +484,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 封装响应的实体
ImMessageOnlineSend
imMessageOnlineSend
=
new
ImMessageOnlineSend
();
imMessageOnlineSend
.
setMsgId
(
messageId
);
imMessageOnlineSend
.
setCreateTime
(
new
Date
());
imMessageOnlineSend
.
setType
(
imMessage
.
getMsgType
());
...
...
@@ -513,9 +507,89 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 将群成员数量减
imConversationMapper
.
addMemberCount
(
imApplication
.
getId
(),
imClientToConversation
.
getConversationId
(),
needAddCount
);
return
ApiResult
.
ok
();
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Override
public
void
disband
(
DisbandConversationParam
param
)
{
ImClient
currentClient
=
imClientService
.
getCurrentClient
();
// 判断是否为群主
ImConversationMembers
conversationMember
=
imConversationMembersService
.
getOne
(
new
QueryWrapper
<
ImConversationMembers
>().
lambda
()
.
eq
(
ImConversationMembers:
:
getFkConversationId
,
param
.
getConversationId
())
.
eq
(
ImConversationMembers:
:
getFkClientId
,
currentClient
.
getId
())
);
if
(
conversationMember
==
null
||
!
GroupRoleEnum
.
OWNER
.
getCode
().
equals
(
conversationMember
.
getRole
()))
{
throw
new
BusinessException
(
"非群主无权限解散群聊"
);
}
// 查询该会话所有成员
List
<
ImConversationMembers
>
membersList
=
imConversationMembersService
.
list
(
new
QueryWrapper
<
ImConversationMembers
>().
lambda
()
.
eq
(
ImConversationMembers:
:
getFkAppid
,
currentClient
.
getFkAppid
())
.
eq
(
ImConversationMembers:
:
getFkConversationId
,
param
.
getConversationId
())
.
notIn
(
ImConversationMembers:
:
getId
,
currentClient
.
getId
())
);
if
(
membersList
.
isEmpty
())
{
throw
new
BusinessException
(
"群聊成员列表为空"
);
}
// 删除会话
imConversationService
.
removeById
(
param
.
getConversationId
());
// 删除所有成员
imConversationMembersService
.
deleteByConversationId
(
param
.
getConversationId
());
for
(
ImConversationMembers
member
:
membersList
)
{
// 不关心事件是否发送成功
try
{
// 保存事件消息
ImMessage
imMessage
=
new
ImMessage
();
Map
<
String
,
Object
>
content
=
new
HashMap
<>();
content
.
put
(
"operator"
,
currentClient
.
getClientId
());
content
.
put
(
"passivityOperator"
,
member
.
getClientId
());
imMessage
.
setContent
(
JsonUtils
.
encodeJson
(
content
));
// 保存消息至消息表
imMessage
.
setId
(
SnowflakeUtil
.
getId
());
imMessage
.
setMsgType
(
MsgTypeEnum
.
CONVERSATION_DISBAND
.
getUriCode
());
imMessage
.
setCreateTime
(
new
Date
());
imMessage
.
setFkAppid
(
currentClient
.
getFkAppid
());
imMessage
.
setSender
(
currentClient
.
getId
());
imMessage
.
setWithdraw
(
false
);
imMessage
.
setEvent
(
true
);
imMessage
.
setSystemFlag
(
false
);
imMessage
.
setSendStatus
(
2
);
imMessage
.
setFkConversationId
(
param
.
getConversationId
());
imMessageService
.
save
(
imMessage
);
// 给所有成员下发事件消息
ImClient
imClientReceiver
=
imClientService
.
getOne
(
new
QueryWrapper
<
ImClient
>().
lambda
()
.
eq
(
ImClient:
:
getFkAppid
,
currentClient
.
getFkAppid
())
.
eq
(
ImClient:
:
getId
,
member
.
getFkClientId
()));
if
(
imClientReceiver
==
null
)
{
continue
;
}
// 封装响应的实体
ImMessageOnlineSend
imMessageOnlineSend
=
new
ImMessageOnlineSend
();
imMessageOnlineSend
.
setMsgId
(
imMessage
.
getId
());
imMessageOnlineSend
.
setCreateTime
(
new
Date
());
imMessageOnlineSend
.
setType
(
imMessage
.
getMsgType
());
imMessageOnlineSend
.
setSender
(
currentClient
.
getClientId
());
imMessageOnlineSend
.
setContent
(
content
);
imMessageOnlineSend
.
setConversationId
(
param
.
getConversationId
());
imMessageOnlineSend
.
setWithdraw
(
Boolean
.
FALSE
);
imMessageOnlineSend
.
setEvent
(
Boolean
.
TRUE
);
// 向接收方推送
WsResponse
<
ImMessageOnlineSend
>
responseModel
=
new
WsResponse
<>();
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
);
channelSender
.
sendMsg
(
responseModel
,
imClientReceiver
.
getId
());
}
catch
(
Exception
e
)
{
log
.
info
(
"下发解散群事件失败,接收人 {}"
,
JSON
.
toJSONString
(
member
));
}
}
}
@Override
...
...
core/src/main/java/com/wecloud/im/ws/enums/MsgTypeEnum.java
View file @
57f0ea87
...
...
@@ -42,6 +42,9 @@ public enum MsgTypeEnum {
// 消息删除 -1017
MSG_DELETE
(-
1017
),
// 解散群聊 -1018
CONVERSATION_DISBAND
(-
1018
),
;
private
final
int
uriCode
;
...
...
core/src/main/resources/mapper/ImConversationMembersMapper.xml
View file @
57f0ea87
...
...
@@ -74,5 +74,9 @@
#{fkClientId}
</foreach>
</update>
<delete
id=
"deleteByConversationId"
>
DELETE FROM im_conversation_members WHERE fk_conversation_id = #{conversationId}
</delete>
</mapper>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment