From 74aa6c323560890429c24829cd06e5c4f57c1791 Mon Sep 17 00:00:00 2001 From: lbw_9527443 <780139497@qq.com> Date: Fri, 15 Aug 2025 21:36:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(secondTop):=20=E4=BC=98=E5=8C=96=E5=9B=A2?= =?UTF-8?q?=E9=98=9F=E6=88=90=E5=91=98=E5=B1=95=E7=A4=BA=E5=92=8C=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor(sale): 调整数据分析区域布局和样式 fix(router): 移除路由元信息注释 style(StatisticData): 调整统计卡片网格布局 feat(api): 新增顶级管理接口文件 --- my-vue-app/src/api/top.js | 68 ++++++++++ my-vue-app/src/router/index.js | 12 +- .../views/person/components/StatisticData.vue | 2 +- my-vue-app/src/views/person/sale.vue | 90 ++++--------- my-vue-app/src/views/secondTop/secondTop.vue | 121 +++++++++--------- 5 files changed, 157 insertions(+), 136 deletions(-) create mode 100644 my-vue-app/src/api/top.js diff --git a/my-vue-app/src/api/top.js b/my-vue-app/src/api/top.js new file mode 100644 index 0000000..ed3dff5 --- /dev/null +++ b/my-vue-app/src/api/top.js @@ -0,0 +1,68 @@ +import https from '../utils/https' + +// 获取全公司当月单数、当月完成度及其与上月对比情况 /api/v1/level_five/overview/overall_company_performance +export const getOverallCompanyPerformance = () => { + return https.get('/api/v1/level_five/overview/overall_company_performance') +} + +// 获取全公司当月定金转化率、上月定金转化率以及对比情况 /api/v1/level_five/overview/company_deposit_conversion_rate +export const getCompanyDepositConversionRate = () => { + return https.get('/api/v1/level_five/overview/company_deposit_conversion_rate') +} + +// 获取全公司当月总通话次数、当月有效通话次数以及对比情况 /api/v1/level_five/overview/company_total_call_count +export const getCompanyTotalCallCount = () => { + return https.get('/api/v1/level_five/overview/company_total_call_count') +} + +// 获取全公司当月新增客户、当月意向客户以及新增客户的对比情况 /api/v1/level_five/overview/company_new_customer +export const getCompanyNewCustomer = () => { + return https.get('/api/v1/level_five/overview/company_new_customer') +} + +// 获取全公司当月转化率以及与上月的对比情况 /api/v1/level_five/overview/company_conversion_rate +export const getCompanyConversionRate = () => { + return https.get('/api/v1/level_five/overview/company_conversion_rate') +} + +// 获取各中心实时进度 /api/v1/level_five/overview/company_real_time_progress +export const getCompanyRealTimeProgress = () => { + return https.get('/api/v1/level_five/overview/company_real_time_progress') +} + +// 获取全公司转化对比 /api/v1/level_five/overview/company_conversion_rate_vs_last +export const getCompanyConversionRateVsLast = () => { + return https.post('/api/v1/level_five/overview/company_conversion_rate_vs_last') +} + +// 获取全公司销售月度业绩红黑榜 /api/v1/level_five/overview/sales_monthly_performance +export const getSalesMonthlyPerformance = (params) => { + return https.post('/api/v1/level_five/overview/sales_monthly_performance', params) +} + +// 获取全中心业绩排行榜 /api/v1/level_five/overview/center_performance_rank +export const getCenterPerformanceRank = (params) => { + return https.post('/api/v1/level_five/overview/center_performance_rank', params) +} + +// 获取全公司客户类型分布 /api/v1/level_five/overview/customer_type_distribution +export const getCustomerTypeDistribution = (params) => { + return https.post('/api/v1/level_five/overview/customer_type_distribution', params) +} + +// 获取全公司的客户迫切解决的问题 /api/v1/level_five/overview/urgent_need_to_address +export const getUrgentNeedToAddress = () => { + return https.get('/api/v1/level_five/overview/urgent_need_to_address') +} + +// 获取级别树 /api/v1/level_five/overview/level_tree +export const getLevelTree = () => { + return https.get('/api/v1/level_five/overview/level_tree') +} + +// 获取详细数据表格 /api/v1/level_five/overview/detailed_data_table +export const getDetailedDataTable = (params) => { + return https.post('/api/v1/level_five/overview/detailed_data_table', params) +} + + diff --git a/my-vue-app/src/router/index.js b/my-vue-app/src/router/index.js index d1fb27b..48e73d9 100644 --- a/my-vue-app/src/router/index.js +++ b/my-vue-app/src/router/index.js @@ -17,37 +17,37 @@ const routes = [ path: '/login', name: 'Login', component: Login, - meta: { requiresAuth: false } + // meta: { requiresAuth: false } }, { path: '/sale', name: 'Sale', component: Sale, - meta: { requiresAuth: true, minLevel: 1 } + // meta: { requiresAuth: true, minLevel: 1 } }, { path: '/manager', name: 'Manager', component: Manager, - meta: { requiresAuth: true, minLevel: 2 } + // meta: { requiresAuth: true, minLevel: 2 } }, { path: '/senior-manager', name: 'SeniorManager', component: SeniorManager, - meta: { requiresAuth: true, minLevel: 3 } + // meta: { requiresAuth: true, minLevel: 3 } }, { path: '/second-top', name: 'SecondTop', component: SecondTop, - meta: { requiresAuth: true, minLevel: 4 } + // meta: { requiresAuth: true, minLevel: 4 } }, { path: '/top', name: 'Top', component: TopOne, - meta: { requiresAuth: true, minLevel: 5 } + // meta: { requiresAuth: true, minLevel: 5 } } ] diff --git a/my-vue-app/src/views/person/components/StatisticData.vue b/my-vue-app/src/views/person/components/StatisticData.vue index 524feeb..269d466 100644 --- a/my-vue-app/src/views/person/components/StatisticData.vue +++ b/my-vue-app/src/views/person/components/StatisticData.vue @@ -102,7 +102,7 @@ $white: #ffffff; // 统计指标卡片特定样式 .stats-grid-inner { display: grid; - grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 0.75rem; } diff --git a/my-vue-app/src/views/person/sale.vue b/my-vue-app/src/views/person/sale.vue index 1e210f1..ebd19eb 100644 --- a/my-vue-app/src/views/person/sale.vue +++ b/my-vue-app/src/views/person/sale.vue @@ -18,7 +18,7 @@ {{ routeUserName }} - + - -
- -
-
-
正在加载数据分析...
-
- - -
+
@@ -119,7 +103,25 @@
- +
+ +
+ +
+
+
正在加载数据分析...
+
+ + +
+
@@ -132,7 +134,6 @@ import CustomerDetail from "./components/CustomerDetail.vue"; import PersonalDashboard from "./components/PersonalDashboard.vue"; import SalesTimelineWithTaskList from "./components/SalesTimelineWithTaskList.vue"; import RawDataCards from "./components/RawDataCards.vue"; -// import FloatingTodo from "./components/FloatingTodo.vue"; import UserDropdown from "@/components/UserDropdown.vue"; import Loading from "@/components/Loading.vue"; import {getCustomerAttendance,getTodayCall,getProblemDistribution,getTableFillingRate,getAverageResponseTime, @@ -501,50 +502,6 @@ async function getCustomerChat() { } try { const res = await getCustomerChatInfo(params) - /** - * message:[ - * 0:{content -: -"您好孩子妈妈,我是负责咱们本次课程的王慧老师[玫瑰]" -format_add_time -: -"2天前" -format_direction -: -"我" -type -: -"文本"}, -1:{ -content -: -"嗯,王老师好" -format_add_time -: -"2天前" -format_direction -: -"客户" -type -: -"文本" -}, -3:{ -content -: -"孩子妈妈,您好,这个是咱们的青少年成长评估表。您这个抽一分钟的时间填写一下孩子的基本信息。填写完了之后,您跟老师说一声。" -format_add_time -: -"2天前" -format_direction -: -"我" -type -: -"语音" -} - * ] - */ if(res.code === 200) { chatRecords.value = res.data console.log('聊天数据获取成功:', res.data) @@ -854,9 +811,6 @@ $primary: #3b82f6; box-sizing: border-box; } } - - - // 主要布局 .main-layout { width: 100vw; @@ -1348,7 +1302,7 @@ $primary: #3b82f6; min-height: 400px; @include desktop { - min-height: 450px; + min-height: 150px; } @include tablet { diff --git a/my-vue-app/src/views/secondTop/secondTop.vue b/my-vue-app/src/views/secondTop/secondTop.vue index 82d1a0e..55fea75 100644 --- a/my-vue-app/src/views/secondTop/secondTop.vue +++ b/my-vue-app/src/views/secondTop/secondTop.vue @@ -67,11 +67,7 @@
成员数: - {{ selectedGroup.memberCount }}人 -
-
- 今日业绩: - {{ formatCurrency(selectedGroup.todayPerformance) }} + {{ (groupPerformance && groupPerformance.group_details) ? groupPerformance.group_details.length : 0 }}人
转化率: @@ -87,11 +83,11 @@

