| | |
| | | import Echarts from '@/components/Echarts/echarts.vue' |
| | | import PanelHeader from './PanelHeader.vue' |
| | | import CarouselCards from './CarouselCards.vue' |
| | | import { productCategoryDistribution } from '@/api/viewIndex.js' |
| | | import { rawMaterialPurchaseAmountRatio } from '@/api/viewIndex.js' |
| | | |
| | | /** |
| | | * @introduction 把数组中key值相同的那一项提取出来,组成一个对象 |
| | |
| | | // 卡片数据 |
| | | const cardItems = ref([]) |
| | | |
| | | // 假数据 |
| | | const mockCardData = [ |
| | | { name: '电子产品', value: 156, rate: '28.5' }, |
| | | { name: '机械设备', value: 132, rate: '24.1' }, |
| | | { name: '原材料', value: 98, rate: '17.9' }, |
| | | { name: '化工产品', value: 87, rate: '15.9' }, |
| | | { name: '纺织品', value: 45, rate: '8.2' }, |
| | | { name: '其他', value: 31, rate: '5.7' }, |
| | | ] |
| | | |
| | | // 颜色列表 |
| | | const landColors = ['#26FFCB', '#24CBFF', '#35FBF4', '#2651FF', '#D1E4F5', '#5782F7', '#2F67EF', '#82BAFF'] |
| | | |
| | |
| | | return { |
| | | orient: 'vertical', |
| | | top: 'center', |
| | | left: '60%', |
| | | left: '52%', |
| | | itemGap: 30, |
| | | data: data, |
| | | formatter: function (name) { |
| | | const item = landObjData.value[name] |
| | | if (!item) return name |
| | | return `{title|${name}}{value|${item.value}}{unit|件}{percent|${item.rate}}{unit|%}` |
| | | return `{title|${name}}{value|${item.value}}{unit|元}{percent|${item.rate}}{unit|%}` |
| | | }, |
| | | textStyle: { |
| | | rich: { |
| | |
| | | color: '#43e8fc', |
| | | fontSize: 14, |
| | | fontWeight: 600, |
| | | padding: [0, 0, 0, 30], |
| | | padding: [0, 0, 0, 10], |
| | | }, |
| | | unit: { |
| | | color: '#82baff', |
| | |
| | | // 提示框 |
| | | const landTooltip = { |
| | | trigger: 'item', |
| | | formatter: '{a} <br/>{b} : {c} ({d}%)', |
| | | formatter: '{a} <br/>{b} : {c}元 ({d}%)', |
| | | } |
| | | |
| | | // 双层环形饼图 |
| | |
| | | textStyle: { color: '#B8C8E0' }, |
| | | } |
| | | |
| | | const setMockData = () => { |
| | | // 卡片数据 |
| | | cardItems.value = mockCardData.map(item => ({ |
| | | label: item.name, |
| | | value: item.value, |
| | | unit: '件', |
| | | rate: item.rate |
| | | })) |
| | | // 图表数据 |
| | | dataList.value = mockCardData.map((it) => ({ |
| | | name: it.name, |
| | | value: Number(it.value || 0), |
| | | rate: it.rate, |
| | | children: [], |
| | | })) |
| | | landSeries.value[0].data = dataList.value |
| | | } |
| | | |
| | | const loadData = async () => { |
| | | setMockData() |
| | | // try { |
| | | // const res = await productCategoryDistribution() |
| | | // const items = res?.data?.items || [] |
| | | // dataList.value = items.map((it) => ({ |
| | | // name: it.name, |
| | | // value: Number(it.value || 0), |
| | | // rate: it.rate, |
| | | // children: Array.isArray(it.children) ? it.children : [], |
| | | // })) |
| | | // // 卡片数据 |
| | | // cardItems.value = items.map(item => ({ |
| | | // label: item.name, |
| | | // value: parseInt(item.value), |
| | | // unit: '件', |
| | | // rate: item.rate |
| | | // })) |
| | | // landLegend.data = dataList.value.map((d) => d.name) |
| | | // landSeries.value[0].data = dataList.value |
| | | // } catch (e) { |
| | | // console.error('获取产品大类分布失败:', e) |
| | | // setMockData() |
| | | // } |
| | | const fetchData = () => { |
| | | rawMaterialPurchaseAmountRatio() |
| | | .then((res) => { |
| | | if (res.code === 200 && Array.isArray(res.data)) { |
| | | const items = res.data |
| | | cardItems.value = items.map((item) => ({ |
| | | label: item.name, |
| | | value: item.value, |
| | | unit: '元', |
| | | rate: item.rate, |
| | | })) |
| | | dataList.value = items.map((it) => ({ |
| | | name: it.name, |
| | | value: parseFloat(it.value) || 0, |
| | | rate: it.rate, |
| | | children: [], |
| | | })) |
| | | landSeries.value[0].data = dataList.value |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | console.error('获取原材料采购金额占比失败:', err) |
| | | }) |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadData() |
| | | fetchData() |
| | | }) |
| | | </script> |
| | | |