16 files added
24 files modified
1332 ■■■■ changed files
src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliApplicationLlmStrategyServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/strategy/Impl/AliLlmStrategyServiceImpl.java 221 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/strategy/Impl/HsLlmStrategyServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/strategy/LlmStrategyService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java 239 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/constants/ExchangeConstants.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java 18 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/constants/RouteKeyConstants.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 137 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java 27 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java 92 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/controller/YHApiAgentController.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentKnowledge.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiKnowledge.java 50 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalk.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalkItem.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHSysCompanyLevel.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentKnowledgeMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiKnowledgeMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkItemMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysCompanyLevelMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/AiRequestDto.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHAitalkItemStreamDto.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHSaveContextDto.java 26 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHSendInitDto.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHAitalkItemStreamVo.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/res/YHSendInitVo.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/service/YhAiService.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/service/impl/YhAiServiceImpl.java 198 ●●●●● patch | view | raw | blame | history
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;
    }
}
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));
                });
    }
}
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;
    }
}
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);
}
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 {
@@ -32,242 +34,17 @@
    }
    @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());
    }
}
src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
@@ -11,7 +11,6 @@
import cc.mrbird.febs.mall.service.IMallAchieveService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.service.IMemberProfitService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesOrderServiceImpl.java
@@ -18,7 +18,6 @@
import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IPayService;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
@@ -67,7 +66,6 @@
    private final MallGoodsCouponMapper mallGoodsCouponMapper;
    private final MallExpressInfoMapper mallExpressInfoMapper;
    private final AgentProducer agentProducer;
    private final IXcxPayService iXcxPayService;
    private final IPayService payService;
    private final MallMemberMapper mallMemberMapper;
@@ -568,9 +566,6 @@
        BigDecimal realAmount = total.subtract(discountAmount).add(deliveryAmount).setScale(2, RoundingMode.DOWN);
        orderInfo.setRealAmount(realAmount);
        clothesOrderMapper.updateById(orderInfo);
        //过期时间修改成24小时
        agentProducer.sendClothesOrderCancelDelayMsg(orderInfo.getId(),  24 * 60 * 60 * 1000L);
        ApiClothesOrderInfoVo apiClothesOrderInfoVo = new ApiClothesOrderInfoVo();
        apiClothesOrderInfoVo.setOrderId(orderInfo.getId());
src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java
@@ -11,7 +11,6 @@
import cc.mrbird.febs.mall.service.ApiClothesSocialService;
import cc.mrbird.febs.mall.vo.activity.ApiScCategoryInfoVo;
import cc.mrbird.febs.mall.vo.clothes.*;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@@ -64,7 +63,6 @@
    private final ClothesLocationRemarkMapper clothesLocationRemarkMapper;
    private final ClothesPatternRemarkMapper clothesPatternRemarkMapper;
    private final ClothesSocialCommentMapper clothesSocialCommentMapper;
    private final AgentProducer agentProducer;
    @Override
@@ -421,7 +419,6 @@
            clothesSocialFollow.setType(SocialTypeEnum.LIKE.getValue());
            clothesSocialFollowMapper.insert(clothesSocialFollow);
            agentProducer.sendAddLike(socialId);
        }
        return new FebsResponse().success().message("操作成功");
    }
@@ -467,7 +464,6 @@
            clothesSocialFollow.setType(SocialTypeEnum.COLLECT.getValue());
            clothesSocialFollowMapper.insert(clothesSocialFollow);
            agentProducer.sendAddCollect(socialId);
        }
        return new FebsResponse().success().message("操作成功");
    }
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -19,7 +19,6 @@
import cc.mrbird.febs.pay.service.IPayService;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cc.mrbird.febs.pay.util.WeixinServiceUtil;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cc.mrbird.febs.vip.service.IMallVipConfigBenefitsService;
import cc.mrbird.febs.vip.service.IMallVipConfigService;
import cn.hutool.core.collection.CollUtil;
@@ -74,7 +73,6 @@
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final RedisUtils redisUtils;
    private final AgentProducer agentProducer;
    private final IPayService payService;
    private final IXcxPayService iXcxPayService;
    private final IMallAchieveService mallAchieveService;
@@ -314,7 +312,6 @@
        this.baseMapper.updateById(orderInfo);
        //过期时间修改成24小时
        agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(),  24 * 60 * 60 * 1000L);
        return orderInfo.getId();
    }
@@ -748,7 +745,6 @@
                            StrUtil.format(ScoreFlowTypeEnum.PAY_BALANCE.getDesc(),orderInfo.getAmount()),
                            2
                    );
                    agentProducer.sendOrderCoupon(orderInfo.getId());
                    break;
                case "4":
                    if (orderInfo.getOrderType() != 2) {
@@ -938,7 +934,6 @@
        orderInfo.setReceivingTime(new Date());
        this.baseMapper.updateById(orderInfo);
        agentProducer.sendGetScoreMsg(orderInfo.getId());
    }
    @Override
src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -18,7 +18,6 @@
import cc.mrbird.febs.mall.vo.activity.*;
import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IXcxPayService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
@@ -59,7 +58,6 @@
    private final IXcxPayService iXcxPayService;
    private final IApiMallMemberWalletService iApiMallMemberWalletService;
    private final HappyActivityCategoryMapper happyActivityCategoryMapper;
    private final AgentProducer agentProducer;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final HappyMemberLevelMapper happyMemberLevelMapper;
    private final IMallMoneyFlowService mallMoneyFlowService;
