<template>
  <div class="content">
    <cs-search title="案件检索" :data="searchData" :span="4" direction="row" @onSearch="onSearch" @getData="onSearch" />
    <div class="index-content">
      <div class="header">
        <el-dropdown @command="handleSelect">
          <el-button type="primary">批量操作<i class="el-icon-arrow-down el-icon--right" /></el-button>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item command="1">批量删除</el-dropdown-item>
            <el-dropdown-item command="2">批量恢复</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </div>
      <vxe-grid v-bind="gridOptions" style="margin-top: 20px" @checkbox-change="selectChangeEvent">
        <template #operate="{row}">
          <el-button type="text" @click="resetData(row)">恢复</el-button>
          <el-button type="text" style="color: red" @click="handleDel(row)">删除</el-button>
        </template>
      </vxe-grid>
      <div style="text-align: center">
        <cs-page
          :page.sync="queryForm.page"
          :limit.sync="queryForm.size"
          :total="queryForm.total"
          @pagination="fetchData"
        />
      </div>
    </div>
  </div>
</template>

<script>
import mixin from '@/views/mixin'
import { resetDataStatusByIds, realDeleteByIds, queryCaseList } from '@/api/caseManagement'
export default {
  name: 'Index',
  mixins: [mixin],
  data() {
    return {
      // 筛选数据
      searchData: [
        { label: '案件编号', model: 'caseNo', type: 'input' },
        { label: '案件名称', model: 'caseName', type: 'input' },
        { label: '认定结果', model: 'identifyResult', type: 'selectMultiple', option: JSON.parse(sessionStorage.getItem('identify_result')) }
        // { label: '涉案人员', model: 'involvedPerson', type: 'input' },
        // { label: '最新时间', model: 'updateTime', type: 'datetimerange' }
      ],
      // 表格配置
      gridOptions: {
        ...mixin.data().gridOptions,
        // 指标名称单元格添加样式
        cellClassName: ({ column }) => {
          if (column.field === 'indexName') {
            return 'text-blue'
          }
          return null
        },
        columns: [
          { type: 'checkbox', width: '80px' },
          { title: '案件编号', field: 'caseNo' },
          { title: '案件名称', field: 'caseName' },
          { title: '行为人', field: 'caseActorName' },
          { title: '当事人', field: 'lawParty' },
          { title: '综合得分', field: 'totalScore' },
          { title: '认定结果', field: 'identifyResultName' },
          { title: '删除时间', field: 'updateTime' },
          { title: '操作', slots: { default: 'operate' }, fixed: 'right', width: '150px' }
        ],
        data: []
      },
      selectionRows: [],
      selectedRowKeys: []
    }
  },
  mounted() {
    this.tableHeight(390)
  },
  methods: {
    // 原子指标查询
    fetchData() {
      const params = JSON.parse(JSON.stringify(this.searchFormData))
      params.isDelete = true
      if (params.identifyResult && params.identifyResult.length === 0) delete params['identifyResult']
      queryCaseList(params, this.queryForm.page, this.queryForm.size).then(res => {
        this.gridOptions.data = res.data.records
        this.gridOptions.data.forEach(e => {
          const list = []
          for (const item of e.lawPartyList) {
            list.push(item.name)
          }
          e.lawParty = list.length > 0 ? list.join(',') : '无'
        })
        this.queryForm.total = res.data.total
      })
    },
    async handleSelect(val) {
      if (this.selectionRows.length === 0) {
        this.$baseMessage.error('至少选择一条数据!')
        return
      }
      const list = []
      this.selectionRows.forEach(e => {
        list.push(e.id)
      })
      if (val === '1') {
        this.$baseConfirm('确定要删除吗?', null, async() => {
          const { code, msg } = await realDeleteByIds(list)
          code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!')
          this.fetchData()
        })
      } else {
        const { code, msg } = await resetDataStatusByIds(list)
        if (code === 200) {
          this.$baseMessage.success(msg || '恢复成功!')
          this.fetchData()
        }
      }
    },
    // 复选框事件(保留翻页选中的数据)
    selectChangeEvent({ checked, records, reserves, row }) {
      // 勾选选中时
      if (checked) {
        // 第一次选数据,还未进行翻页时
        if (reserves.length === 0) {
          this.selectedRowKeys = records.map(v => v.id)
          this.selectionRows = records
        } else {
          // id集合,翻页存在已选中的数据时,拼接新选中的数据
          this.selectedRowKeys = [...reserves.map(v => v.id), ...records.map(v => v.id)]
          // 数据集合,翻页存在已选中的数据时,拼接新选中的数据
          this.selectionRows = [...reserves, ...records]
        }
      } else {
        // 取消选中时
        const idIndex = this.selectedRowKeys.indexOf(row.id)
        if (idIndex > -1) {
          // 删除取消选中删除指定元素id
          this.$delete(this.selectedRowKeys, idIndex)
        }

        let dataIndex = null
        for (let i = 0; i < this.selectionRows.length; i++) {
          if (this.selectionRows[i].id === row.id) {
            dataIndex = i
            break
          }
        }
        // 删除取消选中的元素整个对象
        this.$delete(this.selectionRows, dataIndex)
      }
    },
    // 恢复
    async resetData(row) {
      const { code, msg } = await resetDataStatusByIds([row.id])
      if (code === 200) {
        this.$baseMessage.success(msg || '恢复成功!')
        this.fetchData()
      }
    },
    // 删除
    handleDel(row) {
      this.$baseConfirm('确定要删除吗?', null, async() => {
        const { code, msg } = await realDeleteByIds([row.id])
        code === 200 ? this.$baseMessage.success(msg || '删除成功!') : this.$baseMessage.error(msg || '删除失败!')
        this.fetchData()
      })
    },
    // 筛选
    onSearch(data, callback) {
      this.searchFormData = Object.assign({}, data)
      this.queryForm.page = 1
      this.fetchData()
      if (callback) callback(true)
    }
  }
}
</script>

  <style scoped lang="scss">
  .content {
    height: 100%;
    .index-content {
      border-radius: 8px;
      background: white;
      padding: 20px;
      box-sizing: border-box;
      margin-top: 10px;
      height: calc(100% - 120px);
    }
    .expand-details {
      background: #F6F6F6;
      padding: 8px 20px;
      box-sizing: border-box;
    }
  }
  ::v-deep {
    .text-blue {
      color: #005AA8;
    }
    .header-blue {
      background: #F2F6FA;
    }
  }
  </style>