From abe942f4c6d49a6ad42acaf8e74f5f02b5ffc089 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 04 六月 2021 15:26:17 +0800
Subject: [PATCH] 2021-06-04

---
 src/menu/components/chart/antv-pie/index.jsx |  246 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 237 insertions(+), 9 deletions(-)

diff --git a/src/menu/components/chart/antv-pie/index.jsx b/src/menu/components/chart/antv-pie/index.jsx
index ebd9179..8c6428b 100644
--- a/src/menu/components/chart/antv-pie/index.jsx
+++ b/src/menu/components/chart/antv-pie/index.jsx
@@ -3,7 +3,7 @@
 import { is, fromJS } from 'immutable'
 import { Icon, Popover } from 'antd'
 import { Chart } from '@antv/g2'
-import DataSet from '@antv/data-set'
+import DataSet, { DataView } from '@antv/data-set'
 
 import MKEmitter from '@/utils/events.js'
 import asyncComponent from '@/utils/asyncComponent'
@@ -54,6 +54,9 @@
 
       if (card.subtype === 'ring') {
         _plot.innerRadius = 50
+      } else if (card.subtype === 'nest') {
+        _plot.innerRadius = 30
+        _plot.radius = 80
       }
 
       let _card = {
@@ -150,13 +153,6 @@
       { label: '2003', value: 33.7 },
       { label: '2004', value: 30.7 },
       { label: '2005', value: 25.8 },
-      { label: '2006', value: 31.7 },
-      { label: '2007', value: 33 },
-      { label: '2008', value: 46 },
-      { label: '2009', value: 38.3 },
-      { label: '2010', value: 28 },
-      { label: '2011', value: 42.5 },
-      { label: '2012', value: 30.3 }
     ]
 
     let data = xdata.map(item => {
@@ -169,11 +165,243 @@
     return data
   }
 
+  getnestdata = (X_axis, Y_axis, type) => {
+    const xdata = [
+      { name: '鐙瓙', type: '鐏薄', value: 11 },
+      { name: '鐧界緤', type: '鐏薄', value: 10 },
+      { name: '姘寸摱', type: '椋庡悜', value: 14 },
+      { name: '灏勬墜', type: '鐏薄', value: 10 },
+      { name: '鍙屽瓙', type: '椋庡悜', value: 7 },
+      { name: '澶╁钩', type: '椋庡悜', value: 7 },
+      { name: '鎽╃警', type: '鍦熻薄', value: 14 },
+      { name: '閲戠墰', type: '鍦熻薄', value: 3 },
+      { name: '澶勫コ', type: '鍦熻薄', value: 3 },
+      { name: '澶╄潕', type: '姘磋薄', value: 11 },
+      { name: '宸ㄨ煿', type: '姘磋薄', value: 5 },
+      { name: '鍙岄奔', type: '姘磋薄', value: 5 },
+    ]
+
+    let map = new Map()
+    let sort = 1
+    let data = xdata.map(item => {
+      let _sort = sort
+      if (map.has(item.type)) {
+        _sort = map.get(item.type)
+      } else {
+        map.set(item.type, _sort)
+        sort++
+      }
+      return {
+        [X_axis]: item.name,
+        [Y_axis]: item.value,
+        [type]: item.type,
+        $sort: _sort
+      }
+    })
+
+    return data
+  }
+
+  nestrender = () => {
+    const { card } = this.state
+    const plot = card.plot
+
+    let color = plot.color || 'rgba(0, 0, 0, 0.85)'
+    let X_axis = plot.Xaxis || 'x'
+    let Y_axis = plot.Yaxis || 'y'
+    let type = plot.type || 'type'
+
+    const _data = this.getnestdata(X_axis, Y_axis, type)
+    const dvx = new DataView().source(_data)
+
+    dvx.transform({
+      type: 'sort-by',
+      fields: ['$sort']
+    })
+
+    let data = dvx.rows
+
+    // 閫氳繃 DataSet 璁$畻鐧惧垎姣�
+    const dv = new DataView()
+    dv.source(data).transform({
+      type: 'percent',
+      field: Y_axis,
+      dimension: type,
+      as: '$percent'
+    })
+
+    const dv1 = new DataView()
+    dv1.source(data).transform({
+      type: 'percent',
+      field: Y_axis,
+      dimension: X_axis,
+      as: '$percent',
+    })
+
+    const chart = new Chart({
+      container: card.uuid + 'canvas',
+      autoFit: true,
+      height: card.plot.height ? (card.plot.height - 75) : 325,
+      padding: 0,
+    })
+
+    chart.data(dv.rows)
+
+    if (plot.show !== 'value') {
+      chart.scale('percent', {
+        formatter: (val) => {
+          val = val * 100 + '%'
+          return val
+        }
+      })
+
+      Y_axis = '$percent'
+    }
+    let radius = plot.radius / 100
+    let innerRadius = plot.innerRadius / 100
+    
+    chart.coordinate('theta', {
+      innerRadius: innerRadius,
+      radius: innerRadius + (radius - innerRadius) / 2,
+    })
+    chart.tooltip({
+      showTitle: false,
+      showMarkers: false,
+    })
+    chart.legend(false)
+    let chart1 = chart
+      .interval()
+      .adjust('stack')
+      .position(Y_axis)
+      .color(type)
+      .tooltip(`${type}*${Y_axis}`, (type, percent) => {
+        if (plot.show !== 'value') {
+          percent = (percent * 100).toFixed(2) + '%'
+        }
+        return {
+          name: type,
+          value: percent,
+        }
+      })
+      .style({
+        lineWidth: 1,
+        stroke: '#fff',
+      })
+
+    if (plot.label !== 'false') {
+      chart1.label(type, {
+        offset: -10,
+      })
+    }
+    
+    const outterView = chart.createView()
+    
+    outterView.data(dv1.rows)
+
+    if (plot.show !== 'value') {
+      outterView.scale('percent', {
+        formatter: (val) => {
+          val = val * 100 + '%'
+          return val
+        }
+      })
+    }
+    outterView.coordinate('theta', {
+      innerRadius: (innerRadius + (radius - innerRadius) / 2) / radius,
+      radius: radius
+    })
+    let chart2 = outterView
+      .interval()
+      .adjust('stack')
+      .position(Y_axis)
+      .color(X_axis)
+      .tooltip(`${X_axis}*${Y_axis}`, (name, value) => {
+        if (plot.show !== 'value') {
+          value = (value * 100).toFixed(2) + '%'
+        }
+        return {
+          name: name,
+          value: value
+        }
+      })
+      .style({
+        lineWidth: 1,
+        stroke: '#fff',
+      })
+
+      if (plot.label !== 'false') {
+        if (plot.label === 'inner') {
+          chart2.label(Y_axis, {
+            offset: -30,
+            content: (data) => {
+              let _label = ''
+              let _val = ''
+              if (plot.show !== 'value') {
+                _val = `${(data[Y_axis] * 100).toFixed(2)}%`
+              } else {
+                _val = `${data[Y_axis]}`
+              }
+              if (plot.label === 'inner') {
+                _label = _val
+              } else {
+                _label = `${data[X_axis]}: ${_val}`
+              }
+              return _label
+            },
+            style: {
+              textAlign: 'center',
+              fontSize: 16,
+              shadowBlur: 2,
+              shadowColor: 'rgba(0, 0, 0, .45)',
+              fill: '#fff',
+            }
+          })
+        } else {
+          chart2.label(Y_axis, {
+            layout: { type: 'pie-spider' },
+            labelHeight: 20,
+            content: (data) => {
+              let _label = ''
+              let _val = ''
+              if (plot.show !== 'value') {
+                _val = `${(data[Y_axis] * 100).toFixed(2)}%`
+              } else {
+                _val = `${data[Y_axis]}`
+              }
+              if (plot.label === 'inner') {
+                _label = _val
+              } else {
+                _label = `${data[X_axis]}: ${_val}`
+              }
+              return _label
+            },
+            labelLine: {
+              style: {
+                lineWidth: 0.5,
+              },
+            },
+            style: {
+              fill: color
+            }
+          })
+        }
+      }
+    
+    chart.interaction('element-highlight')
+    
+    chart.render()
+  }
+
   pierender = () => {
     const { card } = this.state
     const plot = card.plot
-    let color = plot.color || 'rgba(0, 0, 0, 0.85)'
 
+    if (plot.shape === 'nest') {
+      this.nestrender()
+      return
+    }
+
+    let color = plot.color || 'rgba(0, 0, 0, 0.85)'
     let X_axis = plot.Xaxis || 'x'
     let Y_axis = plot.Yaxis || 'y'
 

--
Gitblit v1.8.0