08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / project / hivuiSam / components / analysisSam / Index.vue
<template>
  <div class="container">
    <!-- 工具条 -->
    <div class="btn-toolbar">
      <!-- 后退 -->
      <el-dropdown split-button :size="size" :class="{disabled: backDisabled}" :disabled="backDisabled" @command="backCommand" @click="backClick">
        <i class="el-icon-back"></i>后退
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item v-for="(item,index) in deepArr" :key="item.prop" :command="index" v-if="index < curIndex">{{ item.label }}</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
      <!-- 前进 -->
      <el-dropdown split-button :size="size" :class="{disabled: goDisabled}" :disabled="goDisabled" @command="goCommand" @click="goClick">
        <i class="el-icon-right"></i>前进
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item v-for="(item,index) in deepArr" :key="item.prop" :command="index" v-if="index > curIndex">{{ item.label }}</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
      <!-- 排序 -->
      <el-dropdown split-button :size="size" class="sort" @command="sortClick">
        <i class="el-icon-sort"></i>排序
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item :command="-1">不排序</el-dropdown-item>
          <el-dropdown-item v-for="(item, index) in sortArr" :key="item.prop" :command="index">{{ item.label }}
            <i class="el-icon-sort-down" :class="{ sortActive: index == sortIndex && sortType =='desc' }"  @click="sortDown"></i> <i class="el-icon-sort-up" :class="{ sortActive: index == sortIndex && sortType =='asc' }"  @click="sortUp"></i>
          </el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
      <!-- 分析列设置 -->
      <el-button icon="el-icon-setting" :size="size" @click="analysisClick">分析列设置</el-button>
      <el-dropdown :size="size" @command="chartTypeChange">
        <el-button :size="size">
          <i class="el-icon-s-data"></i>
          图表<i class="el-icon-arrow-down el-icon--right"></i>
        </el-button>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item command="table">表格</el-dropdown-item>
          <el-dropdown-item command="pie">饼图</el-dropdown-item>
          <el-dropdown-item command="bar">柱图</el-dropdown-item>
          <el-dropdown-item command="line">线图</el-dropdown-item>
          <el-dropdown-item command="area">区域图</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
      <!-- 刷新 -->
      <el-button icon="el-icon-refresh" :size="size" @click="refresh">刷新</el-button>
      <!-- 分析记录 -->
      <el-button icon="el-icon-edit-outline" :size="size" >分析记录</el-button>
      <!-- 叠加 -->
      <el-checkbox
        v-model="superposition"
        label="叠加"
        border
        :size="size" 
      ></el-checkbox>
      <!-- 透视 -->
      <el-checkbox
        v-model="perspective"
        label="直接透视"
        border
        :size="size" 
      ></el-checkbox>
      <el-button icon="el-icon-download" :size="size" :disabled="this.data && this.data.length == 0" :loading="exportLoading" @click="exportExcel">导出excel</el-button>
    </div>
    <!-- 内容区 -->
    <hi-layout :is-fit="true" style="heiht: 100%;">
      <!-- 右侧查询面板 -->
      <hi-layout-right size="300" title="过滤条件">
        <birt-work-book
          style="height: calc( 100% - 142px );border-bottom: 1px dashed #3179de;overflow: auto;"
          :conf="birtModelRight"
          :ref="birtModelRight.controlId"
          class="birtModelRight"
        ></birt-work-book>
        <el-form
          @submit.native.prevent
          ref="groupForm"
          style="padding: 10px 10px 0 0;"
          :model="groupForm"
          label-width="80px"
        >
          <el-form-item label="分组条件" prop="prop">
            <i class="el-icon-edit" @click="showtransfer"></i>
            <el-select v-model="groupForm.prop" style="width: 100%;" placeholder="请选择分组条件">
              <el-option
                v-for="item in groupFields"
                :label="item.label"
                :value="item.prop"
                :key="item.prop"
              ></el-option>
            </el-select>
          </el-form-item>
          <el-form-item>
            <el-button
              type="primary"
              size="mini"
              :loading="loading"
              @click="doCount"
              >执行查询</el-button
            >
            <el-button size="mini" @click="reset">重置</el-button>
          </el-form-item>
        </el-form>
      </hi-layout-right>
      <!-- 图表展示区 -->
      <hi-layout-center style="heiht: 100%;">
        <div class="depth-analysis">
          <span>深度分析:</span>
          <el-breadcrumb
            separator-class="el-icon-arrow-right"
            style="padding: 0 0 0 10px;"
          >
            <el-breadcrumb-item v-for="(item,index) in deepArr" :key="item.prop">
              <span v-if="item.label.includes(',')" @click="breadcrumbClick(item.prop)" :class="{ deepActive: index == curIndex }" style="cursor: pointer;">
                <span v-for="(it, i) in item.label.split(',')">
                  {{ it }}
                  <span style="color: rgb(255, 102, 0);margin-left:2px;" v-if="index < curIndex">{{ item.selectVal.split(',')[i] }}</span>
                </span>
              </span>
              <span v-else @click="breadcrumbClick(item.prop)" :class="{ deepActive: index == curIndex }" style="cursor: pointer;">
                {{ item.label }}
                <span style="color: rgb(255, 102, 0);margin-left:2px;" v-if="index < curIndex">{{ item.selectVal }}</span>
              </span>
            </el-breadcrumb-item>
          </el-breadcrumb>
        </div>
        <div v-if="showDetail" style="height: calc( 100% - 100px )">
          <el-table
            :data="data"
            ref="table"
            height="100%"
            border
            stripe
            :show-summary="showSummary"
            header-row-class-name="tableHeader"
            style="width: 100%"
          >
            <el-table-column
              v-for="item in tableColumns"
              :key="item.prop"
              :prop="item.prop"
              :label="item.label"
            >
            </el-table-column>
          </el-table>
          <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[10, 20, 50, 100]"
            :page-size="pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="total"
          >
          </el-pagination>
        </div>
        <div v-if="!showDetail && chartType == 'table'" style="height: calc( 100% - 100px )">
          <el-table
            :data="data"
            ref="table"
            height="100%"
            border
            stripe
            :show-summary="showSummary"
            header-row-class-name="tableHeader"
            style="width: 100%"
          >
            <el-table-column
              v-for="item in tableColumns"
              :key="item.prop"
              :prop="item.prop"
              :label="item.label"
            >
            </el-table-column>
          </el-table>
          <el-pagination
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[10, 20, 50, 100]"
            :page-size="pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="total"
          >
          </el-pagination>
        </div>
        <Pie-chart
          style="height: calc( 100% - 100px )"
          v-else-if="!showDetail && chartType == 'pie'"
          ref="chartConf"
          :conf="chartConf"
        ></Pie-chart>
        <Bar-chart
          style="height: calc( 100% - 100px )"
          v-else-if="!showDetail && chartType == 'bar'"
          ref="chartConf"
          :conf="chartConf"
        ></Bar-chart>
        <Line-chart
          style="height: calc( 100% - 100px )"
          v-else-if="!showDetail && chartType == 'line'"
          ref="chartConf"
          :conf="chartConf"
        ></Line-chart>
        <Line-chart
          style="height: calc( 100% - 100px )"
          v-else-if="!showDetail && chartType == 'area'"
          ref="chartConf"
          :conf="chartConf"
        ></Line-chart>
      </hi-layout-center>
    </hi-layout>
    <!-- 分析列 -->
    <el-dialog :visible.sync="analysisVisible" title="分析列设置" :height="500">
      <el-table :data="analysisData" size="small" :height="400">
        <el-table-column
          prop="countField"
          label="统计字段">
        </el-table-column>
        <el-table-column prop="tableColumn" label="网格列" align="center">
          <template slot="header" slot-scope="{row}">
            <el-checkbox v-model="tableColumnCheck" @change="handelCheckAll('tableColumn')" label="网格列"></el-checkbox>
          </template>
          <template slot-scope="{row}">
            <el-checkbox v-model="row.tableColumn"></el-checkbox>
          </template>
        </el-table-column>
        <el-table-column prop="tableColumn" label="网格合计列" align="center">
          <template slot="header" slot-scope="{row}">
            <el-checkbox v-model="tableColumnCountCheck" @change="handelCheckAll('tableColumnCount')" label="网格合计列"></el-checkbox>
          </template>
          <template slot-scope="{row}">
            <el-checkbox v-model="row.tableColumnCount"></el-checkbox>
          </template>
        </el-table-column>
        <el-table-column prop="tableColumn" label="图表列" align="center">
          <template slot="header" slot-scope="{row}">
            <el-checkbox v-model="chartColumnCheck" @change="handelCheckAll('chartColumn')" label="图表列"></el-checkbox>
          </template>
          <template slot-scope="{row}">
            <el-checkbox v-model="row.chartColumn"></el-checkbox>
          </template>
        </el-table-column>
        <el-table-column prop="chartColumnCount" label="图表列汇总" align="center">
          <template slot="header" slot-scope="{row}">
            <el-checkbox v-model="chartColumnCountCheck" @change="handelCheckAll('chartColumnCount')" label="图表列汇总"></el-checkbox>
          </template>
          <template slot-scope="{row}">
            <el-checkbox v-model="row.chartColumnCount"></el-checkbox>
          </template>
        </el-table-column>
      </el-table>
    </el-dialog>
    <!-- 分析字段 -->
    <el-dialog  :visible.sync="analysisFieldsVisible" title="选择分析字段" :height="500">
       <Pie-chart
          style="height: 400px;"
          ref="analysisChart"
          :conf="analysisChartConf"
        ></Pie-chart>
    </el-dialog>
    <!-- 穿梭框(修改分组字段) -->
    <el-dialog  :visible.sync="transferVisible" title="选择分组字段" :height="500" width="640px" center @close="transferClose">
       <el-transfer class="sam" v-model="groupFieldsEdit" :data="conf.groupFields" 
       :titles="['来源字段', '目标字段']"
       target-order="push"
       :props="{
          key: 'prop',
          label: 'label'
        }" style="width: 100%;padding: 20px;">
        <span slot-scope="{ option }">{{ option.label }}
          <el-button style="margin-left: 10px;" icon="el-icon-top" type="primary" size="mini" circle @click.stop="transferUp(option)"></el-button>
          <el-button icon="el-icon-bottom" type="primary" size="mini" circle @click.stop="transferDown(option)"></el-button>
        </span>
        </el-transfer>
        <span slot="footer" class="dialog-footer">
          <el-button @click="transferClose" size="small">取 消</el-button>
          <el-button type="primary" size="small" @click="transferConfirm">确 定</el-button>
        </span>
    </el-dialog>
  </div> 
