942 lines
38 KiB
JavaScript
Raw Normal View History

2026-04-01 11:19:46 +08:00
"use strict";
const common_vendor = require("../../common/vendor.js");
require("../../common/libraries/request.js");
const common_store_useWeAppAuthStore = require("../../common/store/useWeAppAuthStore.js");
require("../../common/store/useWorkStore.js");
const common_libraries_upload = require("../../common/libraries/upload.js");
2026-04-01 14:27:31 +08:00
const common_libraries_public = require("../../common/libraries/public.js");
2026-04-01 11:19:46 +08:00
require("../../gen/Apis.js");
require("../../common/libraries/setTabBar.js");
require("../../common/libraries/apiLoading.js");
if (!Array) {
const _easycom_uni_icons2 = common_vendor.resolveComponent("uni-icons");
_easycom_uni_icons2();
}
const _easycom_uni_icons = () => "../../uni_modules/uni-icons/components/uni-icons/uni-icons.js";
if (!Math) {
_easycom_uni_icons();
}
const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({
__name: "chat",
setup(__props) {
common_vendor.dayjs.extend(common_vendor.relativeTime);
common_vendor.dayjs.locale("zh-cn");
const auth = common_store_useWeAppAuthStore.useWeAppAuthStore();
const inputMessage = common_vendor.ref("");
const selectedImages = common_vendor.ref([]);
const isInputFocused = common_vendor.ref(false);
const messages = common_vendor.ref([
{
role: "ai",
content: "您好!我是物业客服,有什么可以帮助您的吗?",
quickQuestions: []
}
]);
const loading = common_vendor.ref(false);
const loadingText = common_vendor.ref("正在输入中...");
let socketTask = null;
let isConnected = common_vendor.ref(false);
const API_BASE_URL = "https://kf-api-test.linyikj.com.cn";
const WS_BASE_URL = "wss://kf-api-test.linyikj.com.cn";
const currentPage = common_vendor.ref(1);
const pageSize = common_vendor.ref(10);
const hasMore = common_vendor.ref(true);
const isLoadingHistory = common_vendor.ref(false);
const conversationId = common_vendor.ref("");
const currentOffset = common_vendor.ref(0);
const quickQuestionsData = common_vendor.ref([]);
const lastMessageContent = common_vendor.ref("");
const getQuickQuestions = async () => {
try {
const response = await common_vendor.index.request({
url: `${API_BASE_URL}/api/public/quick-questions`,
method: "GET"
});
if (response.statusCode === 200) {
const result = response.data;
let quickQuestions = [];
if (result.data && Array.isArray(result.data)) {
quickQuestions = result.data.map(
(item) => item.question || item.title || item.text || item
);
} else if (result.questions && Array.isArray(result.questions)) {
quickQuestions = result.questions.map(
(item) => item.question || item.title || item.text || item
);
} else if (Array.isArray(result)) {
quickQuestions = result.map((item) => item.question || item.title || item.text || item);
}
console.log("获取到开场白按钮数据:", quickQuestions);
return quickQuestions;
} else {
console.error("获取开场白数据失败,状态码:", response.statusCode);
return [];
}
} catch (error) {
console.error("获取开场白数据异常:", error);
return [];
}
};
const formatMessageContent = (content) => {
if (!content || typeof content !== "string") {
return [""];
}
return content.split("\n").filter((line) => line.trim() !== "");
};
const previewImage = (currentImage, images) => {
common_vendor.index.previewImage({
current: currentImage,
urls: images
});
};
const copyMessage = (content) => {
if (!content) {
common_vendor.index.showToast({
title: "暂无内容可复制",
icon: "none"
});
return;
}
common_vendor.index.setClipboardData({
data: content,
success: () => {
common_vendor.index.showToast({
title: "复制成功",
icon: "success"
});
},
fail: () => {
common_vendor.index.showToast({
title: "复制失败",
icon: "none"
});
}
});
};
const formatTime = (timeStr) => {
if (!timeStr)
return "";
try {
const date = common_vendor.dayjs(timeStr);
if (!date.isValid()) {
return "";
}
return date.fromNow();
} catch (e) {
console.error("时间格式化错误:", e);
return "";
}
};
const scrollToBottom = () => {
common_vendor.nextTick$1(() => {
common_vendor.index.pageScrollTo({
scrollTop: 999999,
duration: 300
});
});
};
const getHistoryMessages = async (page = 1) => {
var _a, _b;
const userPhone = (_b = (_a = auth.data) == null ? void 0 : _a.user) == null ? void 0 : _b.phone;
if (!userPhone) {
console.log("用户未登录,无法获取历史记录");
return;
}
if (isLoadingHistory.value) {
return;
}
try {
isLoadingHistory.value = true;
const offset = (page - 1) * pageSize.value;
currentOffset.value = offset;
console.log("分页信息 - 页码:", page, "每页数量:", pageSize.value, "计算出的offset:", offset);
const response = await common_vendor.index.request({
url: `${API_BASE_URL}/api/public/customer/init`,
method: "POST",
data: {
platform: "property",
platform_user_id: userPhone,
//userPhone
limit: pageSize.value,
offset
}
});
if (response.statusCode === 200) {
const result = response.data;
let historyMessages = [];
if (result.conversation && result.conversation.id) {
conversationId.value = result.conversation.id;
console.log("获取到会话ID:", conversationId.value);
} else if (result.conversation_id) {
conversationId.value = result.conversation_id;
console.log("获取到会话ID:", conversationId.value);
} else if (result.conversations && result.conversations.id) {
conversationId.value = result.conversations.id;
console.log("获取到会话ID:", conversationId.value);
}
if (result.messages && Array.isArray(result.messages)) {
historyMessages = result.messages.map((item) => {
const message = {
role: item.sender_type === "customer" ? "user" : "ai",
content: item.message || item.content || "",
created_at: item.created_at || item.timestamp || new Date().toISOString()
};
if (item.message_type) {
message.message_type = item.message_type;
}
let imageUrlData = null;
if (item.image_url && Array.isArray(item.image_url)) {
imageUrlData = item.image_url;
} else if (item.images && Array.isArray(item.images)) {
imageUrlData = item.images;
} else if (item.metadata && item.metadata.image_url && Array.isArray(item.metadata.image_url)) {
imageUrlData = item.metadata.image_url;
}
if (imageUrlData) {
message.image_url = imageUrlData;
message.images = imageUrlData;
}
if (item.metadata) {
message.metadata = item.metadata;
}
return message;
});
console.log("从messages字段获取到历史记录:", historyMessages.length);
} else if (result.data && Array.isArray(result.data)) {
historyMessages = result.data.map((item) => {
const message = {
role: item.sender_type === "customer" ? "user" : "ai",
content: item.message || item.content || "",
created_at: item.created_at || item.timestamp || new Date().toISOString()
};
if (item.message_type) {
message.message_type = item.message_type;
}
let imageUrlData = null;
if (item.image_url && Array.isArray(item.image_url)) {
imageUrlData = item.image_url;
} else if (item.images && Array.isArray(item.images)) {
imageUrlData = item.images;
} else if (item.metadata && item.metadata.image_url && Array.isArray(item.metadata.image_url)) {
imageUrlData = item.metadata.image_url;
}
if (imageUrlData) {
message.image_url = imageUrlData;
message.images = imageUrlData;
}
if (item.metadata) {
message.metadata = item.metadata;
}
return message;
});
console.log("从data字段获取到历史记录:", historyMessages.length);
} else if (result.list && Array.isArray(result.list)) {
historyMessages = result.list.map((item) => {
const message = {
role: item.sender_type === "customer" ? "user" : "ai",
content: item.message || item.content || "",
created_at: item.created_at || item.timestamp || new Date().toISOString()
};
if (item.message_type) {
message.message_type = item.message_type;
}
let imageUrlData = null;
if (item.image_url && Array.isArray(item.image_url)) {
imageUrlData = item.image_url;
} else if (item.images && Array.isArray(item.images)) {
imageUrlData = item.images;
} else if (item.metadata && item.metadata.image_url && Array.isArray(item.metadata.image_url)) {
imageUrlData = item.metadata.image_url;
}
if (imageUrlData) {
message.image_url = imageUrlData;
message.images = imageUrlData;
}
if (item.metadata) {
message.metadata = item.metadata;
}
return message;
});
console.log("从list字段获取到历史记录:", historyMessages.length);
}
if (page === 1) {
if (historyMessages.length > 0) {
messages.value = historyMessages;
console.log("第一页历史记录已加载,总共", historyMessages.length, "条消息");
} else {
console.log("没有历史记录");
messages.value = [];
}
const isFirstPageLastPage = !hasMore.value;
if (checkShouldShowQuickQuestions(isFirstPageLastPage)) {
addQuickQuestionsToFirstAIMessage(isFirstPageLastPage);
}
} else {
if (historyMessages.length > 0) {
setTimeout(() => {
messages.value.unshift(...historyMessages);
console.log(
"加载更多历史记录,新增",
historyMessages.length,
"条消息,总共",
messages.value.length,
"条"
);
}, 300);
}
}
const totalItems = result.total || result.count || result.total_count || 0;
hasMore.value = totalItems > messages.value.length;
currentPage.value = page;
if (page > 1 && !hasMore.value) {
console.log("分页加载完成,当前页:", page, "hasMore:", hasMore.value, "展示开场白");
setTimeout(() => {
addQuickQuestionsToFirstAIMessage(true);
}, 500);
}
console.log(
"第",
page,
"页数据加载完成offset:",
offset,
", limit:",
pageSize.value,
", 总数据:",
totalItems,
", 当前已加载:",
messages.value.length,
", 是否有更多:",
hasMore.value
);
if (page === 1) {
setTimeout(() => {
scrollToBottom();
}, 100);
console.log("[Customer] 历史记录加载完成开始建立WebSocket连接");
initWebSocket();
}
} else {
console.error("获取历史记录失败,状态码:", response.statusCode);
}
} catch (error) {
console.error("获取历史记录异常:", error);
} finally {
isLoadingHistory.value = false;
}
};
common_vendor.onPullDownRefresh(async () => {
if (isLoadingHistory.value || !hasMore.value) {
console.log("正在加载或没有更多数据");
common_vendor.index.stopPullDownRefresh();
return;
}
console.log("触发下拉分页,加载更多历史记录");
const nextPage = currentPage.value + 1;
try {
await getHistoryMessages(nextPage);
await new Promise((resolve) => setTimeout(resolve, 500));
} catch (error) {
console.error("加载历史记录失败:", error);
} finally {
common_vendor.index.stopPullDownRefresh();
}
});
const initWebSocket = () => {
if (socketTask) {
return;
}
try {
const wsUrl = `${WS_BASE_URL}/ws/socket.io/?EIO=4&transport=websocket`;
console.log("正在建立Socket.IO连接");
console.log("连接URL:", wsUrl);
socketTask = common_vendor.index.connectSocket({
url: wsUrl,
header: {
"content-type": "application/json"
}
});
common_vendor.index.onSocketOpen((res) => {
console.log("[Customer] WebSocket connected", res);
isConnected.value = true;
const connectPacket = '40/customer,{"jwt":""}';
common_vendor.index.sendSocketMessage({
data: connectPacket,
success: () => {
console.log("[Customer] Socket.IO连接包发送成功");
if (conversationId.value) {
setTimeout(() => {
const joinMessage = `42/customer,["join_conversation",{"conversation_id":"${conversationId.value}"}]`;
console.log("[Customer] 加入会话房间:", joinMessage);
common_vendor.index.sendSocketMessage({
data: joinMessage,
success: () => {
console.log("[Customer] 成功加入会话房间");
},
fail: (error) => {
console.error("[Customer] 加入会话房间失败:", error);
}
});
}, 200);
}
},
fail: (error) => {
console.error("[Customer] Socket.IO连接包发送失败:", error);
}
});
});
common_vendor.index.onSocketError((error) => {
console.error("[Customer] WebSocket error:", error);
isConnected.value = false;
socketTask = null;
});
common_vendor.index.onSocketClose((res) => {
console.log("[Customer] WebSocket disconnected", res);
isConnected.value = false;
socketTask = null;
});
common_vendor.index.onSocketMessage((res) => {
console.log("收到WebSocket原始消息:", res);
console.log("消息数据类型:", typeof res.data);
console.log("消息内容:", res.data);
const data = res.data;
if (typeof data === "string") {
if (data.startsWith("42/customer,")) {
const payload = data.substring("42/customer,".length);
try {
const parsedData = JSON.parse(payload);
console.log("解析Socket.IO事件:", parsedData);
handleSocketEvent(parsedData);
} catch (e) {
console.error("解析Socket.IO数据失败:", e, "原始数据:", payload);
}
} else if (data.startsWith("40/customer")) {
console.log("Socket.IO连接确认");
} else if (data.startsWith("2")) {
common_vendor.index.sendSocketMessage({
data: "3"
});
} else if (data.startsWith("0")) {
console.log("Socket.IO握手成功");
} else {
try {
const jsonData = JSON.parse(data);
console.log("解析JSON消息:", jsonData);
handleJsonMessage(jsonData);
} catch (e) {
console.log("非JSON格式的字符串消息:", data);
}
}
} else if (typeof data === "object") {
console.log("收到对象类型消息:", data);
handleObjectMessage(data);
} else {
console.log("收到其他类型消息,类型:", typeof data);
}
});
} catch (error) {
console.error("初始化Socket.IO异常:", error);
isConnected.value = false;
socketTask = null;
}
};
const handleSocketEvent = (parsedData) => {
if (Array.isArray(parsedData) && parsedData.length >= 2) {
const eventType = parsedData[0];
const eventData = parsedData[1];
console.log("[Customer] Socket.IO事件类型:", eventType, "事件数据:", eventData);
if (eventType === "new_message") {
processMessage(eventData);
} else if (eventType === "join_conversation_response") {
console.log("[Customer] Joined room:", eventData);
} else if (eventType === "message") {
processMessage(eventData);
} else if (eventType === "typing") {
processTypingIndicator(eventData);
} else {
console.log("[Customer] 未处理的Socket.IO事件类型:", eventType);
}
}
};
const handleJsonMessage = (jsonData) => {
console.log("[Customer] 处理JSON消息:", jsonData);
if (jsonData.type === "message" || jsonData.event === "new_message") {
processMessage(jsonData.data || jsonData);
} else if (jsonData.type === "typing" || jsonData.event === "typing") {
processTypingIndicator(jsonData.data || jsonData);
} else if (jsonData.message || jsonData.content) {
processMessage(jsonData);
} else {
console.log("[Customer] 未识别的JSON消息结构:", jsonData);
}
};
const handleObjectMessage = (objData) => {
console.log("[Customer] 处理对象消息:", objData);
if (objData.message || objData.content || objData.text) {
processMessage(objData);
} else if (objData.is_typing !== void 0) {
processTypingIndicator(objData);
} else {
console.log("[Customer] 未识别的对象消息结构:", objData);
}
};
const processTypingIndicator = (typingData) => {
console.log("[Customer] 处理typing指示器:", typingData);
if (typingData.is_typing && typingData.user_type === "staff") {
loading.value = true;
loadingText.value = "客服正在输入...";
} else {
loading.value = false;
}
};
const checkShouldShowQuickQuestions = (isLastPage = false) => {
if (quickQuestionsData.value.length === 0) {
return false;
}
if (messages.value.length === 0) {
return true;
}
if (isLastPage && messages.value.length > 0) {
return true;
}
return false;
};
const addQuickQuestionsToFirstAIMessage = (isLastPage = false) => {
if (quickQuestionsData.value.length === 0) {
return;
}
if (!checkShouldShowQuickQuestions(isLastPage)) {
return;
}
const existingWelcomeMessage = messages.value.find(
(msg) => msg.role === "ai" && msg.quickQuestions && msg.quickQuestions.length > 0
);
if (existingWelcomeMessage) {
console.log("[Customer] 开场白已存在,跳过添加");
return;
}
const welcomeMessage = {
role: "ai",
content: "您好!我是物业客服,有什么可以帮助您的吗?",
quickQuestions: quickQuestionsData.value,
created_at: new Date().toISOString()
};
console.log("[Customer] 创建开场白消息,是否最后一页:", isLastPage);
if (messages.value.length === 0) {
messages.value = [welcomeMessage];
console.log("[Customer] 设置开场白为第一条消息");
} else if (isLastPage) {
messages.value.unshift(welcomeMessage);
console.log("[Customer] 已加载到最后一页,在第一条消息前面插入开场白");
}
};
const processMessage = (messageData) => {
console.log("[Customer] 处理消息数据:", messageData);
if (messageData.sender_type === "customer" || messageData.role === "user") {
console.log("[Customer] 过滤掉客户消息");
return;
}
let messageContent = "";
if (typeof messageData === "string") {
messageContent = messageData;
} else {
messageContent = messageData.message || messageData.content || messageData.text || messageData.body || "收到回复";
}
if (typeof messageContent === "string") {
messageContent = messageContent.replace(/↵/g, "\n").replace(/\\n/g, "\n");
}
console.log("[Customer] 收到新消息内容:", messageContent);
if (messageContent === lastMessageContent.value) {
console.log("[Customer] 消息与HTTP返回的消息相同跳过显示");
lastMessageContent.value = "";
return;
}
loading.value = false;
const newMessage = {
role: "ai",
content: messageContent,
created_at: messageData.created_at || messageData.timestamp || messageData.time || new Date().toISOString()
};
if (messageData.suggested_questions && Array.isArray(messageData.suggested_questions) && messageData.suggested_questions.length > 0) {
newMessage.quickQuestions = messageData.suggested_questions;
} else if (messageData.quickQuestions && Array.isArray(messageData.quickQuestions) && messageData.quickQuestions.length > 0) {
newMessage.quickQuestions = messageData.quickQuestions;
}
if (messageData.need_confirmation !== void 0) {
newMessage.needConfirmation = messageData.need_confirmation;
}
if (messageData.confirmation_type !== void 0) {
newMessage.confirmationType = messageData.confirmation_type;
}
messages.value.push(newMessage);
scrollToBottom();
};
const handleQuickQuestion = (question) => {
inputMessage.value = question;
handleSendMessage();
};
2026-04-01 14:27:31 +08:00
const handleQuickAction = (action) => {
inputMessage.value = action.message;
handleSendMessage();
};
2026-04-01 11:19:46 +08:00
const handleConfirmation = (message, confirmation) => {
if (message.selectedConfirmation !== void 0) {
return;
}
message.selectedConfirmation = confirmation;
setTimeout(() => {
inputMessage.value = confirmation;
handleSendMessage();
}, 300);
};
const chooseImage = async () => {
const maxImages = 9;
if (selectedImages.value.length >= maxImages) {
common_vendor.index.showToast({
title: "最多选择9张图片",
icon: "none"
});
return;
}
try {
const remainingCount = maxImages - selectedImages.value.length;
const uploadResult = await common_libraries_upload.upload(remainingCount, 2, ["image"]);
if (uploadResult && Array.isArray(uploadResult) && uploadResult.length > 0) {
const imageUrls = uploadResult.map((item) => item.url);
selectedImages.value.push(...imageUrls);
common_vendor.index.showToast({
title: "图片上传成功",
icon: "success"
});
}
} catch (error) {
console.error("选择图片失败:", error);
common_vendor.index.showToast({
title: "选择图片失败",
icon: "none"
});
}
};
const removeImage = (index) => {
selectedImages.value.splice(index, 1);
};
const handleSendMessage = async () => {
var _a, _b, _c, _d, _e, _f;
const message = inputMessage.value.trim();
const hasImages = selectedImages.value.length > 0;
if (!message && !hasImages || loading.value)
return;
const userPhone = (_b = (_a = auth.data) == null ? void 0 : _a.user) == null ? void 0 : _b.phone;
const projectId = (_d = (_c = auth.data) == null ? void 0 : _c.selected_house) == null ? void 0 : _d.asset_projects_id;
const projectName = (_f = (_e = auth.data) == null ? void 0 : _e.selected_house) == null ? void 0 : _f.full_name;
if (!userPhone || !projectId) {
common_vendor.index.showToast({
title: "请先登录并绑定房屋",
icon: "none"
});
return;
}
if (!isConnected.value) {
initWebSocket();
await new Promise((resolve) => setTimeout(resolve, 1e3));
}
const uploadedImages = selectedImages.value;
let messageType = "text";
if (hasImages && message) {
messageType = "mixed";
} else if (hasImages && !message) {
messageType = "image";
}
const userMessage = {
role: "user",
content: message || "",
// 纯图片时传空字符串
created_at: new Date().toISOString(),
message_type: messageType,
image_url: uploadedImages.length > 0 ? uploadedImages : void 0,
images: uploadedImages.length > 0 ? uploadedImages : void 0
};
messages.value.push(userMessage);
inputMessage.value = "";
selectedImages.value = [];
scrollToBottom();
if (message && message.includes("查询")) {
loadingText.value = "正在查询中请稍后...";
} else {
loadingText.value = "正在输入中...";
}
loading.value = true;
try {
const response = await common_vendor.index.request({
url: `${API_BASE_URL}/api/public/chat`,
method: "POST",
data: {
platform: "property",
message: message || "",
// 纯图片时传空字符串
tenant_project_id: projectId,
tenant_project_name: projectName || "",
platform_user_id: userPhone,
conversation_id: conversationId.value,
message_type: messageType,
image_url: uploadedImages.length > 0 ? uploadedImages : void 0
},
header: {
"Content-Type": "application/json"
}
});
if (response.statusCode === 200) {
const result = response.data;
console.log("[Customer] HTTP接口响应数据:", result);
let httpReplyMessage = null;
let suggestedQuestions = [];
let needConfirmation = false;
let confirmationType = null;
if (result.reply && typeof result.reply === "string") {
httpReplyMessage = result.reply;
suggestedQuestions = result.suggested_questions || [];
needConfirmation = result.need_confirmation || false;
confirmationType = result.confirmation_type || null;
} else if (result.reply && result.reply.message) {
httpReplyMessage = result.reply.message;
suggestedQuestions = result.reply.suggested_questions || result.suggested_questions || [];
needConfirmation = result.reply.need_confirmation || result.need_confirmation || false;
confirmationType = result.reply.confirmation_type || result.confirmation_type || null;
} else if (result.reply && result.reply.content) {
httpReplyMessage = result.reply.content;
suggestedQuestions = result.reply.suggested_questions || result.suggested_questions || [];
needConfirmation = result.reply.need_confirmation || result.need_confirmation || false;
confirmationType = result.reply.confirmation_type || result.confirmation_type || null;
} else if (result.message) {
httpReplyMessage = result.message;
suggestedQuestions = result.suggested_questions || [];
needConfirmation = result.need_confirmation || false;
confirmationType = result.confirmation_type || null;
} else if (result.content) {
httpReplyMessage = result.content;
suggestedQuestions = result.suggested_questions || [];
needConfirmation = result.need_confirmation || false;
confirmationType = result.confirmation_type || null;
} else if (result.answer) {
httpReplyMessage = result.answer;
suggestedQuestions = result.suggested_questions || [];
needConfirmation = result.need_confirmation || false;
confirmationType = result.confirmation_type || null;
} else if (result.response) {
httpReplyMessage = result.response;
suggestedQuestions = result.suggested_questions || [];
needConfirmation = result.need_confirmation || false;
confirmationType = result.confirmation_type || null;
} else if (typeof result === "string") {
httpReplyMessage = result;
}
if (httpReplyMessage) {
console.log("[Customer] HTTP接口返回回答消息:", httpReplyMessage);
console.log("[Customer] 建议问题:", suggestedQuestions);
console.log("[Customer] 需要确认:", needConfirmation, "确认类型:", confirmationType);
let formattedMessage = httpReplyMessage;
if (typeof formattedMessage === "string") {
formattedMessage = formattedMessage.replace(/↵/g, "\n").replace(/\\n/g, "\n");
}
lastMessageContent.value = formattedMessage;
loading.value = false;
messages.value.push({
role: "ai",
content: formattedMessage,
created_at: new Date().toISOString(),
quickQuestions: suggestedQuestions.length > 0 ? suggestedQuestions : void 0,
needConfirmation,
confirmationType
});
scrollToBottom();
} else {
console.log("[Customer] 消息发送成功等待WebSocket回复");
}
} else {
throw new Error("请求失败");
}
} catch (error) {
console.error("发送消息失败:", error);
common_vendor.index.showToast({
title: "发送失败,请稍后重试",
icon: "none"
});
messages.value.push({
role: "ai",
content: "抱歉,网络连接出现问题,请稍后再试。"
});
loading.value = false;
scrollToBottom();
}
};
common_vendor.onUnmounted(() => {
if (socketTask || isConnected.value) {
common_vendor.index.closeSocket();
socketTask = null;
isConnected.value = false;
console.log("页面卸载WebSocket连接已关闭");
}
});
2026-04-01 14:27:31 +08:00
common_vendor.onLoad(async (op) => {
2026-04-01 11:19:46 +08:00
quickQuestionsData.value = await getQuickQuestions();
console.log("页面加载时已获取开场白按钮数据:", quickQuestionsData.value.length);
getHistoryMessages(1);
2026-04-01 14:27:31 +08:00
if (op == null ? void 0 : op.message) {
handleQuickAction(op);
}
2026-04-01 11:19:46 +08:00
});
return (_ctx, _cache) => {
return common_vendor.e({
a: common_vendor.f(messages.value, (message, index, i0) => {
return common_vendor.e({
a: message.role === "ai"
}, message.role === "ai" ? {} : {}, {
b: message.image_url && message.image_url.length > 0
}, message.image_url && message.image_url.length > 0 ? {
c: common_vendor.f(message.image_url, (image, imgIndex, i1) => {
return {
a: image,
b: common_vendor.o(($event) => previewImage(image, message.image_url), imgIndex),
c: imgIndex
};
}),
d: message.image_url.length === 1 ? "widthFix" : "aspectFill",
e: message.image_url.length === 1 ? 1 : ""
} : message.images && message.images.length > 0 ? {
g: common_vendor.f(message.images, (image, imgIndex, i1) => {
return {
a: image,
b: common_vendor.o(($event) => previewImage(image, message.images), imgIndex),
c: imgIndex
};
}),
h: message.images.length === 1 ? "widthFix" : "aspectFill",
i: message.images.length === 1 ? 1 : ""
} : message.metadata && message.metadata.image_url && message.metadata.image_url.length > 0 ? {
k: common_vendor.f(message.metadata.image_url, (image, imgIndex, i1) => {
return {
a: image,
b: common_vendor.o(($event) => previewImage(image, message.metadata.image_url), imgIndex),
c: imgIndex
};
}),
l: message.metadata.image_url.length === 1 ? "widthFix" : "aspectFill",
m: message.metadata.image_url.length === 1 ? 1 : ""
} : {}, {
f: message.images && message.images.length > 0,
j: message.metadata && message.metadata.image_url && message.metadata.image_url.length > 0,
n: message.content && message.content.trim()
}, message.content && message.content.trim() ? {
o: common_vendor.f(formatMessageContent(message.content), (line, lineIndex, i1) => {
return {
a: common_vendor.t(line),
b: "text-" + lineIndex
};
})
} : {}, {
p: message.quickQuestions && message.quickQuestions.length > 0
}, message.quickQuestions && message.quickQuestions.length > 0 ? {
q: common_vendor.f(message.quickQuestions, (question, qIndex, i1) => {
return {
a: common_vendor.t(question),
b: qIndex,
c: common_vendor.o(($event) => handleQuickQuestion(question), qIndex)
};
})
} : {}, {
r: message.needConfirmation
}, message.needConfirmation ? {
s: message.selectedConfirmation === "是" ? 1 : "",
t: message.selectedConfirmation !== void 0 ? 1 : "",
v: common_vendor.o(($event) => handleConfirmation(message, "是"), index),
w: message.selectedConfirmation === "否" ? 1 : "",
x: message.selectedConfirmation !== void 0 ? 1 : "",
y: common_vendor.o(($event) => handleConfirmation(message, "否"), index)
} : {}, {
z: message.created_at && !message.quickQuestions
}, message.created_at && !message.quickQuestions ? common_vendor.e({
A: message.role === "ai"
}, message.role === "ai" ? {
B: common_vendor.o(($event) => copyMessage(message.content), index)
} : {}, {
C: common_vendor.t(formatTime(message.created_at)),
D: message.role === "user"
}, message.role === "user" ? {
E: common_vendor.o(($event) => copyMessage(message.content), index)
} : {}) : {}, {
F: index,
G: `msg-${index}`,
H: common_vendor.n(message.role === "user" ? "user-message" : "ai-message")
});
}),
b: loading.value
}, loading.value ? {
c: common_vendor.t(loadingText.value)
} : {}, {
d: selectedImages.value.length > 0
}, selectedImages.value.length > 0 ? common_vendor.e({
e: common_vendor.f(selectedImages.value, (image, index, i0) => {
return {
a: image,
b: "b15798f7-0-" + i0,
c: common_vendor.o(($event) => removeImage(index), index),
d: index
};
}),
f: common_vendor.p({
type: "closeempty",
size: "14",
color: "#fff"
}),
g: selectedImages.value.length < 9
}, selectedImages.value.length < 9 ? {
h: common_vendor.p({
type: "plus",
size: "30",
color: "#999"
}),
i: common_vendor.o(chooseImage)
} : {}) : {}, {
2026-04-01 14:27:31 +08:00
j: common_vendor.f(common_vendor.unref(common_libraries_public.quickActions), (action, index, i0) => {
return {
a: common_vendor.t(action.label),
b: index,
c: common_vendor.o(($event) => handleQuickAction(action), index)
};
}),
k: common_vendor.o(($event) => isInputFocused.value = true),
l: common_vendor.o(($event) => isInputFocused.value = false),
m: common_vendor.o(handleSendMessage),
n: inputMessage.value,
o: common_vendor.o(($event) => inputMessage.value = $event.detail.value),
p: !inputMessage.value.trim() && !isInputFocused.value && selectedImages.value.length === 0
2026-04-01 11:19:46 +08:00
}, !inputMessage.value.trim() && !isInputFocused.value && selectedImages.value.length === 0 ? {
2026-04-01 14:27:31 +08:00
q: common_vendor.p({
2026-04-01 11:19:46 +08:00
type: "camera",
size: "24",
color: "#666"
}),
2026-04-01 14:27:31 +08:00
r: common_vendor.o(chooseImage)
2026-04-01 11:19:46 +08:00
} : {}, {
2026-04-01 14:27:31 +08:00
s: (inputMessage.value.trim() || isInputFocused.value || selectedImages.value.length > 0) && !loading.value
2026-04-01 11:19:46 +08:00
}, (inputMessage.value.trim() || isInputFocused.value || selectedImages.value.length > 0) && !loading.value ? {
2026-04-01 14:27:31 +08:00
t: common_vendor.p({
2026-04-01 11:19:46 +08:00
type: "paperplane-filled",
size: "20",
color: "#fff"
}),
2026-04-01 14:27:31 +08:00
v: common_vendor.o(handleSendMessage)
2026-04-01 11:19:46 +08:00
} : {}, {
2026-04-01 14:27:31 +08:00
w: loading.value
2026-04-01 11:19:46 +08:00
}, loading.value ? {
2026-04-01 14:27:31 +08:00
x: common_vendor.p({
2026-04-01 11:19:46 +08:00
type: "spinner-cycle",
size: "20",
color: "#ccc"
})
} : {});
};
}
});
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-b15798f7"], ["__file", "/Users/zsq/Sources/github/2025property-pay/pay-customer/src/pages/ai/chat.vue"]]);
wx.createPage(MiniProgramPage);