feat(数据展示): 更新转化率组件以支持新数据结构并优化表格列

- 移除secondTop.vue中过时的注释数据
- 修改DetailedDataTable.vue表格列名以匹配新指标
- GroupRanking组件支持显示转化人数并兼容新旧数据结构
This commit is contained in:
2025-08-15 18:41:43 +08:00
parent 5f706507dd
commit a96a25355f
3 changed files with 54 additions and 97 deletions

View File

@@ -30,7 +30,7 @@
<div <div
class="bar team-bar" class="bar team-bar"
:style="{ height: (stage.teamRate * 2.4) + 'px' }" :style="{ height: (stage.teamRate * 2.4) + 'px' }"
:title="`本团队: ${stage.teamRate}%`" :title="`本团队: ${stage.teamRate}%${stage.teamCount}人)`"
></div> ></div>
</div> </div>
<div class="bar-container"> <div class="bar-container">
@@ -38,7 +38,7 @@
<div <div
class="bar company-bar" class="bar company-bar"
:style="{ height: (stage.companyRate * 2.4) + 'px' }" :style="{ height: (stage.companyRate * 2.4) + 'px' }"
:title="`公司平均: ${stage.companyRate}%`" :title="`公司平均: ${stage.companyRate}%${stage.companyCount}人)`"
></div> ></div>
</div> </div>
</div> </div>
@@ -72,79 +72,58 @@ const props = defineProps({
} }
}) })
// 转化率数据 // 转化率数据(含人数)
const conversionStages = computed(() => { const conversionStages = computed(() => {
// 如果有传入的转化率数据,使用传入的数据 // 兼容新的数据结构:
if (props.conversionData && props.conversionData.conversion_rate && props.conversionData.company_conversion_rate) { // {
const userRates = props.conversionData.conversion_rate // conversion_rate_and_count: {
const companyRates = props.conversionData.company_conversion_rate // center_conversion_rate: { "加微": "20.23%", ... },
// center_conversion_count: { "加微": 53, ... }
// },
// company_conversion_rate_and_count: {
// company_conversion_rate: { "加微": "8.44%", ... },
// company_conversion_count: { "加微": 558, ... }
// }
// }
if (
props.conversionData &&
props.conversionData.conversion_rate_and_count &&
props.conversionData.company_conversion_rate_and_count
) {
const user = props.conversionData.conversion_rate_and_count
const company = props.conversionData.company_conversion_rate_and_count
return [ const userRates = user.center_conversion_rate || {}
{ const userCounts = user.center_conversion_count || {}
name: '加微', const companyRates = company.company_conversion_rate || {}
teamRate: parseFloat(userRates['加微']) || 0, const companyCounts = company.company_conversion_count || {}
companyRate: parseFloat(companyRates['加微']) || 0
}, const toNumber = (v) => {
{ if (v === null || v === undefined) return 0
name: '填表', if (typeof v === 'number') return v
teamRate: parseFloat(userRates['填表']) || 0, // v 可能是 "20.23%" 这样的字符串
companyRate: parseFloat(companyRates['填表']) || 0 const n = parseFloat(String(v))
}, return isNaN(n) ? 0 : n
{ }
name: '通话',
teamRate: parseFloat(userRates['通话']) || 0, const stages = ['加微', '填表', '通话', '到课', '付定金', '付费']
companyRate: parseFloat(companyRates['通话']) || 0 return stages.map(name => ({
}, name,
{ teamRate: toNumber(userRates[name]),
name: '首课', teamCount: toNumber(userCounts[name]),
teamRate: parseFloat(userRates['首课']) || 0, companyRate: toNumber(companyRates[name]),
companyRate: parseFloat(companyRates['首课']) || 0 companyCount: toNumber(companyCounts[name])
}, }))
{
name: '三课',
teamRate: parseFloat(userRates['三课']) || 0,
companyRate: parseFloat(companyRates['三课']) || 0
},
{
name: '付费',
teamRate: parseFloat(userRates['付费']) || 0,
companyRate: parseFloat(companyRates['付费']) || 0
}
]
} }
// 默认数据 // 默认数据(名称对齐新接口)
return [ return [
{ { name: '加微', teamRate: 80, companyRate: 85, teamCount: 0, companyCount: 0 },
name: '加微', { name: '填表', teamRate: 90, companyRate: 92, teamCount: 0, companyCount: 0 },
teamRate: 80, { name: '通话', teamRate: 95, companyRate: 95, teamCount: 0, companyCount: 0 },
companyRate: 85 { name: '到课', teamRate: 60, companyRate: 65, teamCount: 0, companyCount: 0 },
}, { name: '付定金', teamRate: 18, companyRate: 20, teamCount: 0, companyCount: 0 },
{ { name: '付费', teamRate: 15, companyRate: 20, teamCount: 0, companyCount: 0 }
name: '填表',
teamRate: 90,
companyRate: 92
},
{
name: '通话',
teamRate: 95,
companyRate: 95
},
{
name: '首课',
teamRate: 60,
companyRate: 65
},
{
name: '三课',
teamRate: 85,
companyRate: 88
},
{
name: '付费',
teamRate: 15,
companyRate: 20
}
] ]
}) })

View File

@@ -328,28 +328,6 @@ const conversionRateVsAverage = ref({})
const res = await getConversionRateVsAverage(hasParams ? params : undefined) const res = await getConversionRateVsAverage(hasParams ? params : undefined)
if (res.code === 200) { if (res.code === 200) {
conversionRateVsAverage.value = res.data conversionRateVsAverage.value = res.data
/**
* "data": {
"user_name": "刘瑞",
"user_level": 4,
"conversion_rate": {
"加微": "21.72%",
"填表": "21.72%",
"通话": "0.00%",
"首课": "37.08%",
"三课": "14.61%",
"付费": "1.87%"
},
"company_conversion_rate": {
"加微": "12.49%",
"填表": "12.49%",
"通话": "0.00%",
"首课": "39.07%",
"三课": "24.27%",
"付费": "1.27%"
}
}
*/
} }
} catch (error) { } catch (error) {
console.error('获取中心整体概览失败:', error) console.error('获取中心整体概览失败:', error)

View File

@@ -19,10 +19,10 @@
<tr> <tr>
<th>人员</th> <th>人员</th>
<th @click="sortBy('dealRate')" class="sortable">成交率 <span class="sort-icon" :class="{ active: sortField === 'dealRate' }">{{ sortOrder === 'desc' ? '↓' : '↑' }}</span></th> <th @click="sortBy('dealRate')" class="sortable">成交率 <span class="sort-icon" :class="{ active: sortField === 'dealRate' }">{{ sortOrder === 'desc' ? '↓' : '↑' }}</span></th>
<th @click="sortBy('callDuration')" class="sortable">通话时长 <span class="sort-icon" :class="{ active: sortField === 'callDuration' }">{{ sortOrder === 'desc' ? '↓' : '↑' }}</span></th> <th @click="sortBy('callDuration')" class="sortable">成交单数 <span class="sort-icon" :class="{ active: sortField === 'callDuration' }">{{ sortOrder === 'desc' ? '↓' : '↑' }}</span></th>
<th>通话次数</th> <th>加微率</th>
<th>成交金额</th> <th>入群率</th>
<th>部门</th> <th>表单填写率</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>