<template>
  <div>
    <main class="site-content" :class="{ 'site-content--tabs': $route.meta.isTab }">
      <!-- 主入口标签页 s -->
      <el-tabs
        v-if="$route.meta.isTab"
        v-model="mainTabsActiveName"
        :closable="true"
        @tab-click="selectedTabHandle"
        @tab-remove="removeTabHandle">
        <el-dropdown class="site-tabs__tools" :show-timeout="0">
          <i class="el-icon-arrow-down el-icon--right"></i>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item @click.native="tabsCloseCurrentHandle">关闭当前标签页</el-dropdown-item>
            <el-dropdown-item @click.native="tabsCloseOtherHandle">关闭其它标签页</el-dropdown-item>
            <el-dropdown-item @click.native="tabsCloseAllHandle">关闭全部标签页</el-dropdown-item>
            <el-dropdown-item @click.native="refresh()">刷新当前标签页</el-dropdown-item>
            <el-dropdown-item @click.native="flag = true">筛选条件</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
        <el-tab-pane
          v-for="item in mainTabs"
          :key="item.name"
          :label="item.title"
          :name="item.name">
          <el-card :body-style="siteContentViewHeight">
            <iframe
              v-if="item.type === 'iframe'"
              :src="item.iframeUrl"
              width="100%" height="100%" frameborder="0" scrolling="yes">
            </iframe>
            <keep-alive v-else>
              <router-view v-if="item.name === mainTabsActiveName" />
            </keep-alive>
          </el-card>
        </el-tab-pane>
      </el-tabs>
      <!-- 主入口标签页 e -->
      <el-card v-else :body-style="siteContentViewHeight">
        <keep-alive>
          <router-view />
        </keep-alive>
      </el-card>
    </main>
    <el-dialog title="查询" append-to-body v-drag @close="closeSiftDialog" @open="openSiftDialog" :visible.sync="flag" width="65%">
      <el-container>
        <el-aside width="90%">
          <el-autocomplete :hide-loading="false" v-if="!settingFlag" style="width: 100%;" @select="handleSelect" :fetch-suggestions="querySaveRecord" v-model="querySavedVo.itemDesc">
            <el-button @click="searchQuerySavedVo" style="width: 80px" slot="append" icon="el-icon-search"></el-button>
          </el-autocomplete>
          <el-table ref="siftTable" :row-key="getRowKeys" @selection-change="handleSelectionChange" :data="siftList" height="40vh" border>
            <el-table-column
              type="selection"
              width="40" align="center" v-if="settingFlag">
            </el-table-column>
            <el-table-column label="操作" align="left" header-align="center" width="70" v-if="settingFlag">
              <template slot-scope="{row,$index}">
                <el-link style="cursor:pointer;" @click="moveSetting($index,-1)" v-if="$index !== 0">上移</el-link>
                <el-link style="cursor:pointer;" @click="moveSetting($index,1)" v-if="$index !== siftList.length-1">下移</el-link>
              </template>
            </el-table-column>
