const milestones = [
{ progress : 100 , milestoneName : '阶段一' , startDate : '2020-12-23' , endDate : '2021-01-30' } ,
{ progress : 100 , milestoneName : '阶段二' , startDate : '2021-01-15' , endDate : '2021-03-15' } ,
{ progress : 100 , milestoneName : '阶段三' , startDate : '2021-03-10' , endDate : '2021-04-05' } ,
{ progress : 94 , milestoneName : '阶段四' , startDate : '2021-04-06' , endDate : '2021-04-29' } ,
{ progress : 0 , milestoneName : '阶段五' , startDate : '2021-04-30' , endDate : '2021-05-03' } ,
] ;
const colors = [
'#f19489' ,
'#bb8fce' ,
'#85c1e9' ,
'#76d7c3' ,
'#81e0aa' ,
'#f7dc6f' ,
'#e59865'
]
const categories = milestones. map ( milestone => milestone. milestoneName) ;
const data = milestones. map ( ( milestone, index ) => {
const startTime = new Date ( milestone. startDate) . getTime ( ) ;
const endTime = new Date ( milestone. endDate) . getTime ( ) ;
const duration = endTime - startTime;
return {
name : milestone. milestoneName,
value : [
index,
startTime,
endTime,
duration
] ,
itemStyle : {
normal : {
color : colors[ index]
}
}
} ;
} ) ;
function renderItem ( params, api ) {
const categoryIndex = api. value ( 0 ) ;
const start = api. coord ( [ api. value ( 1 ) , categoryIndex] ) ;
const end = api. coord ( [ api. value ( 2 ) , categoryIndex] ) ;
const height = api. size ( [ 0 , 1 ] ) [ 1 ] * 0.6 ;
const rectShape = echarts. graphic. clipRectByRect ( {
x : start[ 0 ] ,
y : start[ 1 ] - height / 2 ,
width : end[ 0 ] - start[ 0 ] ,
height : height
} , {
x : params. coordSys. x,
y : params. coordSys. y,
width : params. coordSys. width,
height : params. coordSys. height
} ) ;
return rectShape && {
type : 'rect' ,
shape : rectShape,
style : api. style ( )
} ;
}
option = {
tooltip : {
formatter : function ( params ) {
return params. marker + params. name + ': ' + ( params. value[ 3 ] / 1000 / 60 / 60 / 24 ) . toFixed ( 1 ) + ' days' ;
}
} ,
dataZoom : [ {
type : 'slider' ,
filterMode : 'weakFilter' ,
showDataShadow : false ,
top : 400 ,
height : 10 ,
borderColor : 'transparent' ,
backgroundColor : '#e2e2e2' ,
handleIcon : 'M10.7,11.9H9.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z' ,
handleSize : 20 ,
handleStyle : {
shadowBlur : 6 ,
shadowOffsetX : 1 ,
shadowOffsetY : 2 ,
shadowColor : '#aaa'
} ,
labelFormatter : ''
} , {
type : 'inside' ,
filterMode : 'weakFilter'
} ] ,
grid : {
height : 300
} ,
xAxis : {
type : 'time' ,
axisLabel : {
formatter : function ( val ) {
return new Date ( val) . toLocaleDateString ( ) ;
}
}
} ,
yAxis : {
type : 'category' ,
data : categories
} ,
series : [ {
type : 'custom' ,
renderItem : renderItem,
encode : {
x : [ 1 , 2 ] ,
y : 0
} ,
data : data
} ]
} ;