import { Component, ElementRef, NgZone, OnInit, ViewChild } from '@angular/core'; import { DatePipe, ModalHelper, _HttpClient } from '@delon/theme'; import { G2MiniAreaClickItem, G2MiniAreaData } from '@delon/chart/mini-area'; import { format } from 'date-fns'; import { SFComponent, SFDateWidgetSchema, SFRadioWidgetSchema, SFSchema, SFUISchema } from '@delon/form'; import { G2TimelineData, G2TimelineMap } from '@delon/chart/timeline'; import { Chart } from '@antv/g2'; const DataSet = require('@antv/data-set'); @Component({ selector: 'app-datatable-compliance-index', templateUrl: './index.component.html', styleUrls: ['./index.component.less'], providers: [DatePipe] }) export class DatatableComplianceIndexComponent implements OnInit { @ViewChild('sf', { static: false }) sf!: SFComponent; ui!: SFUISchema; schema: SFSchema = {}; mode = 'year'; date: any = null; dateFormat = 'yyyy-MM-dd'; time: any = ['2022-01-01 00:00:00'] constructor(private http: _HttpClient, private modal: ModalHelper, private ngZone: NgZone, private datePipe: DatePipe) {} ngOnInit(): void { this.initSF(); } changeData(){ if(this.mode === 'year') { this.dateFormat = 'yyyy' } else if(this.mode === 'month') { this.dateFormat = 'yyyy-MM' } else { this.dateFormat = 'yyyy-MM-dd' } } onChange(result: any) { if(this.mode === 'year') { this.time = [this.datePipe.transform(this.date, 'yyyy') + '-01-01 00:00:00'] } else if(this.mode === 'month') { this.time = [this.datePipe.transform(this.date, 'yyyy-MM') + '-01 00:00:00'] } } initSF() { this.schema = { properties: { name: { type: 'string', title: '', ui: { widget: 'select', placeholder: '网络货运人' } }, name2: { type: 'string', title: '', ui: { widget: 'select', placeholder: '部门' } }, name3: { type: 'string', title: '', ui: { placeholder: '业务员' } } } }; this.ui = { '*': { grid: { span: 4 } } }; } render(el: ElementRef) { this.ngZone.runOutsideAngular(() => this.init(el.nativeElement)); } private init(el: HTMLElement): void { const chart = new Chart({ container: el, autoFit: true, height: 400 }); // 以三组数据为例, 需要展示 91/92/93年中a/b/c数据走势 const data = [ { data: '1月', label: '订单合格率', value: 5 }, { data: '2月', label: '订单合格率', value: 10 }, { data: '3月', label: '订单合格率', value: 25 }, { data: '4月', label: '订单合格率', value: 35 }, { data: '5月', label: '订单合格率', value: 15 }, { data: '6月', label: '订单合格率', value: 5 }, { data: '7月', label: '订单合格率', value: 95 }, { data: '8月', label: '订单合格率', value: 45 }, { data: '1月', label: '付款及时率', value: 10 }, { data: '2月', label: '付款及时率', value: 15 }, { data: '3月', label: '付款及时率', value: 30 }, { data: '4月', label: '付款及时率', value: 8 }, { data: '5月', label: '付款及时率', value: 9 }, { data: '6月', label: '付款及时率', value: 5 }, { data: '7月', label: '付款及时率', value: 80 }, { data: '8月', label: '付款及时率', value: 55 }, { data: '1月', label: '货源占比率', value: 90 }, { data: '2月', label: '货源占比率', value: 30 }, { data: '3月', label: '货源占比率', value: 45 }, { data: '4月', label: '货源占比率', value: 35 }, { data: '5月', label: '货源占比率', value: 95 }, { data: '6月', label: '货源占比率', value: 35 }, { data: '7月', label: '货源占比率', value: 65 }, { data: '8月', label: '货源占比率', value: 63 }, { data: '1月', label: '运费直付占比', value: 30 }, { data: '2月', label: '运费直付占比', value: 60 }, { data: '3月', label: '运费直付占比', value: 25 }, { data: '4月', label: '运费直付占比', value: 35 }, { data: '5月', label: '运费直付占比', value: 15 }, { data: '6月', label: '运费直付占比', value: 55 }, { data: '7月', label: '运费直付占比', value: 50 }, { data: '8月', label: '运费直付占比', value: 30 }, ]; chart.data(data); //刻度自定义 chart.scale({ data: { range: [0, 1], }, value: { min: 0, nice: true, }, }); // 图表下方图形文字自定义 chart.legend({ items:[ { name: '订单合格率', value: 'node_load1', marker: { symbol: 'circle', style: {fill: '#6193f7'} }, }, { name: '付款及时率', value: 'node_load2', marker: {symbol: 'circle',style: {fill: '#58d3a2'}}, }, { name: '货源占比率', value: 'node_load13', marker: {symbol: 'circle',style: {fill: '#5b6d8f'}}, }, { name: '运费直付占比', value: 'node_load13', marker: {symbol: 'circle',style: {fill: '#f0b915'}}, }, ] }); // 提示自定义 chart.tooltip({ showCrosshairs: true, shared: true, }); //数据格式化 chart.axis('value', { label: { formatter: (val) => { return val + ' %'; }, }, }); // 在x*y的坐标点上按z值绘制线条, 如果z值相同将使用直线连接 chart.line().position('data*value').color('label').tooltip('label*value', (name:any, value:any) => { return { name: name, value: value + '%' }; });; // 在x*y的坐标上按z值绘制圆点 chart.point().position('data*value').size(4).color('label').shape('circle'); chart.render(); } }