From 485c6557ae50afe6703c0b64169ce8eb634b1924 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 17 Mar 2026 13:01:36 +0800
Subject: [PATCH] feat(rabbit): 移除旧的消息队列配置并新增AI相关的实体和映射

---
 src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java                         |  137 ------
 src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java                 |   35 +
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalkItem.java                             |   27 +
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkItemMapper.java                       |    7 
 src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java                    |  195 ++++++++
 src/main/java/cc/mrbird/febs/yinhe/req/YHAitalkItemStreamDto.java                       |   20 
 src/main/java/cc/mrbird/febs/yinhe/res/YHAitalkItemStreamVo.java                        |   16 
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkMapper.java                           |    7 
 src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java                      |  249 ----------
 src/main/java/cc/mrbird/febs/ai/strategy/LlmStrategyService.java                        |    3 
 src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java                       |   18 
 src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java                        |   92 ---
 src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliLlmStrategyServiceImpl.java            |  221 ++++-----
 src/main/java/cc/mrbird/febs/yinhe/req/YHSendInitDto.java                               |   16 
 src/main/java/cc/mrbird/febs/yinhe/req/YHSaveContextDto.java                            |   26 +
 src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java                     |   27 -
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java                              |    2 
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiKnowledge.java                            |   50 ++
 src/main/java/cc/mrbird/febs/yinhe/res/YHSendInitVo.java                                |   14 
 src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java                             |    9 
 src/main/java/cc/mrbird/febs/rabbit/constants/RouteKeyConstants.java                    |    2 
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalk.java                                 |   24 +
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiKnowledgeMapper.java                      |    7 
 src/main/java/cc/mrbird/febs/ai/strategy/Impl/HsLlmStrategyServiceImpl.java             |    6 
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentKnowledgeMapper.java                 |    7 
 src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentKnowledge.java                       |   29 +
 src/main/java/cc/mrbird/febs/rabbit/constants/ExchangeConstants.java                    |    2 
 src/main/java/cc/mrbird/febs/yinhe/req/AiRequestDto.java                                |   25 +
 src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java |    6 
 src/main/java/cc/mrbird/febs/yinhe/entity/YHSysCompanyLevel.java                        |   14 
 src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysCompanyLevelMapper.java                  |    7 
 31 files changed, 684 insertions(+), 616 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
index a7054a3..1df1f7e 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java
@@ -7,6 +7,7 @@
 import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.yinhe.req.AiRequestDto;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
@@ -255,4 +256,9 @@
                     throw new FebsException(StrUtil.format("百炼工作流输出失败:{}",error));
                 });
     }