@@ -1024,12 +1022,9 @@
                    );
                    // 更新会员钱包中的分数
                    iApiMallMemberWalletService.add(multiply, memberId, "score");
                    // 发送会员等级升级消息
                    agentProducer.sendVipLevelUp(memberId);
                }
            }
        }
        agentProducer.sendCheckActivityItem(happyActivityOrderItem.getOrderId());
        return new FebsResponse().success().message("操作成功");
    }
src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
@@ -19,7 +19,6 @@
import cc.mrbird.febs.pay.util.Signature;
import cc.mrbird.febs.pay.util.Util;
import cc.mrbird.febs.pay.util.WechatConfigure;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -73,7 +72,6 @@
    private final IApiMallMemberWalletService memberWalletService;
    private final IApiMallMemberService mallMemberService;
    private final MallAgentRecordMapper mallAgentRecordMapper;
    private final AgentProducer agentProducer;
    private final IXcxPayService iXcxPayService;
    private final WxFaPiaoService wxFaPiaoService;
    private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
@@ -345,9 +343,6 @@
                                        2
                                );
                            }
                            agentProducer.sendOrderCoupon(order.getId());
//                            agentProducer.sendGetScoreMsg(order.getId());
                            mallMoneyFlowService.addMoneyFlow(
                                    order.getMemberId(),
src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
@@ -17,7 +17,6 @@
import cc.mrbird.febs.pay.model.AliPayPassbackModel;
import cc.mrbird.febs.pay.properties.AliPayProperties;
import cc.mrbird.febs.pay.service.IPayService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
@@ -51,8 +50,6 @@
    private MallOrderInfoMapper orderInfoMapper;
    @Autowired
    private ClothesTypeMapper clothesTypeMapper;
    @Autowired
    private AgentProducer agentProducer;
    @Value("${spring.profiles.active}")
    private String active;
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";
}
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";
}
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";
}
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);
        }
    }
}
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;
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);
    }
}
src/main/java/cc/mrbird/febs/vip/service/impl/VipCommonServiceImpl.java
@@ -9,7 +9,6 @@
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cc.mrbird.febs.vip.entity.MallVipBenefits;
import cc.mrbird.febs.vip.entity.MallVipConfig;
import cc.mrbird.febs.vip.mapper.MallVipConfigMapper;
@@ -49,7 +48,6 @@
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final MallMemberMapper mallMemberMapper;
    private final MallVipConfigMapper mallVipConfigMapper;
    private final AgentProducer agentProducer;
    private final IApiMallGoodsService mallGoodsService;
    private final HappyMemberLevelMapper happyMemberLevelMapper;
    private final HappySaleLevelMapper happySaleLevelMapper;
@@ -140,8 +138,6 @@
                );
                // 更新会员钱包中的分数
                mallMemberWalletService.add(multiply, memberId, "score");
                // 发送会员等级升级消息
                agentProducer.sendVipLevelUp(memberId);
            }
            // 计算推荐人获得的积分
            if(StrUtil.isNotEmpty(member.getReferrerId())){
@@ -173,14 +169,10 @@
                    );
                    // 更新会员钱包中的分数
                    mallMemberWalletService.add(multiply, refMember.getId(), "score");
                    // 发送会员等级升级消息
                    agentProducer.sendVipLevelUp(refMember.getId());
                }
            }
        }
        // 发送分销等级升级消息
        agentProducer.sendSaleLevelUp(orderId);
    }
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);
    }
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiAgentKnowledge.java
New file
@@ -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;
}
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;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiKnowledge.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalk.java
New file
@@ -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 ;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiTalkItem.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YHSysCompanyLevel.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiAgentKnowledgeMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiKnowledgeMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkItemMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiTalkMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHSysCompanyLevelMapper.java
New file
@@ -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> {
}
src/main/java/cc/mrbird/febs/yinhe/req/AiRequestDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHAitalkItemStreamDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHSaveContextDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHSendInitDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/req/YHSysCategoryDto.java
@@ -10,9 +10,6 @@
@ApiModel(value = "YHSysCategoryDto", description = "参数")
public class YHSysCategoryDto {
    @ApiModelProperty(value = "产品ID", example = "10")
    private String id;
    @ApiModelProperty(value = "是否推荐到小程序首页 1-推荐 0-不推荐", example = "1")
    private Integer hotState;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHAitalkItemStreamVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/yinhe/res/YHSendInitVo.java
New file
@@ -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;
}
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);
}
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() {
@@ -159,9 +177,6 @@
        LambdaQueryWrapper<YhSysAgentCategory> query = Wrappers.lambdaQuery(YhSysAgentCategory.class);
        query.eq(YhSysAgentCategory::getState,1);
        if (ObjectUtil.isNotEmpty(dto.getId())){
            query.eq(YhSysAgentCategory::getId,dto.getId());
        }
        if (ObjectUtil.isNotEmpty(dto.getHotState())){
            query.eq(YhSysAgentCategory::getHotState,dto.getHotState());
        }
@@ -246,4 +261,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;
    }
}