From 7562388cb58f80026b907ce41aab4c6dcc51abe6 Mon Sep 17 00:00:00 2001 From: La123123 <617330105@qq.com> Date: Fri, 3 Apr 2026 10:46:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=9C=8D=E8=BD=AC=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implatform/controller/UserController.java | 43 ++++++++++++++++ .../bx/implatform/service/FriendService.java | 6 +++ .../service/PrivateMessageService.java | 6 +++ .../bx/implatform/service/UserService.java | 11 ++++ .../service/impl/FriendServiceImpl.java | 51 +++++++++++++++++++ .../impl/PrivateMessageServiceImpl.java | 36 +++++++++++++ .../service/impl/UserServiceImpl.java | 23 ++++++++- 7 files changed, 175 insertions(+), 1 deletion(-) diff --git a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java index 9c5af89..13f4745 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/UserController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/UserController.java @@ -1,5 +1,8 @@ package com.bx.implatform.controller; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import com.bx.implatform.dto.RegisterDTO; import com.bx.implatform.entity.User; import com.bx.implatform.result.Result; import com.bx.implatform.result.ResultUtils; @@ -18,6 +21,8 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import static com.bx.implatform.enums.ResultCode.XSS_PARAM_ERROR; + @Tag(name = "用户相关") @RestController @RequestMapping("/user") @@ -61,5 +66,43 @@ public class UserController { public Result> findByName(@RequestParam String name) { return ResultUtils.success(userService.findUserByName(name)); } + + @PostMapping("/getEnableChangeCustomer") + @Operation(summary = "获取可转接的客服", description = "转接客服") + public Result> getEnableChangeCustomer() { + // 获取当前客服id、转接客服id、转接用户id + UserSession session = SessionContext.getSession(); + Long userId = session.getUserId(); + + + if(ObjectUtil.isNull(userId)){ + return ResultUtils.error(XSS_PARAM_ERROR); + } + + List list = userService.getEnableChangeCustomerList(userId); + + return ResultUtils.success(list); + } + + @PostMapping("/changeCustomer") + @Operation(summary = "转接客服", description = "转接客服") + public Result register(@RequestBody JSONObject jsonObject) { + + UserSession session = SessionContext.getSession(); + + // 获取当前客服id、转接客服id、转接用户id + Long customerId = session.getUserId(); + Long targetId = jsonObject.getLong("targetId"); + Long userId = jsonObject.getLong("userId"); + + + if(ObjectUtil.isNull(customerId) || ObjectUtil.isNull(targetId) || ObjectUtil.isNull(userId)){ + return ResultUtils.error(XSS_PARAM_ERROR); + } + + userService.changeCustomer(customerId,targetId, userId); + + return ResultUtils.success(); + } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/FriendService.java b/im-platform/src/main/java/com/bx/implatform/service/FriendService.java index d25a850..79feca0 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/FriendService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/FriendService.java @@ -78,4 +78,10 @@ public interface FriendService extends IService { */ void setDnd(FriendDndDTO dto); + /** + * 修改好友关系 + * @param customerId 客服id + */ + void changeFriendRelation(Long customerId,Long targetId, Long userId); + } \ No newline at end of file diff --git a/im-platform/src/main/java/com/bx/implatform/service/PrivateMessageService.java b/im-platform/src/main/java/com/bx/implatform/service/PrivateMessageService.java index 00192d1..d6b0d10 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/PrivateMessageService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/PrivateMessageService.java @@ -57,4 +57,10 @@ public interface PrivateMessageService extends IService { * @param friendId 好友id */ Long getMaxReadedId(Long friendId); + + /** + * 改变消息记录关系 + * @param customerId 客服id + */ + void changeMessageRecord(Long customerId,Long targetId, Long userId); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/UserService.java b/im-platform/src/main/java/com/bx/implatform/service/UserService.java index c46e5a3..70919e8 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/UserService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/UserService.java @@ -97,5 +97,16 @@ public interface UserService extends IService { */ void updateIpAndAddress(User user); + /** + * 转接客服 + * @param customerId 客服id targetId 转接的客服id userId 转接的用户id + */ + void changeCustomer(Long customerId,Long targetId, Long userId); + /** + * 获取可转接的客服 + * @param userId 用户id + * @return 客服列表 + */ + List getEnableChangeCustomerList(Long userId); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java index 69e4a5e..3b13f28 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/FriendServiceImpl.java @@ -37,6 +37,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -51,6 +52,7 @@ public class FriendServiceImpl extends ServiceImpl impleme private final PrivateMessageMapper privateMessageMapper; private final UserMapper userMapper; private final IMClient imClient; + private final FriendMapper friendMapper; @Override public List findAllFriends() { @@ -152,6 +154,55 @@ public class FriendServiceImpl extends ServiceImpl impleme sendSyncDndMessage(dto.getFriendId(), dto.getIsDnd()); } + @Override + public void changeFriendRelation(Long customerId, Long targetId, Long userId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(Friend::getUserId, customerId); + wrapper.eq(Friend::getFriendId, userId); + Friend friend = this.getOne(wrapper); + + LambdaQueryWrapper wrapperAnother = Wrappers.lambdaQuery(); + wrapper.eq(Friend::getUserId, userId); + wrapper.eq(Friend::getFriendId, customerId); + Friend friendAnother = this.getOne(wrapperAnother); + + if (Objects.isNull(friend) || Objects.isNull(friendAnother)) { + throw new GlobalException("用户不存在"); + } + + // 删除原有关系 + List ids = new ArrayList<>(); + ids.add(friend.getId()); + ids.add(friendAnother.getId()); + this.baseMapper.deleteByIds(ids); + + //获取转移目标客服对象 + User user = userMapper.selectById(targetId); + if(Objects.isNull(user)){ + throw new GlobalException("转移目标客服不存在"); + } + + //新增关系 + List friendsList = new ArrayList<>(); + + Friend friendNew = new Friend(); + friendNew.setUserId(targetId); + friendNew.setFriendId(userId); + friendNew.setFriendNickName(friend.getFriendNickName()); + friendNew.setDeleted(false); + friendsList.add(friendNew); + + Friend friendNewAnother = new Friend(); + friendNewAnother.setUserId(userId); + friendNewAnother.setFriendId(targetId); + friendNewAnother.setFriendNickName(user.getNickName()); + friendNewAnother.setFriendHeadImage(user.getHeadImageThumb()); + friendNewAnother.setDeleted(false); + friendsList.add(friendNewAnother); + + friendMapper.insert(friendsList); + } + /** * 单向解除好友关系 * diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java index 8872838..80d1264 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java @@ -30,6 +30,7 @@ import org.apache.commons.lang3.time.DateUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -228,4 +229,39 @@ public class PrivateMessageServiceImpl extends ServiceImpl list = new ArrayList<>(); + + //获取原有消息记录 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PrivateMessage::getSendId, customerId).eq(PrivateMessage::getRecvId, userId); + List messages1 = this.list(wrapper); + //修改发送对象 + if(!messages1.isEmpty()) { + for (PrivateMessage message : messages1) { + message.setSendId(targetId); + } + } + + //获取原有消息记录 + LambdaQueryWrapper wrapperAnother = new LambdaQueryWrapper<>(); + wrapper.eq(PrivateMessage::getSendId, userId).eq(PrivateMessage::getRecvId, customerId); + List messages2 = this.list(wrapperAnother); + //修改接收对象 + if(!messages2.isEmpty()) { + for (PrivateMessage message : messages2) { + message.setRecvId(targetId); + } + } + + list.addAll(messages1); + list.addAll(messages2); + if(!list.isEmpty()) { + baseMapper.updateById(list); + } + + } } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java index 51fc9d6..a2024c5 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/UserServiceImpl.java @@ -22,6 +22,7 @@ import com.bx.implatform.exception.GlobalException; import com.bx.implatform.mapper.UserMapper; import com.bx.implatform.service.FriendService; import com.bx.implatform.service.GroupMemberService; +import com.bx.implatform.service.PrivateMessageService; import com.bx.implatform.service.UserService; import com.bx.implatform.session.SessionContext; import com.bx.implatform.session.UserSession; @@ -51,6 +52,7 @@ public class UserServiceImpl extends ServiceImpl implements Us private final JwtProperties jwtProperties; private final IMClient imClient; private final SensitiveFilterUtil sensitiveFilterUtil; + private final PrivateMessageService privateMessageService; // @Override // public LoginVO login(LoginDTO dto) { @@ -298,7 +300,7 @@ public class UserServiceImpl extends ServiceImpl implements Us user.setSex(vo.getSex()); user.setSignature(vo.getSignature()); user.setHeadImage(vo.getHeadImage()); - user.setHeadImageThumb(vo.getHeadImageThumb()); + user.setHeadImageThumb(vo.getHeadImage()); this.updateById(user); log.info("用户信息更新,用户:{}}", user); } @@ -348,4 +350,23 @@ public class UserServiceImpl extends ServiceImpl implements Us .set(User::getLastLoginIp, ip) .set(User::getIpAddress, address)); } + + @Override + public void changeCustomer(Long customerId, Long targetId, Long userId) { + // 更新好友关系 + friendService.changeFriendRelation(customerId, targetId, userId); + + //变更消息记录 + privateMessageService.changeMessageRecord(customerId, targetId, userId); + + } + + @Override + public List getEnableChangeCustomerList(Long userId) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.ne(User::getId, userId); + queryWrapper.eq(User::getIsCustomer, 2); + + return this.list(queryWrapper); + } }