queryform.js 12.9 KB
import miment from 'miment'
import {getData} from '@/api/bigscreen'

export default {
  data() {
    return {
      // form select-input key
      selectInput: {
        keyname: '',
        keyword: ''
      },

      //日期时间快捷选项
      datetimeRangePickerOptions: {
        shortcuts: [{
          text: '今天',
          onClick(picker) {
            const end = new Date();
            const start = new Date(new Date(new Date().getTime()).setHours(0, 0, 0, 0));
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '昨天',
          onClick(picker) {
            const start = new Date(new Date(new Date().getTime() - 24 * 60 * 60 * 1000).setHours(0, 0, 0, 0));
            const end = new Date(new Date(new Date().getTime() - 24 * 60 * 60 * 1000).setHours(23, 59, 59, 999));
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近一周',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(miment().add(-1, 'ww').stamp());
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近一个月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(miment().add(-1, 'MM').stamp());
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近三个月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(miment().add(-3, 'MM').stamp());
            picker.$emit('pick', [start, end]);
          }
        }],
        // disabledDate(time){
        //   return time.getTime() > Date.now()
        // }
      },
    }
  },
  computed: {},
  created() {
  },
  mounted() {
  },
  destroyed() {
  },
  methods: {
    // 搜索重置搜索页码
    search() {
      this.params.currentPage = 1;
      this.queryByPage();
    },
    // 把selectInput中的值赋到params查询对象中
    parseParamsBySelectInput(keyname, keyword) {
      if (this.params === undefined || this.params === null) {
        console.warn('query form must bind to params object in vue data')
        return
      }
      // if (!this.params.hasOwnProperty(keyname)) {
      //   console.warn('params has no field:' + keyname)
      //   return
      // }
      if (keyword !== undefined) {
        this.params[keyname] = keyword.trim()
      }
    },
    resetForm(data) {
      let formKeys = Object.keys(data)
      for (let k of formKeys) {
        data[k] = null
      }
    },
    handlerInputchange(val) {
      this.parseParamsBySelectInput(this.selectInput.keyname, val)
    },
    // 查询echarts 数据
    queryEchartsData(params) {
      return new Promise(async (resolve) => {
        const {code, data} = await getData(params);
        if (code != 200) return
        const analysisData = this.analysisChartsData(params, data);
        resolve(analysisData)
      })
    },
    // 解析不同图标的数据
    analysisChartsData(params, data) {
      // widget-barchart 柱线图、widget-linechart 折线图、 widget-barlinechart 柱线图
      // widget-piechart 饼图、widget-funnel 漏斗图
      // widget-text 文本框
      // widge-table 表格(数据不要转)
      // widget-stackchart 堆叠图
      // widget-heatmap 热力图
      // widget-mapline 中国地图-路线图
      // widget-radar 雷达图
      const chartType = params.chartType
      if (chartType == "widget-linechart" ||
        chartType == "widget-barlinechart"
      ) {
        return this.barOrLineChartFn(params.chartProperties, data);
      }else if ( chartType == "widget-barchart") {
          return this.barOrLineChartFn(params.chartProperties, data);
      } else if (
        chartType == "widget-piechart" ||
        chartType == "widget-funnel"
      ) {
        return this.piechartFn(params.chartProperties, data);
      } else if (chartType == "widget-text") {
        return this.widgettext(params.chartProperties, data)
      } else if (chartType == "widget-stackchart") {
        return this.stackChartFn(params.chartProperties, data)
      } else if (chartType == "widget-coord") {
        return this.coordChartFn(params.chartProperties, data)
      } else if (chartType == "widget-linemap") {
        return this.linemapChartFn(params.chartProperties, data)
      } else if (chartType == "widget-radar") {
        return this.radarChartFn(params.chartProperties, data)
      } else {
        return data
      }
    },
    // 柱状图
    barChartFn(chartProperties, val) {
      let ananysicData = {};
      let series = [];
      let axis = [];
      let data = [];
      for (const i in val) {
        axis[i] = val[i].axis;
        data[i] = val[i].data
      }
      if (series[0].type == "bar") {
        series[0].data = data;
      }
      ananysicData["xAxis"] = axis;
      ananysicData["series"] = series;
      // console.log(ananysicData);
      return ananysicData;
    },
    // 柱状图、折线图、柱线图
    barOrLineChartFn(chartProperties, data) {
      const ananysicData = {};
      const xAxisList = [];
      const series = [];
      // legend: {
      //   data: ['Forest']
      // },
      for (const key in chartProperties) {
        const obj = {};
        const seriesData = [];
        const value = chartProperties[key];
        obj["type"] = value;
        obj["name"] = key;
        for (let i = 0; i < data.length; i++) {
          if (value.startsWith("xAxis")) {
            // 代表为x轴
            xAxisList[i] = data[i][key];
          } else {
            // 其他的均为series展示数据
            seriesData[i] = data[i][key];
          }
        }
        // console.log("seriesData",seriesData);
        // console.log("xAxisList",xAxisList);
        obj["data"] = seriesData;
        if (!obj["type"].startsWith("xAxis")) {
          series.push(obj);
        }
      }
      ananysicData["xAxis"] = xAxisList;
      ananysicData["series"] = series;
      // console.log("11111",ananysicData);
      return ananysicData;
    },
    //堆叠图
    stackChartFn(chartProperties, val) {
      const ananysicData = {};
      // const series = [];
      // //全部字段字典值
      // const types = Object.values(chartProperties)
      // //x轴字段、y轴字段名
      // const xAxisField = Object.keys(chartProperties)[types.indexOf('xAxis')]
      // const yAxisField = Object.keys(chartProperties)[types.indexOf('yAxis')]
      // const dataField = Object.keys(chartProperties)[types.indexOf('bar')]
      // //x轴数值去重,y轴去重
      // const xAxisList = this.setUnique(data.map(item => item[xAxisField]))
      // const yAxisList = this.setUnique(data.map(item => item[yAxisField]))
      // const dataFieldList = this.setUnique(data.map(item => item[dataField]))
      // const dataGroup = this.setGroupByNew(data, xAxisList,'axis');
      // console.log("1111",types,dataGroup);
      // for (const key in chartProperties) {
      //   if (chartProperties[key] !== 'yAxis' && !chartProperties[key].startsWith('xAxis')) {
      //     Object.keys(dataGroup).forEach(item => {
      //       const data = new Array(xAxisList.length).fill(0)
      //       dataGroup[item].forEach(res => {
      //         data[xAxisList.indexOf(res[xAxisField])] = res[key]
      //       })
      //       series.push({
      //         name: yAxisList[item],
      //         type: chartProperties[key],
      //         data: data,
      //       })
      //     })
      //   }
      // }
      const series = [];
      let xAxisList = [];
      let yAxisList = [];
      for (const i in val) {
        xAxisList[i] = val[i].axis;
        yAxisList[i] = val[i].name;
      }
      xAxisList = this.setUnique(xAxisList);
      yAxisList = this.setUnique(yAxisList);
      for (const i in yAxisList) {
        const data = new Array(xAxisList.length).fill(0);
        for (const j in xAxisList) {
          for (const k in val) {
            if (val[k].name == yAxisList[i]) {
              if (val[k].axis == xAxisList[j]) {
                data[j] = val[k].data;
              }
            }
          }
        }
        series.push({
          name: yAxisList[i],
          type: 'bar',
          data: data,
        });
      }

      ananysicData["xAxis"] = xAxisList;
      ananysicData["series"] = series;
      return ananysicData;
    },
    // 饼图、漏斗图
    piechartFn(chartProperties, data) {
      const ananysicData = [];
      for (let i = 0; i < data.length; i++) {
        const obj = {};
        for (const key in chartProperties) {
          const value = chartProperties[key];
          if (value === "name") {
            obj["name"] = data[i][key];
          } else if (value === "color") {
            obj["color"] = data[i][key];
          }else {
            obj["value"] = data[i][key];
          }
        }
        ananysicData.push(obj);
      }
      return ananysicData;
    },
    widgettext(chartProperties, data) {
      const ananysicData = [];
      for (let i = 0; i < data.length; i++) {
        const obj = {};
        for (const key in chartProperties) {
          const value = chartProperties[key];
          if (value === "name") {
          } else {
            obj["value"] = data[i][key];
          }
        }
        ananysicData.push(obj);
      }
      return ananysicData;
    },
    // 坐标系数据解析
    coordChartFn(chartProperties, data) {
      const ananysicData = {};
      let series = [];
      //全部字段字典值
      const types = Object.values(chartProperties)
      //x轴字段、y轴字段、数值字段名
      const xAxisField = Object.keys(chartProperties)[types.indexOf('xAxis')]
      const yAxisField = Object.keys(chartProperties)[types.indexOf('yAxis')]
      const dataField = Object.keys(chartProperties)[types.indexOf('series')]
      //x轴数值去重,y轴去重
      const xAxisList = this.setUnique(data.map(item => item[xAxisField]))
      const yAxisList = this.setUnique(data.map(item => item[yAxisField]))
      ananysicData["xAxis"] = xAxisList;
      ananysicData["yAxis"] = yAxisList;
      for (const i in data) {
        series[i] = [data[i][xAxisField], data[i][yAxisField], data[i][dataField]];
      }
      ananysicData["series"] = series;
      return ananysicData;
    },
    // 中国地图。路线图数据解析,适合source、target、value
    linemapChartFn(chartProperties, data) {
      const ananysicData = [];
      for (let i = 0; i < data.length; i++) {
        const obj = {};
        for (const key in chartProperties) {
          const value = chartProperties[key];
          if (value === "source") {
            obj["source"] = data[i][key];
          } else if (value === "target") {
            obj["target"] = data[i][key];
          } else {
            obj["value"] = data[i][key];
          }
        }
        ananysicData.push(obj);
      }
      return ananysicData;
    },
    radarChartFn(chartProperties, data) {
      const ananysicData = {};
      // 字段名
      const radarField = [];
      let nameField;
      for(const key in chartProperties) {
        if (chartProperties[key] == 'radar') {
          radarField.push(key)
        }
        if (chartProperties[key] == 'name') {
          nameField = key;
        }
      }
      // 拿到数值
      ananysicData["name"] = nameField;
      ananysicData["keys"] = radarField;
      ananysicData["value"] = data;
      return ananysicData;
    },
    setUnique(arr) {
      let newArr = [];
      arr.forEach(item => {
        return newArr.includes(item) ? '' : newArr.push(item);
      });
      return newArr;
    },
    setGroupBy(array, name) {
      const groups = {}
      array.forEach(function (o) {
        const group = JSON.stringify(o[name])
        groups[group] = groups[group] || []
        groups[group].push(o)
      })
      return Object.keys(groups).map(function (group) {
        return groups[group]
      })
    },
    setGroupByNew(array, name,sType) {
      const groups = {};
      name.forEach(function (oneName) {
        const groupsOne = [];
        array.forEach(function (onedata) {
          console.log('2222',oneName,onedata,sType);
          if(onedata[sType]==oneName){
            groupsOne.push(onedata);
          }
        });
        const check = (typeof groupsOne === 'undefined' || groupsOne == null || groupsOne === '' || groupsOne ==[] || groupsOne.length==0 );
        if(!check){
          groups[oneName]=groupsOne;
        }
      });
      return groups;
    },
  },
  watch: {
    'selectInput.keyname'(newVal, oldVal) {
      this.resetForm(this.params)
      this.params.currentPage = 1
      this.params.pageSize = 10
      this.parseParamsBySelectInput(newVal, this.selectInput.keyword)
    },
    'selectInput.keyword'(newVal, oldVal) {
      if (!this.selectInput.keyname) return
      this.parseParamsBySelectInput(this.selectInput.keyname, newVal)
    }
    // 'selectInput.keyword'(newVal, oldVal) {
    //   this.parseParamsBySelectInput(this.selectInput.keyname, newVal)
    // }
  }
}