会议密集问题

描述:当前是关于Echarts图表中的 关系图 示例。
 
            var renderMachineRoomData = []
var renderConfRoomData = []
var confToMachieRoomLink = []

var iconPath={
          pathMachineRoom: 'path://M77.1,81.7v824h254v-824H77.1z M276.8,396.3h-148v-38h148V396.3z M276.8,474.3h-148v-38h148V474.3z M276.8,318.3h-148v-38\n' +
            '\th148V318.3z M276.8,166.3h-148v-38h148V166.3z M276.8,244.3h-148v-38h148V244.3z M378.1,81.7v824h254v-824H378.1z M577.8,396.3h-148\n' +
            '\tv-38h148V396.3z M577.8,474.3h-148v-38h148V474.3z M577.8,318.3h-148v-38h148V318.3z M577.8,166.3h-148v-38h148V166.3z M577.8,244.3\n' +
            '\th-148v-38h148V244.3z M679.1,81.7v824h254v-824H679.1z M878.8,396.3h-148v-38h148V396.3z M878.8,474.3h-148v-38h148V474.3z\n' +
            '\t M878.8,318.3h-148v-38h148V318.3z M878.8,166.3h-148v-38h148V166.3z M878.8,244.3h-148v-38h148V244.3z',

          pathConfRoom: 'path://M934,583.4c0,35.8-18.2,70.1-51.3,96.4c-10.8,8.6-26.5,6.8-35.1-4c-8.6-10.8-6.8-26.5,4-35.1\n' +
            '\tc14.8-11.7,32.4-31.2,32.4-57.2c0-22.6-13.2-44.4-37.2-61.5c-26.6-18.9-62.4-29.3-100.8-29.3H270.6c-38.4,0-74.3,10.4-100.9,29.3\n' +
            '\tc-24,17-37.2,38.9-37.2,61.5c0,26,17.6,45.4,32.5,57.2c10.8,8.6,12.6,24.3,4,35.1c-4.9,6.2-12.2,9.5-19.6,9.5\n' +
            '\tc-5.4,0-10.9-1.8-15.5-5.4c-33.1-26.3-51.4-60.5-51.4-96.4c0-39.2,20.7-75.6,58.3-102.2c35-24.8,81.1-38.5,129.8-38.5h101.1\n' +
            '\tc-14.5-14.2-16.5-56.2-0.7-84.5c9.9-17.6,42.5-55.5,71.4-55.5c33.9,0,49.6,35.5,63.4,35.5c13.8,0,29.5-35.5,63.4-35.5\n' +
            '\tc28.9,0,61.6,37.9,71.4,55.5c15.8,28.3,13.8,70.3-0.7,84.5h106c48.7,0,94.8,13.7,129.8,38.5C913.3,507.8,934,544.1,934,583.4z\n' +
            '\t M534.8,665.7h-53.2c-13.8,0-25,11.2-25,25s11.2,25,25,25h53.2c13.8,0,25-11.2,25-25S548.6,665.7,534.8,665.7z M505.7,267.4\n' +
            '\tc39,0,70.6-31.6,70.6-70.6c0-39-31.6-70.7-70.6-70.7c-39,0-70.7,31.7-70.7,70.7C435.1,235.8,466.7,267.4,505.7,267.4z M229.5,595.3\n' +
            '\tc0-39,31.6-70.7,70.7-70.7c39,0,70.6,31.7,70.6,70.7S339.2,666,300.2,666C261.1,666,229.5,634.4,229.5,595.3z M423,846.1H177.5\n' +
            '\tc-24.1,0-31.3-54.9-12-89.4c9.9-17.6,42.5-55.5,71.4-55.5c33.9,0,49.6,35.5,63.4,35.5c13.8,0,29.5-35.5,63.4-35.5\n' +
            '\tc28.9,0,61.6,37.9,71.4,55.5C454.3,791.2,447.1,846.1,423,846.1z M648,595.3c0-39,31.6-70.7,70.7-70.7c39,0,70.6,31.7,70.6,70.7\n' +
            '\tS757.7,666,718.6,666C679.6,666,648,634.4,648,595.3z M841.5,846.1H595.9c-24.1,0-31.3-54.9-12-89.4c9.9-17.6,42.5-55.5,71.4-55.5\n' +
            '\tc33.9,0,49.6,35.5,63.4,35.5c13.8,0,29.5-35.5,63.4-35.5c28.9,0,61.6,37.9,71.4,55.5C872.8,791.2,865.6,846.1,841.5,846.1z',
        };
        
// 模拟获取机房或会议数据
var getData = function(lowerValue, upperValue, name) {
    let data = []
    let count = Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue);
    for(let i=0;i<count;i++){
        data.push(name + i)
    }
    return data
  };


/*机房平均平均分布生成坐标函数
   * @method calculationMRCoordinate
   * @param {Number} index 第几个数据
   * @param {Number} total 总共多少数据
   * @param {Number} range 点与点之间的间距
   * @return {Array} 返回生成的数据
    */
