Selaa lähdekoodia

客户端请求头修改

Zhangbw 2 kuukautta sitten
vanhempi
sitoutus
9fb95da155

+ 4 - 0
ruoyi-modules/yp-talk/pom.xml

@@ -18,6 +18,10 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.squareup.okhttp3</groupId>
             <artifactId>okhttp</artifactId>

+ 19 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/api/ChatController.java

@@ -109,6 +109,25 @@ public class ChatController {
         return Map.of("success", success);
     }
 
+    /**
+     * 开始对话
+     * 用户点击开始对话时,将客服状态改为2(对话中),带并发控制
+     *
+     * @param id 客服ID
+     * @return 更新结果
+     */
+    @PostMapping("/agent/{id}/start")
+    public Map<String, Object> startChat(@PathVariable Long id) {
+        boolean success = talkAgentService.changeAgentStatus(id, "2");
+        if (success) {
+            log.info("客服 {} 开始对话,状态已改为对话中", id);
+            return Map.of("success", true, "code", 200);
+        } else {
+            log.warn("客服 {} 开始对话失败,可能已被占用", id);
+            return Map.of("success", false, "code", 400, "msg", "该客服已被其他用户占用,请选择其他客服");
+        }
+    }
+
     /**
      * 挂断电话
      * 用户挂断电话后,将客服状态改回0(正常)

+ 45 - 9
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/api/TalkAuthController.java

@@ -2,19 +2,27 @@ package org.dromara.talk.controller.api;
 
 import cn.dev33.satoken.annotation.SaIgnore;
 import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.stp.parameter.SaLoginParameter;
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.enums.UserType;
+import org.dromara.common.core.utils.MessageUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.vo.SysClientVo;
+import org.dromara.system.service.ISysClientService;
 import org.dromara.talk.domain.TalkUser;
 import org.dromara.talk.domain.vo.TalkUserVo;
 import org.dromara.talk.service.ITalkUserService;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import cn.dev33.satoken.stp.parameter.SaLoginParameter;
-
 /**
  * 对话前端认证接口
  *
@@ -30,15 +38,31 @@ import cn.dev33.satoken.stp.parameter.SaLoginParameter;
 public class TalkAuthController {
 
     private final ITalkUserService talkUserService;
+    private final ISysClientService clientService;
 
     /**
      * 登录
      */
     @PostMapping("/login")
-    public R<Map<String, Object>> login(@RequestBody Map<String, String> request) {
+    public R<Map<String, Object>> login(@RequestBody Map<String, String> request, @RequestHeader(value = LoginHelper.CLIENT_KEY, required = false) String clientId) {
         String username = request.get("username");
         String password = request.get("password");
 
+        // 验证 clientId 是否存在
+        if (ObjectUtil.isNull(clientId)) {
+            log.info("客户端id为空");
+            return R.fail("客户端ID不能为空");
+        }
+
+        // 查询客户端配置
+        SysClientVo client = clientService.queryByClientId(clientId);
+        if (ObjectUtil.isNull(client)) {
+            log.info("客户端id: {} 不存在", clientId);
+            return R.fail(MessageUtils.message("auth.grant.type.error"));
+        } else if (!SystemConstants.NORMAL.equals(client.getStatus())) {
+            return R.fail(MessageUtils.message("auth.grant.type.blocked"));
+        }
+
         // 查询用户(包含密码)
         TalkUser user = talkUserService.queryByUsernameWithPassword(username);
         if (user == null) {
@@ -55,18 +79,30 @@ public class TalkAuthController {
             return R.fail("用户已被停用");
         }
 
-        // 登录并设置会话信息
-        StpUtil.login(user.getId(),
-            new SaLoginParameter()
-                .setExtra("userId", user.getId())
-                .setExtra("userName", user.getUsername())
-                .setExtra("clientid", "talk-web"));
+        // 创建 LoginUser 对象(不包含任何权限)
+        LoginUser loginUser = new LoginUser();
+        loginUser.setUserId(user.getId());
+        loginUser.setUsername(user.getUsername());
+        loginUser.setUserType(UserType.APP_USER.getUserType());
+        loginUser.setMenuPermission(Collections.emptySet());  // 空权限列表
+        loginUser.setRolePermission(Collections.emptySet());  // 空角色列表
+        loginUser.setClientKey(client.getClientKey());
+        loginUser.setDeviceType(client.getDeviceType());
+
+        // 使用 LoginHelper 登录,使用 sys_client 表中的配置
+        SaLoginParameter model = new SaLoginParameter();
+        model.setDeviceType(client.getDeviceType());
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId());
+        LoginHelper.login(loginUser, model);
 
         // 返回token和用户信息(不包含密码)
         TalkUserVo userVo = talkUserService.queryByUsername(username);
         Map<String, Object> result = new HashMap<>();
         result.put("token", StpUtil.getTokenValue());
         result.put("user", userVo);
+        result.put("clientId", client.getClientId());
 
         return R.ok(result);
     }