widgetActiveRingChart.vue 9.3 KB
<!--
动态环图
-->
<template>
  <div  v-if="isRouterAlive">
    <div class="bcci-header" :style="titleConfig.titleStyle" v-if="titleConfig.isNoTitle" >{{titleConfig.titleText}}</div>

    <div class="bc-chart-item" :style="styleObj">
      <Label-Tag :config="labelConfig" v-if="labelConfig.isNoTipTitle && labelConfig.tipsAlign=='top'"/>
      <dv-active-ring-chart :config="options" :style="styleRingChart"/>
      <Label-Tag :config="labelConfig" v-if="labelConfig.isNoTipTitle
      && (labelConfig.tipsAlign=='down' || labelConfig.tipsAlign=='right' || labelConfig.tipsAlign=='left')"/>
    </div>

  </div>

</template>
<script>
import Vue from "vue";
import LabelTag from '../../components/LabelTag'
import activeRingChart from "@jiaminghi/data-view/lib/components/activeRingChart";
Vue.use(activeRingChart)
export default {
  name: "widgetActiveRingChart",
  props: {
    value: Object,
    ispreview: Boolean,
  },
  components: {
    LabelTag
  },
  data() {
    return {
      options: {
        radius:'75%',//环半径
        activeRadius:'85%',//环半径(动态)
        data:[],//环数据
        lineWidth:40,//环数据
        activeTimeGap:3000,//切换间隔(ms)
        color:[],//环颜色
        digitalFlopStyle: {
          fontSize: 30,
          fill: '#3de7c9'
        },//数字翻牌器样式
        digitalFlopToFixed	:0,//数字翻牌器小数位数
        digitalFlopUnit	:'',//数字翻牌器单位
        animationFrame	:50,//动效帧数
        showOriginValue	:false//显示原始值
      },
      optionsStyle: {}, // 样式
      optionsData: {}, // 数据
      optionsCollapse: {}, // 图标属性
      optionsSetup: {},
      labelConfig: {
        data: [],
        colors:[],
        labelStyle:{},
        isNoTipTitle:false,
        tipsAlign:'down',
        labelTagStyle:{}
      },
      titleConfig:{
        titleStyle:{},
        isNoTitle:false,
        titleText:"测试标题"
      },
      flagInter: null,
      isRouterAlive:true,
    }
  },
  provide(){
    return{
      reload:this.reload
    }
  },
  beforeDestroy() {
    clearInterval(this.flagInter);
  },
  computed: {
    styleObj() {
      const style ={
        position: this.ispreview ? "absolute" : "static",
        width: this.optionsStyle.width + "px",
        height: this.optionsStyle.height + "px",
        left: this.optionsStyle.left + "px",
        top: this.optionsStyle.top + "px",
        background: this.optionsSetup.background
      };
      return style;
    },
    styleRingChart() {
      const style ={
        width: this.optionsStyle.width + "px",
        height: this.optionsStyle.height+ "px",
        left: this.optionsStyle.left + "px",
        top: this.optionsStyle.top - 20 + "px",
        position: "static",
        display: 'flex'
      };
      return style;
    }
  },
  watch: {
    value: {
      handler(val) {
        this.optionsStyle = val.position;
        this.optionsData = val.data;
        this.optionsSetup = val.setup;
        this.editorOptions();
        this.reload();
      },
      deep: true
    }
  },
  created() {
    this.optionsStyle = this.value.position;
    console.log("🚀 ~ created ~ this.optionsStyle:", this.optionsStyle)
    this.optionsData = this.value.data;
    this.optionsSetup = this.value.setup;
    this.editorOptions();
  },
  methods: {
    // 修改图标options属性
    editorOptions() {
      //数据修改
      this.setOptionsData();
      //环颜色修改
      this.setOptionsColor();
      //数字翻牌器样式
      this.setFontStyle();
      //设置提示语
      this.setLabelConfig();
      //标题设置
      this.setTitleConfig();
      //基础数据修改
      this.setOptionsConfig();

    },
    //提示语设置
    setLabelConfig(){
      const optionsSetup = this.optionsSetup;
      let labelStyle = {};
      let labelTagStyleOne = {};
      if(optionsSetup.isNoTipTitle){
        this.labelConfig.isNoTipTitle = optionsSetup.isNoTipTitle;
        this.labelConfig.tipsAlign = optionsSetup.tipsAlign;
        labelStyle.color = optionsSetup.tipsColor;
        labelStyle['font-size'] = optionsSetup.tipFontSize+'px';
        if(optionsSetup.tipsAlign=='right' || optionsSetup.tipsAlign=='left'){
          labelTagStyleOne[optionsSetup.tipsAlign]=optionsSetup.tipFontLeft+"%";
          labelTagStyleOne['height']=optionsSetup.tipFontHeight+"%";
          labelTagStyleOne['width']="20%";
          labelTagStyleOne['top']="0";
          labelTagStyleOne['bottom']="0";
        }else if(optionsSetup.tipsAlign=='top'){
          labelTagStyleOne['left']= optionsSetup.tipFontLeft+"%";
          labelTagStyleOne['top']= -optionsSetup.tipFontTop+"%";
        }else{
          labelTagStyleOne['left']= optionsSetup.tipFontLeft+"%";
          labelTagStyleOne['bottom']= optionsSetup.tipFontTop+"%";
        }
        this.labelConfig.labelTagStyle = labelTagStyleOne;
        this.labelConfig.labelStyle = labelStyle;
      }else{
        this.labelConfig.isNoTipTitle = false;
      }
    },
    //标题设置
    setTitleConfig(){
      const optionsSetup = this.optionsSetup;
      let titleStyle = {};
      if(optionsSetup.isNoTitle){
        this.titleConfig.isNoTitle = optionsSetup.isNoTitle;
        this.titleConfig.titleText = optionsSetup.titleText;
        titleStyle.color = optionsSetup.textColor;
        titleStyle['font-size'] = optionsSetup.textFontSize+'px';
        titleStyle['font-style'] = optionsSetup.textFontStyle;
        titleStyle['font-weight'] = optionsSetup.textFontWeight;
        titleStyle['text-align'] = optionsSetup.textAlign;
        this.titleConfig.titleStyle = titleStyle;
      }else{
        this.titleConfig.isNoTitle = false;
      }
    },
    // 颜色修改
    setOptionsColor() {
      const optionsSetup = this.optionsSetup;
      const customColor = optionsSetup.customColor;
      if (!customColor) return;
      const arrColor = [];
      for (let i = 0; i < customColor.length; i++) {
        arrColor.push(customColor[i].color);
      }
      this.options.color = arrColor;
      this.labelConfig.colors = arrColor;
    },
    //字体修改
    setFontStyle() {
      const optionsSetup = this.optionsSetup;
      const fontStyle = {};
      fontStyle.fill=optionsSetup.fill;
      fontStyle.fontSize=optionsSetup.fontSize;
      fontStyle.fontWeight=optionsSetup.fontWeight;
      this.options.digitalFlopStyle = fontStyle;
    },
    // 配置修改
    setOptionsConfig() {
      const optionsSetup = this.optionsSetup;
      this.options.radius = optionsSetup.radius+"%";
      this.options.activeRadius = optionsSetup.activeRadius+"%";
      this.options.lineWidth = optionsSetup.lineWidth;
      this.options.activeTimeGap = optionsSetup.activeTimeGap;
      this.options.digitalFlopToFixed = optionsSetup.digitalFlopToFixed;
      this.options.digitalFlopUnit = optionsSetup.digitalFlopUnit;
      this.options.animationFrame = optionsSetup.animationFrame;
      this.options.showOriginValue = optionsSetup.showOriginValue;
      //改变options
      // console.log("配置修改:",this.styleObj);
      // this.options={...this.options};
    },
    //数据类型
    setOptionsData() {
      const optionsData = this.optionsData; // 数据类型 静态 or 动态
      optionsData.dataType == "staticData"
        ? this.staticDataFn(optionsData.staticData)
        : this.dynamicDataFn(optionsData.dynamicData, optionsData.refreshTime);
    },
    staticDataFn(val) {
      // console.log("设置静态数据",this.options)
      const staticData = typeof val == "string" ? JSON.parse(val) : val;
      this.options.data=staticData;
      this.setLabelConfigData(val);
    },
    dynamicDataFn(val, refreshTime) {
      if (!val) return;
      if (this.ispreview) {
        this.getEchartData(val);
        this.flagInter = setInterval(() => {
          this.getEchartData(val);
        }, refreshTime);
      } else {
        this.getEchartData(val);
      }
    },
    getEchartData(val) {
      const data = this.queryEchartsData(val);
      data.then(res => {
        this.renderingFn(res);
      });
    },
    renderingFn(val) {
      // console.log("设置静态数据",val)
      this.options.data=val;
      this.setLabelConfigData(val);
      this.reload();
    },
    setLabelConfigData(val){
      const optionsSetup = this.optionsSetup;
      const data = [];
      if(this.isNotBlankArray(val)){
        for(let i = 0;i<val.length;i++){
          const oneVal = val[i];
          let showName = oneVal['name'];
          if(optionsSetup.isShowTipVal){
            showName = showName+' '+oneVal['value'];
          }
          data.push(showName);
        }
        this.labelConfig.data = data;
      }
    },
    // vue hack 之强制刷新组件
    reload(){
      this.isRouterAlive=false;
      this.$nextTick(function(){
        this.isRouterAlive=true;
      })
    },

  }
};

</script>
<style scoped lang="scss">
.bottom-charts {
  width: 100%;
  height: 100%;
  position: absolute;

  .bc-chart-item {
    //width: 25%;
    //height: 100%;
    //padding-top: 20px;
    //box-sizing: border-box;
    position: absolute;
  }
  .ringChart{
    width: 100%;
    height: 95%;
    position: absolute;
  }
  //.bcci-header {
  //  height: 50px;
  //  text-align: center;
  //  line-height: 50px;
  //  font-size: 20px;
  //}
  //
  //.label-tag {
  //  height: 30px;
  //}
  //.active-ring-info{ position: absolute;}
  .active-ring-name {
    font-size: 18px!important;
  }
}
</style>