var calculationMRCoordinate = function(index, total, range) {
    let x = null
    let y = null

    let baseNum = Math.ceil(Math.sqrt(total))

    let tempX = index % baseNum
    let tempY = parseInt(index / baseNum)

    x = tempX * range + 0
    y = tempY * range + 0

    // 如果是最后一排且数量小于baseNum,重新计算range X
    if ((total % baseNum) > 0 && tempY === parseInt(total / baseNum)) {
      range = range * (baseNum - 1) / ((total % baseNum) + 1)
      x = tempX * range + 0 + range
    }

    return [x, y]
  };
  
  
/*会议围绕中心点圆形分布生成坐标函数
   * @method calculationCRCoordinate
   * @param {Array} center 围绕的圆心
   * @param {Number} radius 圆的半径
   * @param {Number} index 第几个数据
   * @param {Number} total 总共多少数据
   * @param {Number} count 一个圆上显示多少个
   * @param {Number} range 圆与圆之间的间距
   * @return {Array} 返回生成的数据
  */
var calculationCRCoordinate = function(center, radius, index, total, count, range) {
    let x = null
    let y = null

    let baseNum = parseInt(index / count)
    let offset = baseNum % 2 === 0 ? 0 : (360 / count) / 2

    let hudu = (2 * Math.PI / 360) * ((360 / count) * parseInt(index % count) + offset)

    radius = radius + baseNum * range

    x = center[0] + Math.sin(hudu) * radius
    y = center[1] + Math.cos(hudu) * radius

    return [x, y]
  };
  
// 渲染机房数据
var renderDataMachineRoom=function(){
    let machineRoomData = getData(1,10,'机房')
    let machineRoomLen = machineRoomData.length
    let temInteractive = []
    renderMachineRoomData = machineRoomData.map((item, index) => {
      let coordinate = calculationMRCoordinate(index, machineRoomLen, 110)
      item.name = item
      let tempD = {
        name: item,
        x: coordinate[0],
        y: coordinate[1],
        // fixed:true,
        symbolKeepAspect: true,
        category: '机房',
        value: item,
        symbol: iconPath.pathMachineRoom,
        symbolSize: 30,
      }
      return tempD
    })
};
// 渲染会议数据
var renderDataConfRoom=function(){
    let tempDataConf = []
    let tempDataConfLink = []
    if (renderMachineRoomData.length > 0) {
      //遍历机房
      for (let machineRoom of renderMachineRoomData) {
        let confName = machineRoom.name + '下会议'
        let confRoomData = getData(0,20,confName)
        let confRoomLen = confRoomData.length
        if (confRoomLen > 0) {
          let center = [machineRoom.x, machineRoom.y]
          let radius = 50 / (Math.ceil(confRoomLen / 6) + 1)
          let count = confRoomLen > 6 ? 6 : confRoomLen
          //遍历会议
          confRoomData.forEach((confItem, confIndex) => {
            // center,radius,index,total,count,range
            let coordinate = calculationCRCoordinate(center, radius, confIndex, confRoomLen, count, radius)
            let tempD = {
              name: confItem,
              x: coordinate[0],
              y: coordinate[1],
              // fixed:true,
              category: '会议',
              value: confItem,
              symbolKeepAspect: true,
              symbol: iconPath.pathConfRoom,
              symbolSize: 35,
            }
            tempDataConf.push(tempD)

            let tempDLink = {
              source: confItem,
              target: machineRoom.name,
              value: {
                s: confItem,
                t: machineRoom,
                type: 'confToMachine'
              }
            }
            tempDataConfLink.push(tempDLink)
          });
          //遍历会议 end
        };
      };
      //遍历机房 end
    };

    renderConfRoomData = tempDataConf
    confToMachieRoomLink = tempDataConfLink
};

renderDataMachineRoom()
renderDataConfRoom()
var seriesData = [].concat(renderMachineRoomData,renderConfRoomData)
var link = confToMachieRoomLink
console.log(seriesData,link)
option = {
          backgroundColor: '#232629',
          scaleLimit: {
            min: 0.7,
          },
          tooltip: {
            padding: [18, 14],
            backgroundColor: '#141414',
            borderColor: '#383b3c',
            borderWidth: 1,
            textStyle: {
              color: '#9ca9b1',
            },
            formatter: (params,) => {
              return 'aaaa'
            },
          },
          series: [
            {
              name: 'ConferenceTopology',
              type: 'graph',
              layout: 'none',
              data: seriesData,
              links: link,
              roam: true,
              focusNodeAdjacency: true,
              animationDelay: 1000,
              itemStyle: {
                normal: {
                  color: (params) => {
                    // let index = params.data.value.status ? params.data.value.status : 0
                    // return this.iconColor[index]
                    return '#25a5c5'
                  },
                  opacity: 1,
                }
              },
              label: {
                show: true,
                position: 'top',
                formatter: (params) => {
                  return params.value.name
                }
              },
              lineStyle: {
                color: '#25a5c5',
                width: 2,
                curveness: 0.3
              },
              emphasis: {
                lineStyle: {
                  width: 3
                },
              },
            },
          ]
        };