Jelajahi Sumber

增加自动轮播 增加红绿灯

zhbyyy 1 tahun lalu
induk
melakukan
3f6afb36be
7 mengubah file dengan 355 tambahan dan 86 penghapusan
  1. TEMPAT SAMPAH
      manpower/images/green.png
  2. TEMPAT SAMPAH
      manpower/images/red.png
  3. TEMPAT SAMPAH
      manpower/images/yellow.png
  4. 4 3
      manpower/index.html
  5. 76 59
      manpower/js/index.js
  6. 227 0
      manpower/libs/echarts-tooltip-carousel.js
  7. 48 24
      manpower/styles/index.css

TEMPAT SAMPAH
manpower/images/green.png


TEMPAT SAMPAH
manpower/images/red.png


TEMPAT SAMPAH
manpower/images/yellow.png


+ 4 - 3
manpower/index.html

@@ -22,6 +22,7 @@
   <script src="./js/zhb.js"></script>
   <script src="./js/li.js"></script>
   <script src="./js/fjx.js"></script>
+  <script src="./libs/echarts-tooltip-carousel.js"></script>
 </head>
 
 <body>
@@ -34,7 +35,7 @@
       <div class="left">
         <dv-border-box-8 :dur="10" style="flex: 1;">
           <div class="my-panel">
-            <div class="panel-title flex-between " >
+            <div class="panel-title flex-between ">
               <span class="text">定机构</span>
               <span class="tip-window" @click="handleShowTip(0)">智能分析</span>
             </div>
@@ -235,8 +236,8 @@
       </div>
     </div>
   </div>
- 
- 
+
+
   <script src="./js/index.js"></script>
 </body>
 

+ 76 - 59
manpower/js/index.js

