| | |
| | | <div> |
| | | <PanelHeader title="产品大类" /> |
| | | <div class="panel-item-customers"> |
| | | <div style="height: 70%"> |
| | | <div class="pie-chart-wrapper"> |
| | | <div class="pie-background"></div> |
| | | <Echarts |
| | | ref="chart" |
| | | :chartStyle="chartStyle" |
| | |
| | | :series="landSeries" |
| | | :tooltip="landTooltip" |
| | | :color="landColors" |
| | | :options="{ backgroundColor: 'transparent', textStyle: { color: '#B8C8E0' } }" |
| | | :options="pieOptions" |
| | | style="height: 100%" |
| | | class="land-chart" |
| | | /> |
| | |
| | | |
| | | // 提示框 |
| | | const landTooltip = { |
| | | triggerOn: 'click', |
| | | // triggerOn: 'hover', |
| | | alwaysShowContent: true, |
| | | position: function (pt) { |
| | | return [pt[0], 130] |
| | | }, |
| | | formatter: function (params) { |
| | | return `${params.name} (${params.value}类)` |
| | | }, |
| | | } |
| | | |
| | | // 双层环形饼图 |
| | | const landSeries = ref([ |
| | | { |
| | | name: '外圈', |
| | | name: '产品大类', |
| | | type: 'pie', |
| | | radius: ['35%', '55%'], |
| | | center: ['50%', '50%'], |
| | |
| | | lineHeight: 18, |
| | | rich: { |
| | | ...dotRich, |
| | | parent: { fontSize: 14, fontWeight: 600, color: '#fff', lineHeight: 20 }, |
| | | parent: { fontSize: 14, fontWeight: 600, color: '#fff', lineHeight: 20, overflow: 'break' }, |
| | | child: { fontSize: 12, color: '#fff', lineHeight: 18 }, |
| | | }, |
| | | formatter: function (params) { |
| | | const children = params?.data?.children || [] |
| | | const parentName = params?.data?.name || '' |
| | | const parentValue = params?.data?.value ?? 0 |
| | | const rawVal = params?.data?.value |
| | | const parentValue = typeof rawVal === 'number' && !Number.isNaN(rawVal) ? rawVal : (Number(rawVal) || 0) |
| | | const dotKey = `dot${(params?.dataIndex || 0) % landColors.length}` |
| | | const dot = `{${dotKey}|} ` |
| | | if (!children.length) return `${dot}{parent|${parentName} ${parentValue}}` |
| | | // 用 marker 显示与扇区同色的小圆点,再显示父级名称,后面列出 children 的 name + value |
| | | return [ |
| | | `${dot}{parent|${parentName} ${parentValue}}`, |
| | | ...children.map((c) => `{child|${c.name} ${c.value || 0}}`), |
| | | ].join('\n') |
| | | const parentLine = `${dot}{parent|${parentName} (${parentValue}类)}` |
| | | if (!children.length) return parentLine |
| | | // 父级全部显示;子级最多 5 个,超出显示省略号 |
| | | const displayed = children.slice(0, 5).map((c) => `{child|${c.name}}`) |
| | | if (children.length > 5) displayed.push('{child|…}') |
| | | return [parentLine, ...displayed].join('\n') |
| | | }, |
| | | }, |
| | | labelLine: { |
| | | show: true, |
| | | length: 40, |
| | | length2: 40, |
| | | length: 20, |
| | | length2: 20, |
| | | lineStyle: { |
| | | color: '#B8C8E0', |
| | | }, |
| | |
| | | return landColors[params.dataIndex % landColors.length] |
| | | }, |
| | | }, |
| | | // 初始绑定为响应式数据源,后续通过接口填充 |
| | | data: dataList.value, |
| | | }, |
| | | { |
| | |
| | | |
| | | const chartStyle = { |
| | | width: '100%', |
| | | height: '150%', |
| | | height: '126%', |
| | | } |
| | | |
| | | const pieOptions = { |
| | | backgroundColor: 'transparent', |
| | | textStyle: { color: '#B8C8E0' }, |
| | | } |
| | | |
| | | const loadData = async () => { |
| | |
| | | height: 420px; |
| | | } |
| | | |
| | | .quality-cards { |
| | | display: flex; |
| | | gap: 12px; |
| | | .pie-chart-wrapper { |
| | | position: relative; |
| | | width: 100%; |
| | | height: 54px; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | height: 320px; |
| | | background: transparent; |
| | | } |
| | | |
| | | .quality-cardSec { |
| | | display: flex; |
| | | } |
| | | |
| | | .quality-cardTitle { |
| | | font-weight: 400; |
| | | font-size: 14px; |
| | | color: #ffffff; |
| | | display: flex; |
| | | align-items: flex-start; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .quality-card { |
| | | width: 80px; |
| | | height: 60px; |
| | | background-size: cover; |
| | | .pie-background { |
| | | position: absolute; |
| | | left: 50%; |
| | | top: 50%; |
| | | transform: translate(-51.5%, -39%); |
| | | width: 360px; |
| | | height: 360px; |
| | | background-image: url('@/assets/BI/玫瑰图边框.png'); |
| | | background-size: contain; |
| | | background-position: center; |
| | | background-repeat: no-repeat; |
| | | } |
| | | |
| | | .quality-card.one { |
| | | background-image: url('@/assets/BI/yuancailiaoyijianicon@2x.png'); |
| | | } |
| | | |
| | | .quality-card.two { |
| | | background-image: url('@/assets/BI/guochengyijianicon@2x.png'); |
| | | } |
| | | |
| | | .quality-card.three { |
| | | background-image: url('@/assets/BI/chuchangyijianicon@2x.png'); |
| | | z-index: 1; |
| | | pointer-events: none; |
| | | } |
| | | </style> |