535 lines
15 KiB
JavaScript
535 lines
15 KiB
JavaScript
// pages/chat/chat.js
|
||
import {
|
||
goto_camera,
|
||
} from '../../utils.js'
|
||
|
||
const app = getApp();
|
||
|
||
Page({
|
||
|
||
/**
|
||
* Page initial data
|
||
*/
|
||
data: {
|
||
show_modal: '',
|
||
prompt: [],
|
||
response: [],
|
||
messages: [], // Store chat history
|
||
currentMessage: '', // Current input
|
||
isLoading: false, // Loading state
|
||
sessionId: null, // Session ID for chat
|
||
welcome_response: [
|
||
{
|
||
type: 'text',
|
||
content: '欢迎使用徵象AI客服!我是您的智能防伪验证助手,可以帮您解答关于产品验证、防伪技术等问题。'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '您可以向我提问任何关于产品验证、防伪技术的问题,或者点击下方按钮开启AI验证。'
|
||
},
|
||
],
|
||
prompt_message_verify_result: [
|
||
{
|
||
type: 'text',
|
||
content: '查看验证结果'
|
||
},
|
||
],
|
||
},
|
||
|
||
/**
|
||
* Lifecycle function--Called when page load
|
||
*/
|
||
onLoad(options) {
|
||
this.setData({
|
||
serial_code: options.serial_code,
|
||
verify_time: options.time || new Date().toLocaleString(),
|
||
sessionId: this.generateSessionId(),
|
||
});
|
||
|
||
// Add welcome message to chat history
|
||
this.addMessageToHistory('assistant', '欢迎使用徵象AI客服!我是您的智能防伪验证助手,可以帮您解答关于产品验证、防伪技术等问题。请随时向我提问!');
|
||
|
||
if (options.serial_code) {
|
||
this.show_verify_result(true);
|
||
} else {
|
||
this.show_welcome_response();
|
||
}
|
||
},
|
||
|
||
/**
|
||
* Lifecycle function--Called when page is initially rendered
|
||
*/
|
||
onReady() {
|
||
|
||
},
|
||
|
||
/**
|
||
* Lifecycle function--Called when page show
|
||
*/
|
||
onShow() {
|
||
|
||
},
|
||
|
||
/**
|
||
* Lifecycle function--Called when page hide
|
||
*/
|
||
onHide() {
|
||
|
||
},
|
||
|
||
/**
|
||
* Lifecycle function--Called when page unload
|
||
*/
|
||
onUnload() {
|
||
|
||
},
|
||
|
||
/**
|
||
* Page event handler function--Called when user drop down
|
||
*/
|
||
onPullDownRefresh() {
|
||
|
||
},
|
||
|
||
/**
|
||
* Called when page reach bottom
|
||
*/
|
||
onReachBottom() {
|
||
|
||
},
|
||
|
||
/**
|
||
* Called when user click on the top right corner to share
|
||
*/
|
||
onShareAppMessage() {
|
||
|
||
},
|
||
|
||
goto_camera() {
|
||
goto_camera(true, "ai_chat_mode=1");
|
||
},
|
||
|
||
show_service() {
|
||
this.setData({
|
||
show_modal: 'service',
|
||
})
|
||
},
|
||
|
||
show_channel() {
|
||
this.setData({
|
||
show_modal: 'channel',
|
||
})
|
||
},
|
||
hide_modal() {
|
||
console.log('hide_modal');
|
||
this.setData({
|
||
show_modal: '',
|
||
})
|
||
},
|
||
show_verify_tech() {
|
||
this.set_content({
|
||
prompt: [
|
||
{
|
||
type: 'text',
|
||
content: '这个验证结果可信吗?'
|
||
},
|
||
],
|
||
response: [
|
||
{
|
||
type: 'text',
|
||
content: '本次验证使用「Al图像识别+微米级特征对比」T4.2.2模型',
|
||
classes: 'margin-bottom-10',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '更新时间:2025年2月27日',
|
||
classes: 'secondary',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '1.微观特征捕捉:系统以0.1mm精度扫描二维码的30+项微观特征'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '2.加密特征匹配:比对云端预存的特征图像代码,误差率万分之一'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '若对验证结果有疑虑,可通过人工客服通道咨询'
|
||
},
|
||
{
|
||
type: 'splitline',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '你可能会问:'
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '重看验证结果',
|
||
onclick: () => {
|
||
this.show_verify_result(false);
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '这个产品怎么样?',
|
||
onclick: () => {
|
||
this.show_product_details();
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '有什么福利活动吗?',
|
||
onclick: () => {
|
||
this.show_promotions();
|
||
}
|
||
}
|
||
]
|
||
})
|
||
},
|
||
show_verify_result(is_first_time) {
|
||
var serial_code = this.data.serial_code || "";
|
||
var resp = [
|
||
{
|
||
type: 'text',
|
||
content: '正在生成您的专属验真档案...'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '验真结论:',
|
||
classes: 'margin-bottom-10',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '正品认证通过!',
|
||
mark: 'tick',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '经系统比对,您扫描的【徵象AI体验码】产品二维码为官方认证正品,可放心使用。'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '验证编码: ' + serial_code,
|
||
classes: 'margin-bottom-10 link',
|
||
onclick: () => {
|
||
wx.navigateTo({
|
||
url: '/pages/productinfo/productinfo?serial_code=' + serial_code,
|
||
});
|
||
}
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '验证时间: ' + this.data.verify_time,
|
||
},
|
||
{
|
||
type: 'splitline',
|
||
},
|
||
{
|
||
type: 'text',
|
||
classes: 'secondary',
|
||
content: '你可能会问:'
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '这个验证结果可信吗?',
|
||
onclick: () => {
|
||
this.show_verify_tech();
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '这个产品怎么样?',
|
||
onclick: () => {
|
||
this.show_product_details();
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '有什么福利活动吗?',
|
||
onclick: () => {
|
||
this.show_promotions();
|
||
}
|
||
},
|
||
]
|
||
var prompt = is_first_time ? [] : [{
|
||
type: 'text',
|
||
content: '查看验证结果'
|
||
}];
|
||
this.set_content({
|
||
prompt: prompt,
|
||
response: resp,
|
||
})
|
||
},
|
||
show_welcome_response() {
|
||
this.set_content({
|
||
prompt: [],
|
||
response: this.data.welcome_response,
|
||
})
|
||
},
|
||
show_product_details() {
|
||
var resp = [
|
||
{
|
||
type: 'text',
|
||
content: '微象AI是由「广州市诚投科技有限公司」开发的AI驱动的智能防伪平台。'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '通过「多模态特征识别」构建新一代防伪验证体系,实现从物理防伪到数字认证的全链路保护。系统采用ISO 12931国际防伪标准,已获取国家发明专利(证书编号:CN 115222000 B)。'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '应用场景',
|
||
classes: 'margin-bottom-10 bold',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '1.商品防伪',
|
||
classes: 'margin-bottom-10 bold',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '2.证件安全验证',
|
||
classes: 'margin-bottom-10 bold',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '3.工业品防伪',
|
||
classes: 'bold',
|
||
},
|
||
{
|
||
type: 'splitline',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '你可能会问:',
|
||
classes: 'secondary',
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '重看验证结果',
|
||
onclick: () => {
|
||
this.show_verify_result(false);
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '这个验证结果可信吗?',
|
||
onclick: () => {
|
||
this.show_verify_tech();
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '有什么福利活动吗?',
|
||
onclick: () => {
|
||
this.show_promotions();
|
||
}
|
||
}
|
||
]
|
||
this.set_content({
|
||
prompt: [{
|
||
type: 'text',
|
||
content: '这个产品怎么样'
|
||
}],
|
||
response: resp,
|
||
})
|
||
},
|
||
show_promotions() {
|
||
var resp = [
|
||
{
|
||
type: 'text',
|
||
content: '感谢您选择正品!为保障权益,建议:'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '·关注品牌公众号',
|
||
classes: 'margin-bottom-10',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '·定期访问「会员中心」查看产品溯源信息',
|
||
classes: 'margin-bottom-10',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '·参与【正品守护计划】赢取专属福利'
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '若发现异常验证结果,请立即通过官方客服通道举报'
|
||
},
|
||
{
|
||
type: 'splitline',
|
||
},
|
||
{
|
||
type: 'text',
|
||
content: '你可能会问:',
|
||
classes: 'secondary',
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '重看验证结果',
|
||
onclick: () => {
|
||
this.show_verify_result(false);
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '这个产品怎么样?',
|
||
onclick: () => {
|
||
this.show_product_details();
|
||
}
|
||
},
|
||
{
|
||
type: 'suggestion',
|
||
title: '这个验证结果可信吗?',
|
||
onclick: () => {
|
||
this.show_verify_tech();
|
||
}
|
||
}
|
||
]
|
||
this.set_content({
|
||
prompt: [{
|
||
type: 'text',
|
||
content: '有什么福利活动吗?'
|
||
}],
|
||
response: resp,
|
||
})
|
||
},
|
||
set_content({prompt, response}) {
|
||
this.setData({
|
||
prompt: prompt,
|
||
response: response,
|
||
})
|
||
this.selectComponent('#response').restart_content_output();
|
||
var x = this.selectComponent('#prompt');
|
||
if (x) {
|
||
x.restart_content_output();
|
||
}
|
||
},
|
||
|
||
// New methods for AI chat integration
|
||
generateSessionId() {
|
||
return 'session_' + Date.now() + '_' + Math.random().toString(36).substring(2, 11);
|
||
},
|
||
|
||
addMessageToHistory(role, content) {
|
||
const messages = this.data.messages;
|
||
messages.push({
|
||
role: role,
|
||
content: content,
|
||
timestamp: new Date(),
|
||
});
|
||
this.setData({
|
||
messages: messages,
|
||
});
|
||
},
|
||
|
||
onInputChange(e) {
|
||
this.setData({
|
||
currentMessage: e.detail.value,
|
||
});
|
||
},
|
||
|
||
async sendMessage() {
|
||
const message = this.data.currentMessage.trim();
|
||
if (!message || this.data.isLoading) {
|
||
return;
|
||
}
|
||
|
||
// Clear input
|
||
this.setData({
|
||
currentMessage: '',
|
||
isLoading: true,
|
||
});
|
||
|
||
// Add user message to history
|
||
this.addMessageToHistory('user', message);
|
||
|
||
// Show user message in UI
|
||
this.set_content({
|
||
prompt: [{
|
||
type: 'text',
|
||
content: message,
|
||
}],
|
||
response: [{
|
||
type: 'text',
|
||
content: '正在思考中...',
|
||
}],
|
||
});
|
||
|
||
try {
|
||
// Call AI chat API
|
||
const response = await this.callAIChatAPI(message);
|
||
|
||
// Add AI response to history
|
||
this.addMessageToHistory('assistant', response);
|
||
|
||
// Show AI response in UI
|
||
this.set_content({
|
||
prompt: [{
|
||
type: 'text',
|
||
content: message,
|
||
}],
|
||
response: [{
|
||
type: 'text',
|
||
content: response,
|
||
}],
|
||
});
|
||
} catch (error) {
|
||
console.error('AI Chat Error:', error);
|
||
const errorMessage = '抱歉,我遇到了一些技术问题。请稍后再试,或联系技术支持。';
|
||
this.addMessageToHistory('assistant', errorMessage);
|
||
|
||
this.set_content({
|
||
prompt: [{
|
||
type: 'text',
|
||
content: message,
|
||
}],
|
||
response: [{
|
||
type: 'text',
|
||
content: errorMessage,
|
||
}],
|
||
});
|
||
} finally {
|
||
this.setData({
|
||
isLoading: false,
|
||
});
|
||
}
|
||
},
|
||
|
||
callAIChatAPI(message) {
|
||
return new Promise((resolve, reject) => {
|
||
wx.request({
|
||
url: app.globalData.server_url + '/api/v1/ai-chat/',
|
||
method: 'POST',
|
||
data: {
|
||
message: message,
|
||
session_id: this.data.sessionId,
|
||
chat_type: 'platform',
|
||
},
|
||
header: {
|
||
'content-type': 'application/json',
|
||
},
|
||
success: (res) => {
|
||
if (res.statusCode === 200 && res.data.response) {
|
||
// Update session ID if provided
|
||
if (res.data.session_id) {
|
||
this.setData({
|
||
sessionId: res.data.session_id,
|
||
});
|
||
}
|
||
resolve(res.data.response);
|
||
} else {
|
||
reject(new Error(res.data.error || 'Unknown error'));
|
||
}
|
||
},
|
||
fail: (error) => {
|
||
reject(error);
|
||
}
|
||
});
|
||
});
|
||
},
|
||
}) |