<!--            <el-table-column label="属性" align="center" show-overflow-tooltip width="120" prop="fieldName"></el-table-column>-->
            <el-table-column label="属性名称" align="center" show-overflow-tooltip width="120" prop="fieldCaption"></el-table-column>
            <el-table-column label="条件" align="center">
              <template slot-scope="{row,$index}">
                <el-input v-model="row.formula" clearable>
                  <el-select slot="prepend" clearable v-model="row.symbol" style="width: 100px;cursor:pointer;">
                    <el-option value="eq" label="等于"></el-option>
                    <el-option value="gt" label="大于"></el-option>
                    <el-option value="ge" label="大于等于"></el-option>
                    <el-option value="lt" label="小于"></el-option>
                    <el-option value="le" label="小于等于"></el-option>
                    <el-option value="between" label="之间"></el-option>
                    <el-option value="in" label="或者"></el-option>
                    <el-option value="ne" label="不等于"></el-option>
                    <el-option value="like" label="LIKE"></el-option>
                  </el-select>
                </el-input>
              </template>
            </el-table-column>
            <el-table-column label="排序" align="center" prop="sortBy" show-overflow-tooltip width="120">
              <template slot-scope="{row,$index}">
                <el-select v-model="row.sortBy" clearable style="width: 100%">
                  <el-option value="asc" label="升序"></el-option>
                  <el-option value="desc" label="降序"></el-option>
                </el-select>
              </template>
            </el-table-column>
            <el-table-column label="次序" align="center" prop="orderSeq" width="120">
              <template slot-scope="{row,$index}">
                <el-input-number v-model="row.orderSeq" clearable style="width: 100%;" :controls="false"></el-input-number>
              </template>
            </el-table-column>
            <el-table-column label="数据库字段" align="center" prop="originalField" show-overflow-tooltip width="120"></el-table-column>
          </el-table>
        </el-aside>
        <el-container>
          <el-main style="padding: 0px;">
            <el-card class="box-card" style="height: 100%;margin-left: 3px">
              <div style="text-align: center;">
                <div class="box-div" style="margin-top: 70px">
                  <button @click="openSaveQueryHeaderDialog" v-if="!settingFlag">条件保存</button>
                </div>
                <div class="box-div">
                  <button @click="flushedSiftList">刷新</button>
                </div>
                <div class="box-div">
                  <button @click="clearSetting">清除</button>
                </div>
                <div class="box-div">
                  <button @click="queryUserSettingSave">{{ settingFlag?'保存':'配置' }}</button>
                </div>
                <div class="box-div" v-if="settingFlag">
                  <button @click="settingFlag = false">取消</button>
                </div>
                <div class="box-div" v-if="!settingFlag">
                  <el-checkbox v-model="querySavedVo.caseSensitiveFlag" true-label="Y" false-label="N">区分大小写</el-checkbox>
                </div>
              </div>
            </el-card>
          </el-main>
        </el-container>
      </el-container>
      <div style="height: 20px;width: 100%"></div>
    </el-dialog>

    <el-dialog title="记录名称" center :visible.sync="saveQueryHeader" @open="selectData = {itemDesc: undefined}" top="20vh" width="20%">
      <el-input v-model="selectData.itemDesc"></el-input>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="saveQueryHeaderDetail">保 存</el-button>
        <el-button type="primary" @click="saveQueryHeader = false">关 闭</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
  import { isURL } from '@/utils/validate'
  import {
    saveOrUpdateBatch, saveQueryHeaderDetail,
    searchUserSettingList,
    searchUserSettingRecording,
    searchUserSettingRecordList
  } from "../api/sift/queryUserSetting";
  import {Decimal} from "decimal.js";
  export default {
    inject: ['refresh'],
    data () {
      return {
        cloneSiftList:[],
        flag:false,
        settingFlag:false,
        selectionSiftList:[],
        recordList:[],
        selectData:{
          itemDesc:undefined,
        },
        querySavedVo:{
          menuId:this.$route.meta.menuId,
          userId:this.$store.state.user.id,
          itemNo:undefined,
          itemDesc:undefined,
          caseSensitiveFlag:'N'
        },
        saveQueryHeader:false,
      }
    },
    computed: {
      documentClientHeight: {
        get () { return this.$store.state.common.documentClientHeight }
      },
      menuActiveName: {
        get () { return this.$store.state.common.menuActiveName },
        set (val) { this.$store.commit('common/updateMenuActiveName', val) }
      },
      mainTabs: {
        get () { return this.$store.state.common.mainTabs },
        set (val) { this.$store.commit('common/updateMainTabs', val) }
      },
      mainTabsActiveName: {
        get () { return this.$store.state.common.mainTabsActiveName },
        set (val) { this.$store.commit('common/updateMainTabsActiveName', val) }
      },
      siteContentViewHeight () {
        var height = this.documentClientHeight - 50 - 2
        if (this.$route.meta.isTab) {
          height -= 40
          return isURL(this.$route.meta.iframeUrl) ? { height: height + 'px' } : { minHeight: height + 'px' }
        }
        return { minHeight: height + 'px' }
      },
      siftList:{
        get(){
          return this.$store.state.sift.siftList.filter(e => e.visible === 'Y'|| this.settingFlag)
        },
      }
    },
    methods: {
      // tabs, 选中tab
      selectedTabHandle (tab) {
        tab = this.mainTabs.filter(item => item.name === tab.name)
        if (tab.length >= 1) {
          this.$router.push({ name: tab[0].name, query: tab[0].query, params: tab[0].params })
        }
      },
      // tabs, 删除tab
      removeTabHandle (tabName) {
        this.mainTabs = this.mainTabs.filter(item => item.name !== tabName)
        if (this.mainTabs.length >= 1) {
          // 当前选中tab被删除
          if (tabName === this.mainTabsActiveName) {
            var tab = this.mainTabs[this.mainTabs.length - 1]
            this.$router.push({ name: tab.name, query: tab.query, params: tab.params }, () => {
              this.mainTabsActiveName = this.$route.name
            })
          }
        } else {
          this.menuActiveName = ''
          this.$router.push({ name: 'home' })
        }
      },
      // tabs, 关闭当前
      tabsCloseCurrentHandle () {
        console.log(this.$route.meta.menuId)
        this.removeTabHandle(this.mainTabsActiveName)
      },
      // tabs, 关闭其它
      tabsCloseOtherHandle () {
        this.mainTabs = this.mainTabs.filter(item => item.name === this.mainTabsActiveName)
      },
      // tabs, 关闭全部
      tabsCloseAllHandle () {
        this.mainTabs = []
        this.menuActiveName = ''
        this.$router.push({ name: 'home' })
      },
      // tabs, 刷新当前
      tabsRefreshCurrentHandle () {
        var tab = this.$route
        this.removeTabHandle(tab.name)
        this.$nextTick(() => {
          this.$router.push({ name: tab.name, query: tab.query, params: tab.params })
        })
      },
      openSiftDialog(){
        this.cloneSiftList = JSON.parse(JSON.stringify(this.$store.state.sift.siftList))
      },
      closeSiftDialog(){
        if (this.settingFlag){
          this.$confirm('存在未保存的数据，是否保存?', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            this.queryUserSettingSave();
            this.settingFlag = false;
          }).catch(() => {
            this.settingFlag = false;
          });
        }
        this.$store.commit("sift/commitSiftList",this.cloneSiftList);
        this.querySavedVo={
          menuId:this.$route.meta.menuId,
            userId:this.$store.state.user.id,
            itemNo:undefined,
            itemDesc:undefined,
            caseSensitiveFlag:'N'
        };
      },
      searchSiftList(){
        let params = {
          menuId:this.$route.meta.menuId,
          userId:this.$store.state.user.id
        }
        searchUserSettingList(params).then(({data})=>{
          if (data && data.code === 0){
            this.$store.commit("sift/commitSiftList",data.rows)
            this.cloneSiftList = data.rows
          }else {
            this.$message.warning(data.msg)
          }
        }).catch((error)=>{
          this.$message.warning(error)
        })
      },
      queryUserSettingSave(){
        if (this.settingFlag === false){
          this.settingFlag = true
          this.$store.commit("sift/commitSiftList",this.cloneSiftList)
          this.$nextTick(()=>{
            this.$refs.siftTable.clearSelection()
            this.siftList.forEach(row=>{
              this.$refs.siftTable.toggleRowSelection(row,row.visible === 'Y')
            })
          })
          return
        }
        // 修改选择值切换
        // this.showSetting();
        // 发起新增或修改请求
        saveOrUpdateBatch(this.showSetting()).then(({data})=>{
          if (data && data.code === 0){
            this.searchSiftList()
            this.querySavedVo={
              menuId:this.$route.meta.menuId,
                userId:this.$store.state.user.id,
                itemNo:undefined,
                itemDesc:undefined,
                caseSensitiveFlag:'N'
            }
            this.settingFlag = false
            this.$message.success(data.msg)
          }else {
            this.$message.warning(data.msg)
          }
        }).catch((error)=>{
          this.$message.error(error)
        })
      },
      handleSelectionChange(val){
        this.selectionSiftList = val
      },
      getRowKeys(row){
        return row.fieldName
      },
      moveSetting(i,num){
        let arr = [...this.siftList]
        arr[i+num].showSeqNo = new Decimal(arr[i+num].showSeqNo).toNumber() - num
        arr[i].showSeqNo = new Decimal(arr[i+num].showSeqNo).toNumber() + num
        arr = arr.sort((a,b)=> a.showSeqNo-b.showSeqNo)
        this.$store.commit("sift/commitSiftList",arr)
        this.$nextTick(()=>{
          this.siftList.forEach(row =>{
            this.$refs.siftTable.toggleRowSelection(row,row.visible === 'Y')
          })
        })
      },
      showSetting(){
        let arr = [...this.siftList]
        arr.map(i=>{
          i.visible = 'N'
          return i
        })
        this.selectionSiftList.forEach(item=>{
          for (let i = 0; i < arr.length; i++) {
            let setting = arr[i]
            if (item.fieldName === setting.fieldName){
              setting.visible = 'Y'
              break
            }
          }
        })
        return arr
      },
      clearSetting(){
        let arr = JSON.parse(JSON.stringify(this.siftList));
        for (let i = 0; i < this.siftList.length; i++) {
          arr[i].symbol = null;
          arr[i].formula = null;
          arr[i].sortBy = null;
        }
        this.querySavedVo = {
          menuId:this.$route.meta.menuId,
            userId:this.$store.state.user.id,
            itemNo:undefined,
            itemDesc:undefined,
            caseSensitiveFlag:'N'
        };
        this.$store.commit("sift/commitSiftList",arr)
        this.$nextTick(()=>{
          this.siftList.forEach(row =>{
            this.$refs.siftTable.toggleRowSelection(row,row.visible === 'Y')
          })
        })
      },
      flushedSiftList(){
        let params = {
          menuId:this.$route.meta.menuId,
          userId:this.$store.state.user.id
        }
        this.querySavedVo={
          menuId:this.$route.meta.menuId,
            userId:this.$store.state.user.id,
            itemNo:undefined,
            itemDesc:undefined,
            caseSensitiveFlag:'N'
        }
        searchUserSettingList(params).then(({data})=>{
          if (data && data.code === 0){
            this.$store.commit("sift/commitSiftList",data.rows)
            this.$nextTick(()=>{
              this.siftList.forEach(row =>{
                this.$refs.siftTable.toggleRowSelection(row,row.visible === 'Y')
              })
            })
          }else {
            this.$message.warning(data.msg)
          }
        }).catch((error)=>{
          this.$message.error(error)
        })
      },
      flushedSiftRecording(){
        let params = {
          menuId:this.$route.meta.menuId,
          userId:this.$store.state.user.id
        }
        searchUserSettingRecordList(params).then(({data})=>{
          if (data && data.code === 0){
            this.recordList = data.rows
          }else {
            this.$message.warning(data.msg)
          }
        }).catch((error)=>{
          this.$message.error(error)
        })
      },
      flushSift(){
        if (this.$route.meta.menuId){
          this.flushedSiftList()
          this.flushedSiftRecording()
        }
      },
      querySaveRecord(queryString, cb){
        let results = this.recordList;
        results = queryString?results.filter((item)=>{
          return item.itemDesc.toUpperCase().match(queryString)
        }):results;
        results = results.map(item=>{
          item.value = item.itemDesc
          return item
        })
        cb(results)
      },
      handleSelect(item){
        this.selectData = JSON.parse(JSON.stringify(item))
        searchUserSettingRecording(item).then(({data})=>{
          if (data && data.code === 0){
            let rows = data.rows
            let list = [...this.siftList]
            rows.forEach((row)=>{
              for (let i = 0; i < list.length; i++) {
                let sift = list[i]
                if (sift.menuId === row.menuId && sift.userId === row.userId && sift.fieldName === row.fieldName){
                  sift.symbol = row.symbol
                  sift.formula = row.formula
                  sift.sortBy = row.sortBy
                  break
                }
              }
            })
            this.$store.commit("sift/commitSiftList",list);
            // 处理数据
          }else {
            this.$message.warning(data.msg)
          }
        }).catch((error)=>{
          this.$message.error(error)
        })
      },
      openSaveQueryHeaderDialog(){
        if (!this.querySavedVo.itemDesc){
          this.saveQueryHeader = true
          return
        }
        this.saveQueryHeaderDetail();
      },
      saveQueryHeaderDetail(){
        let param = {...this.selectData}
        // 打开了新增弹框即新增查询记录 否则修改查询记录
        if (this.saveQueryHeader){
          param.menuId = this.$route.meta.menuId
          param.userId = this.$store.state.user.id
          param.dtsName = 'ADOQResult'
        }
        param.querySavedDetailList = JSON.parse(JSON.stringify(this.siftList))
        saveQueryHeaderDetail(param).then(({data})=>{
          if (data && data.code === 0){
            this.flushedSiftRecording();
            this.saveQueryHeader = false
            this.$message.success(data.msg)
          }else {
            this.$message.warning(data.msg)
          }
        }).catch((error)=>{
          this.$message.error(error)
        })
      },
      searchQuerySavedVo(){
        let params = {...this.querySavedVo}
        params.querySavedDetailList = this.siftList
        this.$store.state.sift.searchFunction(params)
      }
    },
    watch:{
      // 监听路由变化调用筛选查询
      $route:'flushSift'
    },
    mounted() {
      this.flushSift()
    }
  }
</script>

<style scoped>
 /deep/ .el-table .cell{
  height: auto;
}
 .box-div{
   width: 100%;
   margin-bottom: 5px;
   padding-bottom: 5px;
   //border-bottom: 1px solid #eee;
 }
 .box-div button{
   height: 32px;
   width: 80px;
   background: rgb(22,179,163);
   border: none;
   border-radius: 5px;
   color: #fff;
   cursor: pointer;
 }
 .box-div button:hover{
   background: rgb(97, 217, 204);
 }

 /deep/ .el-input .el-input-group__prepend{
   background-color: #fff;
 }

 /deep/ .el-autocomplete .el-input .el-input-group__append{
   background-color: rgb(22,179,163);
   color: #fff;
   border: 1px solid rgb(22,179,163);
 }

 .el-input-number /deep/ .el-input__inner{
   text-align: right;
   padding-right: 5px !important;
 }

 /deep/ .el-input-number--medium{
   line-height: 20px;
 }
</style>

