| | |
| | | <PanelHeader title="产品大类" /> |
| | | <div class="panel-item-customers"> |
| | | <div style="height: 70%"> |
| | | <div style="height: 100%"> |
| | | <Echarts |
| | | ref="chart" |
| | | :chartStyle="chartStyle" |
| | |
| | | |
| | | // 数据列表(来自接口) |
| | | const dataList = ref([]) |
| | | import { productCategoryDistribution } from '@/api/viewIndex.js' |
| | | |
| | | // 颜色列表 |
| | | const landColors = ['#26FFCB', '#24CBFF', '#35FBF4', '#2651FF', '#D1E4F5', '#5782F7', '#2F67EF', '#82BAFF'] |
| | |
| | | |
| | | // 图例配置(右侧竖排) |
| | | const landLegend = { |
| | | // 在制品工序柱状图配置 |
| | | const workInProcessXAxis = ref([ |
| | | { |
| | | type: 'category', |
| | | axisTick: { show: false }, |
| | | axisLabel: { |
| | | color: '#B8C8E0', |
| | | interval: 0, |
| | | rotate: 25 |
| | | }, |
| | | data: [], |
| | | }, |
| | | ]) |
| | | |
| | | const workInProcessYAxis = [ |
| | | { |
| | | type: 'value', |
| | | axisLabel: { color: '#B8C8E0' }, |
| | | name: '', |
| | | }, |
| | | ] |
| | | |
| | | const workInProcessBarLegend = { |
| | | show: false, |
| | | icon: 'circle', |
| | | data: [], |
| | |
| | | const dotKey = `dot${(params?.dataIndex || 0) % landColors.length}` |
| | | const dot = `{${dotKey}|} ` |
| | | if (!children.length) return `${dot}{parent|${parentName} ${parentValue}}` |
| | | // 用 marker 显示与扇区同色的小圆点,再显示父级名称,后面列出 children 的 name + value |
| | | // 小圆点 + 父级 name + 父级 value,换行展示 children 的 name + value |
| | | return [ |
| | | `${dot}{parent|${parentName} ${parentValue}}`, |
| | | ...children.map((c) => `{child|${c.name} ${c.value || 0}}`), |
| | | ...children.map((c) => `{child|${c.name}}`), |
| | | ].join('\n') |
| | | }, |
| | | }, |
| | | labelLine: { |
| | | show: true, |
| | | length: 40, |
| | | length2: 40, |
| | | length: 20, |
| | | length2: 20, |
| | | lineStyle: { |
| | | color: '#B8C8E0', |
| | | }, |
| | | name: '产品数量', |
| | | type: 'bar', |
| | | barWidth: 25, |
| | | barGap: 0, |
| | | emphasis: { |
| | | focus: 'series', |
| | | }, |
| | | itemStyle: { |
| | | color: function (params) { |
| | | return landColors[params.dataIndex % landColors.length] |
| | | }, |
| | | }, |
| | | // 初始绑定为响应式数据源,后续通过接口填充 |
| | | data: dataList.value, |
| | | }, |
| | | { |
| | |
| | | radius: ['35%', '40%'], |
| | | center: ['50%', '50%'], |
| | | silent: true, |
| | | color: { |
| | | type: 'linear', |
| | | x: 0, |
| | | y: 0, |
| | | x2: 0, |
| | | y2: 1, |
| | | colorStops: [ |
| | | { offset: 0, color: '#4EE4FF' }, |
| | | { offset: 1, color: '#00A4ED' }, |
| | | ], |
| | | }, |
| | | borderRadius: [4, 4, 0, 0] |
| | | }, |
| | | label: { |
| | | show: false, |
| | | }, |
| | |
| | | const chartStyle = { |
| | | width: '100%', |
| | | height: '150%', |
| | | height: '100%', |
| | | } |
| | | |
| | | const loadData = async () => { |
| | |
| | | landLegend.data = [] |
| | | landSeries.value[0].data = [] |
| | | } |
| | | const grid = { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '15%', |
| | | containLabel: true, |
| | | } |
| | | |
| | | const tooltip = { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'shadow', |
| | | }, |
| | | formatter: function (params) { |
| | | let result = params[0].axisValueLabel + '<br/>' |
| | | params.forEach((item) => { |
| | | result += `<div style="color: #B8C8E0">${item.marker} ${item.seriesName}: ${item.value}</div>` |
| | | }) |
| | | return result |
| | | }, |
| | | } |
| | | |
| | | // 获取各产品大类分布 |
| | | const getProductCategoryDistribution = () => { |
| | | productCategoryDistribution() |
| | | .then((res) => { |
| | | if (res.code === 200 && res.data && res.data.items) { |
| | | workInProcessXAxis.value[0].data = res.data.items.map(item => item.name) |
| | | workInProcessBarSeries.value[0].data = res.data.items.map(item => parseInt(item.value)) |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | console.error('获取各产品大类分布失败:', error) |
| | | }) |
| | | } |
| | | |
| | | onMounted(() => { |
| | | loadData() |
| | | getProductCategoryDistribution() |
| | | }) |
| | | </script> |
| | | |