diff --git a/my-vue-app/src/views/secondTop/components/CustomerType.vue b/my-vue-app/src/views/secondTop/components/CustomerType.vue index e5b4155..0e3f3ff 100644 --- a/my-vue-app/src/views/secondTop/components/CustomerType.vue +++ b/my-vue-app/src/views/secondTop/components/CustomerType.vue @@ -40,10 +40,133 @@ const chartData = computed(() => { return [] } - return props.customerData.customer_type_distribution.map(item => ({ + let processedData = props.customerData.customer_type_distribution.map(item => ({ name: item.category, value: parseFloat(item.ratio.replace('%', '')) || 0 })) + + // 如果是地域类型,需要按省份进行数据整理 + if (customerTypeCategory.value === 'region') { + const provinceMap = new Map() + + processedData.forEach(item => { + // 提取省份名称,处理"山东省 临沂市 莒南县"这种空格分隔的格式 + let provinceName = item.name + + // 处理空格分隔的地域数据格式(如:"山东省 临沂市 莒南县") + if (item.name.includes(' ')) { + const parts = item.name.split(' ') + provinceName = parts[0] // 取第一部分作为省份 + } + // 处理横线分隔的格式 + else if (item.name.includes('-')) { + provinceName = item.name.split('-')[0] + } + // 处理包含省字的格式 + else if (item.name.includes('省') || item.name.includes('市') || item.name.includes('区')) { + // 如果已经包含省份标识,直接使用 + if (item.name.includes('省') || item.name.includes('自治区') || item.name.endsWith('市')) { + provinceName = item.name + } else { + // 根据城市名推断省份 + const cityToProvince = { + '北京': '北京市', + '上海': '上海市', + '天津': '天津市', + '重庆': '重庆市', + '广州': '广东省', + '深圳': '广东省', + '珠海': '广东省', + '佛山': '广东省', + '东莞': '广东省', + '中山': '广东省', + '杭州': '浙江省', + '宁波': '浙江省', + '温州': '浙江省', + '南京': '江苏省', + '苏州': '江苏省', + '无锡': '江苏省', + '常州': '江苏省', + '成都': '四川省', + '绵阳': '四川省', + '武汉': '湖北省', + '宜昌': '湖北省', + '西安': '陕西省', + '郑州': '河南省', + '洛阳': '河南省', + '济南': '山东省', + '青岛': '山东省', + '烟台': '山东省', + '潍坊': '山东省', + '临沂': '山东省', + '大连': '辽宁省', + '沈阳': '辽宁省', + '长春': '吉林省', + '哈尔滨': '黑龙江省', + '石家庄': '河北省', + '唐山': '河北省', + '太原': '山西省', + '呼和浩特': '内蒙古自治区', + '南宁': '广西壮族自治区', + '桂林': '广西壮族自治区', + '海口': '海南省', + '三亚': '海南省', + '昆明': '云南省', + '贵阳': '贵州省', + '拉萨': '西藏自治区', + '兰州': '甘肃省', + '西宁': '青海省', + '银川': '宁夏回族自治区', + '乌鲁木齐': '新疆维吾尔自治区', + '合肥': '安徽省', + '芜湖': '安徽省', + '福州': '福建省', + '厦门': '福建省', + '泉州': '福建省', + '南昌': '江西省', + '长沙': '湖南省', + '株洲': '湖南省', + // 港澳台地区 + '香港': '香港特别行政区', + '澳门': '澳门特别行政区', + '台北': '台湾省', + '高雄': '台湾省', + '台中': '台湾省', + '台南': '台湾省', + '桃园': '台湾省', + '新竹': '台湾省', + '基隆': '台湾省', + '嘉义': '台湾省', + '台东': '台湾省', + '花莲': '台湾省', + '宜兰': '台湾省', + '屏东': '台湾省', + '彰化': '台湾省', + '南投': '台湾省', + '云林': '台湾省', + '苗栗': '台湾省', + '澎湖': '台湾省' + } + provinceName = cityToProvince[item.name] || item.name + } + } + + // 聚合同一省份的数据 + if (provinceMap.has(provinceName)) { + provinceMap.set(provinceName, provinceMap.get(provinceName) + item.value) + } else { + provinceMap.set(provinceName, item.value) + } + }) + + // 转换为数组格式 + processedData = Array.from(provinceMap.entries()).map(([name, value]) => ({ + name, + value + })) + } + + return processedData }) const updateChart = () => { @@ -70,37 +193,47 @@ const updateChart = () => { } const option = { - tooltip: { - trigger: 'axis', - axisPointer: { type: 'shadow' }, + tooltip: { + trigger: 'item', formatter: function(params) { - return params[0].name + '
' + params[0].seriesName + ': ' + params[0].value + '%' + return params.name + '
' + '占比: ' + params.value + '%' + ' (' + params.percent + '%)' } }, - grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true }, - xAxis: { - type: 'category', - data: currentData.map(item => item.name), - axisTick: { alignWithLabel: true }, - axisLabel: { - interval: 0, - rotate: currentData.length > 5 ? 45 : 0 - } - }, - yAxis: { - type: 'value', - axisLabel: { - formatter: '{value}%' + legend: { + orient: 'vertical', + left: 'left', + top: 'center', + textStyle: { + fontSize: 12 } }, series: [{ - name: '占比', - type: 'bar', - barWidth: '60%', - data: currentData.map(item => item.value), - itemStyle: { - color: (params) => ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de'][params.dataIndex % 5] - } + name: '客户类型占比', + type: 'pie', + radius: ['40%', '70%'], + center: ['65%', '50%'], + avoidLabelOverlap: false, + label: { + show: false, + position: 'center' + }, + emphasis: { + label: { + show: true, + fontSize: '16', + fontWeight: 'bold' + } + }, + labelLine: { + show: false + }, + data: currentData.map((item, index) => ({ + name: item.name, + value: item.value, + itemStyle: { + color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#fc8452', '#9a60b4'][index % 7] + } + })) }] }; customerTypeChart.setOption(option, true); diff --git a/my-vue-app/src/views/topOne/topone.vue b/my-vue-app/src/views/topOne/topone.vue index 2f646e3..13773a3 100644 --- a/my-vue-app/src/views/topOne/topone.vue +++ b/my-vue-app/src/views/topOne/topone.vue @@ -280,16 +280,18 @@ const customerTypeData = ref([ { name: "55岁以上", value: 50 }, ]); -// 客户问题排行榜数据 -const problemRankingData = ref([ - { name: "提高学习成绩", value: "65%" }, - { name: "课程费用咨询", value: "58%" }, - { name: "师资力量了解", value: "52%" }, - { name: "时间安排问题", value: "48%" }, - { name: "学习兴趣培养", value: "42%" }, - { name: "学习方法指导", value: "38%" }, - { name: "课程内容详情", value: "35%" }, -]); +// 客户问题排行榜数据 - 计算属性:将API数据转换为组件所需格式 +const problemRankingData = computed(() => { + if (!customerUrgency.value || !customerUrgency.value.company_urgent_issue_ratio) { + return [] + } + + const ratioData = customerUrgency.value.company_urgent_issue_ratio + return Object.entries(ratioData).map(([name, value]) => ({ + name, + value + })) +}) // 表格数据和筛选 const tableData = ref([ @@ -1027,6 +1029,50 @@ 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); }