Jelajahi Sumber

客服卡片修改

Zhangbw 2 bulan lalu
induk
melakukan
c0dc77447b

+ 2 - 0
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/controller/admin/TalkAgentController.java

@@ -7,6 +7,8 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.annotation.SaIgnore;
+
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.validation.annotation.Validated;

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

@@ -32,24 +32,66 @@ public class ChatController {
     private final DictService dictService;
     private final ITalkAgentService talkAgentService;
 
+    /**
+     * 处理用户消息
+     * 接收用户发送的消息,调用AI处理后返回回复文本和语音
+     *
+     * @param request 请求参数,包含:
+     *                - message: 用户消息文本
+     *                - agentId: 客服ID
+     *                - agentGender: 客服性别(0=男,1=女)
+     *                - ttsVcnList: 发言人字典列表
+     * @return 响应数据,包含:
+     *         - reply: AI回复文本
+     *         - audio: 语音音频(base64编码)
+     *         - timestamp: 时间戳
+     */
     @SaIgnore
     @PostMapping("/message")
     public Map<String, Object> handleMessage(@RequestBody Map<String, Object> request) {
         String userMessage = (String) request.get("message");
         Long agentId = request.get("agentId") != null ?
             Long.valueOf(request.get("agentId").toString()) : null;
+        String agentGender = (String) request.get("agentGender");
+        @SuppressWarnings("unchecked")
+        List<Map<String, String>> ttsVcnList = (List<Map<String, String>>) request.get("ttsVcnList");
 
-        log.info("收到用户消息: {}, 客服ID: {}", userMessage, agentId);
+        log.info("收到用户消息: {}, 客服ID: {}, 客服性别: {}", userMessage, agentId, agentGender);
 
-        return chatService.processMessage(userMessage, agentId);
+        return chatService.processMessage(userMessage, agentId, agentGender, ttsVcnList);
     }
 
+    /**
+     * 获取语言字典
+     * 返回系统支持的语言列表
+     *
+     * @return 语言字典列表
+     */
     @SaIgnore
     @GetMapping("/dict/language")
     public List<DictDataDTO> getLanguageDict() {
         return dictService.getDictData("agent_language");
     }
 
+    /**
+     * 获取TTS发言人字典
+     * 返回系统支持的TTS发言人列表,用于AI动态选择合适的发言人
+     *
+     * @return TTS发言人字典列表
+     */
+    @SaIgnore
+    @GetMapping("/dict/ttsVcn")
+    public List<DictDataDTO> getTtsVcnDict() {
+        return dictService.getDictData("tts_vcn");
+    }
+
+    /**
+     * 获取客服列表
+     * 返回符合条件的客服列表,用于对话前端展示
+     *
+     * @param bo 查询条件(可选)
+     * @return 客服列表(分页数据)
+     */
     @SaIgnore
     @GetMapping("/agent/list")
     public TableDataInfo<TalkAgentVo> getAgentList(TalkAgentBo bo) {
@@ -57,6 +99,19 @@ public class ChatController {
         return TableDataInfo.build(list);
     }
 
+    /**
+     * 更新客服配置
+     * 用于对话前端在开始对话时更新客服的TTS配置和状态
+     *
+     * @param id 客服ID
+     * @param bo 客服配置参数,包含:
+     *           - ttsSpeed: TTS语速
+     *           - ttsPitch: TTS音调
+     *           - ttsVolume: TTS音量
+     *           - ttsBgs: TTS背景音开关
+     *           - status: 客服状态(2=对话中)
+     * @return 更新结果
+     */
     @SaIgnore
     @PutMapping("/agent/{id}")
     public Map<String, Object> updateAgentConfig(@PathVariable Long id, @RequestBody TalkAgentBo bo) {

+ 0 - 10
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/TalkAgent.java

@@ -42,11 +42,6 @@ public class TalkAgent extends TenantEntity {
      */
     private String avatarUrl;
 
-    /**
-     * 客服描述
-     */
-    private String description;
-
     /**
      * 欢迎语
      */
@@ -82,11 +77,6 @@ public class TalkAgent extends TenantEntity {
      */
     private Long ttsBgs;
 
-    /**
-     * AI回复语言(字典)
-     */
-    private String language;
-
     /**
      * 删除标志(0=存在 1=删除)
      */

+ 0 - 10
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/bo/TalkAgentBo.java

@@ -43,11 +43,6 @@ public class TalkAgentBo extends BaseEntity {
      */
     private String avatarUrl;
 
-    /**
-     * 客服描述
-     */
-    private String description;
-
     /**
      * 欢迎语
      */
@@ -83,10 +78,5 @@ public class TalkAgentBo extends BaseEntity {
      */
     private Long ttsBgs;
 
-    /**
-     * AI回复语言(字典)
-     */
-    private String language;
-
 
 }

+ 0 - 13
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/domain/vo/TalkAgentVo.java

@@ -51,12 +51,6 @@ public class TalkAgentVo implements Serializable {
     @ExcelProperty(value = "头像URL")
     private String avatarUrl;
 
-    /**
-     * 客服描述
-     */
-    @ExcelProperty(value = "客服描述")
-    private String description;
-
     /**
      * 欢迎语
      */
@@ -101,12 +95,5 @@ public class TalkAgentVo implements Serializable {
     @ExcelProperty(value = "TTS背景音开关 0=无背景音 1=有背景音")
     private Long ttsBgs;
 
-    /**
-     * AI回复语言(字典)
-     */
-    @ExcelProperty(value = "AI回复语言", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "字=典")
-    private String language;
-
 
 }

+ 4 - 1
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/IChatService.java

@@ -1,5 +1,6 @@
 package org.dromara.talk.service;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -12,7 +13,9 @@ public interface IChatService {
      *
      * @param userMessage 用户消息
      * @param agentId 客服ID
+     * @param agentGender 客服性别
+     * @param ttsVcnList 发言人字典列表
      * @return 响应数据(包含回复文本和音频)
      */
-    Map<String, Object> processMessage(String userMessage, Long agentId);
+    Map<String, Object> processMessage(String userMessage, Long agentId, String agentGender, List<Map<String, String>> ttsVcnList);
 }

+ 33 - 7
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/ChatServiceImpl.java

@@ -9,6 +9,7 @@ import org.dromara.talk.service.ITtsService;
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
@@ -22,8 +23,8 @@ public class ChatServiceImpl implements IChatService {
     private final ITalkAgentService talkAgentService;
 
     @Override
-    public Map<String, Object> processMessage(String userMessage, Long agentId) {
-        log.info("处理用户消息: {}, 客服ID: {}", userMessage, agentId);
+    public Map<String, Object> processMessage(String userMessage, Long agentId, String agentGender, List<Map<String, String>> ttsVcnList) {
+        log.info("处理用户消息: {}, 客服ID: {}, 客服性别: {}", userMessage, agentId, agentGender);
 
         // 获取客服配置
         TalkAgentVo agentConfig = null;
@@ -31,8 +32,15 @@ public class ChatServiceImpl implements IChatService {
             agentConfig = talkAgentService.queryById(agentId);
         }
 
-        // 生成回复
-        String reply = generateReply(userMessage);
+        // 生成回复(预留AI接口,返回包含发言人和文本的JSON)
+        Map<String, String> aiResult = generateReply(userMessage, agentGender, ttsVcnList, agentConfig);
+        String reply = aiResult.get("replyText");
+        String selectedVcn = aiResult.get("ttsVcn");
+
+        // 如果AI选择了发言人,更新客服配置
+        if (selectedVcn != null && agentConfig != null) {
+            agentConfig.setTtsVcn(selectedVcn);
+        }
 
         // 合成语音(传递客服配置)
         String audioBase64 = synthesizeAudio(reply, agentConfig);
@@ -50,9 +58,27 @@ public class ChatServiceImpl implements IChatService {
         return response;
     }
 
-    private String generateReply(String userMessage) {
-        // 默认回复(后期接入AI)
-        return userMessage;
+    private Map<String, String> generateReply(String userMessage, String agentGender, List<Map<String, String>> ttsVcnList, TalkAgentVo agentConfig) {
+        // 组装发送给AI的JSON数据
+        Map<String, Object> aiRequest = new HashMap<>();
+        aiRequest.put("userMessage", userMessage);
+        aiRequest.put("agentGender", agentGender);
+        aiRequest.put("ttsVcnList", ttsVcnList);
+        aiRequest.put("currentVcn", agentConfig != null ? agentConfig.getTtsVcn() : null);
+
+        log.info("AI接口预留 - 请求数据: {}", aiRequest);
+
+        // TODO: 后续接入AI,发送 aiRequest 给AI服务
+        // AI应返回格式: {"ttsVcn": "选择的发言人", "replyText": "回复文本"}
+
+        // 暂时返回默认值
+        Map<String, String> aiResponse = new HashMap<>();
+        aiResponse.put("ttsVcn", agentConfig != null ? agentConfig.getTtsVcn() : "x4_yezi");
+        aiResponse.put("replyText", userMessage);
+
+        log.info("AI接口预留 - 响应数据: {}", aiResponse);
+
+        return aiResponse;
     }
 
     private String synthesizeAudio(String text, TalkAgentVo agentConfig) {

+ 0 - 2
ruoyi-modules/yp-talk/src/main/java/org/dromara/talk/service/impl/TalkAgentServiceImpl.java

@@ -81,7 +81,6 @@ public class TalkAgentServiceImpl implements ITalkAgentService {
         lqw.like(StringUtils.isNotBlank(bo.getName()), TalkAgent::getName, bo.getName());
         lqw.eq(StringUtils.isNotBlank(bo.getGender()), TalkAgent::getGender, bo.getGender());
         lqw.eq(StringUtils.isNotBlank(bo.getAvatarUrl()), TalkAgent::getAvatarUrl, bo.getAvatarUrl());
-        lqw.eq(StringUtils.isNotBlank(bo.getDescription()), TalkAgent::getDescription, bo.getDescription());
         lqw.eq(StringUtils.isNotBlank(bo.getGreetingMessage()), TalkAgent::getGreetingMessage, bo.getGreetingMessage());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), TalkAgent::getStatus, bo.getStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getTtsVcn()), TalkAgent::getTtsVcn, bo.getTtsVcn());
@@ -89,7 +88,6 @@ public class TalkAgentServiceImpl implements ITalkAgentService {
         lqw.eq(bo.getTtsPitch() != null, TalkAgent::getTtsPitch, bo.getTtsPitch());
         lqw.eq(bo.getTtsVolume() != null, TalkAgent::getTtsVolume, bo.getTtsVolume());
         lqw.eq(bo.getTtsBgs() != null, TalkAgent::getTtsBgs, bo.getTtsBgs());
-        lqw.eq(StringUtils.isNotBlank(bo.getLanguage()), TalkAgent::getLanguage, bo.getLanguage());
         return lqw;
     }