|
@@ -30,6 +30,9 @@ import com.tourism.webadmin.back.service.TourUserService;
|
|
|
import com.tourism.webadmin.back.vo.TourImGroupVo;
|
|
|
import com.tourism.webadmin.back.vo.TourImMemberVo;
|
|
|
import com.tourism.webadmin.enums.GroupRole;
|
|
|
+import com.tourism.webadmin.enums.RedisLock;
|
|
|
+import org.redisson.api.RLock;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -53,7 +56,8 @@ public class TourGroupServiceImpl extends ServiceImpl<TourImGroupMapper, TourImG
|
|
|
private TourImMemberService tourImMemberService;
|
|
|
@Autowired
|
|
|
private TourImGroupInvitationService tourImGroupInvitationService;
|
|
|
-
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
/**
|
|
|
* 创建群聊
|
|
|
* @param params
|
|
@@ -260,53 +264,71 @@ public class TourGroupServiceImpl extends ServiceImpl<TourImGroupMapper, TourImG
|
|
|
//发送人
|
|
|
TourUser fromUser = tourUserService.getById(userId);
|
|
|
|
|
|
- List<TourImMember> list = tourImMemberService.lambdaQuery().eq(TourImMember::getUserId, userId)
|
|
|
- .eq(TourImMember::getPartnerId, params.getGetUserId())
|
|
|
- .eq(TourImMember::getDataState, 1).list();
|
|
|
- if(!ObjectUtil.isEmpty(list)){
|
|
|
- //之前已经有会话了
|
|
|
- TourImGroup byId = getById(list.get(0).getGroupId());
|
|
|
- //修改会话为显示
|
|
|
- List<TourImMember> collect = list.stream().filter(item -> item.getGroupId().equals(byId.getId())&&item.getIsShow().equals(0)).collect(Collectors.toList());
|
|
|
- collect.forEach(o->o.setIsShow(1));
|
|
|
- tourMemberService.updateBatchById(collect);
|
|
|
- //是否单聊
|
|
|
- if(byId.getNoticeType()==1){
|
|
|
- return list.get(0).getGroupId().toString();
|
|
|
- }else {
|
|
|
- return null;
|
|
|
- }
|
|
|
+ ArrayList<String> lockString = new ArrayList<>();
|
|
|
+ lockString.add(toUser.getUserId().toString());
|
|
|
+ lockString.add(fromUser.getUserId().toString());
|
|
|
+ Collections.sort(lockString);//排序
|
|
|
+ RLock[] locks=new RLock[lockString.size()];
|
|
|
+ for (int i = 0; i < locks.length; i++) {
|
|
|
+ String s = lockString.get(i);
|
|
|
+ locks[i] = redissonClient.getFairLock(RedisLock.MEMBER_KEY+s);
|
|
|
}
|
|
|
- TourImGroup byId = getById(groupId);
|
|
|
- if(ObjectUtil.isEmpty(byId)){
|
|
|
- //创建group
|
|
|
- TourImGroup group = new TourImGroup();
|
|
|
- group.setId(Long.valueOf(groupId));
|
|
|
- group.setLeaderId(userId);
|
|
|
- group.setIsPublic(IsTrue.FALSE);
|
|
|
- group.setGroupName(fromUser.getShowName() + "和" + toUser.getShowName()+"的单聊");
|
|
|
- group.setCreateUserId(userId);
|
|
|
- group.setCreateTime(new Date());
|
|
|
- group.setUpdateUserId(userId);
|
|
|
- group.setUpdateTime(new Date());
|
|
|
- group.setNoticeType(params.getNoticeType());
|
|
|
- save(group);
|
|
|
- //之前没有创建会话 创建群聊和发送人的member
|
|
|
- TourImMember tourImMember = new TourImMember();
|
|
|
- tourImMember.setGroupId(group.getId());
|
|
|
- tourImMember.setUserId(fromUser.getUserId());
|
|
|
- tourImMember.setPartnerId(toUser.getUserId());
|
|
|
-
|
|
|
- tourImMember.setCreateUserId(userId);
|
|
|
- tourImMember.setCreateTime(new Date());
|
|
|
- tourImMember.setUpdateUserId(userId);
|
|
|
- tourImMember.setUpdateTime(new Date());
|
|
|
- tourImMember.setGroupRole(GroupRole.GROUP_LEADER.getCode());
|
|
|
- //保存Member
|
|
|
- tourImMemberService.save(tourImMember);
|
|
|
- return group.getId().toString();
|
|
|
+ RLock multiLock = redissonClient.getMultiLock(locks);
|
|
|
+ try {
|
|
|
+ if(multiLock.tryLock()){
|
|
|
+ List<TourImMember> list = tourImMemberService.lambdaQuery().eq(TourImMember::getUserId, userId)
|
|
|
+ .eq(TourImMember::getPartnerId, params.getGetUserId())
|
|
|
+ .eq(TourImMember::getDataState, 1).list();
|
|
|
+
|
|
|
+ if(!ObjectUtil.isEmpty(list)){
|
|
|
+ //之前已经有会话了
|
|
|
+ TourImGroup byId = getById(list.get(0).getGroupId());
|
|
|
+ //修改会话为显示
|
|
|
+ List<TourImMember> collect = list.stream().filter(item -> item.getGroupId().equals(byId.getId())&&item.getIsShow().equals(0)).collect(Collectors.toList());
|
|
|
+ collect.forEach(o->o.setIsShow(1));
|
|
|
+ tourMemberService.updateBatchById(collect);
|
|
|
+ //是否单聊
|
|
|
+ if(byId.getNoticeType()==1){
|
|
|
+ return list.get(0).getGroupId().toString();
|
|
|
+ }else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ TourImGroup byId = getById(groupId);
|
|
|
+ if(ObjectUtil.isEmpty(byId)){
|
|
|
+ //创建group
|
|
|
+ TourImGroup group = new TourImGroup();
|
|
|
+ group.setId(Long.valueOf(groupId));
|
|
|
+ group.setLeaderId(userId);
|
|
|
+ group.setIsPublic(IsTrue.FALSE);
|
|
|
+ group.setGroupName(fromUser.getShowName() + "和" + toUser.getShowName()+"的单聊");
|
|
|
+ group.setCreateUserId(userId);
|
|
|
+ group.setCreateTime(new Date());
|
|
|
+ group.setUpdateUserId(userId);
|
|
|
+ group.setUpdateTime(new Date());
|
|
|
+ group.setNoticeType(params.getNoticeType());
|
|
|
+ save(group);
|
|
|
+ //之前没有创建会话 创建群聊和发送人的member
|
|
|
+ TourImMember tourImMember = new TourImMember();
|
|
|
+ tourImMember.setGroupId(group.getId());
|
|
|
+ tourImMember.setUserId(fromUser.getUserId());
|
|
|
+ tourImMember.setPartnerId(toUser.getUserId());
|
|
|
+
|
|
|
+ tourImMember.setCreateUserId(userId);
|
|
|
+ tourImMember.setCreateTime(new Date());
|
|
|
+ tourImMember.setUpdateUserId(userId);
|
|
|
+ tourImMember.setUpdateTime(new Date());
|
|
|
+ tourImMember.setGroupRole(GroupRole.GROUP_LEADER.getCode());
|
|
|
+ //保存Member
|
|
|
+ tourImMemberService.save(tourImMember);
|
|
|
+ groupId=group.getId().toString();
|
|
|
+ return groupId;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }finally {
|
|
|
+ multiLock.unlock();
|
|
|
}
|
|
|
- return params.getGroupId();
|
|
|
+ return groupId;
|
|
|
}
|
|
|
|
|
|
/**
|