Gqingci 4 ngày trước cách đây
mục cha
commit
c9ccaade20

+ 2 - 1
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/CsSessionController.java

@@ -35,10 +35,11 @@ public class CsSessionController extends BaseController {
         String fromUserName = (String) params.get("fromUserName");
         String fromUserName = (String) params.get("fromUserName");
         String fromUserAvatar = (String) params.get("fromUserAvatar");
         String fromUserAvatar = (String) params.get("fromUserAvatar");
         String sourceId = (String) params.get("sourceId");
         String sourceId = (String) params.get("sourceId");
+        Long guestUserId = params.get("guestUserId") != null ? Long.valueOf(params.get("guestUserId").toString()) : null;
 
 
         CsSessionVo session = sessionService.createOrGetSession(
         CsSessionVo session = sessionService.createOrGetSession(
             sessionType, fromUserId, fromUserName, fromUserAvatar,
             sessionType, fromUserId, fromUserName, fromUserAvatar,
-            sourceId
+            sourceId, guestUserId
         );
         );
         return R.ok(session);
         return R.ok(session);
     }
     }

+ 13 - 1
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/PortalAuthController.java

@@ -20,6 +20,7 @@ import org.dromara.common.core.domain.dto.RoleDTO;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.domain.model.SmsLoginBody;
 import org.dromara.common.core.domain.model.SmsLoginBody;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.service.OssService;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.ratelimiter.annotation.RateLimiter;
 import org.dromara.common.ratelimiter.annotation.RateLimiter;
@@ -80,6 +81,7 @@ public class PortalAuthController extends BaseController {
     private final ISysPostService postService;
     private final ISysPostService postService;
     private final ISysDeptService deptService;
     private final ISysDeptService deptService;
     private final SysUserMapper userMapper;
     private final SysUserMapper userMapper;
+    private final OssService ossService;
 
 
     @Value("${spring.profiles.active:}")
     @Value("${spring.profiles.active:}")
     private String activeProfile;
     private String activeProfile;
@@ -219,7 +221,17 @@ public class PortalAuthController extends BaseController {
 
 
         Map<String, Object> result = new HashMap<>(2);
         Map<String, Object> result = new HashMap<>(2);
         result.put("employee", employee);
         result.put("employee", employee);
-        result.put("company", company);
+
+        // 将 company.avatar(OSS文件ID)转换为实际URL
+        if (company != null && company.getAvatar() != null) {
+            String avatarUrl = ossService.selectUrlByIds(company.getAvatar().toString());
+            Map<String, Object> companyMap = BeanUtil.beanToMap(company);
+            companyMap.put("avatarUrl", avatarUrl);
+            result.put("company", companyMap);
+        } else {
+            result.put("company", company);
+        }
+
         return R.ok(result);
         return R.ok(result);
     }
     }
 
 

+ 12 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/ICsSessionService.java

@@ -16,6 +16,18 @@ public interface ICsSessionService {
                                    String fromUserName, String fromUserAvatar,
                                    String fromUserName, String fromUserAvatar,
                                    String sourceId);
                                    String sourceId);
 
 
+    /**
+     * 创建或获取会话(支持访客会话迁移)
+     */
+    CsSessionVo createOrGetSession(Integer sessionType, Long fromUserId,
+                                   String fromUserName, String fromUserAvatar,
+                                   String sourceId, Long guestUserId);
+
+    /**
+     * 迁移访客会话到登录用户
+     */
+    void migrateGuestSession(Long guestUserId, Long realUserId, String realUserName, String realUserAvatar);
+
     /**
     /**
      * 查询会话列表
      * 查询会话列表
      */
      */

+ 34 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsSessionServiceImpl.java