@@ -14,7 +14,8 @@ let app = new Vue({
       },
       centerData: '',
       storageRecordConfig: {
-        header: ['时间', '所属集团', '工作情况'],
+        waitTime: 200000,
+        header: ['', '时间', '所属集团', '工作情况'],
         headerBGC: '#05507b33',
         oddRowBGC: '#69c0ff0f',
         evenRowBGC: '',
@@ -22,13 +23,21 @@ let app = new Vue({
         rowNum: 4,
         align: ['center'],
         data: [
-          ['2022年1月', '山西焦煤', '已经开展高层次人才引进工作'],
-          ['2022年2月', '山西文旅', '不能按期完成序时进度'],
-          ['2022年3月', '大地控股', '已经实现中长期激励机制贯彻'],
-          ['2022年4月', '国际能源', '薪酬结果没有做到公开'],
-          ['2022年5月', '山西焦煤', '已经开展高层次人才引进工作'],
-          ['2022年6月', '山西焦煤', '不能按期完成序时进度'],
+          ['<span class="lightOut"><span class="light red"></span></span>', '2022年1月', '山西焦煤', '已经开展高层次人才引进工作'],
+          ['<span class="lightOut"><span class="light yellow"></span></span>', '2022年2月', '山西文旅', '不能按期完成序时进度'],
+          ['<span class="lightOut"><span class="light green"></span></span>', '2022年3月', '大地控股', '已经实现中长期激励机制贯彻'],
+          ['<span class="lightOut"><span class="light red"></span></span>', '2022年4月', '国际能源', '薪酬结果没有做到公开'],
+          ['<span class="lightOut"><span class="light yellow"></span></span>', '2022年5月', '山西焦煤', '已经开展高层次人才引进工作'],
+          ['<span class="lightOut"><span class="light green"></span></span>', '2022年6月', '山西焦煤', '不能按期完成序时进度'],
         ],
+        // data: [
+        //   ['<span style-"display:inline-block; width:15px;height:15px;border-radius:50%;background-color:green;"></span>', '2022年1月', '山西焦煤', '已经开展高层次人才引进工作'],
+        //   ['2022年2月', '山西文旅', '不能按期完成序时进度'],
+        //   ['2022年3月', '大地控股', '已经实现中长期激励机制贯彻'],
+        //   ['2022年4月', '国际能源', '薪酬结果没有做到公开'],
+        //   ['2022年5月', '山西焦煤', '已经开展高层次人才引进工作'],
+        //   ['2022年6月', '山西焦煤', '不能按期完成序时进度'],
+        // ],
       },
       storageRecordConfig2: {
         header: ['企业名称', '预警内容', '数据抓取日期', '累计未获取数据日期'],
@@ -163,11 +172,11 @@ let app = new Vue({
     }
   },
   methods: {
-    handleShowTip(index){
+    handleShowTip (index) {
       this.showTip = true
       this.tipNum = index
     },
-    handleGoPage(url){
+    handleGoPage (url) {
       window.location.href = url
     },
     numFormat (value) {
@@ -362,7 +371,7 @@ let app = new Vue({
           {
             name: '管理人员数占总人数比值',
             type: 'line',
-            yAxisIndex: 1, 
+            yAxisIndex: 1,
             smooth: true, //平滑曲线显示
             showAllSymbol: true, //显示所有图形。
             symbol: 'circle', //标记的图形为实心圆
@@ -408,8 +417,8 @@ let app = new Vue({
       option.legend.data = ['当前管理人员数', '管理人员数占总人数比值']
       option.yAxis[0] = {
         type: 'log',
-        min:1,
-        logBase:10,
+        min: 1,
+        logBase: 10,
         axisLine: {
           show: false,
         },
@@ -418,7 +427,7 @@ let app = new Vue({
         },
         axisLabel: {
           show: true,
-          formatter: function(value) {
+          formatter: function (value) {
             return value === 1 ? 0 : value
           },
           textStyle: {
@@ -570,7 +579,7 @@ let app = new Vue({
         },
         axisLabel: {
           show: true,
-          formatter: function(value) {
+          formatter: function (value) {
             return value === 1 ? 0 : value
           },
           textStyle: {
@@ -716,22 +725,22 @@ let app = new Vue({
       option.legend.data = ['人数变化', '劳动生产率同比变化']
       option.legend.show = true
       option.yAxis[0].axisLabel.formatter = '{value} %',
-      option.yAxis.push({
-        type: 'value',
-        axisLine: {
-          show: false,
-        },
-        splitLine: {
-          show: false,
-        },
-        axisLabel: {
-          show: true,
-          formatter: '{value} %',
-          textStyle: {
-            color: 'rgba(250,250,250,0.6)',
+        option.yAxis.push({
+          type: 'value',
+          axisLine: {
+            show: false,
           },
-        },
-      })
+          splitLine: {
+            show: false,
+          },
+          axisLabel: {
+            show: true,
+            formatter: '{value} %',
+            textStyle: {
+              color: 'rgba(250,250,250,0.6)',
+            },
+          },
+        })
 
       myChart.setOption(option)
     },
@@ -787,10 +796,10 @@ let app = new Vue({
         ],
       }
       option.title.text = '人数变化和人工成本利润率变化分析'
-      option.legend.data = ['人数变化','人工成本利润率同比变化']
+      option.legend.data = ['人数变化', '人工成本利润率同比变化']
       option.legend.show = true
       option.yAxis[0].axisLabel.formatter = '{value} %',
-      myChart.setOption(option)
+        myChart.setOption(option)
     },
     // 中间图表---------------------------------------------开始
     initChartC1 () {
@@ -822,7 +831,7 @@ let app = new Vue({
             },
             // data: [60, 50, 80, 80, 90, 55, 40, 60, 50, 80, 90, 55, 40, 60, 50, 90, 55, 40],
             data: c1[0],
-           
+
 
           },
           {
@@ -907,6 +916,10 @@ let app = new Vue({
         },
       })
       myChart.setOption(option)
+      tools.loopShowTooltip(myChart, option, {
+        nterval: 2000,
+        loopSeries: true,
+      });
     },
     initChartC2 () {
       let myChart = echarts.init(this.$refs['echartC2'])
@@ -934,7 +947,7 @@ let app = new Vue({
               color: '#B889EA',
               width: 2,
             },
-           
+
             // data: [60, 50, 80, 80, 90, 55, 40, 60, 50, 80, 90, 55, 40, 60, 50, 90, 55, 40],
             data: c2[0],
             markLine: {
@@ -989,13 +1002,13 @@ let app = new Vue({
             },
             itemStyle: {
               color: params => {
-                  if( params.value < 0 && c2[0][params.dataIndex] < 0) {
-                    return 'red'
-                  } else if(c2[0][params.dataIndex]  < 0) {
-                    return 'yellow'
-                  } else {
-                    return '#69c0ff'
-                  }
+                if (params.value < 0 && c2[0][params.dataIndex] < 0) {
+                  return 'red'
+                } else if (c2[0][params.dataIndex] < 0) {
+                  return 'yellow'
+                } else {
+                  return '#69c0ff'
+                }
               },
             },
             data: c2[1]
@@ -1007,15 +1020,19 @@ let app = new Vue({
       option.legend.show = true
       option.grid.right = '15%'
       option.yAxis[0].axisLabel.formatter = '{value} %',
-      option.yAxis.push({
-        splitLine: {
-          show: false,
-        },
-        axisLine: {
-          show: false,
-        },
-      })
+        option.yAxis.push({
+          splitLine: {
+            show: false,
+          },
+          axisLine: {
+            show: false,
+          },
+        })
       myChart.setOption(option)
+      tools.loopShowTooltip(myChart, option, {
+        nterval: 2000,
+        loopSeries: true,
+      });
     },
     // 右侧图表---------------------------------------------开始
     initChartR1 () {
@@ -1025,12 +1042,12 @@ let app = new Vue({
       let dataTemp = []
       let dataTemp2 = []
       dataR1[0].forEach(item => {
-          dataTemp.push(item+1);
+        dataTemp.push(item + 1);
       });
       dataR1[1].forEach(item => {
-        dataTemp2.push(item+1);
-    });
-    
+        dataTemp2.push(item + 1);
+      });
+
       let option = {
         ..._.cloneDeep(commonOptions),
         series: [
@@ -1080,9 +1097,9 @@ let app = new Vue({
       option.title.text = '当前各省属企业招聘需求公示人次'
       option.legend.data = ['招聘需求公告次数', '招聘需求公告累计招聘人次']
       option.legend.show = true
-      option.tooltip.formatter = function(value){
-        return value[0].axisValue+':'+ (value[0].value -1)+'<br>'+
-        value[1].axisValue+':'+ (value[1].value-1)
+      option.tooltip.formatter = function (value) {
+        return value[0].axisValue + ':' + (value[0].value - 1) + '<br>' +
+          value[1].axisValue + ':' + (value[1].value - 1)
       }
       option.yAxis[0] = {
         type: 'log',
@@ -1096,7 +1113,7 @@ let app = new Vue({
         },
         axisLabel: {
           show: true,
-          formatter: function(value) {
+          formatter: function (value) {
             return value === 1 ? 0 : value
           },
           textStyle: {
@@ -1171,7 +1188,7 @@ let app = new Vue({
         },
         axisLabel: {
           show: true,
-          formatter: function(value) {
+          formatter: function (value) {
             return value === 1 ? 0 : value
           },
           textStyle: {
@@ -1245,7 +1262,7 @@ let app = new Vue({
         },
         axisLabel: {
           show: true,
-          formatter: function(value) {
+          formatter: function (value) {
             return value === 1 ? 0 : value
           },
           textStyle: {
@@ -1319,7 +1336,7 @@ let app = new Vue({
         },
         axisLabel: {
           show: true,
-          formatter: function(value) {
+          formatter: function (value) {
             return value === 1 ? 0 : value
           },
           textStyle: {

+ 227 - 0
manpower/libs/echarts-tooltip-carousel.js

@@ -0,0 +1,227 @@
+/**
+ * Created by chengwb on 2016/9/3.
+ */
+(function (global) {
+  global.tools = global.tools || {};
+
+  /**
+   * echarts tooltip轮播
+   * @param chart ECharts实例
+   * @param chartOption echarts的配置信息
+   * @param options object 选项
+   * {
+   *  interval    轮播时间间隔,单位毫秒,默认为2000
+   *  loopSeries  boolean类型,默认为false。
+   *              true表示循环所有series的tooltip,false则显示指定seriesIndex的tooltip
+   * 	seriesIndex 默认为0,指定某个系列(option中的series索引)循环显示tooltip,
+   * 	            当loopSeries为true时,从seriesIndex系列开始执行。
+   *  updateData  自定义更新数据的函数,默认为null;
+   *              用于类似于分页的效果,比如总数据有20条,chart一次只显示5条,全部数据可以分4次显示。
+   * }
+   * @returns {{clearLoop: clearLoop}}
+   */
+  tools.loopShowTooltip = function (chart, chartOption, options) {
+    let defaultOptions = {
+      interval: 2000,
+      loopSeries: false,
+      seriesIndex: 0,
+      updateData: null
+    };
+
+    if (!chart || !chartOption) {
+      return;
+    }
+
+    let dataIndex = 0; // 数据索引,初始化为-1,是为了判断是否是第一次执行
+    let seriesIndex = 0; // 系列索引
+    let timeTicket = 0;
+    let seriesLen = chartOption.series.length; // 系列个数
+    let dataLen = 0; // 某个系列数据个数
+    let chartType; // 系列类型
+    let first = true;
+    let lastShowSeriesIndex = 0;
+    let lastShowDataIndex = 0;
+    if (seriesLen === 0) {
+      return;
+    }
+
+    //待处理列表
+    //不循环series时seriesIndex指定显示tooltip的系列,不指定默认为0,指定多个则默认为第一个
+    //循环series时seriesIndex指定循环的series,不指定则从0开始循环所有series,指定单个则相当于不循环,指定多个
+    //要不要添加开始series索引和开始的data索引?
+
+    if (options) {
+      options.interval = options.interval || defaultOptions.interval;
+      options.loopSeries = options.loopSeries || defaultOptions.loopSeries;
+      options.seriesIndex = options.seriesIndex || defaultOptions.seriesIndex;
+      options.updateData = options.updateData || defaultOptions.updateData;
+    } else {
+      options = defaultOptions;
+    }
+
+    //如果设置的seriesIndex无效,则默认为0
+    if (options.seriesIndex < 0 || options.seriesIndex >= seriesLen) {
+      seriesIndex = 0;
+    } else {
+      seriesIndex = options.seriesIndex;
+    }
+
+    /**
+     * 清除定时器
+     */
+    function clearLoop() {
+      if (timeTicket) {
+        clearInterval(timeTicket);
+        timeTicket = 0;
+      }
+      chart.off('mousemove', stopAutoShow);
+      zRender.off('mousemove', zRenderMouseMove);
+      zRender.off('globalout', zRenderGlobalOut);
+    }
+
+    /**
+     * 取消高亮
+     */
+    function cancelHighlight() {
+      /**
+       * 如果dataIndex为0表示上次系列完成显示,如果是循环系列,且系列索引为0则上次是seriesLen-1,否则为seriesIndex-1;
+       * 如果不是循环系列,则就是当前系列;
+       * 如果dataIndex>0则就是当前系列。
+       */
+      let tempSeriesIndex = dataIndex === 0 ?
+        (options.loopSeries ?
+          (seriesIndex === 0 ? seriesLen - 1 : seriesIndex - 1)
+          : seriesIndex)
+        : seriesIndex;
+      let tempType = chartOption.series[tempSeriesIndex].type;
+
+      if (tempType === 'pie' || tempType === 'radar') {
+        chart.dispatchAction({
+          type: 'downplay',
+          seriesIndex: lastShowSeriesIndex,
+          dataIndex: lastShowDataIndex
+        });//wait 系列序号为0且循环系列,则要判断上次的系列类型是否是pie、radar
+      }
+    }
+
+    /**
+     * 自动轮播tooltip
+     */
+    function autoShowTip() {
+      let invalidSeries = 0;
+      let invalidData = 0;
+
+      function showTip() {
+        //判断是否更新数据
+        if (dataIndex === 0 && !first && typeof options.updateData === "function") {
+          options.updateData();
+          chart.setOption(chartOption);
+        }
+
+        let series = chartOption.series;
+        let currSeries = series[seriesIndex];
+        if (!series || series.length === 0 ||
+          !currSeries || !currSeries.type || !currSeries.data ||
+          !currSeries.data.length) {
+          return;
+        }
+        chartType = currSeries.type; // 系列类型
+        dataLen = currSeries.data.length; // 某个系列的数据个数
+
+        let tipParams = {seriesIndex: seriesIndex};
+        switch (chartType) {
+          case 'pie':
+          case 'map':
+          case 'chord':
+            tipParams.name = currSeries.data[dataIndex].name;
+            break;
+          case 'radar': // 雷达图
+            tipParams.seriesIndex = seriesIndex;
+            tipParams.dataIndex = dataIndex;
+            break;
+          default:
+            tipParams.dataIndex = dataIndex;
+            break;
+        }
+
+        if (chartType === 'pie' || chartType === 'radar') {
+          if (!first) {
+            cancelHighlight();
+          }
+
+          // 高亮当前图形
+          chart.dispatchAction({
+            type: 'highlight',
+            seriesIndex: seriesIndex,
+            dataIndex: dataIndex
+          });
+        }
+
+        // 显示 tooltip
+        tipParams.type = 'showTip';
+
+        // 防止updateData时先处理tooltip后刷新数据导出tooltip显示不正确
+        setTimeout(() => {
+          chart.dispatchAction(tipParams);
+        }, 0);
+
+        lastShowSeriesIndex = seriesIndex;
+        lastShowDataIndex = dataIndex;
+        dataIndex = (dataIndex + 1) % dataLen;
+        if (options.loopSeries && dataIndex === 0) { // 数据索引归0表示当前系列数据已经循环完
+          invalidData = 0;
+          seriesIndex = (seriesIndex + 1) % seriesLen;
+          if (seriesIndex === options.seriesIndex) {
+            invalidSeries = 0;
+          }
+        }
+
+        first = false;
+      }
+
+      showTip();
+      timeTicket = setInterval(showTip, options.interval);
+    }
+
+    // 关闭轮播
+    function stopAutoShow() {
+      if (timeTicket) {
+        clearInterval(timeTicket);
+        timeTicket = 0;
+
+        if (chartType === 'pie' || chartType === 'radar') {
+          cancelHighlight();
+        }
+      }
+    }
+
+    let zRender = chart.getZr();
+
+    function zRenderMouseMove(param) {
+      if (param.event) {
+        //阻止canvas上的鼠标移动事件冒泡
+        param.event.cancelBubble = true;
+      }
+
+      stopAutoShow();
+    }
+
+    // 离开echarts图时恢复自动轮播
+    function zRenderGlobalOut() {
+      if (!timeTicket) {
+        autoShowTip();
+      }
+    }
+
+    // 鼠标在echarts图上时停止轮播
+    chart.on('mousemove', stopAutoShow);
+    zRender.on('mousemove', zRenderMouseMove);
+    zRender.on('globalout', zRenderGlobalOut);
+
+    autoShowTip();
+
+    return {
+      clearLoop: clearLoop
+    };
+  };
+})(window);

+ 48 - 24
manpower/styles/index.css

@@ -10,7 +10,8 @@ body {
   min-width: 7640px;
   font-size: 20px;
   color: #fff;
-  font-family: 'Microsoft YaHei', 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', Arial, sans-serif;
+  font-family: 'Microsoft YaHei', 'Helvetica Neue', Helvetica, 'PingFang SC',
+    'Hiragino Sans GB', Arial, sans-serif;
 }
 
 .flex {
@@ -53,7 +54,7 @@ body {
   font-size: 12px;
 }
 .main-color {
-  color: #69C0FF;
+  color: #69c0ff;
 }
 .danger-color {
   color: #f15450 !important;
@@ -93,7 +94,7 @@ a {
   font-weight: 600;
 }
 .my-header span {
-  background: linear-gradient(-3deg, #99EEFF 0%, #99EEFF 30%, #FFFFFF 91%);
+  background: linear-gradient(-3deg, #99eeff 0%, #99eeff 30%, #ffffff 91%);
   -webkit-background-clip: text;
   -webkit-text-fill-color: transparent;
 }
@@ -147,7 +148,7 @@ a {
 .center .top .box {
   flex: 1;
   padding: 20px 0;
-  background-color: rgba(105,192,255,0.2);
+  background-color: rgba(105, 192, 255, 0.2);
   display: flex;
   align-items: center;
   padding-left: 8%;
@@ -161,7 +162,7 @@ a {
 }
 .box > div p {
   font-size: 24px;
-  color: #E4F8FF;
+  color: #e4f8ff;
 }
 .box > div i {
   display: inline-block;
@@ -199,7 +200,7 @@ a {
 .footer a:hover {
   background: url('../images/footer-item-checked.png') no-repeat;
   background-size: 100% 100%;
-  color: #15F7FF;
+  color: #15f7ff;
 }
 .my-panel .content {
   height: calc(100% - 60px);
@@ -215,7 +216,7 @@ a {
 .panel-title .text {
   font-size: 22px;
   font-weight: 600;
-  color: #DAF9FF;
+  color: #daf9ff;
 }
 .panel-title .right-opr {
   position: absolute;
@@ -242,11 +243,11 @@ a {
   text-align: center;
   background: #69c0ff3f;
   border-radius: 4px;
-  color: #69C0FF;
+  color: #69c0ff;
 }
 .list-item i.num {
   font-size: 30px;
-  color: #69C0FF;
+  color: #69c0ff;
   margin-right: 10px;
 }
 .s-title {
@@ -266,7 +267,7 @@ a {
   border-radius: 10px;
 }
 .el-progress-bar__outer {
-  background-color: #17436d!important;
+  background-color: #17436d !important;
 }
 .el-progress__text {
   color: #f5f7fa;
@@ -302,36 +303,36 @@ a {
 .box-center > div p:nth-child(1) {
   font-size: 45px;
   font-weight: 800;
-  color: #69C0FF;
+  color: #69c0ff;
   margin-bottom: 15px;
 }
 .box-center > div p:nth-child(2) {
   font-size: 24px;
-  color: #E4F8FF;
+  color: #e4f8ff;
 }
 .box-center > div span {
   font-size: 24px;
   margin-left: 10px;
 }
 .dv-scroll-board .header {
-  font-size: 18px!important;
-  font-weight: 600!important;
-  background-color: rgba(105, 192, 255, 0.1)!important;
+  font-size: 18px !important;
+  font-weight: 600 !important;
+  background-color: rgba(105, 192, 255, 0.1) !important;
 }
 .dv-scroll-board .rows .row-item {
-  font-size: 18px!important;
+  font-size: 18px !important;
 }
-.tip-window{
+.tip-window {
   margin-right: 50px;
   margin-top: 10px;
-  color: #69C0FF;
+  color: #69c0ff;
   display: inline-block;
   width: 142px;
   height: 50px;
   line-height: 50px;
   text-align: center;
-  background-color: rgba(64,169,255,0.12);
-  border: 2px solid #40A9FF;
+  background-color: rgba(64, 169, 255, 0.12);
+  border: 2px solid #40a9ff;
   border-radius: 8px;
   cursor: pointer;
 }
@@ -347,19 +348,42 @@ a {
   position: absolute;
   /* top: 35%;
   left: 32.5%; */
-   /* width: 35%;
+  /* width: 35%;
   height: 30%; */
   width: 1000px;
   height: 700px;
   top: calc(50% - 350px);
   left: calc(50% - 500px);
   background: url('../images/sex-bg.png') no-repeat center;
-  background-color: #133B65;
+  background-color: #133b65;
   background-size: 100% 100%;
- 
+
   padding: 60px;
 }
 .tip-box > div {
   font-size: 42px;
   line-height: 70px;
-}
+}
+.light {
+  display: inline-block;
+  width: 24px;
+  height: 24px;
+  border-radius: 50%;
+  background-size: 100% 100%;
+}
+.red {
+  background: url('../images/red.png');
+}
+.green {
+  background: url('../images/green.png');
+}
+.yellow {
+  background: url('../images/yellow.png');
+}
+.lightOut {
+  display: flex;
+  width: 100%;
+  height: 100%;
+  align-items: center;
+  justify-content: center;
+}