备份恢复项目中的难点需求整理

1.多种备份方式显示和操作 逻辑

<template>
  <div class="container">
    <el-card class="boxCard">
      <div class="cardHeader">
        <div class="headerImg"></div>
        <div class="headerFont">备份模型管理</div>
      </div>
      <el-divider></el-divider>
      <div class="tabStyle">
        <el-form v-show="showSearch" :inline="true" ref="queryForm" :model="queryParams" class="demo-form-inline"
                 id="demo-form" label-width="90px">
          <el-form-item label="表英文名称" prop="tableNameEng">
            <el-input clearable autocomplete="off" v-model="queryParams.tableNameEng" placeholder="请输入内容"></el-input>
          </el-form-item>
          <el-form-item label="表中文名称" prop="tableNameChn">
            <el-input clearable autocomplete="off" v-model="queryParams.tableNameChn" placeholder="请输入内容"></el-input>
          </el-form-item>
          <el-form-item>
            <el-button class="panbtn greenbtn" icon="el-icon-search" @click="handleQuery">查询</el-button>
          </el-form-item>
          <el-form-item>
            <el-button class="panbtn bluebtn" icon="el-icon-refresh-left" @click="resetQuery">重置</el-button>
          </el-form-item>
          <div class="btnBox">
            <el-button class="panbtn greenbtn" @click="handleAdd" icon="el-icon-circle-plus">新增表</el-button>
            <el-button class="panbtn redbtn" @click="handleDelete" :disabled="multiple"
                       icon="el-icon-remove">删除</el-button>
          </div>
        </el-form>
        <!-- 折叠 -->
        <el-row v-show="false" :gutter="10" class="mb8">
          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
        </el-row>
        <!-- 表格 -->
        <div class="table-wrapper">
          <el-table height="55vh" @cell-dblclick="handleUpdate" :data="leftTableData" :style="{width: rightTableData.length > 0 ? '49%' : '100%', display: 'inline-block', verticalAlign: 'top'}"
                    @selection-change="selection => handleSelectionChange(selection, 'left')" v-loading="loading">
            <el-table-column type="selection" width="55" align="center" />
            <el-table-column width="100px" prop="tableId" label="表ID" align="center" show-overflow-tooltip>
            </el-table-column>
            <el-table-column prop="tableNameEng" label="表英文名" align="center" show-overflow-tooltip>
            </el-table-column>
            <el-table-column prop="tableNameChn" label="表中文名" align="center" show-overflow-tooltip>
            </el-table-column>
            <el-table-column label="操作" width="150px" align="center" show-overflow-tooltip>
              <template slot-scope="scope">
                <el-button class="tableBtn-green" @click="handleUpdate(scope.row)">查看域信息配置</el-button>
              </template>
            </el-table-column>
          </el-table>
          <el-table height="55vh" v-if="rightTableData.length>0" @cell-dblclick="handleUpdate" :data="rightTableData" style="width: 49%; display: inline-block;margin-left: 1%;vertical-align: top;"
                    @selection-change="selection => handleSelectionChange(selection, 'right')" v-loading="loading">
            <el-table-column type="selection" width="55" align="center" />
            <el-table-column width="100px" prop="tableId" label="表ID" align="center" show-overflow-tooltip>
            </el-table-column>
            <el-table-column prop="tableNameEng" label="表英文名" align="center" show-overflow-tooltip>
            </el-table-column>
            <el-table-column prop="tableNameChn" label="表中文名" align="center" show-overflow-tooltip>
            </el-table-column>
            <el-table-column label="操作" width="150px" align="center" show-overflow-tooltip>
              <template slot-scope="scope">
                <el-button class="tableBtn-green" @click="handleUpdate(scope.row)">查看域信息配置</el-button>
              </template>
            </el-table-column>
          </el-table>
        </div>
        <!-- 分页 -->
        <pagination :page-sizes="[20, 40, 100, 200]" v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
                    :limit.sync="queryParams.pageSize" @pagination="getList" />
      </div>
    </el-card>
    <!-- 弹框表 -->
    <el-dialog title="添加表" :visible.sync="open2" width="98%" :close-on-click-modal="false">
      <el-form :inline="true" :model="formInline" ref="formInline" class="demo-form-inline">
        <el-form-item label="表英文名称" prop="tableNameEng">
          <el-input clearable autocomplete="off" v-model="formInline.tableNameEng" placeholder="请输入内容"></el-input>
        </el-form-item>
        <el-form-item label="表中文名称" prop="tableNameChn">
          <el-input clearable autocomplete="off" v-model="formInline.tableNameChn" placeholder="请输入内容"></el-input>
        </el-form-item>
        <el-form-item label="应用类型" prop="appType">
          <el-select clearable autocomplete="off" v-model="appType1" multiple collapse-tags @change="changeappType">
            <el-option v-for="item in comOptions" :key="item.value" :label="item.label" :value="item.value">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button class="panbtn greenbtn" icon="el-icon-search" @click="handleQuery2">查询</el-button>
        </el-form-item>
        <el-form-item>
          <el-button class="panbtn bluebtn" icon="el-icon-refresh-left" @click="resetQuery2">重置</el-button>
        </el-form-item>
        <div class="btnBox">
          <el-button :disabled="multipleAddB" class="panbtn greenbtn" @click="handleAddB"
                     icon="el-icon-circle-plus">添加</el-button>
        </div>
      </el-form>
      <el-table height="55vh" :data="tableDataB" style="width: 100%" @selection-change="handleSelectionChangeB" v-loading="loadingB">
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column width="100" prop="tableId" label="表ID" align="center" show-overflow-tooltip>
        </el-table-column>
        <el-table-column prop="tableNameEng" label="表英文名" align="center" show-overflow-tooltip>
        </el-table-column>
        <el-table-column prop="tableNameChn" label="表中文名" align="center" show-overflow-tooltip>
        </el-table-column>
        <el-table-column prop="appTypeName" label="应用类型" align="center" show-overflow-tooltip>
        </el-table-column>
      </el-table>
      <pagination v-show="formtotal2 > 0" :total="formtotal2" :page.sync="formInline.pageNum"
                  :limit.sync="formInline.pageSize" @pagination="getBList" />
    </el-dialog>
    <!-- 弹框域 -->
    <el-dialog title="域信息配置详情" :visible.sync="open" width="98%" :close-on-click-modal="false" @close="handleClose">
      <div class="titlee">{{ form.tableNameChn }}</div>
      <el-button class="panbtn greenbtn" @click="handleAddBFY" icon="el-icon-circle-plus">添加备份域</el-button>
      <el-button class="panbtn redbtn" @click="handleDeleteBFY" :disabled="multipleBFY"
                 icon="el-icon-remove">删除</el-button>
      <el-table height="55vh" :data="tableDataY" style="width: 100%;margin-top: 10px;" @selection-change="handleSelectionChangeBFY" v-loading="loadingY">
        <el-table-column type="selection" width="55" align="center" />
        <el-table-column prop="columnId" label="域ID" align="center" show-overflow-tooltip>
        </el-table-column>
        <el-table-column prop="columnNameEng" label="域英文名" align="center" show-overflow-tooltip>
        </el-table-column>
        <el-table-column prop="columnNameChn" label="域中文名" align="center" show-overflow-tooltip>
        </el-table-column>
        <el-table-column prop="referenceFlag" label="关联方式" align="center" show-overflow-tooltip>
          <template slot-scope="scope">
            <el-tag type="success" v-if="scope.row.referenceFlag == 1">采样关联</el-tag>
            <el-tag type="success" v-if="scope.row.referenceFlag == 0">普通关联</el-tag>
            <el-tag type="danger" v-if="scope.row.referenceFlag == 2">外键关联</el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="menuName" label="菜单名称" align="center" show-overflow-tooltip>
        </el-table-column>
        <el-table-column prop="isKey" label="是否主键" align="center" show-overflow-tooltip>
          <template slot-scope="scope">
            <span v-if="scope.row.isKey == 1" style="color: red">是</span>
            <span v-if="scope.row.isKey == 0" style="color: #00706b">否</span>
          </template>
        </el-table-column>
        <el-table-column prop="allowNull" label="是否允许空值" align="center" show-overflow-tooltip>
          <template slot-scope="scope">
            <span v-if="scope.row.allowNull == 1" style="color: red">是</span>
            <span v-if="scope.row.allowNull == 0" style="color: #00706b">否</span>
          </template>
        </el-table-column>
        <el-table-column prop="backupType" label="备份方式" align="center" width="300px">
          <template slot-scope="scope">
            <el-radio-group v-model="scope.row.backupType" @change.native="changeBackupType(scope.row)">
              <el-radio :label="0" v-if="scope.row.menuName == null && scope.row.referenceFlag == 0
                ">普通备份</el-radio>
              <el-radio :label="1" v-if="scope.row.menuName != null || scope.row.referenceFlag != 0
                ">ID备份</el-radio>
              <el-radio :label="2" v-if="scope.row.menuName != null || scope.row.referenceFlag != 0
                ">ID转备份</el-radio>
              <el-radio :label="3" v-if="scope.row.menuName != null || scope.row.referenceFlag != 0
                ">全备份</el-radio>
            </el-radio-group>
          </template></el-table-column></el-table>
      <pagination v-show="formtotal > 0" :total="formtotal" :page.sync="form.pageNum" :limit.sync="form.pageSize"
                  @pagination="getYList" />
      <!-- 内层域列表弹框------------------------ -->
      <el-dialog width="80%" title="添加域" :visible.sync="innerVisible" append-to-body :close-on-click-modal="false">
        <el-button :disabled="multipleInner" class="panbtn greenbtn" @click="handleAddBFYInner"
                   icon="el-icon-circle-plus">添加</el-button>
        <!-- @toggleRowSelection="toRowSelection" -->
        <el-table height="55vh" :data="tableDataInner" style="width: 100%;margin-top: 10px;" @selection-change="handleSelectionChangeInner"
                  v-loading="loadingInner" @row-click="row_click" ref="innerDom">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column width="100px" prop="tableId" label="域ID" align="center" show-overflow-tooltip>
          </el-table-column>
          <el-table-column prop="columnNameEng" label="域英文名" align="center" show-overflow-tooltip>
          </el-table-column>
          <el-table-column prop="columnNameChn" label="域中文名" align="center" show-overflow-tooltip>
          </el-table-column>
          <el-table-column prop="referenceFlag" label="关联方式" align="center" show-overflow-tooltip>
            <template slot-scope="scope">
              <el-tag type="success" v-if="scope.row.referenceFlag == 1">采样关联</el-tag>
              <el-tag type="success" v-if="scope.row.referenceFlag == 0">普通关联</el-tag>
              <el-tag type="danger" v-if="scope.row.referenceFlag == 2">外联关联</el-tag>
            </template>
          </el-table-column>
          <el-table-column prop="isKey" label="是否主键" align="center" show-overflow-tooltip>
            <template slot-scope="scope">
              <span v-if="scope.row.isKey == 1" style="color: red">是</span>
              <span v-if="scope.row.isKey == 0" style="color: #00706b">否</span>
            </template>
          </el-table-column>
          <el-table-column prop="allowNull" label="是否允许空值" align="center" show-overflow-tooltip>
            <template slot-scope="scope">
              <span v-if="scope.row.allowNull == 1" style="color: red">是</span>
              <span v-if="scope.row.allowNull == 0" style="color: #00706b">否</span>
            </template>
          </el-table-column>
          <el-table-column prop="menuName" label="菜单名称" align="center" show-overflow-tooltip>
          </el-table-column>
          <el-table-column prop="backupType" label="备份方式" align="center" width="300px">
            <template slot-scope="scope">
              <el-radio-group v-model="scope.row.backupType">
                <el-radio :label="0" v-if="scope.row.menuName == null && scope.row.referenceFlag == 0
                  ">普通备份</el-radio>
                <el-radio :label="1" v-if="scope.row.menuName != null || scope.row.referenceFlag != 0
                  ">ID备份</el-radio>
                <el-radio :label="2" v-if="scope.row.menuName != null || scope.row.referenceFlag != 0
                  ">ID转备份</el-radio>
                <el-radio :label="3" v-if="scope.row.menuName != null || scope.row.referenceFlag != 0
                  ">全备份</el-radio>
              </el-radio-group>
            </template></el-table-column></el-table>
        <pagination v-show="formtotalInner > 0" :total="formtotalInner" :page.sync="formInner.pageNum"
                    :limit.sync="formInner.pageSize" @pagination="getBFYList" />
      </el-dialog>
    </el-dialog>
  </div>
