123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- import React, { Component } from "react";
- import style from "../index.less";
- import { Radio} from '@commonComp';
- import echarts from 'echarts';
- import config from "@config";
- import 'zrender/lib/svg/svg';
- /**
- * 来源于后台数据
- * 图表类型
- *
- *
- * **/
- class ChartItem extends Component {
- constructor(props) {
- super(props);
- this.getContainers = this.getContainers.bind(this);
- this.rangChange = this.rangChange.bind(this);
- this.getXAxisArr = this.getXAxisArr.bind(this);
- }
- getXAxisArr(type){
- const endDate = this.props.endDate;
- let now = endDate?new Date(endDate).getTime():new Date().getTime();
- let arr = [],temp=0;
- //近一周
- switch(type){
- case 'week':
- for(let i=0;i<7;i++){
- temp=i*1000*60*60*24;
- arr.unshift(...this.getDayHours(now-temp,true));
- }
- break;
- case 'month':
- for(let i=0;i<30;i++){
- temp=i*1000*60*60*24;
- arr.unshift(this.getDayHours(now-temp));
- }
- break;
- case 'sixMonth':
- for(let i=0;i<180;i++){
- temp=i*1000*60*60*24;
- arr.unshift(this.getDayHours(now-temp));
- }
- break;
- case 'year':
- for(let i=0;i<365;i++){
- temp=i*1000*60*60*24;
- arr.unshift(this.getDayHours(now-temp));
- }
- break;
- default:
- }
- return arr;
- }
- getDayHours(time,isHour){
- const year = new Date(time).getFullYear();
- const month = new Date(time).getMonth()+1;
- const date = new Date(time).getDate();
- const hour = new Date(time).getHours();
- let arr=[],temp='';
- const str= year+'-'+(month<10?'0'+month:month)+'-'+(date<10?'0'+date:date);
- if(isHour){
- for(let i=0;i<24;i++){
- temp = hour-i>-1?hour-i:hour-i+24;
- arr.unshift(str+" "+(temp<10?'0'+temp:temp));
- }
- return arr;
- }else{
- return str;
- }
- }
- rangChange(type,i){
- const {initFn,handleChange,data,pindex} = this.props;
- const times = this.getXAxisArr(type);
- const startTime=times[0];
- const endTime=times[times.length-1];
- const range = [startTime,endTime];
- const temp=this.props.timeTypes;
- if(!data[startTime+endTime]){
- initFn&&initFn({range,rangeType:type,index:i,pindex,getNew:false});
- }
- handleChange&&handleChange(Object.assign(temp,{[i]:type}));
- }
- getContainers(){
- const timeTypes = this.props.timeTypes;
- const range = this.getXAxisArr(config.chartDismen);
- const obj = this.props.data[range[0]+range[range.length-1]];
- const {endDate} = this.props;
- let arr = [];
- for(let i in obj){
- arr.push(<Chart data={obj[i]} endDate={endDate} type={timeTypes&&timeTypes[i]} index={i} getXAxisArr={this.getXAxisArr} handleRangeChange={this.rangChange}/>)
- }
- return arr;
- }
- componentDidMount(){
- const {initFn,pindex} = this.props;
- const type = config.chartDismen;
- const times = this.getXAxisArr(config.chartDismen);
- const startTime=times[0];
- const endTime=times[times.length-1];
- const range = [startTime,endTime];
- initFn&&initFn({range,rangeType:type,pindex,getNew:true});
- }
- render() {
- const {title} = this.props;
- return <div className={style['assess-item']}>
- <h2>{title}</h2>
- <div className={style['item-content']}>
- {this.getContainers()}
- </div>
- </div>;
- }
- }
- class Chart extends Component{
- constructor(props) {
- super(props);
- this.state={
- chartObj:null,
- //timeRange:'year',
- week:props.getXAxisArr('week'),
- month:props.getXAxisArr('month'),
- sixMonth:props.getXAxisArr('sixMonth'),
- year:props.getXAxisArr('year')
- };
- this.drawChart = this.drawChart.bind(this);
- this.timeSwitch = this.timeSwitch.bind(this);
- }
- drawChart(){
- const {index,data,getXAxisArr,type,endDate} = this.props;
- const xAxis = getXAxisArr(type);
- const id = endDate?'chart'+endDate+index:'chart'+index;
- let series = [],names=[],inx=-1;
- let myChart = echarts.init(document.getElementById(id) ,null, {renderer: 'svg'});
- const interval = {
- week:24,
- month:4,
- sixMonth:9,
- year:60
- };
- data&&data.map((it)=>{
- let values=new Array();
- let name='';
- it&&it.creatTime.map((x,i)=>{
- inx=xAxis.findIndex((a)=>{
- name=type=='week'?x.substr(0,13):x.substr(0,10);
- return a==name;
- }); //日期对应横坐标的位置
- if(inx!=-1){
- values[inx] = it.indexValue[i]; //值对应横坐标的位置
- }
- });
- names.push(it.itemName);
- series.push({
- name: it.itemName,
- type: 'line',
- data: values,
- showAllSymbol:true
- });
- });
- // 指定图表的配置项和数据
- var option = {
- tooltip: {
- trigger: 'axis'
- },
- legend: {
- data:names,
- bottom:210
- },
- grid:{
- top:80
- },
- xAxis: {
- type: 'category',
- boundaryGap: false,
- data: xAxis,
- splitLine:{
- show:false
- },
- axisPointer:{
- //show:false
- },
- axisTick:{
- show:false,
- interval:interval[type]
- },
- axisLabel:{
- show:true,
- showMaxLabel:true,
- interval:interval[type],
- rotate:65,
- fontSize:10
- }
- },
- yAxis: {
- type: 'value',
- axisTick:{
- show:false
- },
- axisLabel:{
- show:true,
- showMaxLabel:true
- }
- },
- series: series
- };
- // 使用刚指定的配置项和数据显示图表。
- myChart.setOption(option);
- }
- timeSwitch(type){
- const {handleRangeChange,index} = this.props;
- handleRangeChange&&handleRangeChange(type,index);
- const that=this;
- setTimeout(()=>{
- that.drawChart();
- },300);
- }
- componentDidMount(){
- this.drawChart();
- }
- render(){
- const {type,index,endDate} = this.props;
- return <div className={style['cont']}>
- <div className={style['time-range']}>
- <span className={type=='year'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("year")}>近一年</span>
- <span className={type=='sixMonth'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("sixMonth")}>近六个月</span>
- <span className={type=='month'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("month")}>近一个月</span>
- <span className={type=='week'?style['range']+" "+style['on']:style['range']} onClick={()=>this.timeSwitch("week")}>近一周</span>
- </div>
- <div className={style["chart-box"]} id={endDate?'chart'+endDate+index:'chart'+index}></div>
- </div>;
- }
- }
- export default ChartItem;
|