diff --git a/my-vue-app/src/views/topOne/components/DetailedDataTable.vue b/my-vue-app/src/views/topOne/components/DetailedDataTable.vue index 7993250..2863a90 100644 --- a/my-vue-app/src/views/topOne/components/DetailedDataTable.vue +++ b/my-vue-app/src/views/topOne/components/DetailedDataTable.vue @@ -6,10 +6,33 @@
-
-
-
- +
+ + +
+
+ + +
+
+ + +
@@ -58,25 +81,52 @@ import { ref, computed } from 'vue'; const props = defineProps({ - tableData: { type: Array, required: true }, - selectedPerson: { type: Object, default: null } -}); + tableData: { type: Array, required: true }, + selectedPerson: { type: Object, default: null }, + levelTree: { type: Object, default: () => ({}) } + }); defineEmits(['update:selectedPerson']); -const filters = ref({ department: '', position: '', timeRange: 'month', dealStatus: '' }); +const filters = ref({ centerLeader: '', advancedManager: '', manager: '', dealStatus: '' }); const sortField = ref('dealRate'); const sortOrder = ref('desc'); +const centerLeaders = computed(() => { + return props.levelTree?.level_tree?.center_leaders || []; + }); + + const availableAdvancedManagers = computed(() => { + if (!filters.value.centerLeader) return []; + const leader = centerLeaders.value.find(l => l.name === filters.value.centerLeader); + return leader ? leader.advanced_managers || [] : []; + }); + + const availableManagers = computed(() => { + if (!filters.value.advancedManager) return []; + const manager = availableAdvancedManagers.value.find(m => m.name === filters.value.advancedManager); + return manager ? manager.managers || [] : []; + }); + const filteredTableData = computed(() => { let filtered = props.tableData; - if (filters.value.department) filtered = filtered.filter(item => item.department === filters.value.department); - if (filters.value.position) filtered = filtered.filter(item => item.position === filters.value.position); + if (filters.value.centerLeader) filtered = filtered.filter(item => item.centerLeader === filters.value.centerLeader); + if (filters.value.advancedManager) filtered = filtered.filter(item => item.advancedManager === filters.value.advancedManager); + if (filters.value.manager) filtered = filtered.filter(item => item.manager === filters.value.manager); return filtered.sort((a, b) => { const aValue = a[sortField.value], bValue = b[sortField.value]; return sortOrder.value === 'desc' ? bValue - aValue : aValue - bValue; }); }); +const onCenterLeaderChange = () => { + filters.value.advancedManager = ''; + filters.value.manager = ''; +}; + +const onAdvancedManagerChange = () => { + filters.value.manager = ''; +}; + const sortBy = (field) => { if (sortField.value === field) sortOrder.value = sortOrder.value === 'desc' ? 'asc' : 'desc'; else { sortField.value = field; sortOrder.value = 'desc'; } @@ -100,6 +150,7 @@ const formatDuration = (minutes) => { .filter-group { display: flex; flex-direction: column; gap: 4px; } .filter-group label { font-size: 12px; font-weight: 600; color: #4a5568; } .filter-group select { padding: 8px 12px; border: 1px solid #e2e8f0; border-radius: 6px; } +.filter-group select:disabled { background-color: #f7fafc; color: #a0aec0; cursor: not-allowed; } .data-table { overflow-x: auto; border-radius: 8px; border: 1px solid #e2e8f0; } table { width: 100%; border-collapse: collapse; } th { background: #f7fafc; padding: 12px 16px; text-align: left; font-weight: 600; color: #4a5568; border-bottom: 1px solid #e2e8f0; font-size: 12px; } diff --git a/my-vue-app/src/views/topOne/topone.vue b/my-vue-app/src/views/topOne/topone.vue index 13773a3..438cd52 100644 --- a/my-vue-app/src/views/topOne/topone.vue +++ b/my-vue-app/src/views/topOne/topone.vue @@ -70,6 +70,7 @@
@@ -674,34 +675,6 @@ async function getConversionComparison(data) { const res = await getCompanyConversionRateVsLast(params) console.log(111111,res) conversionComparison.value = res.data - /** - * "data": { - "user_name": "赵世敬", - "user_level": 5, - "check_type": "month", - "company_current_rate": { - "线索总数": 14050, - "加微": 3238, - "到课": 7613, - "付定金": 167, - "成交": 135 - }, - "company_last_rate": { - "线索总数": 17598, - "加微": 3328, - "到课": 3543, - "付定金": 0, - "成交": 0 - }, - "company_current_vs_last_rate": { - "线索总数": "-20.16%", - "加微": "-2.70%", - "到课": "+114.87%", - "付定金": "+∞%", - "成交": "+∞%" - } - } - */ } catch (error) { console.error("获取转化对比失败:", error); } @@ -942,25 +915,6 @@ async function getCenterSalesRank(data) { const res = await getCenterPerformanceRank(params) console.log(1222222,res) centerSalesRank.value = res.data - /** - * "data": { - "user_name": "赵世敬", - "user_level": 5, - "rank_type": "periods", - "center_performance_periods_rank": [ - { - "center_leader": "郭可英", - "total_deals": 0, - "average_deals_per_member": 0 - }, - { - "center_leader": "刘瑞", - "total_deals": 4, - "average_deals_per_member": 0 - } - ] - } - */ } catch (error) { console.error("获取全中心业绩排行榜失败:", error); } @@ -975,49 +929,6 @@ async function getCustomerTypeRatio(data) { const res = await getCustomerTypeDistribution(params) console.log(1222222,res) customerTypeRatio.value = res.data - /** - * data -: -customer_type_distribution -: -Array(7) -0 -: -{category: '初二', ratio: '37.50%'} -1 -: -{category: '高一', ratio: '18.75%'} -2 -: -{category: '初一', ratio: '12.50%'} -3 -: -{category: '五年级', ratio: '12.50%'} -4 -: -{category: '六年级', ratio: '6.25%'} -5 -: -{category: '三年级以下', ratio: '6.25%'} -6 -: -{category: '高三', ratio: '6.25%'} -length -: -7 -[[Prototype]] -: -Array(0) -distribution_type -: -"child_education" -user_level -: -5 -user_name -: -"赵世敬" - */ } catch (error) { console.error("获取客户类型占比失败:", error); } @@ -1029,50 +940,6 @@ async function getCustomerUrgency() { const res = await getUrgentNeedToAddress() console.log(1222222,res) customerUrgency.value = res.data - /** - * data -: -company_urgent_issue_counts -: -回归学校 -: -2 -少玩手机 -: -6 -心理健康 -: -0 -成绩提升 -: -8 -[[Prototype]] -: -Object -company_urgent_issue_ratio -: -回归学校 -: -"12.50%" -少玩手机 -: -"37.50%" -心理健康 -: -"0.00%" -成绩提升 -: -"50.00%" -[[Prototype]] -: -Object -user_level -: -5 -user_name -: -"赵世敬" - */ } catch (error) { console.error("获取客户迫切解决的问题排行榜失败:", error); } @@ -1084,6 +951,55 @@ async function CusotomGetLevelTree() { const res = await getLevelTree() console.log(1222222,res) levelTree.value = res.data + /** + * "data": { + "user_name": "赵世敬", + "user_level": 5, + "level_tree": { + "center_leaders": [ + { + "name": "郭可英", + "advanced_managers": [ + { + "name": "李小燕", + "managers": [] + }, + { + "name": "郭子奇", + "managers": [ + { + "name": "杨朵朵" + }, + { + "name": "张明起" + } + ] + } + ] + }, + { + "name": "刘瑞", + "advanced_managers": [ + { + "name": "陈盼良", + "managers": [ + { + "name": "马然" + }, + { + "name": "杨启晨" + }, + { + "name": "韦少杰" + } + ] + } + ] + } + ] + } + } + */ } catch (error) { console.error("获取级别树失败:", error); } @@ -1110,9 +1026,9 @@ onMounted(async() => { // await getConversionComparison('month') // await getCompanySalesRank('red') // await getCenterSalesRank('periods') - await getCustomerTypeRatio('child_education') - await getCustomerUrgency() - + // await getCustomerTypeRatio('child_education') + // await getCustomerUrgency() +await CusotomGetLevelTree() });