| | |
| | | <template> |
| | | <div> |
| | | <PanelHeader title="支出构成分析" /> |
| | | <PanelHeader title="构成分析" /> |
| | | <div class="main-panel panel-item-customers"> |
| | | <div class="filters-row"> |
| | | <ProductTypeSwitch |
| | | v-model="amountType" |
| | | :options="amountTypeOptions" |
| | | @change="handleTypeChange" |
| | | /> |
| | | </div> |
| | | <!-- <CarouselCards :items="cardItems" :visible-count="3" /> --> |
| | | <div class="pie-chart-wrapper"> |
| | | <div class="pie-background"></div> |
| | |
| | | import { ref, onMounted, computed } from 'vue' |
| | | import Echarts from '@/components/Echarts/echarts.vue' |
| | | import PanelHeader from './PanelHeader.vue' |
| | | import CarouselCards from './CarouselCards.vue' |
| | | import ProductTypeSwitch from './ProductTypeSwitch.vue' |
| | | import { rawMaterialPurchaseAmountRatio } from '@/api/viewIndex.js' |
| | | |
| | | /** |
| | |
| | | } |
| | | return resObj |
| | | } |
| | | |
| | | // 当前类型:1=支出 2=收入 |
| | | const amountType = ref(1) |
| | | |
| | | const amountTypeOptions = [ |
| | | { label: 1, text: '支出' }, |
| | | { label: 2, text: '收入' }, |
| | | ] |
| | | |
| | | // 数据列表(来自接口) |
| | | const dataList = ref([]) |
| | |
| | | top: 'center', |
| | | left: '52%', |
| | | itemGap: 30, |
| | | show: false, |
| | | show: true, |
| | | data: data, |
| | | formatter: function (name) { |
| | | const item = landObjData.value[name] |
| | |
| | | } |
| | | |
| | | // 双层环形饼图 |
| | | // 双层环形饼图 |
| | | const landSeries = ref([ |
| | | { |
| | | name: '产品采购金额分析', |
| | | name: '构成分析', |
| | | type: 'pie', |
| | | radius: ['50%', '75%'], |
| | | center: ['50%', '60%'], |
| | | radius: ['40%', '60%'], |
| | | center: ['25%', '50%'], |
| | | itemStyle: { |
| | | borderColor: '#0a1c3a', |
| | | borderWidth: 2, |
| | |
| | | }, |
| | | }, |
| | | label: { |
| | | show: true, |
| | | position: 'outside', |
| | | color: '#fff', |
| | | fontSize: 12, |
| | | lineHeight: 18, |
| | | // rich: { |
| | | // ...dotRich, |
| | | // parent: { fontSize: 14, fontWeight: 600, color: '#fff', lineHeight: 20, overflow: 'break' }, |
| | | // child: { fontSize: 12, color: '#fff', lineHeight: 18 }, |
| | | // }, |
| | | show: false |
| | | }, |
| | | minAngle: 15, |
| | | data: dataList.value, |
| | |
| | | { |
| | | // 内圈 |
| | | type: 'pie', |
| | | radius: ['50%', '60%'], |
| | | center: ['50%', '60%'], |
| | | radius: ['40%', '45%'], |
| | | center: ['25%', '50%'], |
| | | silent: true, |
| | | label: { |
| | | show: false, |
| | |
| | | } |
| | | |
| | | const fetchData = () => { |
| | | // 目前接口只有支出构成占比,先忽略类型参数 |
| | | // 预留扩展:后续可根据 amountType 切不同接口 |
| | | rawMaterialPurchaseAmountRatio() |
| | | .then((res) => { |
| | | if (res.code === 200 && Array.isArray(res.data)) { |
| | |
| | | }) |
| | | } |
| | | |
| | | const handleTypeChange = () => { |
| | | fetchData() |
| | | } |
| | | |
| | | onMounted(() => { |
| | | fetchData() |
| | | }) |
| | |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 20px; |
| | | } |
| | | |
| | | .filters-row { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | align-items: center; |
| | | gap: 12px; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .panel-item-customers { |
| | |
| | | |
| | | .pie-background { |
| | | position: absolute; |
| | | left: 50%; |
| | | top: 60%; |
| | | left: 25%; |
| | | top: 50%; |
| | | transform: translate(-51.5%, -50%); |
| | | width: 380px; |
| | | height: 380px; |
| | | width: 310px; |
| | | height: 310px; |
| | | background-image: url('@/assets/BI/玫瑰图边框.png'); |
| | | background-size: contain; |
| | | background-position: center; |