</template>

<script>
import { QueryStyleFactory } from "../templates/query-panel/QueryStyleFactory";
import { GridSingleSelect } from "../templates/GridSingleSelect";
import _ from 'lodash'
export default {
  name: "AnalysisSam",
  props:{
    conf:{
      type: Object,
    }
  },
  computed: {
    // 后退
    backDisabled(){
      return this.curIndex === 0 
    },
    // 前进
    goDisabled(){
      return this.curIndex == this.deepArr.length - 1
    },
    // 表格列
    tableColumns() {
      if(this.showDetail){
        return this.dataFields
      }else{
        // 组合分组条件分成多个列
        let list = this.curGroupField.split(',')
        // 获取当前分组列
        let curGroupArr = this.groupFields.filter(item =>{
          return list.includes(item.prop)
        })
        // 当前分组列+分析列
        let arr = curGroupArr.concat(this.analyseFields)
        if(arr && arr.length){
          this.sortArr = arr
        }
        return arr
      }
    },
    // 网格是否显示合计行
    showSummary(){
      let flag = false
      this.analysisData.some(item =>{
        flag = item.tableColumnCount
        return flag
      })
      return flag
    },
    //  数据列
    dataFields(){
      return this.conf && this.conf.dataFields || []
    },
    // 图表配置
    chartConf() {
      debugger
      let groupBy = this.curGroupField;
      let calcFields = []
      calcFields = this.analyseFields.map(item =>{
        let obj = {
          name: item.prop,
          title: item.label
        }
        return obj
      })
      let controlName = ''
      let datas = this.data
      // 组合分组条件时,数据添加组合列
      if(groupBy.includes(',')){
        let keyArr = groupBy.split(',');
        datas = datas.map(item =>{
          let label = []
          for(let key of keyArr){
            label.push(item[key])
          }
          label=label.join();
          item[groupBy] = label
          return item
        })
      }
      controlName = this.chartType == "pie" ? "PieChart"
                  : this.chartType == "bar" ? "BarChart"
                  : this.chartType == "line" ? "LineChart"
                  : this.chartType == "area" ? "LineChart" : 'PieChart'
      // 区域图
      let areaSeries = calcFields.map(item =>{
        return {
          smooth: true,
          areaStyle: {
            normal: {
                color: new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: "rgba(30, 231, 231, 0.3)" },{ offset: 1, color: "rgba(30, 231, 231, 0.1)" }]),
            },
          },
          label: {
            show: false,
            position: "outside",
          },
        }
      })
      // 饼图
      var pieSeries = []
      if(this.chartType == "pie"){
        let len = calcFields.length
        switch(len){
          case 1: 
            pieSeries = [];
            break;
          case 2: 
            pieSeries = [
              {
                radius: ["50%"],
                center: ["25%", "50%"],
              },
              {
                radius: ["50%"],
                center: ["75%", "50%"],
              },
            ]
            break;
          case 3:
            pieSeries = [
              {
                radius: ["50%"],
                center: ["25%", "50%"],
              },
              {
                radius: ["35%"],
                center: ["75%", "30%"],
              },
              {
                radius: ["35%"],
                center: ["75%", "70%"],
              },
            ]
            break;
          case 4: 
            pieSeries = [
              {
                radius: ["35%"],
                center: ["25%", "30%"],
              },
              {
                radius: ["35%"],
                center: ["25%", "70%"],
              },
              {
                radius: ["35%"],
                center: ["75%", "30%"],
              },
              {
                radius: ["35%"],
                center: ["75%", "70%"],
              },
            ]
            break;
        }
      }
      // 其他
      var series = []
      const conf = {
          controlName: controlName,
          controlId: "chart_controlid",
          height: "100%",
          isGroupData: true,
          groupBy: groupBy,
          datas: datas,
          calcFields: calcFields,
          option: {
            legend: {
              show: true
            },
            series: this.chartType == "area" ? areaSeries 
            : this.chartType == "pie" ? pieSeries : series
          },
          events:{
            click(row){
              let _this = this.$parent.$parent.$parent;
              _this.currentObj = row.data
              _this.currentObj.prop = _this.curGroupField;
              if(_this.perspective){
                var index = -1
                _this.deepArr.forEach((item,i)=>{
                  if(item.prop == _this.curGroupField){
                    index = i
                  }
                })
                if(index > -1 && index < _this.deepArr.length - 1){
                  _this.analysisFieldsVisible = false
                  _this.curIndex = _this.curIndex + 1
                  _this.currentObj = _this.deepArr[_this.curIndex];
                  _this.data = _this.currentObj.data
                  _this.curGroupField = _this.currentObj.prop;
                }else{
                  _this.analysisChartConf.datas = _this.deepAnalysisFields
                  _this.analysisFieldsVisible = true
                }
              }else{
                _this.analysisChartConf.datas = _this.deepAnalysisFields
                _this.analysisFieldsVisible = true
              }
            }
          }
      };
      return conf 
    },
    //  深度分析字段列表
    deepAnalysisFields(){
      let fields = this.groupFields
      if(fields && fields.length == 0){
        return []
      }
      let analysisFields = fields.map((item) => {
        item.value = 1
        return item
      });
      
      // 排除已经统计的分析列
      if(this.deepArr && this.deepArr.length > 0){
        let arrnew = this.deepArr.slice(0, this.curIndex + 1).map((item) => {
          return item.prop
        });
        analysisFields = analysisFields.filter(item =>{
          return arrnew.indexOf(item.prop) < 0
        })
      }
      // 添加详情
      analysisFields.push(
        {
          prop: 'detail',
          label: "详情",
          value: 1
        }
      )
      return analysisFields
    },
    // 查询字段
    queryFields(){
      let queryFields = []
      let fields = this.conf && this.conf.queryFields
      if(!fields || fields.length == 0){
        queryFields = []
      }else{
        queryFields = fields.map(item =>{
          let obj = {}
          obj.prop = item.prop
          if(item.props && item.props.lookup){
            let model = item.props.lookup
            if(item.element === 'hi-select-grid'){
              var columns = []
              if(model && model.columns && model.columns.length){
                columns = model.columns.map(item =>{
                  item.prop = item.name
                  return item
                })
              }
              obj.lookup = {
                type: "data",
                openstyle: 'selectgrid',
                bindField: item.prop,
                lookSelectGrid: {
                  width: 1200,
                  height: 600,
                  table: {
                      columns: columns,
                  },
                  bindField: item.prop,
                  tableData: model && model.sourceDatas,
                },
              }
              obj.dbtype = 'dbString'
            }else if(item.element === 'hi-data-select'){
              var columns = []
              if(model && model.columns && model.columns.length){
                columns = model.columns.map(item =>{
                  item.prop = item.name
                  return item
                })
              }
              let queryOptionFields = model.queryOption.fields
              let store = model.storeCfg || model.sourceDsCfg
              let modelFilePath =store.modelFile
              let fields = store.fields
              let rows = queryOptionFields.map(item =>{
                return {children:[
                  {
                    prop: item.name,
                    label: item.label
                  }
                ]}
              });
              let cols = queryOptionFields.map(item =>{
                return { colWidth: 100}
              });
              let queryPanel = {
                rows: rows,
                cols: cols
              };
              let tableColumn = model.columns.map(item =>{
                return {
                  prop: item.name,
                  label: item.label
                }
              })
              let table = {
                children:tableColumn
              }
              let ds = {
                controlName: "HcDataset",
                controlId: modelFilePath,
                name:  model.entityDs,
                modelFilePath: modelFilePath,
                _infcPagging: {
                    pageSize: 10,
                    pageNum: 1,
                    returnCount: true
                },
                _infcLoad: {
                    autoActive: true,
                },
                fields: fields,
                data: [],
              }
              obj.lookup = {
                type: "data",
                openstyle: 'dialog',
                birtModel: GridSingleSelect({
                  mainDataset: ds,
                  hcQueryPanel: queryPanel,
                  hcTable: table
                }),
                lookDataset: {
                  modelFilePath: modelFilePath, // 数据模型路径
                },
                lookDialog: {
                  title: "",
                  width: 900,
                  height: 600,
                },
                bindField: item.prop,
                sourceDsId: model.sourceDsId
              }
              obj.dbtype = 'dbString'
            }
          } 
          return obj
        })
      }
      return queryFields
    },
    // 数据集字段
    fields(){
      let fields = this.conf.dataset && this.conf.dataset.config.fields
      for(let key in this.queryFields){
        let prop = this.queryFields[key].prop
        if(fields[prop] && fields[prop].lookup){
          let lookup = Object.assign(fields[prop].lookup, this.queryFields[key].lookup)
          // 下拉枚举查找
          if(lookup.label && lookup.returnFields){
            for(let key in lookup.returnFields){
              if(lookup.returnFields[key] == lookup.label){
                lookup.bindShowField = key
                lookup.lookSelectGrid.bindShowField = key
              }
              if(lookup.lookSelectGrid && lookup.lookSelectGrid.tableData){
                let data = lookup.lookSelectGrid.tableData
                for(let i in data){
                  if(data[i][lookup.returnFields[key]]){
                    data[i][key] = data[i][lookup.returnFields[key]]
                  }
                }
              }
            }
          }
          // 数据模型查找
          if(lookup.fieldPair && lookup.sourceDsId){
            lookup.returnFields = lookup.fieldPair[lookup.sourceDsId].returnFields
          }
          fields[prop]['lookup'] = lookup 
        }
      }
      // 应用默认填充表达式
      for(let key in fields){
        if(fields[key].default && fields[key].default.exps){
          fields[key].default['expr'] = fields[key].default.exps
        }
      }
      return fields
    },
    // 数据集
    dataset(){
      var dataset = {}
      if(this.conf && this.conf.dataset){
        let ds = this.conf.dataset
        dataset = {
          controlName: ds.controlName,
          controlId: ds.controlId,
          name: ds.name,
          modelFilePath: ds.modelFilePath,
          fields: this.fields,
          _infcLoad: {
              autoActive: false
            },
          _infcPagging: {
              returnCount: true,
              pageSize: 100,
              pageNum: 1
            },
          data: [],
        }
      }
      return dataset
    },
    // 查询面板
    birtModelRight(){
      let rows = this.queryFields.map(item =>{
        return {children:[item],colspan: 6}
      })
      let cols = this.queryFields.map(item =>{
        return { colWidth: 60 }
      })
      const queryPanel = {
        rows: rows,
        cols: cols
      };
      let hcQueryPanel = {
        controlName: "HcQueryPanel",
        controlId: "HcQueryPanel_sam",
        inline: false,
        dataset: this.dataset && this.dataset.controlId || "dsSam",
        size: "small",
        hideBtn: true,
        style: "width: 100%;",
        children: [],
      };
      Object.assign(hcQueryPanel, QueryStyleFactory.buildForm(queryPanel) || {});
      let birtModelRight = {
        controlName: "BirtWorkBook",
        controlId: "BirtWorkBook_right",
        style: "border-bottom: 1px solid #eee;",
        showToolBar: false,
        children: [
          {
            controlName: "BirtSheet",
            controlId: "BirtSheet_right",
            name: "sheet0",
            pageIndex: 0,
            dataSets: [].concat(this.dataset ? this.dataset : []),
            children: [
              {
                controlName: "BirtFormSheet",
                controlId: "BirtFormSheet_01",
                children: [hcQueryPanel]
              }
            ]
          }
        ],
      };
      return birtModelRight
    },
    // 分组条件(统计字段)
    groupFields(){
      let groupFields = this.conf && _.cloneDeep(this.conf.groupFields) || []
      // 组合分组条件
      if(this.curTransferVal && this.curTransferVal.length){
        let obj = {}
        let curTransferLabel = this.curTransferVal.map(item =>{
          for(var field of groupFields){
            if(field.prop == item){
              return field.label
            }
          }
        })
        obj = {
          prop: this.curTransferVal.join(),
          label: curTransferLabel.join()
        }
        groupFields.push(obj)
      }
      return groupFields
    },
    // 分析字段
    analyseFields(){
      return this.conf && this.conf.analyseFields || []
    },
    // 显示详情
    showDetail(){
      return this.currentObj.prop == 'detail'
    },
  },
  watch:{
    conf:{
      deep: true,
      handler: function(val){
        if(val && val.groupFields && !this.groupForm.prop){
          this.groupForm.prop = val.groupFields[0] && val.groupFields[0].prop
          this.curGroupField = this.groupForm.prop
        }
        if(val && val.analyseFields && val.analyseFields.length){
          this.analysisData=val.analyseFields.map(item =>{
            let obj = {
              prop: item.prop,
              countField: item.label,
              tableColumn: true,
              tableColumnCount: true,
              chartColumn: true,
              chartColumnCount: true,
            }
            return obj
          })
        }
      }
    },
  },
  data() {
    return {
      size: 'small',
      superposition: false,
      perspective: false,
      chartType: "table",
      groupForm: {
        prop: ""
      },
      loading: false,
      currentPage: 1,
      pageSize: 100,
      total: 0,
      data: [],
      // 排序
      sortArr:[],
      sortIndex:-1,
      sortType: '',
      // 分析列
      analysisVisible: false,
      analysisData:[],
      tableColumnCheck: true,
      tableColumnCountCheck: true,
      chartColumnCheck: true,
      chartColumnCountCheck: true,
      // 分析字段
      analysisFieldsVisible: false,
      analysisFieldsArr:[],
      analysisChartConf:{
        controlName: "PieChart",
        controlId: "chart_analysis",
        height: "100%",
        isGroupData: true,
        groupBy: "label",
        datas: [],
        calcFields: [
          {
            name: "value",
            title: ""
          }
        ],
        option: {
          legend: {
            show: true
          }
        },
        events:{
          click(row){
            debugger;
            var _this = this.$parent.$parent;
            _this.analysisChartConf.datas = _this.deepAnalysisFields
            let data = JSON.parse(JSON.stringify(row.data))
            delete data.emphasis
            // 删除当前分析以后的深度分析
            _this.deepArr.splice(_this.curIndex+1, _this.deepArr.length - _this.curIndex - 1)
            let obj = _this.deepArr[_this.deepArr.length -1]
            obj.selectVal = _this.currentObj.name
            _this.$set(_this.deepArr,_this.curIndex,obj)
            _this.$set(_this.deepArr,_this.curIndex + 1, data)
            _this.curGroupField = data.prop;
            _this.currentObj = data;
            _this.curIndex = _this.curIndex + 1;
            _this.doQuery();
            _this.analysisFieldsVisible = false;
          }
        }
      },
      // 深度分析
      deepArr:[],
      conf:{},
      // 图表当前选中对象
      currentObj:{},
      // 当前分组字段
      curGroupField: '',
      // 深度分析当前环节下标
      curIndex: 0,
      exportLoading: false,
      // 穿梭框
      transferVisible: false,
      curTransferVal: [],
      groupFieldsEdit: [],
    }
  },
  updated() {
    this.$nextTick(() => {
      this.$refs["table"] && this.$refs["table"].doLayout();
    });
  },
  methods: {
    //  排序
    sortClick(val) {
      this.sortIndex = val
    },
    sortDown(){
      this.sortType = 'desc'
    },
    sortUp(){
      this.sortType = 'asc'
    },
    // 前进
    goCommand(val){
      let index = this.curIndex + val;
      this.curIndex = index;
      this.currentObj = this.deepArr[index];
      this.curGroupField = this.currentObj.prop;
      this.data = this.currentObj.data
    },
    goClick:_.debounce(function(){
      if(this.curIndex < this.deepArr.length - 1){
        this.curIndex = this.curIndex + 1;
        this.currentObj = this.deepArr[this.curIndex];
        this.curGroupField = this.currentObj.prop;
        this.data = this.currentObj.data
      }
    },500),
    // 后退
    backCommand(val){
      this.curIndex = val
      this.currentObj = this.deepArr[val];
      this.curGroupField = this.currentObj.prop;
      this.data = this.currentObj.data
    },
    backClick:_.debounce(function(){
      if(this.curIndex > 0){
        this.curIndex = this.curIndex - 1
        this.currentObj = this.deepArr[this.curIndex];
        this.curGroupField = this.currentObj.prop;
        this.data = this.currentObj.data
      }
    },500),
    // 深度分析
    breadcrumbClick(val) {
      this.curGroupField = val
      let arrnew = this.deepArr.map(item =>{
        return item.prop
      })
      this.curIndex = arrnew.indexOf(val)
      this.currentObj = this.deepArr[this.curIndex];
      // 数据替换成缓存的数据
      this.data = this.currentObj.data
    },
    // 点击查询
    doCount() {
      debugger;
      // 监听数据集
      if(this.dataset && this.deepArr.length == 0){
        let ds = this.$refs.BirtWorkBook_right.dataset[this.dataset.controlId]
          ds && ds.on("afterLoadData", this.afterLoadData);
      }
      this.loading = true;
      let prop = this.groupForm.prop;
      let fields = this.groupFields.map(item =>{
        return item.prop
      })
      this.curGroupField = prop;
      let index = fields.indexOf(prop)
      if(this.deepArr.length){
        // 如果切换了分组条件,清空深度分析
        if(this.deepArr[0] && this.deepArr[0].prop !== prop){
          this.deepArr = []
          this.currentObj = this.groupFields[index]
        }else{
          this.currentObj = this.deepArr[0]
        }
      }
      this.doQuery();
      // 当前分组加入深度分析
      if(index < 0){
        this.$message.error('当前分组条件不在分组字段中,请重新配置')
      }else{
        this.$set(this.deepArr,0,this.groupFields[index])
        this.curIndex = 0
      }
    },
    afterLoadData(datas){
      debugger
      this.data = datas
      // 缓存数据
      this.deepArr[this.curIndex].data = datas;
      let ds = this.$refs.BirtWorkBook_right.dataset[this.dataset.controlId]
      this.total = ds._infcPagging.recordCount
    },
    // 查询方法
    doQuery(){
      let ds = this.$refs.BirtWorkBook_right.dataset[this.dataset.controlId]
      if(this.showDetail){
        ds._infcPagging = {
          _isPagging: true,
          pageSize: this.pageSize,
          pageNum: this.currentPage,
          returnCount: true
        };
        ds._infcStat = {}
         ds._infcSort = {}
      }else{
        ds._infcPagging = {
          _isPagging: true,
          pageSize: this.pageSize,
          pageNum: this.currentPage,
          returnCount: true
        };
        ds._infcStat = {
          isGroupData: true,
          groupBy: this.curGroupField,
        }
        if(this.sortIndex > -1){
          let obj = this.sortArr[this.sortIndex]
          ds._infcSort.orderBy =[{
            name: obj.prop, 
            desc: obj.label, 
            type: this.sortType || 'desc'
          }]
        }else{
          ds._infcSort.orderBy = []
        }
      }
      ds.query();
      this.loading = false;
    },
    //  重置
    reset() {
      this.$refs.groupForm.resetFields();
      this.curTransferVal = []
      this.groupForm.prop = this.groupFields[0] && this.groupFields[0].prop;
      var queryPanel = this.$refs.BirtWorkBook_right.$children[0].$children[0].$children[0].$children[0].$children[0].$children[0];
      queryPanel.reset();
      let ds = this.$refs.BirtWorkBook_right.dataset[this.dataset.controlId]
      ds._infcLoad.queryModel={}
    },
    handleSizeChange(val) {
      this.pageSize = val
    },
    handleCurrentChange(val) {
      this.currentPage = val
    },
    // 切换图表
    chartTypeChange(command) {
      this.chartType = command;
    },
    // 打开分析列
    analysisClick(){
      this.analysisVisible = true
    },
    // 分系列全选
    handelCheckAll(val){
      debugger
      let _this = this
      this.analysisData = this.analysisData.map(item => {
        if(val == 'tableColumn') {
          item.tableColumn = _this.tableColumnCheck
        }
        if(val == 'tableColumnCount') {
          item.tableColumnCount = _this.tableColumnCountCheck
        }
        if(val == 'chartColumn') {
          item.chartColumn = _this.chartColumnCheck
        }
        if(val == 'chartColumnCount') {
          item.chartColumnCount = _this.chartColumnCountCheck
        }
        return item
      })
    },
    // 刷新
    refresh(){
      this.doQuery();
      this.$refs.chartConf && this.$refs.chartConf.refreshChart();
    },
    // 导出
    exportExcel() {
        let param = {
            pageNum: -1,
            pageSize: -1,
            __slaveExport: false,
        };
        let __body = {};
        let ds = this.$refs.BirtWorkBook_right.dataset[this.dataset.controlId]
        var cdion = ds.lastLoadCdion
        console.log('cdion', cdion)
        if (cdion) {
            __body['queryCdions'] = JSON.parse(cdion);
        }
        param['modelFilePath'] = ds['modelFilePath'];
        param['__funcpath'] = ds['__funcpath'];
        param.__body = __body
        let sheetStyle = {}
        let cells = []
        let columns = []
        this.tableColumns.forEach(item => {
          cells.push({
            title: item.label,
            colspan: 1,
            rowspan: 1
          })
          columns.push({
            fields: item.prop,
            width: 70
          })
        });
        sheetStyle = {
        name: '统计分析',
        titleRows: [
          {
            cells: cells
          }
        ],
        columns: columns
      }
        param.__sheetStyle = sheetStyle
        var data = {
            __sheetDatas: JSON.stringify([param])
        }
        var url = this.$HI.exportUrl
        this.exportLoading = true
        this.$HI.request.post(url,data).then((res) =>{
            console.log('res', res)
            this.exportLoading = false
            if(res.status == 200){
                let token = getToken();
                var url = this.$HI.download + `?path=${res.dataPack.path}&access_token=${token}`
                url = url.replace(/\\/g,"/")
                const a = document.createElement('a') //创建a标签
                a.style.display = 'none'
                a.href = url // 指定下载链接
                // a.download = '用户信息.xlsx' //指定下载文件名
                a.click() //触发下载
            }
        }).catch((e) =>{
            this.exportLoading = false
        })
    },
    // 打开穿梭框
    showtransfer(){
      this.groupFieldsEdit = JSON.parse(JSON.stringify(this.curTransferVal))
      this.transferVisible = true
    },
    transferConfirm(){
      if(this.groupFieldsEdit && this.groupFieldsEdit.length > 1){
        this.curTransferVal = JSON.parse(JSON.stringify(this.groupFieldsEdit))
        this.groupForm.prop = this.curTransferVal.join();
        this.curGroupField = this.groupForm.prop;
        this.transferVisible = false
      }else{
        this.$message.error("该分组选项已存在")
      }
    },
    transferClose(){
      this.transferVisible = false
      this.groupFieldsEdit = JSON.parse(JSON.stringify(this.curTransferVal))
    },
    transferUp(option){
      let arr = this.groupFieldsEdit
      let index = this.groupFieldsEdit.indexOf(option.prop)
      if(index > 0){
        arr.splice(index - 1, 1, ...arr.splice(index, 1, arr[index - 1]));
      }
    },
    transferDown(option){
      let arr = this.groupFieldsEdit
      let index = this.groupFieldsEdit.indexOf(option.prop)
      if(index < arr.length){
        arr.splice(index, 1, ...arr.splice(index + 1, 1, arr[index]));
      };
    },
  },
  mounted() { 
    
  }
};
</script>
<style>
.birtModelRight .el-main{
    padding: 5px !important;
  }
 .birtModelRight  table.zhc-birt-data-list{
    table-layout: auto !important;
    border-collapse: initial !important;
    border-spacing: revert !important;
}
.el-transfer.sam .el-transfer-panel:nth-child(1) button{
  display: none;
}
.el-dropdown.disabled .el-button,
.el-dropdown.disabled .el-button:hover{
  cursor: not-allowed;
  color: #C0C4CC;
  cursor: not-allowed;
  background-image: none;
  background-color: #FFF;
  border-color: #EBEEF5;
}
.tableHeader th, .tableHeader tr{
  background: linear-gradient(0deg,rgba(224,240,255,1), rgba(240,247,255,1));
}
</style>
<style lang="scss" scoped>
.container {
  position: relative;
  display: flex;
  flex-direction: column;
  height: 100%;
  padding: 20px;
}
.btn-toolbar {
  * + * {
    margin-left: 10px;
    margin-right: 0;
  }
}
.el-dropdown-menu__item {
  min-width: 90px;
}
.center-content {
  height: 100%;
  width: 100%;
  padding: 10px;
  box-sizing: border-box;
}
.depth-analysis {
  display: flex;
  align-items: center;
  padding: 10px;
}
.el-breadcrumb__item a {
  cursor: pointer !important;
}
.deepActive{
  color: #06c;
  font-weight: 600;
}
.sortActive{
  color: rgb(33, 235, 141);
  font-weight: 600;
}
>>>.el-dropdown-menu__item:focus, .el-dropdown-menu__item:not(.is-disabled):hover{
  background: initial;
  color: initial;
}
.el-dropdown-menu__item i{
  font-weight: 600;
  margin: 0 0 0 5px;
}
.el-dropdown-menu__item i:hover {
  color: rgb(33, 235, 141);
}

.birtModelRight .el-main{
    padding: 5px !important;
}
.el-icon-edit{
  right: 30px;
  position: absolute;
  z-index: 1;
  line-height: 30px;
  cursor: pointer;
}
>>>.el-dropdown.disabled .el-button,
>>>.el-dropdown.disabled .el-button:hover{
  cursor: not-allowed;
  color: #C0C4CC;
  cursor: not-allowed;
  background-image: none;
  background-color: #FFF;
  border-color: #EBEEF5;
}
</style>