From 5ff42dbbad06f42b1605984d3ab96eea0c464147 Mon Sep 17 00:00:00 2001 From: lbw_9527443 <780139497@qq.com> Date: Fri, 7 Nov 2025 20:53:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(api):=20=E4=BF=AE=E6=AD=A3=E4=BA=8C?= =?UTF-8?q?=E9=98=B6=E5=88=86=E6=9E=90=E6=8A=A5=E5=91=8A=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor(views): 重构阶段分析报告展示逻辑,使用新接口数据格式 feat(analytics): 添加umami网站统计脚本 feat(api): 新增优秀录音文件获取接口 style(views): 优化分析报告样式和布局 --- my-vue-app/index.html | 1 + my-vue-app/src/api/api.js | 2 +- my-vue-app/src/api/manager.js | 4 +- my-vue-app/src/api/senorManger.js | 5 +- .../maneger/components/MemberDetails.vue | 203 +++++++++--------- .../person/components/PersonalDashboard.vue | 120 ++++------- .../src/views/senorManger/seniorManager.vue | 7 +- 7 files changed, 157 insertions(+), 185 deletions(-) diff --git a/my-vue-app/index.html b/my-vue-app/index.html index 2acdebf..13c8d6f 100644 --- a/my-vue-app/index.html +++ b/my-vue-app/index.html @@ -5,6 +5,7 @@ Vite + Vue +
diff --git a/my-vue-app/src/api/api.js b/my-vue-app/src/api/api.js index 01b0da4..dc0db83 100644 --- a/my-vue-app/src/api/api.js +++ b/my-vue-app/src/api/api.js @@ -84,5 +84,5 @@ export const getCallSuccessRate = (params) => { // 二阶分析报告 export const getSecondOrderAnalysisReport = (params) => { - return https.post('/api/v1/sales/get_call_text', params) + return https.post('/api/v1/sales/get_second_analysis_report', params) } \ No newline at end of file diff --git a/my-vue-app/src/api/manager.js b/my-vue-app/src/api/manager.js index 1de993a..d4da093 100644 --- a/my-vue-app/src/api/manager.js +++ b/my-vue-app/src/api/manager.js @@ -44,9 +44,9 @@ export const getGroupDetail = (params) => { export const getGroupCallDuration = (params) => { return https.post('/api/v1/manager/group_call_duration', params) } -// 二二阶分析报告 /api/v1/sales/get_call_text +// 二阶分析报告 /api/v1/sales/get_call_text export const GetSecondOrderAnalysisReport = (params) => { - return https.post('/api/v1/manager/group_call_text', params) + return https.post('/api/v1/manager/group_second_report', params) } // 通话分类数据 /api/v1/manager/get_member_call_classify diff --git a/my-vue-app/src/api/senorManger.js b/my-vue-app/src/api/senorManger.js index 4936e8d..492bae9 100644 --- a/my-vue-app/src/api/senorManger.js +++ b/my-vue-app/src/api/senorManger.js @@ -79,6 +79,9 @@ export const getTeamManyTarget = (params) => { return https.post('/api/v1/level_three/overview/get_team_many_target', params) } - +// 优秀录音 /api/v1/level_three/overview/get_current_center_excellent_record_file +export const getExcellentRecordFile = (params) => { + return https.post('/api/v1/level_three/overview/get_current_center_excellent_record_file', params) +} diff --git a/my-vue-app/src/views/maneger/components/MemberDetails.vue b/my-vue-app/src/views/maneger/components/MemberDetails.vue index fa39b26..a4321d2 100644 --- a/my-vue-app/src/views/maneger/components/MemberDetails.vue +++ b/my-vue-app/src/views/maneger/components/MemberDetails.vue @@ -85,11 +85,6 @@

💡 指导建议

-
- - - -
@@ -99,27 +94,17 @@
-
正在生成分析报告...
-
{{ analysisReport }}
-
- - -
-
-
-
- {{ guidance.icon }} -
-
-

{{ guidance.title }}

-

{{ guidance.description }}

-
- 建议行动: - {{ guidance.action }} -
-
+
正在生成分析报告...
+
+ 暂无分析报告数据 +
+
+
+

{{ report.name }} ({{ report.start_time }} - {{ report.end_time }})

+
+
{{ analysisReport }}
@@ -224,53 +209,6 @@ const processedCallStats = computed(() => { })).sort((a, b) => b.count - a.count); // 按通话次数降序排列 }); - -// 切换分析周期 -const switchAnalysisPeriod = (period) => { - analysisPeriod.value = period - CenterGetSecondOrderAnalysisReport(analysisPeriod.value) -} - -// 获取二阶分析报告 -async function CenterGetSecondOrderAnalysisReport(time) { - if (!chatService_02.value) { - chatService_02.value = new SimpleChatService('app-MGaBOx5QFblsMZ7dSkxKJDKm') - } - - isReportLoading.value = true - analysisReport.value = '' - - try { - const params = { - user_name: props.memberDetails?.user_name, - time: time - } - const response = await GetSecondOrderAnalysisReport(params) - - if (!response.data.records || response.data.records.length === 0) { - analysisReport.value = '当前周期暂无数据可供分析。' - isReportLoading.value = false - return - } - - const records = response.data.records.join('\n') - - chatService_02.value.sendMessage( - records, - (update) => { - analysisReport.value = update.content - }, - () => { - isReportLoading.value = false - } - ) - } catch (error) { - console.error('获取二阶分析报告失败:', error) - analysisReport.value = '获取分析报告失败,请稍后重试。' - isReportLoading.value = false - } -} - // 切换指导建议折叠状态 const toggleGuidanceCollapse = () => { isGuidanceCollapsed.value = !isGuidanceCollapsed.value @@ -293,31 +231,6 @@ const hideTooltip = () => { tooltip.visible = false } -// 获取成员指导建议 -const getGuidanceForMember = (member) => { - const guidance = [] - if (!member) return guidance; - - // 业绩相关建议 - if (member.month_order_count === 0) { - guidance.push({ type: 'urgent', icon: '🚨', title: '业绩突破', description: '当前还未有成交记录,需要重点关注转化技巧和客户跟进。', action: '建议参加销售技巧培训,加强客户需求挖掘' }) - } else if (member.month_order_count < 5) { - guidance.push({ type: 'warning', icon: '📈', title: '业绩提升', description: '业绩有提升空间,可以通过优化沟通策略来提高转化率。', action: '分析高业绩同事的沟通技巧,制定个人提升计划' }) - } - - // 转化率相关建议 - if (member.conversion < 3.0) { - guidance.push({ type: 'urgent', icon: '🎯', title: '转化率优化', description: '转化率偏低,需要提升客户沟通和需求挖掘能力。', action: '重点学习客户心理分析和异议处理技巧' }) - } - - // 通话相关建议 - if (member.call_count < 100) { - guidance.push({ type: 'warning', icon: '📞', title: '通话量提升', description: '通话量偏少,增加客户接触频次有助于提升业绩。', action: '制定每日通话计划,确保充足的客户接触量' }) - } - - return guidance.slice(0, 3); -} - // 【修改】函数现在从API获取数据并更新内部状态 async function updateCallClassificationData() { if (props.selectedMember && props.selectedMember.user_name) { @@ -325,6 +238,7 @@ async function updateCallClassificationData() { const response = await getMemberCallClassify({ user_name: props.selectedMember.user_name }); + console.log('获取通话分类数据:', response.data); // 将获取到的数据赋值给内部状态 callClassificationData.value = { call_count_by_tag: response.call_count_by_tag || {}, @@ -341,14 +255,33 @@ async function updateCallClassificationData() { } } +// 获取二阶分析报告数据 +async function fetchAnalysisReport() { + if (props.selectedMember && props.selectedMember.user_name) { + isReportLoading.value = true; + try { + const response = await GetSecondOrderAnalysisReport({ + user_name: props.selectedMember.user_name + }); + console.log('获取分析报告数据:', response.data); + // 将获取到的数据赋值给分析报告变量 + analysisReport.value = response.data; + } catch (error) { + console.error('获取分析报告失败:', error); + analysisReport.value = ''; + } finally { + isReportLoading.value = false; + } + } +} + // 监听selectedMember变化 watch(() => props.selectedMember, (newMember) => { if (newMember) { // 成员变化时,获取新的通话分类数据 - updateCallClassificationData(); - // 同时获取新的分析报告 - CenterGetSecondOrderAnalysisReport(analysisPeriod.value); - + updateCallClassificationData(); + // 获取分析报告数据 + fetchAnalysisReport(); // 重置滚动位置 nextTick(() => { const container = document.querySelector('.member-details') @@ -656,14 +589,80 @@ watch(() => props.selectedMember, (newMember) => { border: 1px solid #e2e8f0; min-height: 100px; - .loading { + .loading-message { text-align: center; color: #64748b; font-style: italic; padding: 1rem; } - .report-content { + .empty-message { + text-align: center; + color: #94a3b8; + padding: 2rem; + font-style: italic; + } + + .report-section { + margin-bottom: 1.5rem; + padding-bottom: 1.5rem; + border-bottom: 1px dashed #e2e8f0; + + &:last-child { + margin-bottom: 0; + padding-bottom: 0; + border-bottom: none; + } + + .report-title { + font-size: 1rem; + font-weight: 600; + color: #1e293b; + margin: 0 0 0.75rem 0; + padding: 0.5rem 0.75rem; + background: #ffffff; + border-left: 3px solid #3b82f6; + border-radius: 2px; + } + + .report-content { + white-space: pre-wrap; + line-height: 1.6; + color: #334155; + font-size: 0.9rem; + padding: 0 0.5rem; + + h1, h2, h3 { + color: #1e293b; + margin: 1.25rem 0 0.75rem 0; + } + + h3 { + font-size: 1.1rem; + border-bottom: 1px solid #e2e8f0; + padding-bottom: 0.25rem; + } + + p { + margin: 0.5rem 0; + } + + ul, ol { + margin: 0.75rem 0; + padding-left: 1.5rem; + } + + li { + margin: 0.25rem 0; + } + + strong { + font-weight: 600; + } + } + } + + .report-content:not(.report-section .report-content) { white-space: pre-wrap; line-height: 1.5; color: #1e293b; diff --git a/my-vue-app/src/views/person/components/PersonalDashboard.vue b/my-vue-app/src/views/person/components/PersonalDashboard.vue index dadfb84..78a6659 100644 --- a/my-vue-app/src/views/person/components/PersonalDashboard.vue +++ b/my-vue-app/src/views/person/components/PersonalDashboard.vue @@ -111,33 +111,19 @@ - +
{ const res = await getExcellentRecordFile(params); + console.log(6666666666,res); return res.data; }); excellentRecord.value = result;