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
    } ] 
} ;