package com.hanserwei.chat.controller; import com.hanserwei.chat.model.dto.ChatMessageDTO; import com.hanserwei.chat.model.vo.AIResponse; import com.hanserwei.chat.tools.SendMQMessageTools; import com.hanserwei.chat.utils.ConversationContext; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.memory.ChatMemory; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; import java.util.regex.Matcher; import java.util.regex.Pattern; @Slf4j @RestController @RequestMapping("/ai") public class AiChatController { @Resource private ChatClient dashScopeChatClient; @Resource private SendMQMessageTools sendMQMessageTools; private static final Pattern PHONE_PATTERN = Pattern.compile("(? chatWithAi(@RequestBody ChatMessageDTO chatMessageDTO) { log.info("会话ID:{}", chatMessageDTO.getConversionId()); ConversationContext.setConversationId(chatMessageDTO.getConversionId()); triggerSendMessageIfPhonePresent(chatMessageDTO); return dashScopeChatClient.prompt() .user(chatMessageDTO.getMessage()) .advisors(p -> p.param(ChatMemory.CONVERSATION_ID, chatMessageDTO.getConversionId())) .stream() .chatResponse() .mapNotNull(chatResponse -> AIResponse.builder() .v(chatResponse.getResult().getOutput().getText()) .build()) .contextWrite(ctx -> ConversationContext.withConversationId(chatMessageDTO.getConversionId())) .doFinally(signalType -> ConversationContext.clear()); } private void triggerSendMessageIfPhonePresent(ChatMessageDTO chatMessageDTO) { String message = chatMessageDTO.getMessage(); if (message == null || message.isEmpty()) { return; } Matcher matcher = PHONE_PATTERN.matcher(message); if (!matcher.find()) { return; } String phoneNumber = matcher.group(1); log.info("检测到手机号:{},会话ID:{}", phoneNumber, chatMessageDTO.getConversionId()); sendMQMessageTools.sendMQMessage(phoneNumber) .doOnError(error -> log.error("触发发送消息工具失败,手机号:{},错误:{}", phoneNumber, error.getMessage(), error)) .subscribe(result -> log.info("已触发发送消息工具,手机号:{},结果:{}", phoneNumber, result)); } }