+
+    @Override
+    public Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto aiRequestDto) {
+        return null;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliLlmStrategyServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliLlmStrategyServiceImpl.java
index 972e835..83dfd23 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliLlmStrategyServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliLlmStrategyServiceImpl.java
@@ -5,166 +5,147 @@
 import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.common.utils.RedisUtils;
+import cc.mrbird.febs.yinhe.req.AiRequestDto;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.dashscope.aigc.generation.Generation;
 import com.alibaba.dashscope.aigc.generation.GenerationParam;
 import com.alibaba.dashscope.aigc.generation.GenerationResult;
+import com.alibaba.dashscope.app.*;
 import com.alibaba.dashscope.common.Message;
 import com.alibaba.dashscope.common.Role;
 import com.alibaba.dashscope.exception.InputRequiredException;
 import com.alibaba.dashscope.exception.NoApiKeyException;
+import com.alibaba.dashscope.utils.JsonUtils;
 import io.reactivex.Flowable;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import reactor.core.publisher.Flux;
 
 import javax.annotation.PostConstruct;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
+@Slf4j
 @Component("AliLlmStrategyService")
 public class AliLlmStrategyServiceImpl implements LlmStrategyService {
 
-    private GenerationParam generationParam;
-
-    private static final String apiKey = "sk-4b97b556ba7c4350a41f2856f75b9377";
-    private static final String model = "qwen-plus";
-//    private static final String model = "qwen3-14b-ft-202509031002-7446";
-
-    @PostConstruct
-    public void init() {
-        this.generationParam = GenerationParam.builder()
-                // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx")
-                .apiKey(apiKey)
-                // 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
-                .model(model)
-                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
-                .build();
-    }
-
-    private List<Message> getMessages(List<LlmStrategyDto> dto) {
-        List<Message> messages = new ArrayList<>();
-        for (LlmStrategyDto dtoItem : dto){
-            if (StrUtil.equals(dtoItem.getRole(),Role.SYSTEM.getValue())){
-                messages.add(Message.builder()
-                        .role(Role.SYSTEM.getValue())
-                        .content(dtoItem.getContent())
-                        .build());
-            }
-            if (StrUtil.equals(dtoItem.getRole(),Role.USER.getValue())){
-                messages.add(Message.builder()
-                        .role(Role.USER.getValue())
-                        .content(dtoItem.getContent())
-                        .build());
-            }
-            if (StrUtil.equals(dtoItem.getRole(),Role.ASSISTANT.getValue())){
-                messages.add(Message.builder()
-                        .role(Role.ASSISTANT.getValue())
-                        .content(dtoItem.getContent())
-                        .build());
-            }
-        }
-        return messages;
-    }
-
     @Override
     public FebsResponse llmInvokeNonStreaming(List<LlmStrategyDto> dto) {
-        if (CollUtil.isEmpty(dto)){
-            throw new FebsException("百炼大模型初始化异常");
-        }
-        List<Message> messages = getMessages(dto);
-        Generation gen = new Generation();
-        generationParam.setMessages(messages);
-        generationParam.setEnableThinking( false);
-        FebsResponse febsResponse = new FebsResponse();
-        try {
-            GenerationResult result = gen.call(generationParam);
-            if (result != null && result.getOutput() != null && result.getOutput().getChoices().size() > 0){
-                febsResponse.success().data(result.getOutput().getChoices().get(0).getMessage().getContent());
-            }else{
-                febsResponse.fail().message("百炼大模型调用失败");
-            }
-        } catch (NoApiKeyException e) {
-            throw new FebsException(StrUtil.format("百炼大模型调用失败:{}",e.getMessage()));
-        } catch (InputRequiredException e) {
-            throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",e.getMessage()));
-        }
-        return febsResponse;
+        return new FebsResponse().success();
     }
 
     @Override
     public Flux<FebsResponse> llmInvokeStreamingWithThink(List<LlmStrategyDto> dto) {
-        if (CollUtil.isEmpty(dto)){
-            throw new FebsException("百炼大模型初始化异常");
-        }
-        List<Message> messages = getMessages(dto);
-
-        long startTime = System.currentTimeMillis();
-        Generation gen = new Generation();
-        generationParam.setMessages(messages);
-        generationParam.setResultFormat(GenerationParam.ResultFormat.MESSAGE);
-        generationParam.setEnableThinking( true);
-        generationParam.setIncrementalOutput( true);
-        Flowable<GenerationResult> result;
-        try {
-            result = gen.streamCall(generationParam);
-        } catch (NoApiKeyException | InputRequiredException e) {
-            throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",e.getMessage()));
-        }
-
-        return Flux.from(result)
-                .map(message -> {
-                    HashMap<String, String> stringStringHashMap = new HashMap<>();
-                    if (StrUtil.isNotEmpty(message.getOutput().getChoices().get(0).getMessage().getReasoningContent())){
-                        stringStringHashMap.put(LlmStrategyContextEnum.THINK.name(),message.getOutput().getChoices().get(0).getMessage().getReasoningContent());
-
-                        System.out.print(message.getOutput().getChoices().get(0).getMessage().getReasoningContent());
-                    }
-                    if (StrUtil.isNotEmpty(message.getOutput().getChoices().get(0).getMessage().getContent())){
-                        stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.name(),message.getOutput().getChoices().get(0).getMessage().getContent());
-                        System.out.print(message.getOutput().getChoices().get(0).getMessage().getContent());
-                    }
-                    return new FebsResponse().success().data(stringStringHashMap);
-                })
-                .doOnComplete(() -> {
-                    long endTime = System.currentTimeMillis();
-                    System.out.println("百炼大模型输出:" + (endTime - startTime) + "毫秒");
-                })
-                .doOnError(error -> {
-                    throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",error));
-                });
+        return null;
     }
 
     @Override
     public Flux<FebsResponse> llmInvokeStreamingNoThink(List<LlmStrategyDto> dto) {
-        if (CollUtil.isEmpty(dto)){
-            throw new FebsException("百炼大模型初始化异常");
-        }
-        List<Message> messages = getMessages(dto);
+        return null;
+    }
 
+
+    private ApplicationParam applicationParam;
+
+    @Autowired
+    private RedisUtils redisUtils;
+    @PostConstruct
+    public void init() {
+
+        this.applicationParam = ApplicationParam.builder()
+                // 若没有配置环境变量,可用百炼API Key将下行替换为:.apiKey("sk-xxx")。但不建议在生产环境中直接将API Key硬编码到代码中,以减少API Key泄露风险。
+                .apiKey(YHapiKey)
+                .appId(YHappId)
+                .build();
+    }
+    private static final String YHapiKey = "sk-4b97b556ba7c4350a41f2856f75b9377";
+    //    private static final String appId = "71022536aca048528b61ac43c77f0e94";
+    private static final String YHappId = "04beff88c50d4ccaaf1814231b02d2bb";
+
+    @Override
+    public Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto dto) {
         long startTime = System.currentTimeMillis();
-        Generation gen = new Generation();
-        generationParam.setMessages(messages);
-        generationParam.setResultFormat(GenerationParam.ResultFormat.MESSAGE);
-        generationParam.setIncrementalOutput( true);
-        generationParam.setEnableThinking( false);
-        Flowable<GenerationResult> result;
+        if (ObjectUtil.isEmpty(dto)){
+            throw new FebsException("参数异常");
+        }
+        String talkId = dto.getTalkId();
+
+        String rolePrompt = dto.getRolePrompt();
+        List<Message> messages = dto.getMessages();
+        HashMap<String, Object> userPromptParams = new HashMap<>();
+        userPromptParams.put("role_prompt", rolePrompt);
+        if(CollUtil.isNotEmpty( messages)){
+            userPromptParams.put("message_list", messages);
+        }
+        HashMap<String, Object> bizParams = new HashMap<>();
+        bizParams.put("user_prompt_params", userPromptParams);
+
+        List<String> knowledgeIds = dto.getKnowledgeIds();
+        List<String> fileIds = dto.getFileIds();
+        String prompt = dto.getPrompt();
+
+        Application application = new Application();
+        applicationParam.setPrompt(prompt);
+        applicationParam.setBizParams(JsonUtils.toJsonObject( bizParams));
+        // 获取当前的系统时间
+        applicationParam.setEnableSystemTime( true);
+        // 增量输出
+        applicationParam.setIncrementalOutput( true);
+        // 思考过程
+        applicationParam.setEnableThinking( false);
+        // 多轮对话
+//        applicationParam.setMessages(messages);
+        // 上下文seesionId
+//        String sessionId = (String) redisCache.getCacheObject(talkId);
+//        if (ObjectUtil.isNotEmpty(sessionId)){
+//            applicationParam.setSessionId(talkId);
+//        }
+
+        RagOptions ragOptions = null;
+        if (CollUtil.isEmpty(fileIds)){
+            ragOptions = RagOptions.builder()
+                    .pipelineIds(knowledgeIds)
+                    .build();
+        }else{
+            ragOptions = RagOptions.builder()
+                    .pipelineIds(knowledgeIds)
+                    .fileIds(fileIds)
+                    .build();
+        }
+        applicationParam.setRagOptions(ragOptions);
+        Flowable<ApplicationResult> result;
         try {
-            result = gen.streamCall(generationParam);
+            result = application.streamCall(applicationParam);
         } catch (NoApiKeyException | InputRequiredException e) {
+
             throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",e.getMessage()));
         }
-
         return Flux.from(result)
                 .map(message -> {
-                    HashMap<String, String> stringStringHashMap = new HashMap<>();
-                    if (StrUtil.isNotEmpty(message.getOutput().getChoices().get(0).getMessage().getContent())){
-                        String content = message.getOutput().getChoices().get(0).getMessage().getContent();
-                        System.out.print( content);
-                        stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.name(),content);
+                    HashMap<String, Object> stringStringHashMap = new HashMap<>();
+                    if (!message.getOutput().getFinishReason().equals("stop")){
+                        stringStringHashMap.put(LlmStrategyContextEnum.CONTENT.name(),message.getOutput().getText());
                     }
+                    if (message.getOutput().getFinishReason().equals("stop")){
+                        log.info("百炼大模型输出:{}",message.getOutput().getSessionId());
+                        List<ApplicationUsage.ModelUsage> models = message.getUsage().getModels();
+                        long outputTokens = models.stream().mapToLong(ApplicationUsage.ModelUsage::getOutputTokens).sum();
+                        log.info("百炼大模型输出:{}",outputTokens);
+                        long inputTokens = models.stream().mapToLong(ApplicationUsage.ModelUsage::getInputTokens).sum();
+                        log.info("百炼大模型输出:{}",inputTokens);
+                        redisUtils.set(talkId, message.getOutput().getSessionId(), 5*60);
+                        stringStringHashMap.put("inputTokens:",inputTokens);
+                        stringStringHashMap.put("outputTokens:",outputTokens);
+                    }
+
                     return new FebsResponse().success().data(stringStringHashMap);
                 })
                 .doOnComplete(() -> {
@@ -174,5 +155,7 @@
                 .doOnError(error -> {
                     throw new FebsException(StrUtil.format("百炼大模型输出失败:{}",error));
                 });
+
     }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/HsLlmStrategyServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/HsLlmStrategyServiceImpl.java
index 4cb18dd..ce96878 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/Impl/HsLlmStrategyServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/Impl/HsLlmStrategyServiceImpl.java
@@ -5,6 +5,7 @@
 import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.yinhe.req.AiRequestDto;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -201,4 +202,9 @@
                     throw new FebsException(StrUtil.format("火山大模型流式调用AI服务失:{}",throwable));
                 });
     }
