diff --git a/App.vue b/App.vue
index 91187f2..80b7750 100644
--- a/App.vue
+++ b/App.vue
@@ -198,7 +198,8 @@
this.urlPathMap = {
'pages/furniture_customer/furniture_customer': '/customer',
'pages/furniture_reception/furniture_reception': '/reception',
- 'pages/furniture_top_sales/furniture_top_sales': '/top-sales',
+ 'pages/ai_qa/ai_qa': '/ai-qa',
+ 'pages/ai_analysis/ai_analysis': '/ai-analysis',
'pages/ucenter/ucenter': '/profile'
};
diff --git a/custom-tab-bar/index.js b/custom-tab-bar/index.js
index 103b334..fe90a1c 100644
--- a/custom-tab-bar/index.js
+++ b/custom-tab-bar/index.js
@@ -61,6 +61,20 @@ Component({
iconPath: '/static/tabbar/customer.png',
selectedIconPath: '/static/tabbar/customer_active.png',
},
+ {
+ key: 'ai_qa',
+ text: 'AI问答',
+ pagePath: 'pages/ai_qa/ai_qa',
+ iconPath: '/static/tabbar/expression.png',
+ selectedIconPath: '/static/tabbar/expression_active.png',
+ },
+ {
+ key: 'ai_analysis',
+ text: 'AI分析',
+ pagePath: 'pages/ai_analysis/ai_analysis',
+ iconPath: '/static/tabbar/ai_analysis.png',
+ selectedIconPath: '/static/tabbar/ai_analysis_active.png',
+ },
{
key: 'furniture_top_sales',
text: '销冠',
@@ -276,6 +290,8 @@ Component({
'furniture_reception': 'pages/furniture_reception/furniture_reception',
'common_begin_reception': 'pages/furniture_reception/common_begin_reception',
'furniture_customer': 'pages/furniture_customer/furniture_customer',
+ 'ai_qa': 'pages/ai_qa/ai_qa',
+ 'ai_analysis': 'pages/ai_analysis/ai_analysis',
'furniture_top_sales': 'pages/furniture_top_sales/furniture_top_sales'
};
@@ -503,7 +519,7 @@ Component({
const hasFurnitureRole = roles.includes('furniture');
if (isAdminFurniture || hasFurnitureRole) {
- const furnitureTabs = ['furniture_reception', 'furniture_customer', 'furniture_top_sales', 'ucenter'];
+ const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ai_qa', 'ai_analysis', 'ucenter'];
console.log('[TabBar][allowed] furniture/admin_furniture role ->', furnitureTabs);
return furnitureTabs;
}
@@ -517,7 +533,7 @@ Component({
if (isAdmin) {
const all = this.data.allTabs
.map((t) => t.key)
- .filter((key) => !meetingTabKeys.includes(key) && !['furniture_reception', 'common_begin_reception', 'furniture_customer', 'furniture_top_sales', 'reception', 'customer', ...removedTabKeys].includes(key));
+ .filter((key) => !meetingTabKeys.includes(key) && !['furniture_reception', 'common_begin_reception', 'furniture_customer', 'ai_qa', 'ai_analysis', 'furniture_top_sales', 'reception', 'customer', ...removedTabKeys].includes(key));
console.log('[TabBar][allowed] admin ->', all);
return all;
}
@@ -536,7 +552,7 @@ Component({
const otherTabs = this.data.allTabs
.map((t) => t.key)
- .filter((key) => !['homework', 'edu', 'voice', 'expression', 'furniture_reception', 'common_begin_reception', 'furniture_customer', 'furniture_top_sales', 'reception', 'customer', ...meetingTabKeys, ...removedTabKeys].includes(key));
+ .filter((key) => !['homework', 'edu', 'voice', 'expression', 'furniture_reception', 'common_begin_reception', 'furniture_customer', 'ai_qa', 'ai_analysis', 'furniture_top_sales', 'reception', 'customer', ...meetingTabKeys, ...removedTabKeys].includes(key));
if (!otherTabs.includes('ucenter')) {
otherTabs.push('ucenter');
}
diff --git a/custom-tab-bar/index.vue b/custom-tab-bar/index.vue
index 7d8ea51..86546e4 100644
--- a/custom-tab-bar/index.vue
+++ b/custom-tab-bar/index.vue
@@ -77,6 +77,13 @@ export default {
iconPath: '/static/tabbar/me.png',
selectedIconPath: '/static/tabbar/me_active.png',
},
+ {
+ key: 'ai_qa',
+ text: 'AI问答',
+ pagePath: '/pages/ai_qa/ai_qa',
+ iconPath: '/static/tabbar/expression.png',
+ selectedIconPath: '/static/tabbar/expression_active.png',
+ },
{
key: 'ai_analysis',
text: 'AI分析',
@@ -112,10 +119,17 @@ export default {
iconPath: '/static/tabbar/customer.png',
selectedIconPath: '/static/tabbar/customer_active.png',
},
+ {
+ key: 'ai_qa',
+ text: 'AI问答',
+ pagePath: 'pages/ai_qa/ai_qa',
+ iconPath: '/static/tabbar/expression.png',
+ selectedIconPath: '/static/tabbar/expression_active.png',
+ },
{
key: 'ai_analysis',
text: 'AI分析',
- pagePath: 'pages/ai_analysis/ai_analysis', // 移除开头的/
+ pagePath: 'pages/ai_analysis/ai_analysis',
iconPath: '/static/tabbar/ai_analysis.png',
selectedIconPath: '/static/tabbar/ai_analysis_active.png',
},
@@ -134,7 +148,7 @@ export default {
console.log('VISIBLE TABS CALC - THIS MUST SHOW IN H5');
// 简化逻辑:直接返回家具相关的tabs,跳过权限检查
- const furnitureKeys = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
+ const furnitureKeys = ['furniture_reception', 'furniture_customer', 'ai_qa', 'ai_analysis', 'ucenter'];
const result = furnitureKeys.map(key => {
return this.allTabs.find(tab => tab.key === key);
}).filter(Boolean);
@@ -289,15 +303,15 @@ export default {
console.log('GET ALLOWED KEYS - 简化版本,总是返回家具相关tabs');
// 简化逻辑:总是返回家具相关的tabs
- const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
+ const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ai_qa', 'ai_analysis', 'ucenter'];
console.log('[TabBar][allowed] 简化逻辑 ->', furnitureTabs);
return furnitureTabs;
},
// #ifdef H5
toggleNativeTabs() {
// H5 平台自定义 tabbar 不生效,直接根据角色显隐原生 tabbar 项
- // 当前位置顺序(根据 pages.json 中的 tabBar.list 顺序):接待、客户、AI分析、我的、团队、总结和统计、家具接待、开始接待、家具客户
- const ORDER = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
+ // 当前位置顺序(根据 pages.json 中的 tabBar.list 顺序):接待、客户、AI问答、AI分析、我的、团队、总结和统计…
+ const ORDER = ['furniture_reception', 'furniture_customer', 'ai_qa', 'ai_analysis', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
const allowed = this.getAllowedKeys();
// 限制重试次数,防止渲染时机未就绪
this._h5TabRetries = (this._h5TabRetries || 0) + 1;
@@ -328,6 +342,7 @@ export default {
const tabBarList = [
'pages/furniture_reception/furniture_reception',
'pages/furniture_customer/furniture_customer',
+ 'pages/ai_qa/ai_qa',
'pages/ai_analysis/ai_analysis',
'pages/ucenter/ucenter'
];
@@ -369,6 +384,7 @@ export default {
el.textContent && (
el.textContent.includes('接待') ||
el.textContent.includes('客户') ||
+ el.textContent.includes('AI问答') ||
el.textContent.includes('AI分析') ||
el.textContent.includes('我的')
)
@@ -406,9 +422,9 @@ export default {
return;
}
- // 按文本内容排序:接待、客户、AI分析、我的
+ // 按文本内容排序:接待、客户、AI问答、AI分析、我的
const sortedElements = tabElements.sort((a, b) => {
- const order = ['接待', '客户', 'AI分析', '我的'];
+ const order = ['接待', '客户', 'AI问答', 'AI分析', '我的'];
const aIndex = order.findIndex(text => a.textContent.includes(text));
const bIndex = order.findIndex(text => b.textContent.includes(text));
return aIndex - bIndex;
@@ -418,7 +434,7 @@ export default {
// 处理每个元素
sortedElements.forEach((element, index) => {
- const keyMap = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
+ const keyMap = ['furniture_reception', 'furniture_customer', 'ai_qa', 'ai_analysis', 'ucenter'];
const key = keyMap[index];
const shouldShow = allowed.includes(key);
diff --git a/pages-subpackage/ai_qa/after_sales_qa/after_sales_qa.vue b/pages-subpackage/ai_qa/after_sales_qa/after_sales_qa.vue
new file mode 100644
index 0000000..fa14d5a
--- /dev/null
+++ b/pages-subpackage/ai_qa/after_sales_qa/after_sales_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 说明
+ 成交后与履约相关的问题:安装、调试、维修、质保范围与期限、退换补件、投诉升级路径等,是延续信任与口碑的关键触点。
+
+
+
+ 典型问题
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 说清时效与责任人(谁接单、多久响应);书面或工单留痕;超出权限的部分主动升级并给时间节点,避免空承诺。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/competitor_qa/competitor_qa.vue b/pages-subpackage/ai_qa/competitor_qa/competitor_qa.vue
new file mode 100644
index 0000000..221e32c
--- /dev/null
+++ b/pages-subpackage/ai_qa/competitor_qa/competitor_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 对比选择
+ 客户在你和其他品牌之间摇摆,需要差异化说服。
+
+
+
+ 典型问题
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 不贬损竞品;用「客户在意维度」做对比表(交付、材质、售后、落地案例),把差异落到可验证的事实与承诺上。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/decision_qa/decision_qa.vue b/pages-subpackage/ai_qa/decision_qa/decision_qa.vue
new file mode 100644
index 0000000..2945d50
--- /dev/null
+++ b/pages-subpackage/ai_qa/decision_qa/decision_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 临门一脚
+ 客户有需求、认可产品,但犹豫是否立刻下单。
+
+
+
+ 典型问题
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 制造紧迫感(限时 / 限量)、给出行动理由,推动快速决策。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/demand_qa/demand_qa.vue b/pages-subpackage/ai_qa/demand_qa/demand_qa.vue
new file mode 100644
index 0000000..cbb82cd
--- /dev/null
+++ b/pages-subpackage/ai_qa/demand_qa/demand_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 核心基础
+ 客户想确认产品 / 服务是否匹配自身需求,是成交的前提。
+
+
+
+ 典型问题
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 深挖痛点,精准匹配产品价值,不盲目推销。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/general_qa/general_qa.vue b/pages-subpackage/ai_qa/general_qa/general_qa.vue
new file mode 100644
index 0000000..d29bcc2
--- /dev/null
+++ b/pages-subpackage/ai_qa/general_qa/general_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 说明
+ 面向未归入具体场景的日常咨询:产品基础介绍、服务范围、预约流程、交货周期等。先澄清客户真正想知道什么,再分点回答,避免一次抛出过多信息。
+
+
+
+ 可优先确认
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 先倾听再结构化回答;复杂问题拆成「结论 + 理由 + 下一步」,并反问一句确认是否讲清楚。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/objection_qa/objection_qa.vue b/pages-subpackage/ai_qa/objection_qa/objection_qa.vue
new file mode 100644
index 0000000..5deabd8
--- /dev/null
+++ b/pages-subpackage/ai_qa/objection_qa/objection_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 说明
+ 客户在语言上未直接拒绝,但用拖延、借口或模糊理由保持距离,需要先分辨「真顾虑」还是「礼貌推脱」。
+
+
+
+ 典型表现
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 用小闭环提问澄清真实障碍(预算、决策人、对比项、时间节点);给出可试的一步(看案例、到现场、小单试点),降低心理压力。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/price_qa/price_qa.vue b/pages-subpackage/ai_qa/price_qa/price_qa.vue
new file mode 100644
index 0000000..d1d9b3c
--- /dev/null
+++ b/pages-subpackage/ai_qa/price_qa/price_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 高频阻力
+ 客户关注成本、性价比,是最常见的成交障碍。
+
+
+
+ 典型问题
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 塑造价值>谈价格,用效果、售后、长期成本抵消价格顾虑。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/sharp_qa/sharp_qa.vue b/pages-subpackage/ai_qa/sharp_qa/sharp_qa.vue
new file mode 100644
index 0000000..0ffad36
--- /dev/null
+++ b/pages-subpackage/ai_qa/sharp_qa/sharp_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 说明
+ 语气尖锐、带测试或挑衅色彩的问题,常在试探专业度、诚意或底线;硬怼或空喊口号都容易失分。
+
+
+
+ 典型问题
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 不怼、不躲;先共情或复述问题,再坦诚边界(能承诺什么 / 不能承诺什么),用可验证依据与替代方案收尾,把对话带回需求与价值。
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_qa/trust_qa/trust_qa.vue b/pages-subpackage/ai_qa/trust_qa/trust_qa.vue
new file mode 100644
index 0000000..8929b04
--- /dev/null
+++ b/pages-subpackage/ai_qa/trust_qa/trust_qa.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+ 决策关键
+ 客户对产品、品牌、销售本人存在疑虑,缺乏安全感。
+
+
+
+ 典型问题
+
+ •
+ {{ t }}
+
+
+
+
+ 应对关键
+ 用案例、资质、口碑、承诺建立信任,打消顾虑。
+
+
+
+
+
+
+
+
diff --git a/pages.json b/pages.json
index ba7d89f..f15871a 100644
--- a/pages.json
+++ b/pages.json
@@ -39,6 +39,12 @@
"QualityCoveragePopup": "pages-subpackage/ai_features/quality_coverage/quality-coverage-popup"
}
},
+ {
+ "path": "pages/ai_qa/ai_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
// #ifdef APP
{
"path": "uni_modules/uni-upgrade-center-app/pages/upgrade-popup",
@@ -301,6 +307,60 @@
"style": {
"navigationStyle": "custom"
}
+ },
+ {
+ "path": "ai_qa/general_qa/general_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/demand_qa/demand_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/price_qa/price_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/trust_qa/trust_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/decision_qa/decision_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/competitor_qa/competitor_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/objection_qa/objection_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/sharp_qa/sharp_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_qa/after_sales_qa/after_sales_qa",
+ "style": {
+ "navigationStyle": "custom"
+ }
}
// #ifdef APP
,
@@ -373,6 +433,12 @@
"selectedIconPath": "static/tabbar/customer_active.png",
"text": "客户"
},
+ {
+ "pagePath": "pages/ai_qa/ai_qa",
+ "iconPath": "static/tabbar/expression.png",
+ "selectedIconPath": "static/tabbar/expression_active.png",
+ "text": "AI问答"
+ },
{
"pagePath": "pages/ai_analysis/ai_analysis",
"iconPath": "static/tabbar/ai_analysis.png",
diff --git a/pages/ai_qa/ai_qa.vue b/pages/ai_qa/ai_qa.vue
new file mode 100644
index 0000000..bcf5b65
--- /dev/null
+++ b/pages/ai_qa/ai_qa.vue
@@ -0,0 +1,380 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 🙋
+ 通用问答
+ 日常接待与通用话术
+
+
+ 🛠️
+ 售后问答
+ 安装、质保与售后流程
+
+
+
+
+
+
+
+
+ 📌
+ 需求类问答
+ 是否匹配需求、场景方案
+
+
+ 💳
+ 价格类问答
+ 价格、优惠与性价比
+
+
+ 🤝
+ 信任类问答
+ 质量、售后与案例资质
+
+
+ ⚡
+ 决策类问答
+ 再考虑、犹豫与促单
+
+
+
+
+
+
+
+
+ 🔀
+ 竞品类问答
+ 与竞品对比与选型
+
+
+ 🚧
+ 抗拒点问答
+ 拖延、借口与隐性拒绝
+
+
+ 📍
+ 针尖问答
+ 尖锐与刁难型问题
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/furniture_customer/furniture_customer.vue b/pages/furniture_customer/furniture_customer.vue
index 37367a8..f85b879 100644
--- a/pages/furniture_customer/furniture_customer.vue
+++ b/pages/furniture_customer/furniture_customer.vue
@@ -2493,7 +2493,8 @@
this.urlPathMap = {
'pages/furniture_customer/furniture_customer': '/customer',
'pages/furniture_reception/furniture_reception': '/reception',
- 'pages/furniture_top_sales/furniture_top_sales': '/top-sales',
+ 'pages/ai_qa/ai_qa': '/ai-qa',
+ 'pages/ai_analysis/ai_analysis': '/ai-analysis',
'pages/ucenter/ucenter': '/profile'
};
diff --git a/pages/furniture_reception/furniture_reception.vue b/pages/furniture_reception/furniture_reception.vue
index db4e69e..d17f1e9 100644
--- a/pages/furniture_reception/furniture_reception.vue
+++ b/pages/furniture_reception/furniture_reception.vue
@@ -985,7 +985,8 @@ import ServiceListFurniture from "./serviceListFurniture.vue";
this.urlPathMap = {
'pages/furniture_customer/furniture_customer': '/customer',
'pages/furniture_reception/furniture_reception': '/reception',
- 'pages/furniture_top_sales/furniture_top_sales': '/top-sales',
+ 'pages/ai_qa/ai_qa': '/ai-qa',
+ 'pages/ai_analysis/ai_analysis': '/ai-analysis',
'pages/ucenter/ucenter': '/profile'
};
diff --git a/pages/ucenter/ucenter.vue b/pages/ucenter/ucenter.vue
index a8262af..383894e 100644
--- a/pages/ucenter/ucenter.vue
+++ b/pages/ucenter/ucenter.vue
@@ -375,7 +375,7 @@
this[item.event]();
} else if (item.to) {
// 如果是 tabBar 页面,使用 switchTab
- const tabBarPages = ['/pages/furniture_reception/furniture_reception', '/pages/furniture_customer/furniture_customer', '/pages/furniture_top_sales/furniture_top_sales', '/pages/ucenter/ucenter']
+ const tabBarPages = ['/pages/furniture_reception/furniture_reception', '/pages/furniture_customer/furniture_customer', '/pages/ai_qa/ai_qa', '/pages/ai_analysis/ai_analysis', '/pages/ucenter/ucenter']
if (tabBarPages.includes(item.to)) {
uni.switchTab({
url: item.to
@@ -700,7 +700,8 @@
this.urlPathMap = {
'pages/furniture_customer/furniture_customer': '/customer',
'pages/furniture_reception/furniture_reception': '/reception',
- 'pages/furniture_top_sales/furniture_top_sales': '/top-sales',
+ 'pages/ai_qa/ai_qa': '/ai-qa',
+ 'pages/ai_analysis/ai_analysis': '/ai-analysis',
'pages/ucenter/ucenter': '/profile'
};