diff --git a/custom-tab-bar/index.vue b/custom-tab-bar/index.vue
index 39187dc..7d8ea51 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_analysis',
+ text: 'AI分析',
+ pagePath: '/pages/ai_analysis/ai_analysis',
+ iconPath: '/static/tabbar/ai_analysis.png',
+ selectedIconPath: '/static/tabbar/ai_analysis_active.png',
+ },
{
key: 'meeting_summary',
text: '总结和统计',
@@ -105,6 +112,13 @@ export default {
iconPath: '/static/tabbar/customer.png',
selectedIconPath: '/static/tabbar/customer_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: 'ucenter',
text: '我的',
@@ -120,7 +134,7 @@ export default {
console.log('VISIBLE TABS CALC - THIS MUST SHOW IN H5');
// 简化逻辑:直接返回家具相关的tabs,跳过权限检查
- const furnitureKeys = ['furniture_reception', 'furniture_customer', 'ucenter'];
+ const furnitureKeys = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
const result = furnitureKeys.map(key => {
return this.allTabs.find(tab => tab.key === key);
}).filter(Boolean);
@@ -275,15 +289,15 @@ export default {
console.log('GET ALLOWED KEYS - 简化版本,总是返回家具相关tabs');
// 简化逻辑:总是返回家具相关的tabs
- const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ucenter'];
+ const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
console.log('[TabBar][allowed] 简化逻辑 ->', furnitureTabs);
return furnitureTabs;
},
// #ifdef H5
toggleNativeTabs() {
// H5 平台自定义 tabbar 不生效,直接根据角色显隐原生 tabbar 项
- // 当前位置顺序(根据 pages.json 中的 tabBar.list 顺序):接待、客户、团队、总结和统计、家具接待、开始接待、家具客户、我的
- const ORDER = ['furniture_reception', 'furniture_customer', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
+ // 当前位置顺序(根据 pages.json 中的 tabBar.list 顺序):接待、客户、AI分析、我的、团队、总结和统计、家具接待、开始接待、家具客户
+ const ORDER = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
const allowed = this.getAllowedKeys();
// 限制重试次数,防止渲染时机未就绪
this._h5TabRetries = (this._h5TabRetries || 0) + 1;
@@ -314,6 +328,7 @@ export default {
const tabBarList = [
'pages/furniture_reception/furniture_reception',
'pages/furniture_customer/furniture_customer',
+ 'pages/ai_analysis/ai_analysis',
'pages/ucenter/ucenter'
];
const normalizedPath = pagePath.startsWith('/') ? pagePath.substring(1) : pagePath;
@@ -354,6 +369,7 @@ export default {
el.textContent && (
el.textContent.includes('接待') ||
el.textContent.includes('客户') ||
+ el.textContent.includes('AI分析') ||
el.textContent.includes('我的')
)
);
@@ -390,9 +406,9 @@ export default {
return;
}
- // 按文本内容排序:接待、客户、我的
+ // 按文本内容排序:接待、客户、AI分析、我的
const sortedElements = tabElements.sort((a, b) => {
- const order = ['接待', '客户', '我的'];
+ const order = ['接待', '客户', 'AI分析', '我的'];
const aIndex = order.findIndex(text => a.textContent.includes(text));
const bIndex = order.findIndex(text => b.textContent.includes(text));
return aIndex - bIndex;
@@ -402,7 +418,7 @@ export default {
// 处理每个元素
sortedElements.forEach((element, index) => {
- const keyMap = ['furniture_reception', 'furniture_customer', 'ucenter'];
+ const keyMap = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
const key = keyMap[index];
const shouldShow = allowed.includes(key);
diff --git a/pages-subpackage/ai_features/customer_count/customer_count.vue b/pages-subpackage/ai_features/customer_count/customer_count.vue
new file mode 100644
index 0000000..6bfd10d
--- /dev/null
+++ b/pages-subpackage/ai_features/customer_count/customer_count.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+ {{ totalCustomers }}
+ 累计接待客户
+
+
+ {{ todayCustomers }}
+ 今日接待客户
+
+
+
+
+
+ 接待趋势图
+
+ 📈 图表区域
+ 此处将显示客户接待趋势图表
+
+
+
+
+
+ 接待记录
+
+
+ {{ item.date }}
+ {{ item.description }}
+
+
+ {{ item.count }} 人
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/deal_attribution/deal_attribution.vue b/pages-subpackage/ai_features/deal_attribution/deal_attribution.vue
new file mode 100644
index 0000000..e4a3cde
--- /dev/null
+++ b/pages-subpackage/ai_features/deal_attribution/deal_attribution.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+ {{ conversionRate }}%
+ 总体转化率
+
+
+ {{ totalDeals }}
+ 成交总数
+
+
+
+
+ 成交因素分析图
+
+ 📊 图表区域
+ 此处将显示成交归因分析图表
+
+
+
+
+ 关键成交因素
+
+
+ {{ item.factor }}
+ {{ item.description }}
+
+
+ {{ item.percentage }}%
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/intent_level/intent_level.vue b/pages-subpackage/ai_features/intent_level/intent_level.vue
new file mode 100644
index 0000000..1b35d20
--- /dev/null
+++ b/pages-subpackage/ai_features/intent_level/intent_level.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+ {{ highIntent }}%
+ 高意向客户
+
+
+ {{ totalAnalyzed }}
+ 已分析客户
+
+
+
+
+ 意向分布图
+
+ 📊 图表区域
+ 此处将显示客户意向分级分布图表
+
+
+
+
+ 意向等级详情
+
+
+ {{ item.level }}
+ {{ item.description }}
+
+
+ {{ item.count }} 人
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/opening_rate/opening_rate.vue b/pages-subpackage/ai_features/opening_rate/opening_rate.vue
new file mode 100644
index 0000000..3648961
--- /dev/null
+++ b/pages-subpackage/ai_features/opening_rate/opening_rate.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+ {{ openingRate }}%
+ 平均开口率
+
+
+ {{ totalConversations }}
+ 总对话数
+
+
+
+
+ 开口率趋势图
+
+ 📈 图表区域
+ 此处将显示客户开口率趋势图表
+
+
+
+
+ 详细数据
+
+
+ {{ item.time }}
+ {{ item.description }}
+
+
+ {{ item.rate }}%
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/over_commitment/over_commitment.vue b/pages-subpackage/ai_features/over_commitment/over_commitment.vue
new file mode 100644
index 0000000..9e70eb1
--- /dev/null
+++ b/pages-subpackage/ai_features/over_commitment/over_commitment.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+ {{ overCommitmentRate }}%
+ 过度承诺率
+
+
+ {{ totalIncidents }}
+ 违规事件数
+
+
+
+
+ 过度承诺趋势图
+
+ ⚠️ 图表区域
+ 此处将显示过度承诺统计趋势图表
+
+
+
+
+ 违规记录
+
+
+ {{ item.employee }}
+ {{ item.description }}
+
+
+ {{ item.count }} 次
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/quality_coverage/quality_coverage.vue b/pages-subpackage/ai_features/quality_coverage/quality_coverage.vue
new file mode 100644
index 0000000..b1bebfa
--- /dev/null
+++ b/pages-subpackage/ai_features/quality_coverage/quality_coverage.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+ {{ coverageRate }}%
+ 总体覆盖率
+
+
+ {{ todayCoverage }}%
+ 今日覆盖率
+
+
+
+
+ 覆盖率趋势图
+
+ 📊 图表区域
+ 此处将显示质检覆盖率趋势图表
+
+
+
+
+ 详细数据
+
+
+ {{ item.date }}
+ {{ item.description }}
+
+
+ {{ item.rate }}%
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/recording_duration/recording_duration.vue b/pages-subpackage/ai_features/recording_duration/recording_duration.vue
new file mode 100644
index 0000000..456e2ea
--- /dev/null
+++ b/pages-subpackage/ai_features/recording_duration/recording_duration.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+ {{ totalDuration }}
+ 总录音时长
+
+
+ {{ todayDuration }}
+ 今日录音时长
+
+
+
+
+
+ 时长趋势图
+
+ 📊 图表区域
+ 此处将显示录音时长趋势图表
+
+
+
+
+
+ 详细数据
+
+
+ {{ item.date }}
+ {{ item.description }}
+
+
+ {{ item.duration }}
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/red_line_touch/red_line_touch.vue b/pages-subpackage/ai_features/red_line_touch/red_line_touch.vue
new file mode 100644
index 0000000..c4ea336
--- /dev/null
+++ b/pages-subpackage/ai_features/red_line_touch/red_line_touch.vue
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+
+ {{ redLineIncidents }}
+ 红线事件总数
+
+
+ {{ criticalRate }}%
+ 严重程度比例
+
+
+
+
+ 红线触及趋势图
+
+ 🚨 图表区域
+ 此处将显示触及红线统计趋势图表
+
+
+
+
+ 红线事件详情
+
+
+ {{ item.violation }}
+ {{ item.description }}
+
+
+ {{ item.count }} 次
+
+
+
+
+
+
+
+
+
+
diff --git a/pages-subpackage/ai_features/speech_rating/speech_rating.vue b/pages-subpackage/ai_features/speech_rating/speech_rating.vue
new file mode 100644
index 0000000..98117a7
--- /dev/null
+++ b/pages-subpackage/ai_features/speech_rating/speech_rating.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+ {{ averageScore }}
+ 平均评分
+
+
+ {{ totalEvaluations }}
+ 总评价次数
+
+
+
+
+ 评分趋势图
+
+ 📈 图表区域
+ 此处将显示员工话术评分趋势图表
+
+
+
+
+ 评分详情
+
+
+ {{ item.employee }}
+ {{ item.description }}
+
+
+ {{ item.score }}/5.0
+
+
+
+
+
+
+
+
+
+
diff --git a/pages.json b/pages.json
index d45eba1..abffb76 100644
--- a/pages.json
+++ b/pages.json
@@ -30,6 +30,12 @@
"navigationStyle": "custom"
}
},
+ {
+ "path": "pages/ai_analysis/ai_analysis",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
// #ifdef APP
{
"path": "uni_modules/uni-upgrade-center-app/pages/upgrade-popup",
@@ -262,6 +268,60 @@
"navigationBarTitleText": "阅读记录",
"enablePullDownRefresh": true
}
+ },
+ {
+ "path": "ai_features/recording_duration/recording_duration",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/customer_count/customer_count",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/quality_coverage/quality_coverage",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/speech_rating/speech_rating",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/intent_level/intent_level",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/deal_attribution/deal_attribution",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/opening_rate/opening_rate",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/over_commitment/over_commitment",
+ "style": {
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "ai_features/red_line_touch/red_line_touch",
+ "style": {
+ "navigationStyle": "custom"
+ }
}
// #ifdef APP
,
@@ -339,6 +399,12 @@
"selectedIconPath": "static/tabbar/customer_active.png",
"text": "客户"
},
+ {
+ "pagePath": "pages/ai_analysis/ai_analysis",
+ "iconPath": "static/tabbar/ai_analysis.png",
+ "selectedIconPath": "static/tabbar/ai_analysis_active.png",
+ "text": "AI分析"
+ },
{
"pagePath": "pages/ucenter/ucenter",
"iconPath": "static/tabbar/me.png",
diff --git a/pages/ai_analysis/ai_analysis.vue b/pages/ai_analysis/ai_analysis.vue
new file mode 100644
index 0000000..022b4c7
--- /dev/null
+++ b/pages/ai_analysis/ai_analysis.vue
@@ -0,0 +1,461 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ⏱️
+ 录音时长
+ 统计录音总时长
+
+
+ 👥
+ 接待客户数
+ 统计接待客户数量
+
+
+
+
+
+
+
+
+
+ 🎯
+ 质检覆盖率
+ 质检录音覆盖统计
+
+
+ 🗣️
+ 员工话术评分
+ 员工沟通质量评分
+
+
+
+
+
+
+
+
+
+ 🎯
+ 客户意向分级
+ 客户购买意向分析
+
+
+ 💰
+ 成交归因
+ 成交成功因素分析
+
+
+ 🚪
+ 开口率
+ 客户主动开口统计
+
+
+
+
+
+
+
+
+
+ 🚨
+ 过度承诺统计
+ 监控过度承诺情况
+
+
+ 🔴
+ 触及红线统计
+ 违规行为监控统计
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/tabbar/ai_analysis.png b/static/tabbar/ai_analysis.png
new file mode 100644
index 0000000..0ec5081
Binary files /dev/null and b/static/tabbar/ai_analysis.png differ
diff --git a/static/tabbar/ai_analysis_active.png b/static/tabbar/ai_analysis_active.png
new file mode 100644
index 0000000..9b752c7
Binary files /dev/null and b/static/tabbar/ai_analysis_active.png differ
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map
index 5ca43de..1515db5 100644
--- a/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/app.js.map
@@ -1 +1 @@
-{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t正在加载...\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\n\n\n\n\n","import App from './App'\r\nimport i18n from './lang/i18n'\r\n\r\n\r\n// #ifndef VUE3\r\nimport Vue from 'vue'\r\nVue.config.productionTip = false\r\nApp.mpType = 'app'\r\nconst app = new Vue({\r\n\ti18n,\r\n\t...App\r\n})\r\napp.$mount()\r\n// #endif\r\n\r\n\r\n// #ifdef VUE3\r\nimport {createSSRApp} from 'vue'\r\n\r\nexport function createApp() {\r\n\tconst app = createSSRApp(App)\r\n\tapp.use(i18n)\r\n\treturn {app}\r\n}\r\n// #endif\r\n"],"names":["uni","initApp","uniIdPageInit","mutations","store","createSSRApp","i18n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"app.js","sources":["App.vue","main.js"],"sourcesContent":["\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t正在加载...\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\n\n\n\n\n\n","import App from './App'\r\nimport i18n from './lang/i18n'\r\n\r\n\r\n// #ifndef VUE3\r\nimport Vue from 'vue'\r\nVue.config.productionTip = false\r\nApp.mpType = 'app'\r\nconst app = new Vue({\r\n\ti18n,\r\n\t...App\r\n})\r\napp.$mount()\r\n// #endif\r\n\r\n\r\n// #ifdef VUE3\r\nimport {createSSRApp} from 'vue'\r\n\r\nexport function createApp() {\r\n\tconst app = createSSRApp(App)\r\n\tapp.use(i18n)\r\n\treturn {app}\r\n}\r\n// #endif\r\n"],"names":["uni","initApp","uniIdPageInit","mutations","store","createSSRApp","i18n"],"mappings":"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"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/common/store.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/common/store.js.map
index 4a2b9a4..fd2a615 100644
--- a/unpackage/dist/dev/.sourcemap/mp-weixin/common/store.js.map
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/common/store.js.map
@@ -1 +1 @@
-{"version":3,"file":"store.js","sources":["common/store.js"],"sourcesContent":["import pagesJson from '@/pages.json'\r\nimport { getApiUrl } from '@/common/config.js'\r\n\r\n// 由于 store.js 在主包中,无法直接访问子包中的 config.js\r\n// 使用默认配置值\r\nconst config = {\r\n\tsetPasswordAfterLogin: false // 默认值,如果需要修改,可以在这里调整\r\n}\r\n\r\n// 获取用户信息,避免在模块加载时就执行 uni-app API\r\nlet hostUserInfo = null\r\n\r\nfunction getHostUserInfo() {\r\n\t// 总是从存储中读取最新值,确保登录状态的实时性\r\n\t// 特别是在微信小程序中,页面跳转可能导致模块重新加载\r\n\ttry {\r\n\t\tif (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {\r\n\t\t\tconst storedUserInfo = uni.getStorageSync('uni-id-pages-userInfo') || {};\r\n\t\t\treturn storedUserInfo;\r\n\t\t}\r\n\t} catch (e) {\r\n\t\t// 在模块初始化时,uni可能还未完全初始化,静默失败\r\n\t}\r\n\treturn {};\r\n}\r\n\r\n// 初始化用户信息(只调用一次)\r\nconst initialUserInfo = getHostUserInfo() || {};\r\n\r\nconst data = {\r\n\tuserInfo: initialUserInfo,\r\n\thasLogin: Object.keys(initialUserInfo).length != 0\r\n}\r\n\r\n// 定义 mutations, 修改属性\r\nexport const mutations = {\r\n\t// 更新用户信息(简化版,不使用数据库)\r\n\tasync updateUserInfo(data = false) {\r\n\t\tif (data) {\r\n\t\t\t// 直接更新本地用户信息\r\n\t\t\tthis.setUserInfo(data)\r\n\t\t\tif (typeof uni !== 'undefined' && uni.showToast) {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: \"更新成功\",\r\n\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\tduration: 3000\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// 如果没有传入数据,不做任何操作(不再从数据库获取)\r\n\t\t\t// #ifdef APP-PLUS || H5 || MP-ALIPAY\r\n\t\t\tconsole.log('updateUserInfo called without data, skipping database operation')\r\n\t\t\t// #endif\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * 从本地存储中重新加载用户信息到store\r\n\t * 用于解决store初始化时uni未准备好导致的问题\r\n\t */\r\n\tsyncUserInfoFromStorage() {\r\n\t\ttry {\r\n\t\t\tif (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {\r\n\t\t\t\tconst storedUserInfo = uni.getStorageSync('uni-id-pages-userInfo') || {};\r\n\t\t\t\tif (Object.keys(storedUserInfo).length > 0) {\r\n\t\t\t\t\tthis.setUserInfo(storedUserInfo, { cover: true });\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\t// 静默失败\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\tsetUserInfo(data, {cover}={cover:false}) {\r\n\t\t// 确保data是一个对象\r\n\t\tconst safeData = data && typeof data === 'object' ? data : {};\r\n\t\tlet userInfo = cover ? safeData : Object.assign({}, store.userInfo || {}, safeData);\r\n\t\tstore.userInfo = Object.assign({}, userInfo);\r\n\t\tstore.hasLogin = Object.keys(store.userInfo).length != 0;\r\n\r\n\t\tif (typeof uni !== 'undefined' && uni && typeof uni.setStorageSync === 'function') {\r\n\t\t\ttry {\r\n\t\t\t\tuni.setStorageSync('uni-id-pages-userInfo', store.userInfo);\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// 静默失败\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn safeData;\r\n\t},\r\n\tasync logout() {\r\n\t\t// 检查 uni 是否可用\r\n\t\tif (typeof uni === 'undefined') {\r\n\t\t\tconsole.warn('uni API not available for logout')\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// 优先调用后端自定义登出接口(/api/sys/auth/logout),失败也不影响本地清理\r\n\t\tconst backendUserId = uni.getStorageSync('backend-user-id')\r\n\t\tif (backendUserId) {\r\n\t\t\ttry {\r\n\t\t\t\tawait uni.request({\r\n\t\t\t\t\turl: getApiUrl('/api/sys/auth/logout'),\r\n\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\theader: {\r\n\t\t\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded'\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tuserId: backendUserId\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error('后端登出接口调用失败:', e)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 清理本地登录状态(后端 token + 旧 uni-id token + tenantId)\r\n\t\tuni.removeStorageSync('backend-token')\r\n\t\tuni.removeStorageSync('backend-login-response')\r\n\t\tuni.removeStorageSync('backend-user-id')\r\n\t\tuni.removeStorageSync('backend-tenant-id') // 清除 tenantId\r\n\t\tuni.removeStorageSync('uni_id_token');\r\n\t\tuni.setStorageSync('uni_id_token_expired', 0)\r\n this.setUserInfo({},{cover:true})\r\n uni.$emit('uni-id-pages-logout')\r\n\t\tuni.redirectTo({\r\n\t\t\turl: `/${pagesJson.uniIdRouter && pagesJson.uniIdRouter.loginPage ? pagesJson.uniIdRouter.loginPage: 'uni_modules/uni-id-pages/pages/login/login-withoutpwd'}`,\r\n\t\t});\r\n\t},\r\n\tloginBack (e = {}) {\r\n\t\t// 检查 uni 是否可用\r\n\t\tif (typeof uni === 'undefined') {\r\n\t\t\tconsole.warn('uni API not available for loginBack')\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst {uniIdRedirectUrl = ''} = e\r\n\t\tlet delta = 0; //判断需要返回几层\r\n\t\tlet pages = getCurrentPages();\r\n\t\t// console.log(pages);\r\n\t\tpages.forEach((page, index) => {\r\n\t\t\tif (pages[pages.length - index - 1].route.split('/')[3] == 'login') {\r\n\t\t\t\tdelta++\r\n\t\t\t}\r\n\t\t})\r\n\t\t// console.log('判断需要返回几层:', delta);\r\n\t\tif (uniIdRedirectUrl) {\r\n\t\t\treturn uni.redirectTo({\r\n\t\t\t\turl: uniIdRedirectUrl,\r\n\t\t\t\tfail: (err1) => {\r\n\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\turl:uniIdRedirectUrl,\r\n\t\t\t\t\t\tfail: (err2) => {\r\n\t\t\t\t\t\t\tconsole.log(err1,err2)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t\t// #ifdef H5\r\n\t\tif (e.loginType == 'weixin') {\r\n\t\t\t// console.log('window.history', window.history);\r\n\t\t\treturn window.history.go(-3)\r\n\t\t}\r\n\t\t// #endif\r\n\r\n\t\tif (delta) {\r\n\t\t\tconst page = pagesJson.pages[0]\r\n\t\t\treturn uni.reLaunch({\r\n\t\t\t\turl: `/${page.path}`\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tuni.navigateBack({\r\n\t\t\tdelta\r\n\t\t})\r\n\t},\r\n\tloginSuccess(e = {}){\r\n\t\tconst {\r\n\t\t\tshowToast = true, toastText = '登录成功', autoBack = true, uniIdRedirectUrl = '', passwordConfirmed\r\n\t\t} = e\r\n\t\t// console.log({toastText,autoBack});\r\n\r\n\t\t// 检查 uni 是否可用\r\n\t\tif (typeof uni === 'undefined') {\r\n\t\t\tconsole.warn('uni API not available for loginSuccess')\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (showToast) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: toastText,\r\n\t\t\t\ticon: 'none',\r\n\t\t\t\tduration: 3000\r\n\t\t\t});\r\n\t\t}\r\n // 异步调用(更新用户信息)防止获取头像等操作阻塞页面返回\r\n\t\tthis.updateUserInfo()\r\n\r\n\t\tuni.$emit('uni-id-pages-login-success')\r\n\r\n\t\tif (config.setPasswordAfterLogin && !passwordConfirmed) {\r\n\t\t\treturn uni.redirectTo({\r\n\t\t\t\turl: uniIdRedirectUrl ? `/uni_modules/uni-id-pages/pages/userinfo/set-pwd/set-pwd?uniIdRedirectUrl=${uniIdRedirectUrl}&loginType=${e.loginType}`: `/uni_modules/uni-id-pages/pages/userinfo/set-pwd/set-pwd?loginType=${e.loginType}`,\r\n\t\t\t\tfail: (err) => {\r\n\t\t\t\t\tconsole.log(err)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tif (autoBack) {\r\n\t\t\tthis.loginBack({uniIdRedirectUrl})\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n// #ifdef VUE2\r\nimport Vue from 'vue'\r\n// 通过Vue.observable创建一个可响应的对象\r\nexport const store = Vue.observable(data)\r\n// #endif\r\n\r\n// #ifdef VUE3\r\n// 在小程序环境中,可能 reactive 不可用,使用简单的对象\r\nexport const store = data\r\n// #endif\r\n"],"names":["uni","data","getApiUrl","pages"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"store.js","sources":["common/store.js"],"sourcesContent":["import pagesJson from '@/pages.json'\r\nimport { getApiUrl } from '@/common/config.js'\r\n\r\n// 由于 store.js 在主包中,无法直接访问子包中的 config.js\r\n// 使用默认配置值\r\nconst config = {\r\n\tsetPasswordAfterLogin: false // 默认值,如果需要修改,可以在这里调整\r\n}\r\n\r\n// 获取用户信息,避免在模块加载时就执行 uni-app API\r\nlet hostUserInfo = null\r\n\r\nfunction getHostUserInfo() {\r\n\t// 总是从存储中读取最新值,确保登录状态的实时性\r\n\t// 特别是在微信小程序中,页面跳转可能导致模块重新加载\r\n\ttry {\r\n\t\tif (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {\r\n\t\t\tconst storedUserInfo = uni.getStorageSync('uni-id-pages-userInfo') || {};\r\n\t\t\treturn storedUserInfo;\r\n\t\t}\r\n\t} catch (e) {\r\n\t\t// 在模块初始化时,uni可能还未完全初始化,静默失败\r\n\t}\r\n\treturn {};\r\n}\r\n\r\n// 初始化用户信息(只调用一次)\r\nconst initialUserInfo = getHostUserInfo() || {};\r\n\r\nconst data = {\r\n\tuserInfo: initialUserInfo,\r\n\thasLogin: Object.keys(initialUserInfo).length != 0\r\n}\r\n\r\n// 定义 mutations, 修改属性\r\nexport const mutations = {\r\n\t// 更新用户信息(简化版,不使用数据库)\r\n\tasync updateUserInfo(data = false) {\r\n\t\tif (data) {\r\n\t\t\t// 直接更新本地用户信息\r\n\t\t\tthis.setUserInfo(data)\r\n\t\t\tif (typeof uni !== 'undefined' && uni.showToast) {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: \"更新成功\",\r\n\t\t\t\t\ticon: 'none',\r\n\t\t\t\t\tduration: 3000\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// 如果没有传入数据,不做任何操作(不再从数据库获取)\r\n\t\t\t// #ifdef APP-PLUS || H5 || MP-ALIPAY\r\n\t\t\tconsole.log('updateUserInfo called without data, skipping database operation')\r\n\t\t\t// #endif\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * 从本地存储中重新加载用户信息到store\r\n\t * 用于解决store初始化时uni未准备好导致的问题\r\n\t */\r\n\tsyncUserInfoFromStorage() {\r\n\t\ttry {\r\n\t\t\tif (typeof uni !== 'undefined' && uni && typeof uni.getStorageSync === 'function') {\r\n\t\t\t\tconst storedUserInfo = uni.getStorageSync('uni-id-pages-userInfo') || {};\r\n\t\t\t\tif (Object.keys(storedUserInfo).length > 0) {\r\n\t\t\t\t\tthis.setUserInfo(storedUserInfo, { cover: true });\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\t// 静默失败\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\tsetUserInfo(data, {cover}={cover:false}) {\r\n\t\t// 确保data是一个对象\r\n\t\tconst safeData = data && typeof data === 'object' ? data : {};\r\n\t\tlet userInfo = cover ? safeData : Object.assign({}, store.userInfo || {}, safeData);\r\n\t\tstore.userInfo = Object.assign({}, userInfo);\r\n\t\tstore.hasLogin = Object.keys(store.userInfo).length != 0;\r\n\r\n\t\tif (typeof uni !== 'undefined' && uni && typeof uni.setStorageSync === 'function') {\r\n\t\t\ttry {\r\n\t\t\t\tuni.setStorageSync('uni-id-pages-userInfo', store.userInfo);\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// 静默失败\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn safeData;\r\n\t},\r\n\tasync logout() {\r\n\t\t// 检查 uni 是否可用\r\n\t\tif (typeof uni === 'undefined') {\r\n\t\t\tconsole.warn('uni API not available for logout')\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// 优先调用后端自定义登出接口(/api/sys/auth/logout),失败也不影响本地清理\r\n\t\tconst backendUserId = uni.getStorageSync('backend-user-id')\r\n\t\tif (backendUserId) {\r\n\t\t\ttry {\r\n\t\t\t\tawait uni.request({\r\n\t\t\t\t\turl: getApiUrl('/api/sys/auth/logout'),\r\n\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\theader: {\r\n\t\t\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded'\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tuserId: backendUserId\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t} catch (e) {\r\n\t\t\t\tconsole.error('后端登出接口调用失败:', e)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 清理本地登录状态(后端 token + 旧 uni-id token + tenantId)\r\n\t\tuni.removeStorageSync('backend-token')\r\n\t\tuni.removeStorageSync('backend-login-response')\r\n\t\tuni.removeStorageSync('backend-user-id')\r\n\t\tuni.removeStorageSync('backend-tenant-id') // 清除 tenantId\r\n\t\tuni.removeStorageSync('uni_id_token');\r\n\t\tuni.setStorageSync('uni_id_token_expired', 0)\r\n this.setUserInfo({},{cover:true})\r\n uni.$emit('uni-id-pages-logout')\r\n\t\tuni.redirectTo({\r\n\t\t\turl: `/${pagesJson.uniIdRouter && pagesJson.uniIdRouter.loginPage ? pagesJson.uniIdRouter.loginPage: 'uni_modules/uni-id-pages/pages/login/login-withoutpwd'}`,\r\n\t\t});\r\n\t},\r\n\tloginBack (e = {}) {\r\n\t\t// 检查 uni 是否可用\r\n\t\tif (typeof uni === 'undefined') {\r\n\t\t\tconsole.warn('uni API not available for loginBack')\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst {uniIdRedirectUrl = ''} = e\r\n\t\tlet delta = 0; //判断需要返回几层\r\n\t\tlet pages = getCurrentPages();\r\n\t\t// console.log(pages);\r\n\t\tpages.forEach((page, index) => {\r\n\t\t\tif (pages[pages.length - index - 1].route.split('/')[3] == 'login') {\r\n\t\t\t\tdelta++\r\n\t\t\t}\r\n\t\t})\r\n\t\t// console.log('判断需要返回几层:', delta);\r\n\t\tif (uniIdRedirectUrl) {\r\n\t\t\treturn uni.redirectTo({\r\n\t\t\t\turl: uniIdRedirectUrl,\r\n\t\t\t\tfail: (err1) => {\r\n\t\t\t\t\tuni.switchTab({\r\n\t\t\t\t\t\turl:uniIdRedirectUrl,\r\n\t\t\t\t\t\tfail: (err2) => {\r\n\t\t\t\t\t\t\tconsole.log(err1,err2)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t\t// #ifdef H5\r\n\t\tif (e.loginType == 'weixin') {\r\n\t\t\t// console.log('window.history', window.history);\r\n\t\t\treturn window.history.go(-3)\r\n\t\t}\r\n\t\t// #endif\r\n\r\n\t\tif (delta) {\r\n\t\t\tconst page = pagesJson.pages[0]\r\n\t\t\treturn uni.reLaunch({\r\n\t\t\t\turl: `/${page.path}`\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tuni.navigateBack({\r\n\t\t\tdelta\r\n\t\t})\r\n\t},\r\n\tloginSuccess(e = {}){\r\n\t\tconst {\r\n\t\t\tshowToast = true, toastText = '登录成功', autoBack = true, uniIdRedirectUrl = '', passwordConfirmed\r\n\t\t} = e\r\n\t\t// console.log({toastText,autoBack});\r\n\r\n\t\t// 检查 uni 是否可用\r\n\t\tif (typeof uni === 'undefined') {\r\n\t\t\tconsole.warn('uni API not available for loginSuccess')\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (showToast) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: toastText,\r\n\t\t\t\ticon: 'none',\r\n\t\t\t\tduration: 3000\r\n\t\t\t});\r\n\t\t}\r\n // 异步调用(更新用户信息)防止获取头像等操作阻塞页面返回\r\n\t\tthis.updateUserInfo()\r\n\r\n\t\tuni.$emit('uni-id-pages-login-success')\r\n\r\n\t\tif (config.setPasswordAfterLogin && !passwordConfirmed) {\r\n\t\t\treturn uni.redirectTo({\r\n\t\t\t\turl: uniIdRedirectUrl ? `/uni_modules/uni-id-pages/pages/userinfo/set-pwd/set-pwd?uniIdRedirectUrl=${uniIdRedirectUrl}&loginType=${e.loginType}`: `/uni_modules/uni-id-pages/pages/userinfo/set-pwd/set-pwd?loginType=${e.loginType}`,\r\n\t\t\t\tfail: (err) => {\r\n\t\t\t\t\tconsole.log(err)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tif (autoBack) {\r\n\t\t\tthis.loginBack({uniIdRedirectUrl})\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\n// #ifdef VUE2\r\nimport Vue from 'vue'\r\n// 通过Vue.observable创建一个可响应的对象\r\nexport const store = Vue.observable(data)\r\n// #endif\r\n\r\n// #ifdef VUE3\r\n// 在小程序环境中,可能 reactive 不可用,使用简单的对象\r\nexport const store = data\r\n// #endif\r\n"],"names":["uni","data","getApiUrl","pages"],"mappings":"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"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.js.map
new file mode 100644
index 0000000..b4ca725
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"customer_count.js","sources":["pages-subpackage/ai_features/customer_count/customer_count.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xjdXN0b21lcl9jb3VudFxjdXN0b21lcl9jb3VudC52dWU"],"sourcesContent":["\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {{ totalCustomers }}\r\n 累计接待客户\r\n \r\n \r\n {{ todayCustomers }}\r\n 今日接待客户\r\n \r\n \r\n\r\n \r\n \r\n 接待趋势图\r\n \r\n 📈 图表区域\r\n 此处将显示客户接待趋势图表\r\n \r\n \r\n\r\n \r\n \r\n 接待记录\r\n \r\n \r\n {{ item.date }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.count }} 人\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/customer_count/customer_count.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAqDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,UAAU;AAAA,QACR,EAAE,MAAM,cAAc,aAAa,UAAU,OAAO,KAAM;AAAA,QAC1D,EAAE,MAAM,cAAc,aAAa,UAAU,OAAO,KAAM;AAAA,QAC1D,EAAE,MAAM,cAAc,aAAa,UAAU,OAAO,KAAM;AAAA,QAC1D,EAAE,MAAM,cAAc,aAAa,WAAW,OAAO,KAAM;AAAA,QAC3D,EAAE,MAAM,cAAc,aAAa,UAAU,OAAO,KAAK;AAAA,MAC3D;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;ACvEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.js.map
new file mode 100644
index 0000000..42f6f8f
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"deal_attribution.js","sources":["pages-subpackage/ai_features/deal_attribution/deal_attribution.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xkZWFsX2F0dHJpYnV0aW9uXGRlYWxfYXR0cmlidXRpb24udnVl"],"sourcesContent":["\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ conversionRate }}%\r\n 总体转化率\r\n \r\n \r\n {{ totalDeals }}\r\n 成交总数\r\n \r\n \r\n\r\n \r\n 成交因素分析图\r\n \r\n 📊 图表区域\r\n 此处将显示成交归因分析图表\r\n \r\n \r\n\r\n \r\n 关键成交因素\r\n \r\n \r\n {{ item.factor }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.percentage }}%\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/deal_attribution/deal_attribution.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAgDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,UAAU;AAAA,QACR,EAAE,QAAQ,QAAQ,aAAa,YAAY,YAAY,OAAQ;AAAA,QAC/D,EAAE,QAAQ,QAAQ,aAAa,aAAa,YAAY,OAAQ;AAAA,QAChE,EAAE,QAAQ,QAAQ,aAAa,WAAW,YAAY,OAAQ;AAAA,QAC9D,EAAE,QAAQ,QAAQ,aAAa,aAAa,YAAY,OAAQ;AAAA,QAChE,EAAE,QAAQ,QAAQ,aAAa,YAAY,YAAY,MAAM;AAAA,MAC/D;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;AClEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.js.map
new file mode 100644
index 0000000..82a0ebd
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"intent_level.js","sources":["pages-subpackage/ai_features/intent_level/intent_level.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xpbnRlbnRfbGV2ZWxcaW50ZW50X2xldmVsLnZ1ZQ"],"sourcesContent":["\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ highIntent }}%\r\n 高意向客户\r\n \r\n \r\n {{ totalAnalyzed }}\r\n 已分析客户\r\n \r\n \r\n\r\n \r\n 意向分布图\r\n \r\n 📊 图表区域\r\n 此处将显示客户意向分级分布图表\r\n \r\n \r\n\r\n \r\n 意向等级详情\r\n \r\n \r\n {{ item.level }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.count }} 人\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/intent_level/intent_level.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAgDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,UAAU;AAAA,QACR,EAAE,OAAO,OAAO,aAAa,YAAY,OAAO,MAAO;AAAA,QACvD,EAAE,OAAO,QAAQ,aAAa,WAAW,OAAO,MAAO;AAAA,QACvD,EAAE,OAAO,OAAO,aAAa,WAAW,OAAO,MAAO;AAAA,QACtD,EAAE,OAAO,OAAO,aAAa,UAAU,OAAO,MAAO;AAAA,QACrD,EAAE,OAAO,OAAO,aAAa,UAAU,OAAO,KAAK;AAAA,MACrD;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;AClEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.js.map
new file mode 100644
index 0000000..2584efa
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"opening_rate.js","sources":["pages-subpackage/ai_features/opening_rate/opening_rate.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xvcGVuaW5nX3JhdGVcb3BlbmluZ19yYXRlLnZ1ZQ"],"sourcesContent":["\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ openingRate }}%\r\n 平均开口率\r\n \r\n \r\n {{ totalConversations }}\r\n 总对话数\r\n \r\n \r\n\r\n \r\n 开口率趋势图\r\n \r\n 📈 图表区域\r\n 此处将显示客户开口率趋势图表\r\n \r\n \r\n\r\n \r\n 详细数据\r\n \r\n \r\n {{ item.time }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.rate }}%\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/opening_rate/opening_rate.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAgDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,UAAU;AAAA,QACR,EAAE,MAAM,cAAc,aAAa,UAAU,MAAM,OAAQ;AAAA,QAC3D,EAAE,MAAM,eAAe,aAAa,QAAQ,MAAM,OAAQ;AAAA,QAC1D,EAAE,MAAM,eAAe,aAAa,QAAQ,MAAM,OAAQ;AAAA,QAC1D,EAAE,MAAM,eAAe,aAAa,SAAS,MAAM,OAAQ;AAAA,QAC3D,EAAE,MAAM,QAAQ,aAAa,WAAW,MAAM,OAAO;AAAA,MACvD;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;AClEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.js.map
new file mode 100644
index 0000000..472adf1
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"over_commitment.js","sources":["pages-subpackage/ai_features/over_commitment/over_commitment.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xvdmVyX2NvbW1pdG1lbnRcb3Zlcl9jb21taXRtZW50LnZ1ZQ"],"sourcesContent":["\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ overCommitmentRate }}%\r\n 过度承诺率\r\n \r\n \r\n {{ totalIncidents }}\r\n 违规事件数\r\n \r\n \r\n\r\n \r\n 过度承诺趋势图\r\n \r\n ⚠️ 图表区域\r\n 此处将显示过度承诺统计趋势图表\r\n \r\n \r\n\r\n \r\n 违规记录\r\n \r\n \r\n {{ item.employee }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.count }} 次\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/over_commitment/over_commitment.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAgDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,UAAU;AAAA,QACR,EAAE,UAAU,MAAM,aAAa,aAAa,OAAO,IAAK;AAAA,QACxD,EAAE,UAAU,MAAM,aAAa,aAAa,OAAO,IAAK;AAAA,QACxD,EAAE,UAAU,MAAM,aAAa,aAAa,OAAO,IAAK;AAAA,QACxD,EAAE,UAAU,MAAM,aAAa,eAAe,OAAO,IAAK;AAAA,QAC1D,EAAE,UAAU,MAAM,aAAa,UAAU,OAAO,KAAK;AAAA,MACvD;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;AClEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.js.map
new file mode 100644
index 0000000..4710d20
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"quality_coverage.js","sources":["pages-subpackage/ai_features/quality_coverage/quality_coverage.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xxdWFsaXR5X2NvdmVyYWdlXHF1YWxpdHlfY292ZXJhZ2UudnVl"],"sourcesContent":["\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ coverageRate }}%\r\n 总体覆盖率\r\n \r\n \r\n {{ todayCoverage }}%\r\n 今日覆盖率\r\n \r\n \r\n\r\n \r\n 覆盖率趋势图\r\n \r\n 📊 图表区域\r\n 此处将显示质检覆盖率趋势图表\r\n \r\n \r\n\r\n \r\n 详细数据\r\n \r\n \r\n {{ item.date }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.rate }}%\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/quality_coverage/quality_coverage.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAgDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,cAAc;AAAA,MACd,eAAe;AAAA,MACf,UAAU;AAAA,QACR,EAAE,MAAM,cAAc,aAAa,WAAW,MAAM,OAAQ;AAAA,QAC5D,EAAE,MAAM,cAAc,aAAa,WAAW,MAAM,OAAQ;AAAA,QAC5D,EAAE,MAAM,cAAc,aAAa,WAAW,MAAM,OAAQ;AAAA,QAC5D,EAAE,MAAM,cAAc,aAAa,YAAY,MAAM,OAAQ;AAAA,QAC7D,EAAE,MAAM,cAAc,aAAa,SAAS,MAAM,OAAO;AAAA,MAC3D;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;AClEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.js.map
new file mode 100644
index 0000000..4d26511
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"recording_duration.js","sources":["pages-subpackage/ai_features/recording_duration/recording_duration.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xyZWNvcmRpbmdfZHVyYXRpb25ccmVjb3JkaW5nX2R1cmF0aW9uLnZ1ZQ"],"sourcesContent":["\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {{ totalDuration }}\r\n 总录音时长\r\n \r\n \r\n {{ todayDuration }}\r\n 今日录音时长\r\n \r\n \r\n\r\n \r\n \r\n 时长趋势图\r\n \r\n 📊 图表区域\r\n 此处将显示录音时长趋势图表\r\n \r\n \r\n\r\n \r\n \r\n 详细数据\r\n \r\n \r\n {{ item.date }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.duration }}\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/recording_duration/recording_duration.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAqDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,eAAe;AAAA,MACf,eAAe;AAAA,MACf,UAAU;AAAA,QACR,EAAE,MAAM,cAAc,aAAa,UAAU,UAAU,SAAU;AAAA,QACjE,EAAE,MAAM,cAAc,aAAa,UAAU,UAAU,SAAU;AAAA,QACjE,EAAE,MAAM,cAAc,aAAa,QAAQ,UAAU,SAAU;AAAA,QAC/D,EAAE,MAAM,cAAc,aAAa,QAAQ,UAAU,SAAU;AAAA,QAC/D,EAAE,MAAM,cAAc,aAAa,UAAU,UAAU,SAAS;AAAA,MAClE;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;ACvEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.js.map
new file mode 100644
index 0000000..160b6c1
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"red_line_touch.js","sources":["pages-subpackage/ai_features/red_line_touch/red_line_touch.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xyZWRfbGluZV90b3VjaFxyZWRfbGluZV90b3VjaC52dWU"],"sourcesContent":["\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ redLineIncidents }}\r\n 红线事件总数\r\n \r\n \r\n {{ criticalRate }}%\r\n 严重程度比例\r\n \r\n \r\n\r\n \r\n 红线触及趋势图\r\n \r\n 🚨 图表区域\r\n 此处将显示触及红线统计趋势图表\r\n \r\n \r\n\r\n \r\n 红线事件详情\r\n \r\n \r\n {{ item.violation }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.count }} 次\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/red_line_touch/red_line_touch.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAgDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,UAAU;AAAA,QACR,EAAE,WAAW,QAAQ,aAAa,iBAAiB,OAAO,KAAM;AAAA,QAChE,EAAE,WAAW,QAAQ,aAAa,YAAY,OAAO,IAAK;AAAA,QAC1D,EAAE,WAAW,QAAQ,aAAa,YAAY,OAAO,IAAI;AAAA,MAC3D;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;AChEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.js.map
new file mode 100644
index 0000000..19f347b
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"speech_rating.js","sources":["pages-subpackage/ai_features/speech_rating/speech_rating.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMtc3VicGFja2FnZVxhaV9mZWF0dXJlc1xzcGVlY2hfcmF0aW5nXHNwZWVjaF9yYXRpbmcudnVl"],"sourcesContent":["\r\n \r\n \r\n\r\n \r\n \r\n \r\n {{ averageScore }}\r\n 平均评分\r\n \r\n \r\n {{ totalEvaluations }}\r\n 总评价次数\r\n \r\n \r\n\r\n \r\n 评分趋势图\r\n \r\n 📈 图表区域\r\n 此处将显示员工话术评分趋势图表\r\n \r\n \r\n\r\n \r\n 评分详情\r\n \r\n \r\n {{ item.employee }}\r\n {{ item.description }}\r\n \r\n \r\n {{ item.score }}/5.0\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages-subpackage/ai_features/speech_rating/speech_rating.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":";;AAgDA,MAAK,YAAU;AAAA,EACb,OAAO;AACL,WAAO;AAAA,MACL,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,UAAU;AAAA,QACR,EAAE,UAAU,MAAM,aAAa,UAAU,OAAO,MAAO;AAAA,QACvD,EAAE,UAAU,MAAM,aAAa,UAAU,OAAO,MAAO;AAAA,QACvD,EAAE,UAAU,MAAM,aAAa,UAAU,OAAO,MAAO;AAAA,QACvD,EAAE,UAAU,MAAM,aAAa,UAAU,OAAO,MAAO;AAAA,QACvD,EAAE,UAAU,MAAM,aAAa,UAAU,OAAO,MAAM;AAAA,MACxD;AAAA,IACF;AAAA,EACD;AAAA,EACD,SAAS;AAAA,IACP,SAAS;AACPA,oBAAAA,MAAI,aAAa;AAAA,IACnB;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;AClEA,GAAG,WAAW,eAAe;"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/.sourcemap/mp-weixin/pages/ai_analysis/ai_analysis.js.map b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/ai_analysis/ai_analysis.js.map
new file mode 100644
index 0000000..9657cce
--- /dev/null
+++ b/unpackage/dist/dev/.sourcemap/mp-weixin/pages/ai_analysis/ai_analysis.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"ai_analysis.js","sources":["pages/ai_analysis/ai_analysis.vue","../../../work/soft/HBuilderX.4.87.20251210/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvYWlfYW5hbHlzaXMvYWlfYW5hbHlzaXMudnVl"],"sourcesContent":["\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ⏱️\r\n 录音时长\r\n 统计录音总时长\r\n \r\n \r\n 👥\r\n 接待客户数\r\n 统计接待客户数量\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n 🎯\r\n 质检覆盖率\r\n 质检录音覆盖统计\r\n \r\n \r\n 🗣️\r\n 员工话术评分\r\n 员工沟通质量评分\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n 🎯\r\n 客户意向分级\r\n 客户购买意向分析\r\n \r\n \r\n 💰\r\n 成交归因\r\n 成交成功因素分析\r\n \r\n \r\n 🚪\r\n 开口率\r\n 客户主动开口统计\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n 🚨\r\n 过度承诺统计\r\n 监控过度承诺情况\r\n \r\n \r\n 🔴\r\n 触及红线统计\r\n 违规行为监控统计\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n","import MiniProgramPage from 'D:/work2/code/smartDriveEEUniApp1111/pages/ai_analysis/ai_analysis.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni"],"mappings":"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"}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/app.js b/unpackage/dist/dev/mp-weixin/app.js
index 593f6d4..ae4135b 100644
--- a/unpackage/dist/dev/mp-weixin/app.js
+++ b/unpackage/dist/dev/mp-weixin/app.js
@@ -12,6 +12,7 @@ if (!Math) {
"./pages/team/team.js";
"./pages/furniture_reception/common_begin_reception.js";
"./pages/furniture_customer/furniture_customer.js";
+ "./pages/ai_analysis/ai_analysis.js";
"./uni_modules/uni-feedback/pages/opendb-feedback/opendb-feedback.js";
"./uni_modules/uni-id-pages/pages/userinfo/userinfo.js";
"./uni_modules/uni-id-pages/pages/userinfo/realname-verify/realname-verify.js";
@@ -41,6 +42,15 @@ if (!Math) {
"./pages-subpackage/uni-agree/uni-agree.js";
"./pages-subpackage/ucenter/settings/settings.js";
"./pages-subpackage/ucenter/read-news-log/read-news-log.js";
+ "./pages-subpackage/ai_features/recording_duration/recording_duration.js";
+ "./pages-subpackage/ai_features/customer_count/customer_count.js";
+ "./pages-subpackage/ai_features/quality_coverage/quality_coverage.js";
+ "./pages-subpackage/ai_features/speech_rating/speech_rating.js";
+ "./pages-subpackage/ai_features/intent_level/intent_level.js";
+ "./pages-subpackage/ai_features/deal_attribution/deal_attribution.js";
+ "./pages-subpackage/ai_features/opening_rate/opening_rate.js";
+ "./pages-subpackage/ai_features/over_commitment/over_commitment.js";
+ "./pages-subpackage/ai_features/red_line_touch/red_line_touch.js";
}
const _sfc_main = {
globalData: {
diff --git a/unpackage/dist/dev/mp-weixin/app.json b/unpackage/dist/dev/mp-weixin/app.json
index 89f201c..0192d38 100644
--- a/unpackage/dist/dev/mp-weixin/app.json
+++ b/unpackage/dist/dev/mp-weixin/app.json
@@ -4,7 +4,8 @@
"pages/ucenter/ucenter",
"pages/team/team",
"pages/furniture_reception/common_begin_reception",
- "pages/furniture_customer/furniture_customer"
+ "pages/furniture_customer/furniture_customer",
+ "pages/ai_analysis/ai_analysis"
],
"subPackages": [
{
@@ -48,7 +49,16 @@
"customer/customer",
"uni-agree/uni-agree",
"ucenter/settings/settings",
- "ucenter/read-news-log/read-news-log"
+ "ucenter/read-news-log/read-news-log",
+ "ai_features/recording_duration/recording_duration",
+ "ai_features/customer_count/customer_count",
+ "ai_features/quality_coverage/quality_coverage",
+ "ai_features/speech_rating/speech_rating",
+ "ai_features/intent_level/intent_level",
+ "ai_features/deal_attribution/deal_attribution",
+ "ai_features/opening_rate/opening_rate",
+ "ai_features/over_commitment/over_commitment",
+ "ai_features/red_line_touch/red_line_touch"
]
}
],
@@ -80,6 +90,12 @@
"selectedIconPath": "static/tabbar/customer_active.png",
"text": "客户"
},
+ {
+ "pagePath": "pages/ai_analysis/ai_analysis",
+ "iconPath": "static/tabbar/ai_analysis.png",
+ "selectedIconPath": "static/tabbar/ai_analysis_active.png",
+ "text": "AI分析"
+ },
{
"pagePath": "pages/ucenter/ucenter",
"iconPath": "static/tabbar/me.png",
diff --git a/unpackage/dist/dev/mp-weixin/common/store.js b/unpackage/dist/dev/mp-weixin/common/store.js
index c673eb4..26327cb 100644
--- a/unpackage/dist/dev/mp-weixin/common/store.js
+++ b/unpackage/dist/dev/mp-weixin/common/store.js
@@ -31,6 +31,12 @@ const pages = [
style: {
navigationStyle: "custom"
}
+ },
+ {
+ path: "pages/ai_analysis/ai_analysis",
+ style: {
+ navigationStyle: "custom"
+ }
}
];
const subPackages = [
@@ -238,6 +244,60 @@ const subPackages = [
navigationBarTitleText: "阅读记录",
enablePullDownRefresh: true
}
+ },
+ {
+ path: "ai_features/recording_duration/recording_duration",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/customer_count/customer_count",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/quality_coverage/quality_coverage",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/speech_rating/speech_rating",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/intent_level/intent_level",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/deal_attribution/deal_attribution",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/opening_rate/opening_rate",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/over_commitment/over_commitment",
+ style: {
+ navigationStyle: "custom"
+ }
+ },
+ {
+ path: "ai_features/red_line_touch/red_line_touch",
+ style: {
+ navigationStyle: "custom"
+ }
}
]
}
@@ -287,6 +347,12 @@ const tabBar = {
selectedIconPath: "static/tabbar/customer_active.png",
text: "客户"
},
+ {
+ pagePath: "pages/ai_analysis/ai_analysis",
+ iconPath: "static/tabbar/ai_analysis.png",
+ selectedIconPath: "static/tabbar/ai_analysis_active.png",
+ text: "AI分析"
+ },
{
pagePath: "pages/ucenter/ucenter",
iconPath: "static/tabbar/me.png",
diff --git a/unpackage/dist/dev/mp-weixin/custom-tab-bar/index.vue b/unpackage/dist/dev/mp-weixin/custom-tab-bar/index.vue
index 39187dc..7d8ea51 100644
--- a/unpackage/dist/dev/mp-weixin/custom-tab-bar/index.vue
+++ b/unpackage/dist/dev/mp-weixin/custom-tab-bar/index.vue
@@ -77,6 +77,13 @@ export default {
iconPath: '/static/tabbar/me.png',
selectedIconPath: '/static/tabbar/me_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: 'meeting_summary',
text: '总结和统计',
@@ -105,6 +112,13 @@ export default {
iconPath: '/static/tabbar/customer.png',
selectedIconPath: '/static/tabbar/customer_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: 'ucenter',
text: '我的',
@@ -120,7 +134,7 @@ export default {
console.log('VISIBLE TABS CALC - THIS MUST SHOW IN H5');
// 简化逻辑:直接返回家具相关的tabs,跳过权限检查
- const furnitureKeys = ['furniture_reception', 'furniture_customer', 'ucenter'];
+ const furnitureKeys = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
const result = furnitureKeys.map(key => {
return this.allTabs.find(tab => tab.key === key);
}).filter(Boolean);
@@ -275,15 +289,15 @@ export default {
console.log('GET ALLOWED KEYS - 简化版本,总是返回家具相关tabs');
// 简化逻辑:总是返回家具相关的tabs
- const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ucenter'];
+ const furnitureTabs = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
console.log('[TabBar][allowed] 简化逻辑 ->', furnitureTabs);
return furnitureTabs;
},
// #ifdef H5
toggleNativeTabs() {
// H5 平台自定义 tabbar 不生效,直接根据角色显隐原生 tabbar 项
- // 当前位置顺序(根据 pages.json 中的 tabBar.list 顺序):接待、客户、团队、总结和统计、家具接待、开始接待、家具客户、我的
- const ORDER = ['furniture_reception', 'furniture_customer', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
+ // 当前位置顺序(根据 pages.json 中的 tabBar.list 顺序):接待、客户、AI分析、我的、团队、总结和统计、家具接待、开始接待、家具客户
+ const ORDER = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter', 'reception', 'customer', 'team', 'meeting_summary', 'common_begin_reception'];
const allowed = this.getAllowedKeys();
// 限制重试次数,防止渲染时机未就绪
this._h5TabRetries = (this._h5TabRetries || 0) + 1;
@@ -314,6 +328,7 @@ export default {
const tabBarList = [
'pages/furniture_reception/furniture_reception',
'pages/furniture_customer/furniture_customer',
+ 'pages/ai_analysis/ai_analysis',
'pages/ucenter/ucenter'
];
const normalizedPath = pagePath.startsWith('/') ? pagePath.substring(1) : pagePath;
@@ -354,6 +369,7 @@ export default {
el.textContent && (
el.textContent.includes('接待') ||
el.textContent.includes('客户') ||
+ el.textContent.includes('AI分析') ||
el.textContent.includes('我的')
)
);
@@ -390,9 +406,9 @@ export default {
return;
}
- // 按文本内容排序:接待、客户、我的
+ // 按文本内容排序:接待、客户、AI分析、我的
const sortedElements = tabElements.sort((a, b) => {
- const order = ['接待', '客户', '我的'];
+ const order = ['接待', '客户', 'AI分析', '我的'];
const aIndex = order.findIndex(text => a.textContent.includes(text));
const bIndex = order.findIndex(text => b.textContent.includes(text));
return aIndex - bIndex;
@@ -402,7 +418,7 @@ export default {
// 处理每个元素
sortedElements.forEach((element, index) => {
- const keyMap = ['furniture_reception', 'furniture_customer', 'ucenter'];
+ const keyMap = ['furniture_reception', 'furniture_customer', 'ai_analysis', 'ucenter'];
const key = keyMap[index];
const shouldShow = allowed.includes(key);
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.js
new file mode 100644
index 0000000..f7544c3
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ totalCustomers: "1,258",
+ todayCustomers: "23",
+ dataList: [
+ { date: "2024-02-07", description: "今日接待客户", count: "23" },
+ { date: "2024-02-06", description: "昨日接待客户", count: "31" },
+ { date: "2024-02-05", description: "前日接待客户", count: "28" },
+ { date: "2024-02-04", description: "工作日接待客户", count: "35" },
+ { date: "2024-02-03", description: "周末接待客户", count: "18" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.totalCustomers),
+ c: common_vendor.t($data.todayCustomers),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.date),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.count),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-e0c5faaf"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.wxml
new file mode 100644
index 0000000..1a3a07f
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.wxml
@@ -0,0 +1 @@
+{{b}}累计接待客户{{c}}今日接待客户接待趋势图📈 图表区域此处将显示客户接待趋势图表接待记录{{item.a}}{{item.b}}{{item.c}} 人
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.wxss
new file mode 100644
index 0000000..5f885f7
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/customer_count/customer_count.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-e0c5faaf {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-e0c5faaf {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-e0c5faaf {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-e0c5faaf {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-e0c5faaf {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-e0c5faaf {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-e0c5faaf {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-e0c5faaf {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-e0c5faaf {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-e0c5faaf:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-e0c5faaf {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #007aff;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-e0c5faaf {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-e0c5faaf, .data-list.data-v-e0c5faaf {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-e0c5faaf {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-e0c5faaf {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-e0c5faaf {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-e0c5faaf {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-e0c5faaf {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-e0c5faaf:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-e0c5faaf {
+ flex: 1;
+}
+.item-date.data-v-e0c5faaf {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-e0c5faaf {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-e0c5faaf {
+ text-align: right;
+}
+.item-count.data-v-e0c5faaf {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #007aff;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.js
new file mode 100644
index 0000000..308e3e2
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ conversionRate: "15.8",
+ totalDeals: "201",
+ dataList: [
+ { factor: "产品优势", description: "突出产品核心优势", percentage: "35.2" },
+ { factor: "价格优惠", description: "提供合适的价格优惠", percentage: "28.4" },
+ { factor: "服务质量", description: "优质的售后服务", percentage: "18.7" },
+ { factor: "客户关系", description: "良好的客户关系维护", percentage: "12.3" },
+ { factor: "竞争优势", description: "相对于竞品的优势", percentage: "5.4" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.conversionRate),
+ c: common_vendor.t($data.totalDeals),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.factor),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.percentage),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-92834624"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.wxml
new file mode 100644
index 0000000..8e88c37
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.wxml
@@ -0,0 +1 @@
+{{b}}%总体转化率{{c}}成交总数成交因素分析图📊 图表区域此处将显示成交归因分析图表关键成交因素{{item.a}}{{item.b}}{{item.c}}%
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.wxss
new file mode 100644
index 0000000..526e535
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/deal_attribution/deal_attribution.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-92834624 {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-92834624 {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-92834624 {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-92834624 {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-92834624 {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-92834624 {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-92834624 {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-92834624 {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-92834624 {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-92834624:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-92834624 {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #007aff;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-92834624 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-92834624, .data-list.data-v-92834624 {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-92834624 {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-92834624 {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-92834624 {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-92834624 {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-92834624 {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-92834624:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-92834624 {
+ flex: 1;
+}
+.item-date.data-v-92834624 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-92834624 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-92834624 {
+ text-align: right;
+}
+.item-percentage.data-v-92834624 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #007aff;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.js
new file mode 100644
index 0000000..befcb2c
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ highIntent: "23.5",
+ totalAnalyzed: "856",
+ dataList: [
+ { level: "高意向", description: "明确表示购买意愿", count: "201" },
+ { level: "中高意向", description: "有较强购买兴趣", count: "156" },
+ { level: "中意向", description: "有一定购买兴趣", count: "234" },
+ { level: "低意向", description: "购买意愿较低", count: "187" },
+ { level: "无意向", description: "暂无购买意愿", count: "78" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.highIntent),
+ c: common_vendor.t($data.totalAnalyzed),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.level),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.count),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-cafe1f39"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.wxml
new file mode 100644
index 0000000..03dbfe0
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.wxml
@@ -0,0 +1 @@
+{{b}}%高意向客户{{c}}已分析客户意向分布图📊 图表区域此处将显示客户意向分级分布图表意向等级详情{{item.a}}{{item.b}}{{item.c}} 人
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.wxss
new file mode 100644
index 0000000..d07a332
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/intent_level/intent_level.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-cafe1f39 {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-cafe1f39 {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-cafe1f39 {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-cafe1f39 {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-cafe1f39 {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-cafe1f39 {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-cafe1f39 {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-cafe1f39 {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-cafe1f39 {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-cafe1f39:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-cafe1f39 {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #007aff;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-cafe1f39 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-cafe1f39, .data-list.data-v-cafe1f39 {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-cafe1f39 {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-cafe1f39 {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-cafe1f39 {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-cafe1f39 {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-cafe1f39 {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-cafe1f39:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-cafe1f39 {
+ flex: 1;
+}
+.item-date.data-v-cafe1f39 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-cafe1f39 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-cafe1f39 {
+ text-align: right;
+}
+.item-count.data-v-cafe1f39 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #007aff;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.js
new file mode 100644
index 0000000..5a1f393
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ openingRate: "68.5",
+ totalConversations: "2,145",
+ dataList: [
+ { time: "9:00-11:00", description: "上午高峰时段", rate: "75.2" },
+ { time: "11:00-13:00", description: "午间时段", rate: "62.8" },
+ { time: "14:00-16:00", description: "下午时段", rate: "71.3" },
+ { time: "16:00-18:00", description: "晚高峰时段", rate: "69.7" },
+ { time: "整体平均", description: "全天平均开口率", rate: "68.5" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.openingRate),
+ c: common_vendor.t($data.totalConversations),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.time),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.rate),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-24524649"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.wxml
new file mode 100644
index 0000000..b2a175a
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.wxml
@@ -0,0 +1 @@
+{{b}}%平均开口率{{c}}总对话数开口率趋势图📈 图表区域此处将显示客户开口率趋势图表详细数据{{item.a}}{{item.b}}{{item.c}}%
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.wxss
new file mode 100644
index 0000000..fe861cc
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/opening_rate/opening_rate.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-24524649 {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-24524649 {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-24524649 {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-24524649 {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-24524649 {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-24524649 {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-24524649 {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-24524649 {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-24524649 {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-24524649:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-24524649 {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #007aff;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-24524649 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-24524649, .data-list.data-v-24524649 {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-24524649 {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-24524649 {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-24524649 {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-24524649 {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-24524649 {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-24524649:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-24524649 {
+ flex: 1;
+}
+.item-date.data-v-24524649 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-24524649 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-24524649 {
+ text-align: right;
+}
+.item-rate.data-v-24524649 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #007aff;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.js
new file mode 100644
index 0000000..92d51cb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ overCommitmentRate: "3.2",
+ totalIncidents: "42",
+ dataList: [
+ { employee: "张三", description: "承诺无法兑现的服务", count: "8" },
+ { employee: "李四", description: "超出权限的优惠承诺", count: "6" },
+ { employee: "王五", description: "虚假的产品性能承诺", count: "5" },
+ { employee: "赵六", description: "不切实际的交货时间承诺", count: "4" },
+ { employee: "孙七", description: "其他违规承诺", count: "19" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.overCommitmentRate),
+ c: common_vendor.t($data.totalIncidents),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.employee),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.count),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-d7fed9be"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.wxml
new file mode 100644
index 0000000..b292805
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.wxml
@@ -0,0 +1 @@
+{{b}}%过度承诺率{{c}}违规事件数过度承诺趋势图⚠️ 图表区域此处将显示过度承诺统计趋势图表违规记录{{item.a}}{{item.b}}{{item.c}} 次
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.wxss
new file mode 100644
index 0000000..103d952
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/over_commitment/over_commitment.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-d7fed9be {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-d7fed9be {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-d7fed9be {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-d7fed9be {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-d7fed9be {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-d7fed9be {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-d7fed9be {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-d7fed9be {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-d7fed9be {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-d7fed9be:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-d7fed9be {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #ff6b6b;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-d7fed9be {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-d7fed9be, .data-list.data-v-d7fed9be {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-d7fed9be {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-d7fed9be {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-d7fed9be {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-d7fed9be {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-d7fed9be {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-d7fed9be:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-d7fed9be {
+ flex: 1;
+}
+.item-date.data-v-d7fed9be {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-d7fed9be {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-d7fed9be {
+ text-align: right;
+}
+.item-count.data-v-d7fed9be {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #ff6b6b;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.js
new file mode 100644
index 0000000..c396a7b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ coverageRate: "87.5",
+ todayCoverage: "92.3",
+ dataList: [
+ { date: "2024-02-07", description: "今日质检覆盖率", rate: "92.3" },
+ { date: "2024-02-06", description: "昨日质检覆盖率", rate: "89.1" },
+ { date: "2024-02-05", description: "前日质检覆盖率", rate: "85.7" },
+ { date: "2024-02-04", description: "工作日平均覆盖率", rate: "88.4" },
+ { date: "2024-02-03", description: "周末覆盖率", rate: "91.2" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.coverageRate),
+ c: common_vendor.t($data.todayCoverage),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.date),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.rate),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-ef31f941"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.wxml
new file mode 100644
index 0000000..8d5a464
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.wxml
@@ -0,0 +1 @@
+{{b}}%总体覆盖率{{c}}%今日覆盖率覆盖率趋势图📊 图表区域此处将显示质检覆盖率趋势图表详细数据{{item.a}}{{item.b}}{{item.c}}%
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.wxss
new file mode 100644
index 0000000..a847ddf
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/quality_coverage/quality_coverage.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-ef31f941 {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-ef31f941 {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-ef31f941 {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-ef31f941 {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-ef31f941 {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-ef31f941 {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-ef31f941 {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-ef31f941 {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-ef31f941 {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-ef31f941:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-ef31f941 {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #007aff;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-ef31f941 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-ef31f941, .data-list.data-v-ef31f941 {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-ef31f941 {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-ef31f941 {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-ef31f941 {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-ef31f941 {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-ef31f941 {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-ef31f941:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-ef31f941 {
+ flex: 1;
+}
+.item-date.data-v-ef31f941 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-ef31f941 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-ef31f941 {
+ text-align: right;
+}
+.item-rate.data-v-ef31f941 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #007aff;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.js
new file mode 100644
index 0000000..7be11f4
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ totalDuration: "125.5 小时",
+ todayDuration: "8.2 小时",
+ dataList: [
+ { date: "2024-02-07", description: "客户咨询录音", duration: "2.5 小时" },
+ { date: "2024-02-06", description: "销售洽谈录音", duration: "3.2 小时" },
+ { date: "2024-02-05", description: "培训录音", duration: "1.8 小时" },
+ { date: "2024-02-04", description: "会议录音", duration: "4.1 小时" },
+ { date: "2024-02-03", description: "客户反馈录音", duration: "2.9 小时" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.totalDuration),
+ c: common_vendor.t($data.todayDuration),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.date),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.duration),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-582d7c51"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.wxml
new file mode 100644
index 0000000..4bc3750
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.wxml
@@ -0,0 +1 @@
+{{b}}总录音时长{{c}}今日录音时长时长趋势图📊 图表区域此处将显示录音时长趋势图表详细数据{{item.a}}{{item.b}}{{item.c}}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.wxss
new file mode 100644
index 0000000..1ca83f4
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/recording_duration/recording_duration.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-582d7c51 {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-582d7c51 {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-582d7c51 {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-582d7c51 {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-582d7c51 {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-582d7c51 {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-582d7c51 {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-582d7c51 {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-582d7c51 {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-582d7c51:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-582d7c51 {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #007aff;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-582d7c51 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-582d7c51, .data-list.data-v-582d7c51 {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-582d7c51 {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-582d7c51 {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-582d7c51 {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-582d7c51 {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-582d7c51 {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-582d7c51:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-582d7c51 {
+ flex: 1;
+}
+.item-date.data-v-582d7c51 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-582d7c51 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-582d7c51 {
+ text-align: right;
+}
+.item-duration.data-v-582d7c51 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #007aff;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.js
new file mode 100644
index 0000000..d144708
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.js
@@ -0,0 +1,38 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ redLineIncidents: "18",
+ criticalRate: "72.2",
+ dataList: [
+ { violation: "严重违规", description: "违反法律法规或公司核心政策", count: "13" },
+ { violation: "中等违规", description: "违反公司管理制度", count: "4" },
+ { violation: "轻微违规", description: "违反工作流程规范", count: "1" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.redLineIncidents),
+ c: common_vendor.t($data.criticalRate),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.violation),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.count),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-944b0424"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.wxml
new file mode 100644
index 0000000..5989fbb
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.wxml
@@ -0,0 +1 @@
+{{b}}红线事件总数{{c}}%严重程度比例红线触及趋势图🚨 图表区域此处将显示触及红线统计趋势图表红线事件详情{{item.a}}{{item.b}}{{item.c}} 次
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.wxss
new file mode 100644
index 0000000..77e74d1
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/red_line_touch/red_line_touch.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-944b0424 {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-944b0424 {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-944b0424 {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-944b0424 {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-944b0424 {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-944b0424 {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-944b0424 {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-944b0424 {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-944b0424 {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-944b0424:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-944b0424 {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #dc3545;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-944b0424 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-944b0424, .data-list.data-v-944b0424 {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-944b0424 {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-944b0424 {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-944b0424 {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-944b0424 {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-944b0424 {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-944b0424:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-944b0424 {
+ flex: 1;
+}
+.item-date.data-v-944b0424 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-944b0424 {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-944b0424 {
+ text-align: right;
+}
+.item-count.data-v-944b0424 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #dc3545;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.js b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.js
new file mode 100644
index 0000000..2f0aaea
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.js
@@ -0,0 +1,40 @@
+"use strict";
+const common_vendor = require("../../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ return {
+ averageScore: "4.2",
+ totalEvaluations: "1,256",
+ dataList: [
+ { employee: "张三", description: "销售沟通评分", score: "4.5" },
+ { employee: "李四", description: "客户服务评分", score: "4.1" },
+ { employee: "王五", description: "产品介绍评分", score: "4.3" },
+ { employee: "赵六", description: "售后服务评分", score: "3.9" },
+ { employee: "孙七", description: "投诉处理评分", score: "4.0" }
+ ]
+ };
+ },
+ methods: {
+ goBack() {
+ common_vendor.index.navigateBack();
+ }
+ }
+};
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o((...args) => $options.goBack && $options.goBack(...args)),
+ b: common_vendor.t($data.averageScore),
+ c: common_vendor.t($data.totalEvaluations),
+ d: common_vendor.f($data.dataList, (item, index, i0) => {
+ return {
+ a: common_vendor.t(item.employee),
+ b: common_vendor.t(item.description),
+ c: common_vendor.t(item.score),
+ d: index
+ };
+ })
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-78f32b4f"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../../.sourcemap/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.json b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.json
new file mode 100644
index 0000000..ced5b27
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.json
@@ -0,0 +1,4 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {}
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.wxml b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.wxml
new file mode 100644
index 0000000..b594794
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.wxml
@@ -0,0 +1 @@
+{{b}}平均评分{{c}}总评价次数评分趋势图📈 图表区域此处将显示员工话术评分趋势图表评分详情{{item.a}}{{item.b}}{{item.c}}/5.0
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.wxss b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.wxss
new file mode 100644
index 0000000..23fe41b
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages-subpackage/ai_features/speech_rating/speech_rating.wxss
@@ -0,0 +1,127 @@
+
+.feature-page.data-v-78f32b4f {
+ min-height: 100vh;
+ background: #f8f9fa;
+}
+.page-header.data-v-78f32b4f {
+ background: #ffffff;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.nav-bar.data-v-78f32b4f {
+ display: flex;
+ align-items: center;
+ height: 88rpx;
+ padding: 0 30rpx;
+}
+.nav-left.data-v-78f32b4f {
+ width: 60rpx;
+ height: 60rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-right: 20rpx;
+}
+.back-icon.data-v-78f32b4f {
+ font-size: 36rpx;
+ color: #333333;
+}
+.nav-title.data-v-78f32b4f {
+ flex: 1;
+ text-align: center;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+}
+.content-scroll.data-v-78f32b4f {
+ height: calc(100vh - 88rpx);
+}
+.stats-card.data-v-78f32b4f {
+ display: flex;
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ padding: 40rpx 30rpx;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.stat-item.data-v-78f32b4f {
+ flex: 1;
+ text-align: center;
+}
+.stat-item.data-v-78f32b4f:not(:last-child) {
+ border-right: 1rpx solid #e9ecef;
+}
+.stat-value.data-v-78f32b4f {
+ display: block;
+ font-size: 48rpx;
+ font-weight: bold;
+ color: #007aff;
+ margin-bottom: 10rpx;
+}
+.stat-label.data-v-78f32b4f {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.chart-section.data-v-78f32b4f, .data-list.data-v-78f32b4f {
+ margin: 20rpx 30rpx;
+ background: #ffffff;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+}
+.section-title.data-v-78f32b4f {
+ display: block;
+ font-size: 32rpx;
+ font-weight: bold;
+ color: #333333;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #e9ecef;
+}
+.chart-placeholder.data-v-78f32b4f {
+ padding: 80rpx 30rpx;
+ text-align: center;
+}
+.placeholder-text.data-v-78f32b4f {
+ display: block;
+ font-size: 48rpx;
+ margin-bottom: 20rpx;
+}
+.placeholder-desc.data-v-78f32b4f {
+ display: block;
+ font-size: 28rpx;
+ color: #666666;
+}
+.list-item.data-v-78f32b4f {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 30rpx;
+ border-bottom: 1rpx solid #f0f0f0;
+}
+.list-item.data-v-78f32b4f:last-child {
+ border-bottom: none;
+}
+.item-left.data-v-78f32b4f {
+ flex: 1;
+}
+.item-date.data-v-78f32b4f {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #333333;
+ margin-bottom: 8rpx;
+}
+.item-desc.data-v-78f32b4f {
+ display: block;
+ font-size: 24rpx;
+ color: #666666;
+}
+.item-right.data-v-78f32b4f {
+ text-align: right;
+}
+.item-score.data-v-78f32b4f {
+ display: block;
+ font-size: 28rpx;
+ font-weight: bold;
+ color: #007aff;
+}
diff --git a/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.js b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.js
new file mode 100644
index 0000000..97ed7c8
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.js
@@ -0,0 +1,172 @@
+"use strict";
+const common_vendor = require("../../common/vendor.js");
+const _sfc_main = {
+ data() {
+ const systemInfo = common_vendor.index.getSystemInfoSync();
+ const statusBarHeight = systemInfo.statusBarHeight || 20;
+ const navbarHeight = 44;
+ const statusBarHeightRpx = statusBarHeight * 2;
+ const navbarHeightRpx = navbarHeight * 2;
+ const totalNavbarHeight = statusBarHeightRpx + navbarHeightRpx;
+ return {
+ contentTop: totalNavbarHeight + "rpx",
+ // 内容区域距离顶部的距离
+ contentBottom: "96rpx"
+ // 内容区域距离底部的距离(默认值,会在 onReady 中更新)
+ };
+ },
+ computed: {
+ // 计算内容区域的位置(使用计算属性确保响应式)
+ computedContentTop() {
+ const systemInfo = common_vendor.index.getSystemInfoSync();
+ const statusBarHeight = systemInfo.statusBarHeight || 20;
+ const navbarHeight = 44;
+ const statusBarHeightRpx = statusBarHeight * 2;
+ const navbarHeightRpx = navbarHeight * 2;
+ const totalNavbarHeight = statusBarHeightRpx + navbarHeightRpx;
+ return totalNavbarHeight + "rpx";
+ }
+ },
+ onLoad() {
+ this.updateNavbarPosition();
+ },
+ onShow() {
+ this.$nextTick(() => {
+ this.updateNavbarPosition();
+ setTimeout(() => {
+ this.updateNavbarPosition();
+ }, 50);
+ });
+ },
+ onReady() {
+ this.$nextTick(() => {
+ const query = common_vendor.index.createSelectorQuery().in(this);
+ query.select(".uni-navbar__content").boundingClientRect((data) => {
+ if (data && data.height) {
+ const actualHeight = data.height;
+ const actualHeightRpx = actualHeight * 2;
+ const adjustedHeight = Math.max(actualHeightRpx - 4, 0);
+ this.$set(this, "contentTop", adjustedHeight + "rpx");
+ common_vendor.index.__f__("log", "at pages/ai_analysis/ai_analysis.vue:175", "[AIAnalysis] 使用实际导航栏高度:", actualHeight, "px =", actualHeightRpx, "rpx, 调整后:", adjustedHeight, "rpx");
+ } else {
+ const systemInfo = common_vendor.index.getSystemInfoSync();
+ const statusBarHeight = systemInfo.statusBarHeight || 20;
+ const navbarHeight = 44;
+ const statusBarHeightRpx = statusBarHeight * 2;
+ const navbarHeightRpx = navbarHeight * 2;
+ const totalNavbarHeight = statusBarHeightRpx + navbarHeightRpx;
+ const adjustedHeight = Math.max(totalNavbarHeight - 4, 0);
+ this.$set(this, "contentTop", adjustedHeight + "rpx");
+ }
+ }).exec();
+ const queryTabbar = common_vendor.index.createSelectorQuery().in(this);
+ queryTabbar.select(".tabbar").boundingClientRect((tabbarData) => {
+ if (tabbarData && tabbarData.height) {
+ const tabbarHeight = tabbarData.height;
+ const tabbarHeightRpx = tabbarHeight * 2;
+ const adjustedBottom = Math.max(tabbarHeightRpx - 4, 0);
+ this.$set(this, "contentBottom", adjustedBottom + "rpx");
+ common_vendor.index.__f__("log", "at pages/ai_analysis/ai_analysis.vue:199", "[AIAnalysis] 使用实际tabbar高度:", tabbarHeight, "px =", tabbarHeightRpx, "rpx, 调整后:", adjustedBottom, "rpx");
+ } else {
+ this.$set(this, "contentBottom", "96rpx");
+ }
+ }).exec();
+ setTimeout(() => {
+ const query2 = common_vendor.index.createSelectorQuery().in(this);
+ query2.select(".uni-navbar__content").boundingClientRect((data) => {
+ if (data && data.height) {
+ const actualHeight = data.height;
+ const actualHeightRpx = actualHeight * 2;
+ const adjustedHeight = Math.max(actualHeightRpx - 4, 0);
+ this.$set(this, "contentTop", adjustedHeight + "rpx");
+ common_vendor.index.__f__("log", "at pages/ai_analysis/ai_analysis.vue:217", "[AIAnalysis] 延迟更新导航栏高度:", actualHeight, "px =", actualHeightRpx, "rpx, 调整后:", adjustedHeight, "rpx");
+ }
+ }).exec();
+ const queryTabbar2 = common_vendor.index.createSelectorQuery().in(this);
+ queryTabbar2.select(".tabbar").boundingClientRect((tabbarData) => {
+ if (tabbarData && tabbarData.height) {
+ const tabbarHeight = tabbarData.height;
+ const tabbarHeightRpx = tabbarHeight * 2;
+ const adjustedBottom = Math.max(tabbarHeightRpx - 4, 0);
+ this.$set(this, "contentBottom", adjustedBottom + "rpx");
+ common_vendor.index.__f__("log", "at pages/ai_analysis/ai_analysis.vue:229", "[AIAnalysis] 延迟更新tabbar高度:", tabbarHeight, "px =", tabbarHeightRpx, "rpx, 调整后:", adjustedBottom, "rpx");
+ }
+ }).exec();
+ }, 200);
+ });
+ },
+ methods: {
+ // 计算并更新导航栏和内容区域的位置
+ updateNavbarPosition() {
+ const systemInfo = common_vendor.index.getSystemInfoSync();
+ const statusBarHeight = systemInfo.statusBarHeight || 20;
+ const navbarHeight = 44;
+ const statusBarHeightRpx = statusBarHeight * 2;
+ const navbarHeightRpx = navbarHeight * 2;
+ const totalNavbarHeight = statusBarHeightRpx + navbarHeightRpx;
+ const contentTop = totalNavbarHeight + "rpx";
+ this.$set(this, "contentTop", contentTop);
+ this.$forceUpdate();
+ },
+ goBack() {
+ const pages = getCurrentPages();
+ if (pages.length <= 1) {
+ common_vendor.index.__f__("log", "at pages/ai_analysis/ai_analysis.vue:258", "[AIAnalysis][goBack] 当前是第一个页面,无法返回");
+ return;
+ }
+ common_vendor.index.navigateBack({
+ fail: (err) => {
+ common_vendor.index.__f__("error", "at pages/ai_analysis/ai_analysis.vue:263", "[AIAnalysis][goBack] 返回失败:", err);
+ }
+ });
+ },
+ navigateToPage(pageName) {
+ const pagePath = `pages-subpackage/ai_features/${pageName}/${pageName}`;
+ common_vendor.index.navigateTo({
+ url: `/${pagePath}`,
+ fail: (err) => {
+ common_vendor.index.__f__("error", "at pages/ai_analysis/ai_analysis.vue:272", "导航失败:", err);
+ common_vendor.index.showToast({
+ title: "页面跳转失败",
+ icon: "none"
+ });
+ }
+ });
+ }
+ }
+};
+if (!Array) {
+ const _easycom_uni_nav_bar2 = common_vendor.resolveComponent("uni-nav-bar");
+ _easycom_uni_nav_bar2();
+}
+const _easycom_uni_nav_bar = () => "../../uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.js";
+if (!Math) {
+ _easycom_uni_nav_bar();
+}
+function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
+ return {
+ a: common_vendor.o($options.goBack),
+ b: common_vendor.p({
+ fixed: true,
+ statusBar: true,
+ title: "AI销冠系统",
+ leftIcon: "left",
+ color: "#333",
+ backgroundColor: "#FFFFFF"
+ }),
+ c: common_vendor.o(($event) => $options.navigateToPage("recording_duration")),
+ d: common_vendor.o(($event) => $options.navigateToPage("customer_count")),
+ e: common_vendor.o(($event) => $options.navigateToPage("quality_coverage")),
+ f: common_vendor.o(($event) => $options.navigateToPage("speech_rating")),
+ g: common_vendor.o(($event) => $options.navigateToPage("intent_level")),
+ h: common_vendor.o(($event) => $options.navigateToPage("deal_attribution")),
+ i: common_vendor.o(($event) => $options.navigateToPage("opening_rate")),
+ j: common_vendor.o(($event) => $options.navigateToPage("over_commitment")),
+ k: common_vendor.o(($event) => $options.navigateToPage("red_line_touch")),
+ l: $options.computedContentTop || $data.contentTop,
+ m: $data.contentBottom || "96rpx"
+ };
+}
+const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-8462a2f1"]]);
+wx.createPage(MiniProgramPage);
+//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/ai_analysis/ai_analysis.js.map
diff --git a/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.json b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.json
new file mode 100644
index 0000000..af4bb32
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.json
@@ -0,0 +1,6 @@
+{
+ "navigationStyle": "custom",
+ "usingComponents": {
+ "uni-nav-bar": "../../uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar"
+ }
+}
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.wxml b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.wxml
new file mode 100644
index 0000000..0616d41
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.wxml
@@ -0,0 +1 @@
+⏱️录音时长统计录音总时长👥接待客户数统计接待客户数量🎯质检覆盖率质检录音覆盖统计🗣️员工话术评分员工沟通质量评分🎯客户意向分级客户购买意向分析💰成交归因成交成功因素分析🚪开口率客户主动开口统计🚨过度承诺统计监控过度承诺情况🔴触及红线统计违规行为监控统计
\ No newline at end of file
diff --git a/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.wxss b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.wxss
new file mode 100644
index 0000000..d9205bc
--- /dev/null
+++ b/unpackage/dist/dev/mp-weixin/pages/ai_analysis/ai_analysis.wxss
@@ -0,0 +1,161 @@
+
+page.data-v-8462a2f1 {
+ background-color: #F5F5F5;
+}
+.page.data-v-8462a2f1 {
+ min-height: 100vh;
+ background-color: #F5F5F5;
+}
+.content.data-v-8462a2f1 {
+ padding-top: 0 !important;
+ margin-top: 0 !important;
+ position: relative;
+ min-height: 100vh;
+ /* 确保内容从顶部开始,不受占位符影响 */
+ top: 0;
+}
+
+/* 隐藏导航栏占位区域,避免产生空白 */
+.data-v-8462a2f1 .uni-navbar__placeholder {
+ display: none !important;
+ height: 0 !important;
+}
+.data-v-8462a2f1 .uni-navbar__placeholder-view {
+ display: none !important;
+ height: 0 !important;
+}
+
+/* 隐藏底部 tabBar 占位区域,避免产生空白(类似顶部导航栏的处理方式) */
+/* 注意:只隐藏占位符,不隐藏实际的 tabbar */
+.data-v-8462a2f1 [class*="tabbar"][class*="placeholder"] {
+ display: none !important;
+ height: 0 !important;
+}
+
+/* 隐藏可能的页面底部安全区域占位符 */
+.data-v-8462a2f1 [class*="safe-area"][class*="bottom"],.data-v-8462a2f1 [class*="bottom"][class*="safe"] {
+ display: none !important;
+ height: 0 !important;
+}
+.content-scroll.data-v-8462a2f1 {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0; /* 先从顶部开始 */
+ bottom: 0; /* 先设为0,通过查询实际高度动态设置 */
+ /* top值通过内联样式动态设置,覆盖上面的 top: 0 */
+ padding: 0 !important;
+ padding-bottom: 0 !important;
+ margin: 0 !important;
+ box-sizing: border-box;
+}
+
+/* 确保scroll-view内部没有默认间距 */
+.content-scroll > view.data-v-8462a2f1 {
+ margin-top: 0;
+ padding-top: 0;
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+.category-section.data-v-8462a2f1 {
+ margin: 20rpx 30rpx;
+ background: #FFFFFF;
+ border-radius: 16rpx;
+ overflow: hidden;
+ box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
+}
+.category-section.data-v-8462a2f1:first-child {
+ margin-top: 0;
+}
+.category-section.data-v-8462a2f1:last-child {
+ margin-bottom: 0;
+}
+.category-header.data-v-8462a2f1 {
+ display: flex;
+ align-items: center;
+ padding: 30rpx;
+ background: #FFFFFF;
+ border-bottom: 1rpx solid #F0F0F0;
+}
+.category-icon.data-v-8462a2f1 {
+ font-size: 32rpx;
+ margin-right: 20rpx;
+}
+.category-title.data-v-8462a2f1 {
+ font-size: 32rpx;
+ font-weight: 500;
+ color: #333;
+}
+.function-grid.data-v-8462a2f1 {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 10rpx;
+}
+
+/* 两列布局的分类 */
+.two-column .function-item.data-v-8462a2f1 {
+ flex: 1;
+ background: #FFFFFF;
+ border-radius: 12rpx;
+ padding: 24rpx 16rpx;
+ margin: 0 5rpx;
+ text-align: center;
+ box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.04);
+ transition: all 0.3s ease;
+ border: 1rpx solid #F0F0F0;
+}
+
+/* 三列布局的分类 */
+.three-column .function-item.data-v-8462a2f1 {
+ width: 31%;
+ background: #FFFFFF;
+ border-radius: 12rpx;
+ padding: 24rpx 12rpx;
+ margin: 1%;
+ text-align: center;
+ box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.04);
+ transition: all 0.3s ease;
+ border: 1rpx solid #F0F0F0;
+}
+
+/* 销售分析:所有项目统一宽度(50%) */
+.sales-analysis .function-item.full-row-item.data-v-8462a2f1 {
+ flex: 1;
+ width: calc(50% - 10rpx);
+ background: #FFFFFF;
+ border-radius: 12rpx;
+ padding: 24rpx 16rpx;
+ margin: 0 5rpx;
+ text-align: center;
+ box-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.04);
+ transition: all 0.3s ease;
+ border: 1rpx solid #F0F0F0;
+}
+
+/* 销售分析:开口率单独一行,但保持50%宽度 */
+.sales-analysis .function-item.new-line-item.data-v-8462a2f1 {
+ flex-basis: 100%;
+ width: calc(50% - 10rpx);
+ margin-top: 10rpx;
+}
+.function-item.data-v-8462a2f1:active {
+ transform: scale(0.95);
+ box-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.1);
+}
+.function-icon.data-v-8462a2f1 {
+ font-size: 48rpx;
+ margin-bottom: 12rpx;
+}
+.function-name.data-v-8462a2f1 {
+ display: block;
+ font-size: 28rpx;
+ font-weight: 500;
+ color: #333;
+ margin-bottom: 8rpx;
+}
+.function-desc.data-v-8462a2f1 {
+ display: block;
+ font-size: 24rpx;
+ color: #666;
+ line-height: 1.4;
+}
diff --git a/unpackage/dist/dev/mp-weixin/static/tabbar/ai_analysis.png b/unpackage/dist/dev/mp-weixin/static/tabbar/ai_analysis.png
new file mode 100644
index 0000000..0ec5081
Binary files /dev/null and b/unpackage/dist/dev/mp-weixin/static/tabbar/ai_analysis.png differ
diff --git a/unpackage/dist/dev/mp-weixin/static/tabbar/ai_analysis_active.png b/unpackage/dist/dev/mp-weixin/static/tabbar/ai_analysis_active.png
new file mode 100644
index 0000000..9b752c7
Binary files /dev/null and b/unpackage/dist/dev/mp-weixin/static/tabbar/ai_analysis_active.png differ