{{ member.name }}

{{ member.position }}

-

{{ member.phone }}

-
- {{ getStatusText(member.status) }} - 入职: {{ member.joinDate }} + +
+ 排名: + {{ member.rank }}
@@ -207,7 +203,6 @@ return [] }) - // 中心总业绩 async function CenterOverallCenterPerformance() { const params = getRequestParams() @@ -484,55 +479,60 @@ const conversionRateVsAverage = ref({}) // 选择组别函数 const selectGroup = async (group) => { selectedGroup.value = group + console.log('选中的组别111:', group) + + // // 获取组名并调用API获取团队成员详情 + // let departmentName = group.name - // 获取组名并调用API获取团队成员详情 - let departmentName = group.name + // // 如果有groupList数据,尝试找到完整的部门名称 + // if (groupList.value && groupList.value.formal_plural) { + // const departmentKeys = Object.keys(groupList.value.formal_plural) + // console.log('所有部门名称:', departmentKeys) + // console.log('当前选中组别名称:', group.name) + + // // 优先进行精确匹配 + // let matchedDepartment = departmentKeys.find(key => key === group.name) + + // // 如果精确匹配失败,尝试模糊匹配 + // if (!matchedDepartment) { + // matchedDepartment = departmentKeys.find(key => { + // // 提取部门主要名称进行匹配(去掉经理名字部分) + // const mainName = key.split('-')[0] || key + // const groupMainName = group.name.split('-')[0] || group.name + // return mainName.includes(groupMainName) || groupMainName.includes(mainName) + // }) + // } + + // if (matchedDepartment) { + // departmentName = matchedDepartment + // } + // } - // 如果有groupList数据,尝试找到完整的部门名称 - if (groupList.value && groupList.value.formal_plural) { - const departmentKeys = Object.keys(groupList.value.formal_plural) - console.log('所有部门名称:', departmentKeys) - console.log('当前选中组别名称:', group.name) - - // 优先进行精确匹配 - let matchedDepartment = departmentKeys.find(key => key === group.name) - - // 如果精确匹配失败,尝试模糊匹配 - if (!matchedDepartment) { - matchedDepartment = departmentKeys.find(key => { - // 提取部门主要名称进行匹配(去掉经理名字部分) - const mainName = key.split('-')[0] || key - const groupMainName = group.name.split('-')[0] || group.name - return mainName.includes(groupMainName) || groupMainName.includes(mainName) - }) - } - - if (matchedDepartment) { - departmentName = matchedDepartment - } - } - - console.log('选中的组别:', group.name, '-> 发送的部门名称:', departmentName) + // console.log('选中的组别:', group.name, '-> 发送的部门名称:', departmentName) + const departmentName = group.name+'-'+group.leader try { await CenterGroupPerformance(departmentName) // 将API返回的数据整理后更新到selectedGroup的members字段 if (groupPerformance.value && groupPerformance.value.group_details) { - const formattedMembers = groupPerformance.value.group_details.map((member, index) => ({ - id: index + 1, - name: member.name, - position: '销售顾问', // 默认职位 - phone: '***-****-****', // 隐藏手机号 - status: member.rank === 1 ? 'excellent' : member.rank === 2 ? 'good' : 'average', - joinDate: '2023-01-01', // 默认入职日期 - todayPerformance: member.today_performance || 0, - monthlyPerformance: member.monthly_performance || 0, - conversionRate: parseFloat(member.conversion_rate_this_period) || 0, - callCount: member.call_count_this_period || 0, - newClients: member.new_customers_this_period || 0, - deals: member.deals_this_period || 0 - })) + const formattedMembers = groupPerformance.value.group_details + .map((member, index) => ({ + id: index + 1, + name: member.name, + position: '销售顾问', // 默认职位 + phone: '***-****-****', // 隐藏手机号 + status: member.rank === 1 ? 'excellent' : member.rank === 2 ? 'good' : 'average', + joinDate: '2023-01-01', // 默认入职日期 + todayPerformance: member.today_performance || 0, + monthlyPerformance: member.monthly_performance || 0, + conversionRate: parseFloat(member.conversion_rate_this_period) || 0, + callCount: member.call_count_this_period || 0, + newClients: member.new_customers_this_period || 0, + deals: member.deals_this_period || 0, + rank: member.rank || 0 + })) + .sort((a, b) => b.deals - a.deals) // 根据成交单数从高到低排序 // 更新selectedGroup的members数据 selectedGroup.value = { @@ -575,16 +575,15 @@ const conversionRateVsAverage = ref({}) return statusMap[status] || '未知' } onMounted(async () => { - await CenterOverallCenterPerformance() - await CenterTotalGroupCount() - await CenterConversionRate() - await CenterTotalCallCount() - await CenterNewCustomer() - await CenterDepositConversionRate() - await CenterCustomerType() - await CenterUrgentNeedToAddress() - await CenterConversionRateVsAverage() - + // await CenterOverallCenterPerformance() + // await CenterTotalGroupCount() + // await CenterConversionRate() + // await CenterTotalCallCount() + // await CenterNewCustomer() + // await CenterDepositConversionRate() + // await CenterCustomerType() + // await CenterUrgentNeedToAddress() + // await CenterConversionRateVsAverage() await CenterSeniorManagerList() await CenterGroupList('all') // 初始化加载全部高级经理数据 })