@@ -10,12 +10,14 @@ import org.dromara.common.core.service.OssService;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.main.domain.CsMessage;
 import org.dromara.main.domain.CsSeatConfig;
 import org.dromara.main.domain.CsSeatConfig;
 import org.dromara.main.domain.CsSeatWaiter;
 import org.dromara.main.domain.CsSeatWaiter;
 import org.dromara.main.domain.CsSession;
 import org.dromara.main.domain.CsSession;
 import org.dromara.main.domain.MainCompanyApply;
 import org.dromara.main.domain.MainCompanyApply;
 import org.dromara.main.domain.bo.CsSessionBo;
 import org.dromara.main.domain.bo.CsSessionBo;
 import org.dromara.main.domain.vo.CsSessionVo;
 import org.dromara.main.domain.vo.CsSessionVo;
+import org.dromara.main.mapper.CsMessageMapper;
 import org.dromara.main.mapper.CsSeatConfigMapper;
 import org.dromara.main.mapper.CsSeatConfigMapper;
 import org.dromara.main.mapper.CsSeatWaiterMapper;
 import org.dromara.main.mapper.CsSeatWaiterMapper;
 import org.dromara.main.mapper.CsSessionMapper;
 import org.dromara.main.mapper.CsSessionMapper;
@@ -40,6 +42,7 @@ import java.util.stream.Collectors;
 public class CsSessionServiceImpl implements ICsSessionService {
 public class CsSessionServiceImpl implements ICsSessionService {
 
 
     private final CsSessionMapper baseMapper;
     private final CsSessionMapper baseMapper;
+    private final CsMessageMapper messageMapper;
     private final CsSeatConfigMapper seatConfigMapper;
     private final CsSeatConfigMapper seatConfigMapper;
     private final CsSeatWaiterMapper seatWaiterMapper;
     private final CsSeatWaiterMapper seatWaiterMapper;
     private final MainCompanyApplyMapper mainCompanyApplyMapper;
     private final MainCompanyApplyMapper mainCompanyApplyMapper;
@@ -87,6 +90,37 @@ public class CsSessionServiceImpl implements ICsSessionService {
         return enrichSessionVo(converter.convert(newSession, CsSessionVo.class));
         return enrichSessionVo(converter.convert(newSession, CsSessionVo.class));
     }
     }
 
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public CsSessionVo createOrGetSession(Integer sessionType, Long fromUserId,
+                                          String fromUserName, String fromUserAvatar,
+                                          String sourceId, Long guestUserId) {
+        // 如果有访客ID,先做会话迁移
+        if (guestUserId != null && !guestUserId.equals(fromUserId)) {
+            migrateGuestSession(guestUserId, fromUserId, fromUserName, fromUserAvatar);
+        }
+        return createOrGetSession(sessionType, fromUserId, fromUserName, fromUserAvatar, sourceId);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void migrateGuestSession(Long guestUserId, Long realUserId, String realUserName, String realUserAvatar) {
+        // 1. 更新访客会话归属到真实用户
+        baseMapper.update(null,
+            Wrappers.lambdaUpdate(CsSession.class)
+                .set(CsSession::getFromUserId, realUserId)
+                .set(CsSession::getFromUserName, realUserName)
+                .set(CsSession::getFromUserAvatar, realUserAvatar)
+                .eq(CsSession::getFromUserId, guestUserId)
+                .eq(CsSession::getStatus, 1));
+
+        // 2. 更新访客消息的发送者ID到真实用户
+        messageMapper.update(null,
+            Wrappers.lambdaUpdate(CsMessage.class)
+                .set(CsMessage::getSenderId, realUserId)
+                .eq(CsMessage::getSenderId, guestUserId));
+    }
+
     @Override
     @Override
     public TableDataInfo<CsSessionVo> queryPageList(CsSessionBo bo, PageQuery pageQuery) {
     public TableDataInfo<CsSessionVo> queryPageList(CsSessionBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<CsSession> lqw = buildQueryWrapper(bo);
         LambdaQueryWrapper<CsSession> lqw = buildQueryWrapper(bo);