From 9c3e5145609ce288fe7ca42e1d63cc40f36bc7f1 Mon Sep 17 00:00:00 2001 From: lik Date: Mon, 14 Sep 2026 09:35:39 +0800 Subject: [PATCH] tmp --- pages/ai/index.js | 40 +++++++++++++++++++++++++++++++++++++--- pages/ai/index.wxml | 12 +++++++++++- pages/ai/index.wxss | 29 +++++++++++++++++++++++++++++ utils/api.js | 12 ++++++------ 4 files changed, 83 insertions(+), 10 deletions(-) diff --git a/pages/ai/index.js b/pages/ai/index.js index a26cc59..7757658 100644 --- a/pages/ai/index.js +++ b/pages/ai/index.js @@ -6,6 +6,7 @@ Page({ inputValue: '', isTyping: false, scrollToMessage: '', + expandedIds: {}, quickQuestions: [ '今日待处理订单有哪些?', '最近客户反馈统计', @@ -17,6 +18,13 @@ Page({ messageIdCounter: 0, socket: null, + // 生成消息 id:保证计数器始终为数字,避免出现 msg_NaN + genId() { + const n = Number(this.messageIdCounter) + this.messageIdCounter = Number.isFinite(n) ? n + 1 : 1 + return `msg_${this.messageIdCounter}` + }, + onLoad() { this.loadChatHistory() this.initSocket() @@ -66,13 +74,18 @@ Page({ lastMessage.content += data.content || '' messages = this.data.messages } + if (lastMessage.type === 'ai' && data.source == "subagent" && lastMessage.source == data.source) { + lastMessage.content += '' + data.content || '' + messages = this.data.messages + } } if (!messages) { const aiResponse = { - id: `msg_${++this.messageIdCounter}`, + id: this.genId(), _serverId: data.id, type: 'ai', + source: data.source, contentType: 'text', content: data.content || '', time: this.formatTime(new Date()) @@ -97,6 +110,19 @@ Page({ try { const history = wx.getStorageSync('admin_ai_chat_history') if (history && history.length > 0) { + // 清洗历史中的无效/重复 id(如 msg_NaN),并把计数器拨到最大 id 之后 + let max = 0 + const seen = new Set() + history.forEach((m, i) => { + const n = parseInt(String(m.id).slice(4), 10) + if (Number.isFinite(n) && !seen.has(n)) { + seen.add(n) + if (n > max) max = n + } else { + m.id = `msg_h${Date.now()}_${i}` + } + }) + this.messageIdCounter = max this.setData({ messages: history }) this.scrollToBottom() } @@ -132,7 +158,7 @@ Page({ if (!content) return const userMessage = { - id: `msg_${++this.messageIdCounter}`, + id: this.genId(), type: 'user', contentType: 'text', content: content, @@ -187,7 +213,7 @@ Page({ handleAIError(errorMessage) { const errorResponse = { - id: `msg_${++this.messageIdCounter}`, + id: this.genId(), type: 'ai', contentType: 'text', content: errorMessage, @@ -203,6 +229,14 @@ Page({ this.scrollToBottom() }, + // 展开/折叠 subagent 消息(默认折叠,key 不存在即为折叠态) + toggleSubagent(e) { + const id = e.currentTarget.dataset.id + this.setData({ + [`expandedIds.${id}`]: !this.data.expandedIds[id] + }) + }, + scrollToBottom() { setTimeout(() => { const lastMessage = this.data.messages[this.data.messages.length - 1] diff --git a/pages/ai/index.wxml b/pages/ai/index.wxml index 428c302..9a487a8 100644 --- a/pages/ai/index.wxml +++ b/pages/ai/index.wxml @@ -15,8 +15,18 @@ + + + + 思考中... + + + + + + diff --git a/pages/ai/index.wxss b/pages/ai/index.wxss index 0dc800f..a69308b 100644 --- a/pages/ai/index.wxss +++ b/pages/ai/index.wxss @@ -230,6 +230,35 @@ page { word-break: break-all; } +/* subagent 引用卡片(默认折叠) */ +.subagent-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 4rpx 0; +} + +.subagent-label { + font-size: 24rpx; + color: #6b7280; +} + +.subagent-arrow { + font-size: 24rpx; + color: #9ca3af; + transition: transform 0.2s ease; +} + +.subagent-arrow.expanded { + transform: rotate(90deg); +} + +.subagent-body { + margin-top: 12rpx; + padding-top: 12rpx; + border-top: 1rpx solid #e5e7eb; +} + .typing-indicator { display: flex; flex-direction: column; diff --git a/utils/api.js b/utils/api.js index d2e3960..8229222 100644 --- a/utils/api.js +++ b/utils/api.js @@ -2,12 +2,12 @@ const request = require('./request.js') const API = { user: { - wxGetPhoneNumber: (data) => request.post('/user/wxgetphonenumber', data), - wxSignin: (data) => request.post('/user/wxsignin', data, { skipAuthWait: true }), - signout: (data) => request.post('/user/signout', data), - update: (data) => request.post('/user/update', data), - userInfo: (data) => request.post('/user/userInfo', data), - userList: (data) => request.post('/user/list', data), + wxGetPhoneNumber: (data) => request.post('https://api.huashengtec.com/user/wxgetphonenumber', data), + wxSignin: (data) => request.post('https://api.huashengtec.com/user/wxsignin', data, { skipAuthWait: true }), + signout: (data) => request.post('https://api.huashengtec.com/user/signout', data), + update: (data) => request.post('https://api.huashengtec.com/user/update', data), + userInfo: (data) => request.post('https://api.huashengtec.com/user/userInfo', data), + userList: (data) => request.post('https://api.huashengtec.com/user/list', data), }, escort: {