</template>

<script>
import apptypeOptions from '../comOption/appTypeOption.js'; //引入公共option
import {
  getByConditionsList,
  batchDelete,
  getBycolumnInfoList,
  getAddByConditions,
  batchInsert,
  getAddByColumnInfo,
  batchInsertColumnInfo,
  batchDeleteColumnInfo,
  updateSelective
} from '@/api/equipDhbfApi/bfmxgl.js';
// import { getToken } from '@/utils/auth';
export default {
  components: {},
  name: 'bfxx1',
  data() {
    return {
      appType1: undefined,
      appType: undefined,
      comOptions: apptypeOptions,
      // 显示搜索条件
      showSearch: true,
      // 遮罩层
      loading: false,
      loadingB: false,
      loadingY: false,
      loadingInner: false,
      // 选中删除的数组
      leftSelection: [],
      rightSelection: [],
      tableBItem: [],
      tableBInner: [],
      tableBFY: [],
      multipleAddB: true,
      multipleInner: true,
      multipleBFY: true,
      // 总条数
      total: 1,
      formtotal: 1,
      formtotal2: 1,
      formtotalInner: 1,
      // 是否显示弹出层
      open: false,
      open2: false,
      innerVisible: false,
      queryParams: {
        pageNum: 1,
        pageSize: 20,
        tableNameChn: undefined,
        tableNameEng: undefined,
        appType: undefined
      },
      // 表单参数
      form: {
        pageNum: 1,
        pageSize: 10,
        tableId: undefined,
        tableNameChn: undefined
      },
      formInner: {
        pageNum: 1,
        pageSize: 10,
        tableId: undefined
      },
      formInline: {
        tableNameEng: undefined,
        tableNameChn: undefined,
        appType: undefined,
        pageNum: 1,
        pageSize: 10
      },
      // 表格
      tableData: [],
      tableDataY: [],
      tableDataB: [],
      tableDataInner: []
    };
  },
  computed: {
    leftTableData() {
      const data = this.tableData;
      const middle = Math.ceil(data.length / 2);
      return data.slice(0, middle);
    },
    rightTableData() {
      const data = this.tableData;
      const middle = Math.ceil(data.length / 2);
      return data.slice(middle);
    },
    selectionSummation(){
      return this.leftSelection.concat(this.rightSelection);
    },
    selection(){
      return this.selectionSummation.map((item) => item);
    },
    single(){// 非单个禁用
      return this.selectionSummation.length != 1;
    },
    multiple(){      // 非多个禁用
      return !this.selection.length;
    }
  },
  watch: {},
  mounted() { },
  beforeDestroy() { },
  created() {
    this.getList();
  },
  methods: {
    handleClose() {
      this.form.pageNum = 1; // 重置页码为初始值
      this.formInner.pageNum = 1;
    },
    // 批量删除备份域
    handleDeleteBFY() {
      batchDeleteColumnInfo(this.tableBFY).then((res) => {
        // this.$message.success('已删除');
        this.getYList();
      });
    },
    // 内嵌域添加
    handleAddBFYInner() {
      batchInsertColumnInfo(this.tableBInner).then((res) => {
        this.innerVisible = false;
        this.getYList();
      });
    },
    // 添加备份域
    handleAddBFY() {
      this.loadingInner = true;
      this.getBFYList();
    },
    // 获取可添加的备份域列表
    getBFYList() {
      getAddByColumnInfo(this.formInner).then((res) => {
        // this.tableDataInner = res.rows;
        let arr = res.rows;
        this.formtotalInner = res.total;
        this.innerVisible = true;
        this.loadingInner = false;
        arr.forEach((item) => {
          if (item.menuName == null && item.referenceFlag == 0) {
            item.backupType = 0;
          } else if (item.menuName != null || item.referenceFlag != 0) {
            item.backupType = 3;
          }
        });
        this.tableDataInner = arr;
      });
    },
    // 添加表
    handleAddB() {
      batchInsert(this.tableBItem).then((res) => {
        this.$message({
          message: '添加表成功',
          type: 'success'
        });
        this.open2 = false;
        this.getList();
      });
    },
    // 应用类型多选转字符串
    changeappType(val) {
      let str = val.toString();
      this.queryParams.appType = str;
      this.formInline.appType = str;
    },
    // 域单选改变
    changeBackupType(row) {
      updateSelective(row).then((res) => {
      });
    },
    // 列表
    getList() {
      this.loading = true;
      getByConditionsList(this.queryParams).then((response) => {
        this.tableData = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.appType = undefined;
      this.resetForm('queryForm');
      this.handleQuery();
    },
    handleQuery2() {
      this.formInline.pageNum = 1;
      this.getBList();
    },
    resetQuery2() {
      this.appType1 = undefined;
      this.resetForm('formInline');
      this.handleQuery2();
    },
    row_click(row, column, event) {
      this.$refs.innerDom.toggleRowSelection(row);
    },
    // 添加域多选数据
    handleSelectionChangeInner(select, row) {
      this.multipleInner = !select.length;
      this.tableBInner = select.map((item) => item);
      // this.$refs.innerDom.toggleRowSelection(select);
    },
    // 查看域列表多选数据
    handleSelectionChangeBFY(sele) {
      this.multipleBFY = !sele.length;
      this.tableBFY = sele.map((item) => item);
    },
    // toRowSelection(row, selected){
    // },
    // 添加表多选框
    handleSelectionChangeB(item) {
      this.multipleAddB = !item.length;
      this.tableBItem = item.map((item) => item);
    },
    // 列表多选框选中数据
    handleSelectionChange(selection, tableType) {
      if(tableType === 'left'){
        this.leftSelection = selection;
      } else if(tableType === 'right'){
        this.rightSelection = selection;
      }
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.getBList();
      this.open2 = true;
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.open = true;
      this.form.tableId = row.tableId;
      this.formInner.tableId = row.tableId;
      this.form.tableNameChn = row.tableNameChn;
      this.getYList();
    },
    // 添加表
    getBList() {
      this.loadingB = true;
      getAddByConditions(this.formInline).then((res) => {
        this.tableDataB = res.rows;
        this.formtotal2 = res.total;
        this.loadingB = false;
      });
    },
    // 域列表
    getYList() {
      this.loadingY = true;
      getBycolumnInfoList(this.form).then((res) => {
        this.tableDataY = res.rows;
        this.formtotal = res.total;
        this.loadingY = false;
      });
    },
    /** 删除按钮操作 */
    handleDelete() {
      const selection = this.selection;
      this.$confirm('是否确认删除选中的数据项?', '警告', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(function () {
          return batchDelete(selection);
        })
        .then(() => {
          this.$message.success('已删除');
          this.getList();
        })
        .catch(function () { });
    }
  }
};
</script>
<style lang="scss" scoped>
@import '@/views/equipDhbf/style/btn.scss';
@import '@/views/equipDhbf/style/index.scss';
@import '@/views/equipDhbf/style/checkbox.scss';

.titlee {
  line-height: 24px;
  font-size: 16px;
  font-weight: 600;
  text-align: center;
  margin-top: -20px;
}
.table-wrapper{
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}
</style>

``
2.恢复时选择行内数据时 可多选 也可单选一条 选中一个时多选框也需是选中状态,总之就是多选框的联动效果
因为此模型恢复是基于同一个表内的多条信息恢复,所以需要把数据格式转成
{backupId: 111, reqContent: {表名: Array(2)}} // 注意Array(2)为提交的两条选中数据

因为表内容和表字段是不固定的 所以要用拆分表头和表内容的方式

<template>
  <div class="container">
    <el-card class="boxCard">
      <div class="cardHeader">
        <div class="headerImg"></div>
        <div class="headerFont">差异模型恢复</div>
      </div>
      <el-divider></el-divider>
      <div class="tabStyle">
        <el-form
          v-show="showSearch"
          :inline="true"
          ref="queryForm"
          :model="queryParams"
          class="demo-form-inline"
          id="demo-form"
          label-width="90px"
        >
          <el-form-item label="表英文名称" prop="tableNameEng">
            <el-input
              v-model="queryParams.tableNameEng"
              placeholder="请输入内容"
            ></el-input>
          </el-form-item>
          <el-form-item label="表中文名称" prop="tableNameChn">
            <el-input
              v-model="queryParams.tableNameChn"
              placeholder="请输入内容"
            ></el-input>
          </el-form-item>
          <el-form-item label="应用类型" prop="appType">
            <el-select v-model="appType" clearable multiple collapse-tags>
              <el-option
                v-for="item in comOptions"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item>
            <el-button
              class="panbtn greenbtn"
              icon="el-icon-search"
              @click="handleQuery"
              >查询</el-button
            >
          </el-form-item>
          <el-form-item>
            <el-button
              class="panbtn bluebtn"
              icon="el-icon-refresh-left"
              @click="resetQuery"
              >重置</el-button
            >
          </el-form-item>
        </el-form>

        <!-- 表格 -->
        <el-table
          @cell-dblclick="handleUpdate"
          :data="tableData"
          style="width: 100%"
          v-loading="loading"
        >
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column
            prop="backupTime"
            label="备份时间"
            align="center"
            show-overflow-tooltip
          >
          </el-table-column>
          <el-table-column
            width="150px"
            prop="tableId"
            label="表ID"
            align="center"
            show-overflow-tooltip
          >
          </el-table-column>
          <el-table-column
            prop="tableNameEng"
            label="表英文名"
            align="center"
            show-overflow-tooltip
          >
          </el-table-column>
          <el-table-column
            prop="tableNameChn"
            label="表中文名"
            align="center"
            show-overflow-tooltip
          >
          </el-table-column>
          <el-table-column
            prop="appTypeName"
            label="应用类型"
            align="center"
            show-overflow-tooltip
          >
          </el-table-column>
          <el-table-column
            label="操作"
            width="150px"
            align="center"
            show-overflow-tooltip
          >
            <template slot-scope="scope">
              <el-button class="tableBtn-green" @click="handleUpdate(scope.row)"
                >差异恢复</el-button
              >
            </template>
          </el-table-column>
        </el-table>
      </div>
    </el-card>
    <!-- 弹框 -->
    <el-dialog title="差异详情" :visible.sync="open" width="99%">
      <el-button
        type="primary"
        size="small"
        style="margin-bottom: 10px"
        @click="onSubmit"
        >提交修改</el-button
      >
      <el-table
        :data="listData"
        style="width: 100%"
        border
        ref="multipleTable"
        v-loading="dialogLoading"
        @select-all="selectAllChange"
        @select="handleSelectionChangeInner"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55" />
        <el-table-column
          v-for="(item, index) in listLabel"
          :key="index"
          :label="item.label"
          :prop="item.prop"
          align="center"
        >
          <template slot-scope="scope">
            <div v-if="scope.row[item.prop]">
              <div v-if="scope.row[item.prop].includes('更新为')">
                <el-checkbox
                  :key="scope.row.check_q3hfqnre30[item.prop]"
                  :checked="scope.row.check_q3hfqnre30[item.prop]"
                  :label="scope.row[item.prop]"
                  :true-label="scope.row[item.prop]"
                  :false-label="0"
                  @change="changeCheckbox(scope.row, item.prop)"
                />
              </div>
              <div v-else>{{ scope.row[item.prop] }}</div>
            </div>
          </template>
        </el-table-column>
      </el-table>
    </el-dialog>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {
      tijiaoData: {},
      selectionInner: [],
      // 表头数据
      listLabel: [
        { label: '车牌号', prop: 'carEntrustId' },
        { label: '名称', prop: 'name' },
        { label: '值', prop: 'carRewardId' },
        { label: '价格', prop: 'carFundProvider' },
        { label: '利润', prop: 'carFrameNo' },
        { label: '大类', prop: 'carNo' },
        { label: '小类', prop: 'acreage' },
        { label: '有价格', prop: 'assetsType' },
        { label: '极好价格', prop: 'incomePrice' },
        { label: '优质价格', prop: 'rewardStatus' },
        { label: '良好价格', prop: 'addTime' },
        { label: '无价格', prop: 'addManagerName' }
      ],
      // 表格数据
      listData: [
        {
          carEntrustId: '1',
          name: '更新为12',
          carRewardId: '34',
          carFundProvider: '34',
          carFrameNo: '354',
          carNo: '更新为15',
          acreage: '93450',
          assetsType: '44344',
          incomePrice: '34',
          rewardStatus: '23',
          addTime: '23',
          addManagerName: '23'
        },
        {
          carEntrustId: '2',
          name: '343',
          carRewardId: '更新为23',
          carFundProvider: '34',
          carFrameNo: '78',
          carNo: '78',
          acreage: '756',
          assetsType: '354',
          incomePrice: '23',
          rewardStatus: '23',
          addTime: '23',
          addManagerName: '23'
        }
      ],
      comOptions: [
        {
          value: '选项1',
          label: '黄金糕'
        },
        {
          value: '选项2',
          label: '双皮奶'
        },
        {
          value: '选项3',
          label: '蚵仔煎'
        },
        {
          value: '选项4',
          label: '龙须面'
        },
        {
          value: '选项5',
          label: '北京烤鸭'
        }
      ],
      appType: undefined,
      // 显示搜索条件
      showSearch: true,
      // 遮罩层
      loading: false,
      dialogLoading: false,
      // 选中删除的数组
      selection: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 总条数
      total: 1,
      totalInner: 1,
      // 是否显示弹出层
      open: false,
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        backupId: undefined,
        tableNameChn: undefined,
        tableNameEng: undefined,
        appType: undefined
      },
      queryParamsInner: {
        pageNum: 1,
        pageSize: 10,
        backupId: undefined,
        tableName: '111'
      },
      // 表格
      tableData: [
        {
          backupTime: '2016-05-02',
          tableNameEng: '王小虎1'
        },
        {
          backupTime: '2016-05-04',
          tableNameEng: '王小虎2'
        },
        {
          backupTime: '2016-05-01',
          tableNameEng: '王小虎3'
        },
        {
          backupTime: '2016-05-03',
          tableNameEng: '王小虎4'
        }
      ]
    };
  },
  watch: {},
  created() {},
  methods: {
    // 提交修改
    onSubmit() {
      // 判断是否为@selection-change多选框选中
      if (this.selectionInner.length != 0) {
        this.tijiao(this.tijiaoData);
      } else {
        //  筛选有选中项的数据
        const arr = this.listData.filter((item) => {
          if (JSON.stringify(item.active) !== '{}') {
            return item;
          }
        });
        //  重组数据结构
        let newArr = [];
        let num = 0;
        arr.forEach((item, index) => {
          newArr.push({});
          for (const key in item) {
            if (typeof item[key] === 'string' && item[key].includes('更新为')) {
              if (
                item.active[key] &&
                JSON.stringify(item.active[key]) !== '{}'
              ) {
                newArr[index][key] = item[key];
                num += 1;
              }
            } else {
              newArr[index][key] = item[key];
            }
          }
        });
        //  判断是否有选中项
        if (num === 0) {
          this.$message({
            showClose: true,
            message: '请选择数据',
            type: 'warning'
          });
          return;
        }
        //  删除无用key
        let result = JSON.parse(JSON.stringify(newArr));
        result.forEach((j) => {
          delete j.active;
        });
        //  组装传递给后台的数据
        const data = {
          backupId: this.$route.query.id * 1,
          reqContent: {
            [this.queryParamsInner.tableName]: result
          }
        };
        this.tijiao(data);
      }
    },
    // 弹框内提交
    tijiao(data) {
      console.log(data, 'dataaaaAA>?????');
    },
    // *******************************************************************
    // 表格内多选框改变
    changeCheckbox(row, type) {
      console.log(row, type, 'row, type');
      if (
        JSON.stringify(row.active) !== '{}' &&
        row.active[type] &&
        JSON.stringify(row.active[type]) !== '{}'
      ) {
        row.active[type] = {};
        this.$set(row.check_q3hfqnre30, type, false);
      } else {
        row.active[type] = {
          name: row[type]
        };
        this.$set(row.check_q3hfqnre30, type, true);
      }
      //  记录是否选中数据
      const arr = [];
      for (const key in row.check_q3hfqnre30) {
        arr.push(row.check_q3hfqnre30[key]);
      }
      const flag = arr.some((item) => item === true);

      row.isSelect_q3hfqnre30 = flag ? '1' : '0';
      //  设置选中行
      this.$refs.multipleTable.toggleRowSelection(row, flag);
    },
    // 全选提交
    selectAllChange(val) {
      console.log(val, '全选');
      //  取消全选时,设置取消选中项
      if (val.length === 0) {
        this.listData?.forEach((item) => {
          item.check_q3hfqnre30 = {};
          item.active = {};
          item.isSelect_q3hfqnre30 = '0';
        });
      } else {
        //  反之设置选中项
        val?.forEach((item) => {
          item.isSelect_q3hfqnre30 = '1';
          for (const key in item) {
            if (
              typeof item[key] === 'string' &&
              item[key]?.includes('更新为')
            ) {
              this.changeCheckbox(item, key);
              item.check_q3hfqnre30[key] = true;
            }
          }
        });
      }
    },
    // 弹框内多选
    handleSelectionChangeInner(selectionInner, row) {
      console.log(selectionInner, 'selectionInner415');
      console.log(row, ' row414');
      row.isSelect_q3hfqnre30 = row.isSelect_q3hfqnre30 === '1' ? '0' : '1';
      this.selectionInner = selectionInner; //判断用
      //  判断是否为第一次选中行,是的话选中当前行所有包含复选框的数据
      if (JSON.stringify(row.check_q3hfqnre30) === '{}') {
        for (const key in row) {
          if (typeof row[key] === 'string' && row[key]?.includes('更新为')) {
            this.$set(row.check_q3hfqnre30, key, true);
            this.changeCheckbox(row, key);
          }
        }
      } else {
        for (const key in row) {
          if (typeof row[key] === 'string' && row[key]?.includes('更新为')) {
            if (row.check_q3hfqnre30[key]) {
              this.$set(row.check_q3hfqnre30, key, false);
            } else {
              this.$set(row.check_q3hfqnre30, key, true);
            }
            this.changeCheckbox(row, key);
          }
        }
      }
      //  当没有选中行时取消所有选中项
      if (selectionInner.length === 0) {
        this.listData?.forEach((item) => {
          item.isSelect_q3hfqnre30 = false;
          for (const key in item.check_q3hfqnre30) {
            this.$set(row.check_q3hfqnre30, key, false);
          }
        });
      }
    },
    // **************************************************************************
    handleSelectionChange(val) {
      console.log(val, '选中行');
    },
    /** 差异恢复 */
    handleUpdate(row) {
      this.queryParamsInner.tableName = row.tableNameEng;
      this.getInnerData();
      this.open = true;
    },
    //获取差异详情
    getInnerData() {
      // getCurdbCompareContentRecovery(this.queryParamsInner).then((res) => {
      //   console.log(res, '差异恢复');
      //   this.listLabel = res.listLabel;
      //   res.rows.forEach((item) => (item['active'] = {}));
      //   this.listData = res.rows;
      //   this.open = true;
      // });
      // 测试使用的date数据  实际按接口获取整理*********
      this.listLabel = this.listLabel;
      let listDataN = this.listData;
      listDataN?.forEach((item) => {
        item['active'] = {}; //   默认选中行参数
        item['check_q3hfqnre30'] = {}; //  默认选中行标识
      });
      this.listData = listDataN;
    },
    /** 搜索按钮操作 */
    handleQuery() {},
    /** 重置按钮操作 */
    resetQuery() {}
  }
};
</script>
<style lang="less" scoped>
</style>
posted @ 2025-02-25 16:18  刘酸酸sour  阅读(5)  评论(0)    收藏  举报