+
+    @Override
+    public Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto aiRequestDto) {
+        return null;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/ai/strategy/LlmStrategyService.java b/src/main/java/cc/mrbird/febs/ai/strategy/LlmStrategyService.java
index 28e1540..c357d24 100644
--- a/src/main/java/cc/mrbird/febs/ai/strategy/LlmStrategyService.java
+++ b/src/main/java/cc/mrbird/febs/ai/strategy/LlmStrategyService.java
@@ -2,6 +2,7 @@
 
 import cc.mrbird.febs.ai.strategy.param.LlmStrategyDto;
 import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.yinhe.req.AiRequestDto;
 import reactor.core.publisher.Flux;
 
 import java.util.List;
@@ -13,4 +14,6 @@
     Flux<FebsResponse> llmInvokeStreamingWithThink(List<LlmStrategyDto> dto);
 
     Flux<FebsResponse> llmInvokeStreamingNoThink(List<LlmStrategyDto> dto);
+
+    Flux<FebsResponse> llmInvokeStreamingNoThink(AiRequestDto aiRequestDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
index d5a02b7..c40813a 100644
--- a/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
+++ b/src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -4,6 +4,7 @@
 import cc.mrbird.febs.rabbit.constants.QueueConstants;
 import cc.mrbird.febs.rabbit.constants.RouteKeyConstants;
 import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.amqp.core.*;
 import org.springframework.amqp.rabbit.connection.ConnectionFactory;
 import org.springframework.amqp.rabbit.core.RabbitTemplate;
@@ -19,6 +20,7 @@
  * @author wzy
  * @date 2021-09-25
  **/
+@Slf4j
 @Configuration
 public class RabbitConfigure {
 
@@ -28,246 +30,29 @@
     @Bean
     @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
     public RabbitTemplate rabbitTemplate() {
-        return new RabbitTemplate(connectionFactory);
+
+        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
+        // 设置消息确认机制
+        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
+            if (!ack) {
+                log.error("消息发送失败: {}", cause);
+            }
+        });
+        return rabbitTemplate;
     }
 
     @Bean
-    public DirectExchange defaultExchange() {
-        return new DirectExchange(ExchangeConstants.EXCHANGE_DEFAULT);
+    public DirectExchange pcCompanyAddExchange() {
+        return new DirectExchange(RabbitQueueEnum.PC_COMPANY_ADD_ALI.getExchange());
     }
 
     @Bean
-    public Queue defaultQueue() {
-        return new Queue(QueueConstants.QUEUE_DEFAULT);
+    public Queue pcCompanyAddQueue() {
+        return new Queue(RabbitQueueEnum.PC_COMPANY_ADD_ALI.getQueue());
     }
 
     @Bean
-    public Binding defaultBind() {
-        return BindingBuilder.bind(defaultQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT);
+    public Binding pcCompanyAddBind() {
+        return BindingBuilder.bind(pcCompanyAddQueue()).to(pcCompanyAddExchange()).with(RabbitQueueEnum.PC_COMPANY_ADD_ALI.getRoute());
     }
-
-
-
-    @Bean
-    public DirectExchange delayTtlExchangeClothes() {
-        return new DirectExchange(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getExchange());
-    }
-    @Bean
-    public Queue orderDelayQueueTtlClothes() {
-        return QueueBuilder.durable(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getQueue())
-                //到期后转发的交换机
-                .withArgument("x-dead-letter-exchange", RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getExchange())
-                //到期后转发的路由键
-                .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getRoute())
-                .build();
-    }
-    @Bean
-    public Binding orderDelayBindTtlClothes() {
-        return BindingBuilder.bind(orderDelayQueueTtlClothes()).to(delayTtlExchangeClothes()).with(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY_TTL.getRoute());
-    }
-
-    @Bean
-    public DirectExchange orderDelayExchangeClothes() {
-        return new DirectExchange(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getExchange());
-    }
-    @Bean
-    public Queue orderDelayQueueClothes() {
-        return new Queue(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getQueue());
-    }
-    @Bean
-    public Binding orderDelayBindClothes() {
-        return BindingBuilder.bind(orderDelayQueueClothes()).to(orderDelayExchangeClothes()).with(RabbitQueueEnum.CLOTHES_ORDER_CANCEL_DELAY.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange delayTtlExchange() {
-        return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange());
-    }
-
-    @Bean
-    public DirectExchange orderDelayExchange() {
-        return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange());
-    }
-
-    @Bean
-    public Queue orderDelayQueue() {
-        return new Queue(RabbitQueueEnum.ORDER_CANCEL_DELAY.getQueue());
-    }
-
-    @Bean
-    public Queue orderDelayQueueTtl() {
-        return QueueBuilder.durable(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getQueue())
-                //到期后转发的交换机
-                .withArgument("x-dead-letter-exchange", RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange())
-                //到期后转发的路由键
-                .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute())
-                .build();
-    }
-
-    @Bean
-    public Binding orderDelayBind() {
-        return BindingBuilder.bind(orderDelayQueue()).to(orderDelayExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute());
-    }
-
-    @Bean
-    public Binding orderDelayBindTtl() {
-        return BindingBuilder.bind(orderDelayQueueTtl()).to(delayTtlExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute());
-    }
-
-    @Bean
-    public Queue autoLevelUpAgentQueue() {
-        return new Queue(QueueConstants.AGENT_AUTO_LEVEL_UP);
-    }
-
-    @Bean
-    public Binding autoLevelUpBind() {
-        return BindingBuilder.bind(autoLevelUpAgentQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT);
-    }
-
-    @Bean
-    public DirectExchange agentReturnMoneyExchange() {
-        return new DirectExchange(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange());
-    }
-
-    @Bean
-    public Queue agentReturnMoneyQueue() {
-        return new Queue(QueueConstants.AGENT_RETURN_MONEY);
-    }
-
-    @Bean
-    public Binding agentReturnMoneyBind() {
-        return BindingBuilder.bind(agentReturnMoneyQueue()).to(agentReturnMoneyExchange()).with(RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange orderReturnMoneyExchange() {
-        return new DirectExchange(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange());
-    }
-
-    @Bean
-    public Queue orderReturnMoneyQueue() {
-        return new Queue(QueueConstants.ORDER_RETURN_MONEY);
-    }
-
-    @Bean
-    public Binding orderReturnMoneyBind() {
-        return BindingBuilder.bind(orderReturnMoneyQueue()).to(orderReturnMoneyExchange()).with(RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange orderCouponExchange() {
-        return new DirectExchange(RabbitQueueEnum.ORDER_COUPON.getExchange());
-    }
-
-    @Bean
-    public Queue orderCouponQueue() {
-        return new Queue(QueueConstants.ORDER_COUPON);
-    }
-
-    @Bean
-    public Binding orderCouponBind() {
-        return BindingBuilder.bind(orderCouponQueue()).to(orderCouponExchange()).with(RabbitQueueEnum.ORDER_COUPON.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange getScoreMsgExchange() {
-        return new DirectExchange(RabbitQueueEnum.GET_SCORE_MSG.getExchange());
-    }
-
-    @Bean
-    public Queue getScoreMsgQueue() {
-        return new Queue(QueueConstants.GET_SCORE_MSG);
-    }
-
-    @Bean
-    public Binding getScoreMsgBind() {
-        return BindingBuilder.bind(getScoreMsgQueue()).to(getScoreMsgExchange()).with(RabbitQueueEnum.GET_SCORE_MSG.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange vipLevelUp() {
-        return new DirectExchange(RabbitQueueEnum.VIP_LEVEL_UP.getExchange());
-    }
-
-    @Bean
-    public Queue vipLevelUpQueue() {
-        return new Queue(QueueConstants.VIP_LEVEL_UP);
-    }
-
-    @Bean
-    public Binding vipLevelUpBind() {
-        return BindingBuilder.bind(vipLevelUpQueue()).to(vipLevelUp()).with(RabbitQueueEnum.VIP_LEVEL_UP.getRoute());
-    }
-
-
-
-
-    @Bean
-    public DirectExchange saleLevelUp() {
-        return new DirectExchange(RabbitQueueEnum.SALE_LEVEL_UP.getExchange());
-    }
-
-    @Bean
-    public Queue saleLevelUpQueue() {
-        return new Queue(RabbitQueueEnum.SALE_LEVEL_UP.getQueue());
-    }
-
-    @Bean
-    public Binding saleLevelUpBind() {
-        return BindingBuilder.bind(saleLevelUpQueue()).to(saleLevelUp()).with(RabbitQueueEnum.SALE_LEVEL_UP.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange activityOrderCheckExchange() {
-        return new DirectExchange(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getExchange());
-    }
-
-    @Bean
-    public Queue activityOrderCheckQueue() {
-        return new Queue(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getQueue());
-    }
-
-    @Bean
-    public Binding activityOrderCheckBind() {
-        return BindingBuilder.bind(activityOrderCheckQueue()).to(activityOrderCheckExchange()).with(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange clothesAddLikeExchange() {
-        return new DirectExchange(RabbitQueueEnum.CLOTHES_ADD_LIKE.getExchange());
-    }
-
-    @Bean
-    public Queue clothesAddLikeQueue() {
-        return new Queue(RabbitQueueEnum.CLOTHES_ADD_LIKE.getQueue());
-    }
-
-    @Bean
-    public Binding clothesAddLikeBind() {
-        return BindingBuilder.bind(clothesAddLikeQueue()).to(clothesAddLikeExchange()).with(RabbitQueueEnum.CLOTHES_ADD_LIKE.getRoute());
-    }
-
-
-    @Bean
-    public DirectExchange clothesAddCollectExchange() {
-        return new DirectExchange(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getExchange());
-    }
-
-    @Bean
-    public Queue clothesAddCollectQueue() {
-        return new Queue(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getQueue());
-    }
-
-    @Bean
-    public Binding clothesAddCollectBind() {
-        return BindingBuilder.bind(clothesAddCollectQueue()).to(clothesAddCollectExchange()).with(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getRoute());
-    }
-
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/constants/ExchangeConstants.java b/src/main/java/cc/mrbird/febs/rabbit/constants/ExchangeConstants.java
index e4b4676..741935b 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/constants/ExchangeConstants.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/constants/ExchangeConstants.java
@@ -6,5 +6,5 @@
  **/
 public class ExchangeConstants {
 
-    public static final String EXCHANGE_DEFAULT = "exchange_default_qay";
+    public static final String PC_COMPANY_ADD_ALI = "exchange_pc_company_add_ali";
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
index e54282e..70e7a63 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -5,21 +5,5 @@
  * @date 2021-09-25
  **/
 public class QueueConstants {
-    public static final String ACTIVITY_ORDER_ITEM_CHECK = "queue_activity_order_item_check";
-
-    public static final String QUEUE_DEFAULT = "queue_default_qay";
-    public static final String AGENT_AUTO_LEVEL_UP = "queue_agent_auto_level_up_qay";
-    public static final String AGENT_RETURN_MONEY = "queue_agent_return_money_qay";
-    public static final String ORDER_RETURN_MONEY = "queue_order_return_money_qay";
-
-    public static final String ORDER_COUPON = "queue_order_coupon";
-
-    public static final String GET_SCORE_MSG = "queue_get_score_msg";
-    public static final String VIP_LEVEL_UP = "queue_vip_level_up";
-    public static final String SALE_LEVEL_UP = "queue_sale_level_up";
-
-    ;
-    public static final String CLOTHES_ORDER_CANCEL_DELAY = "queue_order_delay_qay_clothes";
-    public static final String CLOTHES_ADD_LIKE = "queue_clothes_add_like";
-    public static final String CLOTHES_ADD_COLLECT = "queue_clothes_add_collect";
+    public static final String PC_COMPANY_ADD_ALI = "queue_pc_company_add_ali";
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/constants/RouteKeyConstants.java b/src/main/java/cc/mrbird/febs/rabbit/constants/RouteKeyConstants.java
index 3676e47..c254011 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/constants/RouteKeyConstants.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/constants/RouteKeyConstants.java
@@ -6,5 +6,5 @@
  **/
 public class RouteKeyConstants {
 
-    public static final String ROUTE_KEY_DEFAULT = "route_key_default_qay";
+    public static final String PC_COMPANY_ADD_ALI = "route_key_pc_company_add_ali";
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
index bc97182..cbf207b 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -21,141 +21,4 @@
 @Component
 public class AgentConsumer {
 
-    @Autowired
-    private IApiMallOrderInfoService orderInfoService;
-
-    @Autowired
-    private ApiClothesOrderService apiClothesOrderService;
-    @Autowired
-    private IAgentService agentService;
-    @Autowired
-    private IMemberProfitService memberProfitService;
-    @Autowired
-    private HappyActivityService happyActivityService;
-
-    @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT)
-    public void agentReturn(Message message, Channel channel) {
-        log.info("消费者:{}", new String(message.getBody()));
-    }
-
-    @RabbitListener(queues = QueueConstants.CLOTHES_ORDER_CANCEL_DELAY)
-    public void orderCancelDelayClothes(String id) {
-        try {
-            apiClothesOrderService.orderCancelDelayClothes(Long.parseLong(id));
-        } catch (Exception e) {
-            log.error("订单超时支付异常", e);
-        }
-    }
-
-    @RabbitListener(queues = "queue_order_delay_qay")
-    public void orderCancelDelay(String id) {
-        try {
-            orderInfoService.autoCancelOrder(Long.parseLong(id));
-        } catch (Exception e) {
-            log.error("订单超时支付异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.AGENT_AUTO_LEVEL_UP)
-    public void agentAutoLevelUp(String id) {
-        log.info("收到代理自动升级消息:{}", id);
-        try {
-            agentService.autoUpAgentLevel(Long.parseLong(id));
-        } catch (Exception e) {
-            log.error("代理自动升级异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY)
-    public void agentReturnMoney(String orderId) {
-        log.info("收到返利消息:{}", orderId);
-        try {
-            agentService.returnMoneyToAgent(Long.parseLong(orderId));
-        } catch (Exception e) {
-            log.error("返利异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.ORDER_RETURN_MONEY)
-    public void orderReturnMoney(String orderId) {
-        log.info("收到订单返利消息:{}", orderId);
-        try {
-            memberProfitService.dynamicProfit(Long.parseLong(orderId));
-        } catch (Exception e) {
-            log.error("订单返利异常:", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.ORDER_COUPON)
-    public void getOrderCoupon(Long orderId) {
-        log.info("收到使用优惠卷消息:{}", orderId);
-        try {
-            memberProfitService.getOrderCoupon(orderId);
-        } catch (Exception e) {
-            log.error("使用优惠卷异常:", e);
-        }
-    }
-
-    @Autowired
-    private IVipCommonService vipCommonService;
-
-    @RabbitListener(queues = QueueConstants.GET_SCORE_MSG)
-    public void getScoreMsg(Long orderId) {
-        log.info("收到积分消息:{}", orderId);
-        try {
-            vipCommonService.getScore(orderId);
-        } catch (Exception e) {
-            log.error("获取积分消息异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.VIP_LEVEL_UP)
-    public void vipLevelUp(Long orderId) {
-        log.info("收到会员升级消息:{}", orderId);
-        try {
-            vipCommonService.levelUp(orderId);
-        } catch (Exception e) {
-            log.error("会员升级消息异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.SALE_LEVEL_UP)
-    public void saleLevelUp(Long orderId) {
-        log.info("收到团长升级:{}", orderId);
-        try {
-            vipCommonService.saleLevelUp(orderId);
-        } catch (Exception e) {
-            log.error("团长升级消息异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.ACTIVITY_ORDER_ITEM_CHECK)
-    public void checkActivityItem(Long orderId) {
-        log.info("收到核销活动门票:{}", orderId);
-        try {
-            happyActivityService.checkActivityItem(orderId);
-        } catch (Exception e) {
-            log.error("核销活动门票异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.CLOTHES_ADD_LIKE)
-    public void getAddLike(Long socialId) {
-        log.info("点赞:{}", socialId);
-        try {
-            happyActivityService.getAddLike(socialId);
-        } catch (Exception e) {
-            log.error("点赞异常", e);
-        }
-    }
-
-    @RabbitListener(queues = QueueConstants.CLOTHES_ADD_COLLECT)
-    public void getAddCollect(Long socialId) {
-        log.info("收藏:{}", socialId);
-        try {
-            happyActivityService.getAddCollect(socialId);
-        } catch (Exception e) {
-            log.error("收藏异常", e);
-        }
-    }
 }
diff --git a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
index e2fe106..c2610be 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -1,35 +1,14 @@
 package cc.mrbird.febs.rabbit.enumerates;
 
+import cc.mrbird.febs.rabbit.constants.ExchangeConstants;
 import cc.mrbird.febs.rabbit.constants.QueueConstants;
+import cc.mrbird.febs.rabbit.constants.RouteKeyConstants;
 import lombok.Getter;
 
 @Getter
 public enum RabbitQueueEnum {
 
-
-    CLOTHES_ADD_COLLECT("exchange_clothes_add_collect", "route_key_clothes_add_collect", QueueConstants.CLOTHES_ADD_COLLECT),
-    CLOTHES_ADD_LIKE("exchange_clothes_add_like", "route_key_clothes_add_like", QueueConstants.CLOTHES_ADD_LIKE),
-    ACTIVITY_ORDER_ITEM_CHECK("exchange_activity_order_item_check", "route_key_activity_order_item_check", QueueConstants.ACTIVITY_ORDER_ITEM_CHECK),
-
-    DEFAULT("exchange_default_qay", "route_key_default_qay", "queue_default_qay"),
-
-    ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay", "route_key_order_delay_ttl_qay", "queue_order_delay_ttl_qay"),
-    ORDER_CANCEL_DELAY("exchange_order_delay_qay", "route_key_order_delay_qay", "queue_order_delay_qay"),
-
-    CLOTHES_ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay_clothes", "route_key_order_delay_ttl_qay_clothes", "queue_order_delay_ttl_qay_clothes"),
-    CLOTHES_ORDER_CANCEL_DELAY("exchange_order_delay_qay_clothes", "route_key_order_delay_qay_clothes", QueueConstants.CLOTHES_ORDER_CANCEL_DELAY),
-
-    AGENT_REUTRN_MONEY("exchange_agent_return_money_qay", "route_key_agent_return_money_qay", "queue_agent_return_money_qay"),
-
-    ORDER_RETURN_MONEY("exchange_order_return_money_qay", "route_key_order_return_money_qay", "queue_order_return_money_qay"),
-
-    ORDER_COUPON("exchange_order_coupon", "route_key_order_coupon", QueueConstants.ORDER_COUPON),
-
-    GET_SCORE_MSG("exchange_get_score_msg", "route_key_get_score_msg", QueueConstants.GET_SCORE_MSG),
-
-    SALE_LEVEL_UP("exchange_sale_level_up", "route_key_sale_level_up", QueueConstants.SALE_LEVEL_UP),
-
-    VIP_LEVEL_UP("exchange_vip_level_up", "route_key_vip_level_up", QueueConstants.VIP_LEVEL_UP);
+    PC_COMPANY_ADD_ALI(ExchangeConstants.PC_COMPANY_ADD_ALI, RouteKeyConstants.PC_COMPANY_ADD_ALI, QueueConstants.PC_COMPANY_ADD_ALI);
 
     private String exchange;
 
diff --git a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
index 1bdfed6..65b4814 100644
--- a/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
+++ b/src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -45,95 +45,17 @@
 
     }
 
-    public void sendOrderReturn(Long id) {
-        log.info("发送消息:{}", id);
-        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange(), RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute(), id, correlationData);
-    }
-
-    public void sendOrderCancelDelayMsg(Long id, Long times) {
-        log.info("发送自动取消订单消息:{}, {}", id, times);
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange(), RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute(), id, new MessagePostProcessor() {
-            @Override
-            public Message postProcessMessage(Message message) throws AmqpException {
-                message.getMessageProperties().setExpiration(String.valueOf(times));
-                return message;
-            }
-        });
-    }
-
-    public void sendClothesOrderCancelDelayMsg(Long id, Long times) {
-        log.info("发送自动取消订单消息:{}, {}", id, times);
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange(), RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute(), id, new MessagePostProcessor() {
-            @Override
-            public Message postProcessMessage(Message message) throws AmqpException {
-                message.getMessageProperties().setExpiration(String.valueOf(times));
-                return message;
-            }
-        });
-    }
-
-    /**
-     * 发送代理自动升级消息
-     *
-     * @param memberId
-     */
-    public void sendAutoLevelUpMsg(@NotNull Long memberId) {
-        log.info("发送代理自动升级消息:{}", memberId);
-        rabbitTemplate.convertAndSend(ExchangeConstants.EXCHANGE_DEFAULT, RouteKeyConstants.ROUTE_KEY_DEFAULT, memberId);
-    }
-
-    public void sendReturnMoneyMsg(Long orderId) {
-        log.info("发送返利消息:{}", orderId);
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange(), RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute(), orderId);
-    }
 
 
-    public void sendOrderCoupon(Long id) {
-        log.info("发送使用优惠卷消息:{}", id);
-        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_COUPON.getExchange(), RabbitQueueEnum.ORDER_COUPON.getRoute(), id, correlationData);
-    }
 
-    public void sendGetScoreMsg(Long orderId) {
-        log.info("发送获得积分消息:{}", orderId);
+    public void sendAddCompanyToken(String id) {
+        log.info("消息记录:{}", id);
 
         CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.GET_SCORE_MSG.getExchange(), RabbitQueueEnum.GET_SCORE_MSG.getRoute(), orderId, correlationData);
-    }
-
-    public void sendVipLevelUp(Long orderId) {
-        log.info("发送会员升级消息:{}", orderId);
-
-        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.VIP_LEVEL_UP.getExchange(), RabbitQueueEnum.VIP_LEVEL_UP.getRoute(), orderId, correlationData);
-    }
-
-    public void sendSaleLevelUp(Long orderId) {
-        log.info("发送团长升级:{}", orderId);
-
-        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.SALE_LEVEL_UP.getExchange(), RabbitQueueEnum.SALE_LEVEL_UP.getRoute(), orderId, correlationData);
-    }
-
-    public void sendCheckActivityItem(Long orderId) {
-        log.info("核销活动门票:{}", orderId);
-
-        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getExchange(), RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getRoute(), orderId, correlationData);
-    }
-
-    public void sendAddLike(Long socialId) {
-        log.info("点赞:{}", socialId);
-
-        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.CLOTHES_ADD_LIKE.getExchange(), RabbitQueueEnum.CLOTHES_ADD_LIKE.getRoute(), socialId, correlationData);
-    }
-
-    public void sendAddCollect(Long socialId) {
-        log.info("收藏:{}", socialId);
-
-        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
-        rabbitTemplate.convertAndSend(RabbitQueueEnum.CLOTHES_ADD_COLLECT.getExchange(), RabbitQueueEnum.CLOTHES_ADD_COLLECT.getRoute(), socialId, correlationData);
+        rabbitTemplate.convertAndSend(
+                RabbitQueueEnum.PC_COMPANY_ADD_ALI.getExchange(),
+                RabbitQueueEnum.PC_COMPANY_ADD_ALI.getRoute(),
+                id,
+                correlationData);
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java b/src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java
index e6f0de2..2ea1a92 100644
--- a/src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java
+++ b/src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java
@@ -11,6 +11,7 @@
 import cc.mrbird.febs.yinhe.req.*;
 import cc.mrbird.febs.yinhe.res.*;
 import cc.mrbird.febs.yinhe.service.YhAiService;
+import cn.hutool.core.util.StrUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
@@ -19,6 +20,9 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import reactor.core.publisher.Flux;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * @author Administrator
@@ -109,4 +113,35 @@
         return service.logout();
     }
 
+
+    @ApiOperation(value = "初始化对话", notes = "初始化对话")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = YHSendInitVo.class)
+    })
+    @PostMapping(value = "/initSend", produces = "application/json")
+    public FebsResponse initSend(@RequestBody @Validated YHSendInitDto dto) {
+
+        return service.initSend(dto);
+    }
+
+    @ApiOperation(value = "保存对话消息", notes = "保存对话消息")
+    @PostMapping(value = "/saveContext")
+    public FebsResponse saveContext(@RequestBody @Validated YHSaveContextDto dto) {
+
+        return service.saveContext(dto);
+    }
+
+
+    @ApiOperation("AI回答(流式)")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "流式响应", response = YHAitalkItemStreamVo.class),
+    })
+    @PostMapping("/aiAnswer")
+    public Flux<FebsResponse> aiAnswer(@RequestBody @Validated YHAitalkItemStreamDto dto) {
+        if (StrUtil.isEmpty(dto.getTalkId()) || StrUtil.isEmpty(dto.getReqContext())|| StrUtil.isEmpty(dto.getReqContext())){
+            return Flux.just(new FebsResponse().fail().message("参数异常"));
+        }
+        return service.aiAnswer(dto);
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentKnowledge.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentKnowledge.java
new file mode 100644
index 0000000..9acc4a4
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentKnowledge.java
@@ -0,0 +1,29 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("ai_agent_knowledge")
+public class YHAiAgentKnowledge extends YhBaseEntity {
+
+    /** 主键 */
+    private String id;
+
+    /** 公司ID */
+    private String companyId;
+
+    /** 名称 */
+    private String name;
+
+    /** 知识创建时间 */
+    private Date knowledgeCreateTime;
+
+    /** 智能体ID */
+    private String agentId;
+
+    /** 知识库ID */
+    private String knowledgeId;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java
index 4bf5b68..8b40b96 100644
--- a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java
@@ -17,4 +17,6 @@
     private String code;
     private String knowledgeId;
     private String categoryId;
+    private String levelCode;
+    private Integer useToken;
 }
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiKnowledge.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiKnowledge.java
new file mode 100644
index 0000000..9339340
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiKnowledge.java
@@ -0,0 +1,50 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("ai_knowledge")
+public class YHAiKnowledge extends YhBaseEntity {
+
+    /** 主键 */
+    private String id;
+
+    /**
+     * 状态:0-上传服务器,1-应用数据,2-知识库 3-成功
+     */
+    private Integer state;
+    /**
+     * 文件ID
+     */
+    private String jobId;
+    /**
+     * 文件ID
+     */
+    private String fileId;
+
+    /**
+     * 文件存储路径
+     */
+    private String savePath;
+
+    /**
+     * 文件名称
+     */
+    private String name;
+
+    /**
+     * 文件大小
+     */
+    private String fileSize;
+
+    /**
+     * 公司ID
+     */
+    private String companyId;
+
+    /**
+     * 分类ID
+     */
+    private String categoryId;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalk.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalk.java
new file mode 100644
index 0000000..d703f2c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalk.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("ai_talk")
+public class YHAiTalk extends YhBaseEntity {
+
+    /** 主键 */
+    private String id;
+
+    /** 公司ID */
+    private String companyId;
+
+    /** 成员ID */
+    private String customerId;
+
+    /** 智能体ID */
+    private String agentId;
+
+    /** 类型 1-普通对话 2-员工对话*/
+    private Integer type ;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalkItem.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalkItem.java
new file mode 100644
index 0000000..7415691
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalkItem.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("ai_talk_item")
+public class YHAiTalkItem extends YhBaseEntity {
+
+
+    /** 主键 */
+    private String id;
+
+    /** 公司ID */
+    private String companyId;
+
+    /** 对话ID */
+    private String talkId;
+
+    /** 类型 system  assistant user tool */
+    private String type;
+
+    /** 内容 */
+    private String context;
+
+    private Integer tokenNum;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/entity/YHSysCompanyLevel.java b/src/main/java/cc/mrbird/febs/yinhe/entity/YHSysCompanyLevel.java
new file mode 100644
index 0000000..92d483c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/entity/YHSysCompanyLevel.java
@@ -0,0 +1,14 @@
+package cc.mrbird.febs.yinhe.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("sys_company_level")
+public class YHSysCompanyLevel extends YhBaseEntity {
+
+    private String name;
+    private String code;
+    private Integer agentNum;
+    private Integer token;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentKnowledgeMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentKnowledgeMapper.java
new file mode 100644
index 0000000..b4bf55b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentKnowledgeMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHAiAgentKnowledge;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHAiAgentKnowledgeMapper extends BaseMapper<YHAiAgentKnowledge> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiKnowledgeMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiKnowledgeMapper.java
new file mode 100644
index 0000000..42a2654
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiKnowledgeMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHAiKnowledge;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHAiKnowledgeMapper extends BaseMapper<YHAiKnowledge> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkItemMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkItemMapper.java
new file mode 100644
index 0000000..e974aef
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkItemMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHAiTalkItem;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHAiTalkItemMapper extends BaseMapper<YHAiTalkItem> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkMapper.java
new file mode 100644
index 0000000..67c2a7d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHAiTalk;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHAiTalkMapper extends BaseMapper<YHAiTalk> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysCompanyLevelMapper.java b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysCompanyLevelMapper.java
new file mode 100644
index 0000000..f80b4ef
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysCompanyLevelMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.yinhe.mapper;
+
+import cc.mrbird.febs.yinhe.entity.YHSysCompanyLevel;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface YHSysCompanyLevelMapper extends BaseMapper<YHSysCompanyLevel> {
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/AiRequestDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/AiRequestDto.java
new file mode 100644
index 0000000..150f130
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/AiRequestDto.java
@@ -0,0 +1,25 @@
+package cc.mrbird.febs.yinhe.req;
+
+import com.alibaba.dashscope.common.Message;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AiRequestDto {
+
+    private List<Message> messages;
+
+    private List<String> knowledgeIds ;
+
+    private List<String> fileIds;
+
+    private String prompt;
+
+    private String rolePrompt;
+
+    private String talkId;
+
+    private String companyId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHAitalkItemStreamDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHAitalkItemStreamDto.java
new file mode 100644
index 0000000..7de6e33
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHAitalkItemStreamDto.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.yinhe.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "YHAitalkItemStreamDto", description = "参数")
+public class YHAitalkItemStreamDto {
+
+    @NotBlank(message = "会话不能为空")
+    @ApiModelProperty(value = "会话ID", example = "10")
+    private String talkId;
+
+    @NotBlank(message = "内容不能为空")
+    @ApiModelProperty(value = "内容", example = "10")
+    private String reqContext;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHSaveContextDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHSaveContextDto.java
new file mode 100644
index 0000000..56b96ee
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHSaveContextDto.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.yinhe.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "YHSaveContextDto", description = "参数")
+public class YHSaveContextDto {
+    /**
+     * 用户对话ID (UUID)
+     */
+    @NotBlank(message = "会话ID不能为空")
+    @ApiModelProperty(value = "会话ID", example = "10")
+    private String talkId;
+
+    @NotBlank(message = "类型不能为空")
+    @ApiModelProperty(value = "类型 ai:assistant ,用户:user", example = "assistant")
+    private String type;
+
+    @NotBlank(message = "内容不能为空")
+    @ApiModelProperty(value = "内容", example = "10")
+    private String content;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/req/YHSendInitDto.java b/src/main/java/cc/mrbird/febs/yinhe/req/YHSendInitDto.java
new file mode 100644
index 0000000..dd3ee2e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/req/YHSendInitDto.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.yinhe.req;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel(value = "YHSendInitDto", description = "参数")
+public class YHSendInitDto {
+
+    @NotBlank(message = "智能体不能为空")
+    @ApiModelProperty(value = "智能体ID", example = "you_ke_*****")
+    private String id;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHAitalkItemStreamVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHAitalkItemStreamVo.java
new file mode 100644
index 0000000..3be97bf
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHAitalkItemStreamVo.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.yinhe.res;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "YHAitalkItemStreamVo", description = "详情响应")
+public class YHAitalkItemStreamVo {
+
+    @ApiModelProperty(value = "消息")
+    private String content;
+
+    @ApiModelProperty(value = "思考")
+    private String reasoningContent;
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/res/YHSendInitVo.java b/src/main/java/cc/mrbird/febs/yinhe/res/YHSendInitVo.java
new file mode 100644
index 0000000..c610354
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/yinhe/res/YHSendInitVo.java
@@ -0,0 +1,14 @@
+package cc.mrbird.febs.yinhe.res;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "YHSendInitVo", description = "参数")
+public class YHSendInitVo {
+
+    @ApiModelProperty(value = "会话ID", example = "1")
+    private String talkId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java b/src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java
index b94595f..5575db9 100644
--- a/src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java
+++ b/src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java
@@ -4,6 +4,9 @@
 import cc.mrbird.febs.yinhe.entity.YhAiMember;
 import cc.mrbird.febs.yinhe.req.*;
 import com.baomidou.mybatisplus.extension.service.IService;
+import reactor.core.publisher.Flux;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 用户表 Service 接口
@@ -26,4 +29,10 @@
     FebsResponse agentSysInfo(YHSysAgentInitDto dto);
 
     FebsResponse logout();
+
+    FebsResponse initSend(YHSendInitDto dto);
+
+    FebsResponse saveContext(YHSaveContextDto dto);
+
+    Flux<FebsResponse> aiAnswer(YHAitalkItemStreamDto dto);
 }
\ No newline at end of file
diff --git a/src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java b/src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java
index 23e8865..8645a08 100644
--- a/src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java
@@ -1,10 +1,15 @@
 package cc.mrbird.febs.yinhe.service.impl;
 
+import cc.mrbird.febs.ai.strategy.LlmStrategyFactory;
+import cc.mrbird.febs.ai.strategy.enumerates.LlmStrategyEnum;
+import cc.mrbird.febs.ai.utils.UUID;
 import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.AppContants;
 import cc.mrbird.febs.common.utils.LoginUserUtil;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.YHLoginUserUtil;
+import cc.mrbird.febs.rabbit.producter.AgentProducer;
 import cc.mrbird.febs.yinhe.entity.*;
 import cc.mrbird.febs.yinhe.mapper.*;
 import cc.mrbird.febs.yinhe.req.*;
@@ -13,14 +18,18 @@
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.dashscope.common.Message;
+import com.alibaba.dashscope.common.Role;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import reactor.core.publisher.Flux;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 @Slf4j
@@ -34,12 +43,21 @@
     private final YHAiAgentCategoryMapper yhAiAgentCategoryMapper;
     private final YHAiAgentMapper yhAiAgentMapper;
     private final YHAiAgentStartQuestionMapper yhAiAgentStartQuestionMapper;
+    private final YHAiAgentKnowledgeMapper yhAiAgentKnowledgeMapper;
+    private final YHAiKnowledgeMapper yhAiKnowledgeMapper;
 
     private final YhSysAgentCategoryMapper yhSysAgentCategoryMapper;
     private final YHSysAgentStartQuestionMapper yhSysAgentStartQuestionMapper;
     private final YHSysAgentMapper yhSysAgentMapper;
+    private final YHSysCompanyLevelMapper yhSysCompanyLevelMapper;
+
+    private final YHAiTalkMapper yhAiTalkMapper;
+    private final YHAiTalkItemMapper yhAiTalkItemMapper;
 
     private final RedisUtils redisUtils;
+    private final AgentProducer agentProducer;
+
+    private final LlmStrategyFactory llmStrategyFactory;
 
     @Override
     public FebsResponse memberInfo() {
@@ -246,4 +264,181 @@
         redisUtils.del(AppContants.XCX_LOGIN_PREFIX + memberUuid);
         return new FebsResponse().success().message("退出登录");
     }
+
+    @Override
+    public FebsResponse initSend(YHSendInitDto dto) {
+        String memberUuid = LoginUserUtil.getLoginUser().getMemberUuid();
+
+        YHSendInitVo vo = new YHSendInitVo();
+
+        String agentId = dto.getId();
+        //获取智能体信息
+        YHAiAgent yhAiAgent = yhAiAgentMapper.selectById(agentId);
+        if (yhAiAgent == null) {
+
+            throw new FebsException("智能体不存在");
+        }
+        if (yhAiAgent.getState() != 1){
+
+            throw new FebsException("智能体未启用");
+        }
+        String companyId = yhAiAgent.getCompanyId();
+        /**
+         * 新增一个会话记录
+         */
+        YHAiTalk entity = new YHAiTalk();
+        entity.setId(UUID.getSimpleUUIDString());
+        entity.setCompanyId(companyId);
+        entity.setCustomerId(memberUuid);
+        entity.setAgentId(yhAiAgent.getId());
+        entity.setType(2);
+        entity.setCreateTime(new Date());
+        yhAiTalkMapper.insert(entity);
+
+        vo.setTalkId(entity.getId());
+        return new FebsResponse().success().data(vo);
+    }
+
+    @Override
+    public FebsResponse saveContext(YHSaveContextDto dto) {
+        String talkId = dto.getTalkId();
+        String type = dto.getType();
+        String content = dto.getContent();
+
+        YHAiTalk aiTalk = yhAiTalkMapper.selectById(talkId);
+        if (aiTalk == null) {
+            throw new FebsException("会话不存在");
+        }
+        //保存会话记录
+        YHAiTalkItem aiTalkItem = new YHAiTalkItem();
+        aiTalkItem.setId(UUID.getSimpleUUIDString());
+        aiTalkItem.setCompanyId(aiTalk.getCompanyId());
+        aiTalkItem.setTalkId(aiTalk.getId());
+        aiTalkItem.setType(type);
+        aiTalkItem.setContext(content);
+        aiTalkItem.setTokenNum(content.length());
+        aiTalkItem.setCreateTime(new Date());
+        yhAiTalkItemMapper.insert(aiTalkItem);
+
+        agentProducer.sendAddCompanyToken(aiTalkItem.getId());
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public Flux<FebsResponse> aiAnswer(YHAitalkItemStreamDto dto) {
+        String talkId = dto.getTalkId();
+        String reqContext = dto.getReqContext();
+
+        YHAiTalk aiTalk = yhAiTalkMapper.selectById(talkId);
+        if (aiTalk == null) {
+            throw new FebsException("会话不存在");
+        }
+
+        //获取智能体的信息
+        String agentId = aiTalk.getAgentId();
+        YHAiAgent aiAgent = yhAiAgentMapper.selectById(agentId);
+        if (aiAgent == null) {
+            throw new FebsException("智能体异常");
+        }
+        //判断字符是否足够
+        String companyId = aiTalk.getCompanyId();
+        YHAiCompany aiCompany = yhAiCompanyMapper.selectById(companyId);
+        if (aiCompany == null) {
+            throw new FebsException("知识库异常");
+        }
+        Integer useToken = aiCompany.getUseToken();
+        YHSysCompanyLevel sysCompanyLevel = yhSysCompanyLevelMapper.selectOne(
+                Wrappers.lambdaQuery(YHSysCompanyLevel.class)
+                        .select(YHSysCompanyLevel::getToken)
+                        .eq(YHSysCompanyLevel::getCode, aiCompany.getLevelCode())
+        );
+        if (useToken > sysCompanyLevel.getToken()) {
+            throw new FebsException("字符已消耗完");
+        }
+        //获取智能体绑定的知识库
+        List<String> knowledgeIds = new ArrayList<>();
+        String knowledgeId = aiCompany.getKnowledgeId();
+        knowledgeIds.add(knowledgeId);
+
+        //获取智能体绑定的查询文件
+        List<String> fileIds = new ArrayList<>();
+        List<YHAiAgentKnowledge> aiAgentKnowledges = yhAiAgentKnowledgeMapper.selectList(
+                Wrappers.lambdaQuery(YHAiAgentKnowledge.class)
+                        .select(YHAiAgentKnowledge::getKnowledgeId)
+                        .eq(YHAiAgentKnowledge::getAgentId, agentId)
+                        .eq(YHAiAgentKnowledge::getCompanyId, companyId)
+        );
+        if (CollUtil.isNotEmpty(aiAgentKnowledges)){
+            List<String> aiKnowledgeIds = new ArrayList<>();
+            for (YHAiAgentKnowledge aiAgentKnowledge : aiAgentKnowledges){
+                aiKnowledgeIds.add(aiAgentKnowledge.getKnowledgeId());
+            }
+            if (CollUtil.isNotEmpty(aiKnowledgeIds)){
+                List<YHAiKnowledge> aiKnowledges = yhAiKnowledgeMapper.selectList(
+                        Wrappers.lambdaQuery(YHAiKnowledge.class)
+                                .select(YHAiKnowledge::getFileId)
+                                .in(YHAiKnowledge::getId, aiKnowledgeIds)
+                );
+                if (CollUtil.isNotEmpty(aiKnowledges)){
+                    for (YHAiKnowledge aiKnowledge : aiKnowledges){
+                        fileIds.add(aiKnowledge.getFileId());
+                    }
+                }
+            }
+        }
+
+
+        AiRequestDto aiRequestDto = new AiRequestDto();
+        aiRequestDto.setTalkId(talkId);
+        String prompt = aiAgent.getPrompt();
+        aiRequestDto.setRolePrompt(prompt);
+//        List<Message> messages = new ArrayList<>();
+//        messages.add(Message.builder().role(Role.SYSTEM.getValue()).content(prompt).build());
+
+        //获取对话记录
+        List<Message> messages = new ArrayList<>();
+        List<YHAiTalkItem> aiTalkItemList = yhAiTalkItemMapper.selectList(
+                Wrappers.lambdaQuery(YHAiTalkItem.class)
+                        .eq(YHAiTalkItem::getTalkId, talkId)
+                        .orderByAsc(YHAiTalkItem::getCreateTime)
+        );
+        if (CollUtil.isNotEmpty(aiTalkItemList)){
+            messages = getMessages(messages,aiTalkItemList);
+        }
+        for (
+                Message message : messages
+        ){
+            log.info("上下文内容:{},{}", message.getRole(),message.getContent());
+        }
+        aiRequestDto.setMessages(messages);
+        aiRequestDto.setKnowledgeIds(knowledgeIds);
+        aiRequestDto.setFileIds(fileIds);
+        aiRequestDto.setPrompt(reqContext);
+        aiRequestDto.setCompanyId(companyId);
+        //日志输出详细的请求参数的每一个属性
+        log.info("请求参数:{}", aiRequestDto.getPrompt());
+        log.info("请求参数:{}", aiRequestDto);
+
+
+        String modelName = LlmStrategyEnum.getName(2);
+        return llmStrategyFactory.getCalculationStrategyMap().get(modelName).llmInvokeStreamingNoThink(aiRequestDto);
+    }
+
+    private List<Message> getMessages(List<Message> messages,List<YHAiTalkItem> aiTalkItemList) {
+        for (YHAiTalkItem item : aiTalkItemList){
+            if (StrUtil.equals(item.getType(), Role.USER.getValue())){
+                messages.add(Message.builder()
+                        .role(Role.USER.getValue())
+                        .content(item.getContext())
+                        .build());
+            }
+            if (StrUtil.equals(item.getType(),Role.ASSISTANT.getValue())){
+                messages.add(Message.builder()
+                        .role(Role.ASSISTANT.getValue())
+                        .content(item.getContext())
+                        .build());
+            }
+        }
+        return messages;
+    }
 }

--
Gitblit v1.9.1