ludc
2025-01-16 986aa62ed00bee39363bab41b4eeb8259d446efd
Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/businessType/index.vue
@@ -1,46 +1,17 @@
<template>
  <el-container>
  <el-container v-loading="createViewLoading">
    <el-aside>
      <basic-container>
        <div ref="TreeBox" style="height: calc(100vh - 144px);!important;">
          <div class="headerCon">
            <el-button icon="el-icon-plus" plain size="small" type="primary" @click="addClickHandler">创建
            </el-button>
            <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editClickHandler">修改
            </el-button>
            <el-button icon="el-icon-delete" plain size="small" type="danger" @click="deleteClickHandler">删除
            </el-button>
            <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">导出
            </el-button>
            <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="upLoadClickHandler">导入
            </el-button>
            <el-button class="miniBtn" icon="el-icon-circle-plus-outline" plain size="small"
                       type="primary" @click="createViewClickHandler">创建视图
            </el-button>
            <el-button class="miniBtn" icon="el-icon-circle-plus-outline" plain size="small"
                       type="primary" @click="checkClickHandler">创建索引
            </el-button>
            <el-button icon="el-icon-menu" plain size="small" style="width: 82px;text-align: center;padding-left: 1px"
                       type="primary" @click="checkClickHandler">一致性检查
            </el-button>
            <el-button class="miniBtn" icon="el-icon-delete" plain size="small"
                       type="danger" @click="checkClickHandler">删除数据
            </el-button>
            <el-button class="smallBtn" plain size="small"
                       type="danger" @click="checkClickHandler">删除全部类型
            </el-button>
            <el-button class="smallBtn" plain size="small" type="primary">查看使用范围
            </el-button>
          </div>
        <div ref="TreeBox" style="height: calc(100vh - 154px);!important;">
          <!-- 左侧树 -->
          <div style="height:  calc(100vh - 330px);">
            <avue-tree :data="treeData" :option="treeOption" @node-click="nodeClick">
          <span slot-scope="{ node, data }" class="el-tree-node__label">
           <span style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
                {{ (node || {}).label }}
            </span>
          </span>
          <div style="height:  calc(100vh - 190px);">
            <avue-tree ref="tree" v-loading="treeLoading" :data="treeData" :option="treeOption" @node-click="nodeClick">
              <span slot-scope="{ node, data }" class="el-tree-node__label">
               <span>
                  <icon-show :name="data.icon"></icon-show>
                    {{ (node || {}).label }}
                </span>
              </span>
            </avue-tree>
          </div>
        </div>
@@ -48,11 +19,69 @@
    </el-aside>
    <el-main>
      <basic-container>
        <div style="display: flex;justify-content: center; height: 230px">
          <div class="descBox" style="max-height: 100px">
            <el-descriptions :column="1" border class="margin-top" size="medium" title="属性信息">
        <div>
          <el-button v-if="permissionList.addBtn" class="button-custom-icon" plain size="small" type="primary"
                     @click="addClickHandler">
            <icon-show :name="permissionList.addBtn.source"></icon-show>
            创建
          </el-button>
          <el-button v-if="permissionList.editBtn" class="button-custom-icon" plain size="small" type="primary"
                     @click="editClickHandler">
            <icon-show :name="permissionList.editBtn.source"></icon-show>
            修改
          </el-button>
          <el-button v-if="permissionList.delBtn" class="button-custom-icon" plain size="small" type="danger"
                     @click="deleteClickHandler">
            <icon-show :name="permissionList.delBtn.source"></icon-show>
            删除
          </el-button>
          <el-button v-if="permissionList.importBtn" class="button-custom-icon" plain size="small" type="primary"
                     @click="upLoadClickHandler">
            <icon-show :name="permissionList.importBtn.source"></icon-show>
            导入
          </el-button>
          <el-button v-if="permissionList.exportBtn" class="button-custom-icon" plain size="small" type="primary"
                     @click="exportClickHandler">
            <icon-show :name="permissionList.exportBtn.source"></icon-show>
            导出
          </el-button>
          <el-button v-if="permissionList.createViewBtn" class="button-custom-icon" plain size="small"
                     type="primary" @click="createViewClickHandler">
            <icon-show :name="permissionList.createViewBtn.source"></icon-show>
            创建视图
          </el-button>
          <el-button v-if="permissionList.createIndexBtn" class="button-custom-icon" plain size="small"
                     type="primary" @click="indexClickHandler">
            <icon-show :name="permissionList.createIndexBtn.source"></icon-show>
            创建索引
          </el-button>
          <el-button v-if="permissionList.consistencyCheckBtn" class="button-custom-icon" plain size="small" type="primary"
                     @click="checkClickHandler">
            <icon-show :name="permissionList.consistencyCheckBtn.source"></icon-show>
            一致性检查
          </el-button>
          <el-button v-if="permissionList.deleteDataBtn" class="button-custom-icon" plain size="small" type="danger"
                     @click="checkClickHandler">
            <icon-show :name="permissionList.deleteDataBtn.source"></icon-show>
            删除数据
          </el-button>
          <el-button v-if="permissionList.deleteEveryTypeBtn" class="button-custom-icon" plain size="small" type="danger"
                     @click="checkClickHandler">
            <icon-show :name="permissionList.deleteEveryTypeBtn.source"></icon-show>
            删除全部类型
          </el-button>
          <el-button v-if="permissionList.viewTheScopeBtn" class="button-custom-icon" plain size="small" type="primary"
                     @click="checkViewClickHandler">
            <icon-show :name="permissionList.viewTheScopeBtn.source"></icon-show>
            查看使用范围
          </el-button>
        </div>
        <div style="display: flex;justify-content:left;margin-top: 15px;">
          <div class="descBox" style="width: 40%">
            <el-descriptions :column="2" border class="margin-top" size="medium" title="属性信息">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                                    :labelStyle="descriptionOption.labelStyle"
                                    :span="12">
                <template slot="label">
                  名称
                </template>
@@ -65,19 +94,29 @@
                </template>
                <el-tag v-if="nodeRow.name">{{ nodeRow.name }}</el-tag>
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle+';min-width: 100px;'"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  图标
                </template>
                <span class="avue-icon">
                  <icon-show :name="nodeRow.imageName"></icon-show>
                </span>
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle"
                                    :span="12">
                <template slot="label">
                  实现类
                </template>
                <el-tooltip v-if="nodeRow.implClass" :content="nodeRow.implClass" class="item" effect="dark"
                            placement="top-start">
                  <el-tag style="max-width: 250px;overflow: hidden">{{ nodeRow.implClass }}
                  </el-tag>
                  <el-tag style="max-width: 100%;overflow: hidden;display: block">{{ nodeRow.implClass }}</el-tag>
                </el-tooltip>
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                                    :labelStyle="descriptionOption.labelStyle"
                                    :span="12">
                <template slot="label">
                  描述
                </template>
@@ -85,7 +124,7 @@
              </el-descriptions-item>
            </el-descriptions>
          </div>
          <div class="descBox">
          <div class="descBox" style="width: 24%;">
            <el-descriptions :column="1" border class="margin-top" size="medium" title="版本规则">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
@@ -137,7 +176,7 @@
            </el-descriptions>
          </div>
          <div class="descBox">
          <div class="descBox" style="width: calc(36% - 40px);margin-right: 0">
            <el-descriptions :column="1" border class="margin-top" size="medium" title="生命周期">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
@@ -146,11 +185,21 @@
                </template>
                <el-tag v-if="nodeRow.lifeCycleId">{{ nodeRow.lifeCycleId }}</el-tag>
              </el-descriptions-item>
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
                <template slot="label">
                  备选生命周期
                </template>
                <div v-if="nodeRow.lifeCycleIds">
                  <el-tag v-for="item in nodeRow.lifeCycleIds.split(',')" style="margin-right: 5px;">{{ item }}</el-tag>
                </div>
              </el-descriptions-item>
            </el-descriptions>
          </div>
        </div>
        <div style="margin-top: 30px">
          <h3>属性列表</h3>
        <div style="margin-top: 25px;position: relative">
          <h3 style="margin: 0;position: absolute;top:0;z-index: 1000;">属性列表</h3>
          <avue-crud
            :data="attrData"
            :option="attrOption">
@@ -168,121 +217,110 @@
      class="avue-dialog"
      width="75%"
      @close="addDialogClose">
      <el-form ref="form" :model="form" :rules="rules" label-width="95px">
      <el-form ref="form" :model="form" :rules="rules" label-width="95px" size="small">
        <div class="dialogForm">
          <div class="leftForm">
          <div class="leftForm" style="width: 40%">
            <el-form-item label="类型名称:" prop="id">
              <el-input v-model="form.id" :readOnly="title === 'edit'"></el-input>
            </el-form-item>
            <el-form-item label="标签:">
              <el-input v-model="form.name"></el-input>
            <el-row :span="24">
              <el-col :span="12">
                <el-form-item label="标签:" prop="name">
                  <el-input v-model="form.name"></el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="图标:" prop="imageName">
                  <input-icon v-model="form.imageName" placeholder="请选择图标"></input-icon>
                </el-form-item>
              </el-col>
            </el-row>
            <el-form-item label="继承自:" prop="fName">
              <avue-input-tree v-model="form.fName"
                               :dic="inheritTreeData"
                               :disabled="title === 'add'"
                               :props="{label: 'id', value: 'id',children: 'children'}"
                               placeholder="请选择业务类型"></avue-input-tree>
            </el-form-item>
            <el-form-item label="继承自:">
              <el-input v-model="form.fName" :readOnly="title === 'edit'"></el-input>
            </el-form-item>
            <el-form-item label="实现类:">
            <el-form-item label="实现类:" prop="implClass">
              <el-input v-model="form.implClass"></el-input>
            </el-form-item>
            <el-form-item label="描述">
            <el-form-item label="描述" prop="description">
              <el-input v-model="form.description" :rows="2" type="textarea"></el-input>
            </el-form-item>
          </div>
          <div class="centerForm">
            <el-form-item label="版本规则:" label-width="110px" prop="revLevel">
              <el-select v-model="form.revLevel">
                <el-option label="不可修订" value="0"></el-option>
                <el-option label="采用一级版本管理" value="1"></el-option>
                <el-option label="采用二级版本管理" value="2"></el-option>
              </el-select>
          <div class="centerForm" style="width: 26%">
            <el-form-item label="版本规则:" label-width="100px" prop="revLevel" style="margin-bottom: 10px;">
              <el-radio v-model="form.revLevel" label="0" @input="revLevelChange">不可修订</el-radio>
              <br>
              <el-radio v-model="form.revLevel" label="1" @input="revLevelChange">采用一级版本管理</el-radio>
              <br>
              <el-radio v-model="form.revLevel" label="2" @input="revLevelChange">采用二级版本管理</el-radio>
            </el-form-item>
            <el-form-item v-if="form.revLevel !== '0'" label="版本号规则:" label-width="110px" prop="revisionRuleName">
              <div style="display: flex;gap: 5px;align-items: center">
                <el-input v-model="form.revisionRuleId" :readOnly="true"></el-input>
                <el-button plain size="small" style="margin-left: 5px;height: 30px" type="success"
                           @click="versionAddHandler">添加
                </el-button>
                <el-switch
                  v-model="form.inputRevisionFlag"
                  active-text="手工输入"
                  style="width: 300px">
                </el-switch>
              </div>
            <el-form-item v-if="form.revLevel !== '0'" label="版本号规则:" label-width="100px" prop="revisionRuleId"
                          style="margin-bottom: 5px;">
              <avue-select v-model="form.revisionRuleId"
                           :dic="versionData"
                           :disabled="form.inputRevisionFlag"
                           :filterable="true"
                           :props="{label: 'id', value: 'id'}"
                           placeholder="请选择版本号规则"></avue-select>
              <el-switch
                v-model="form.inputRevisionFlag"
                active-text="手工输入"
                style="width: 300px"
                @change="form.revisionRuleId = ''">
              </el-switch>
            </el-form-item>
            <el-form-item v-if="form.revLevel !== '0'" label="分隔符:" label-width="110px" prop="delimiter">
              <el-select v-model="form.delimiter" clearable>
                <el-option label="." value="."></el-option>
                <el-option label="-" value="-"></el-option>
              </el-select>
            <el-form-item v-if="form.revLevel !== '0'" label="分隔符:" label-width="100px" prop="delimiter"
                          style="margin-bottom: 5px;">
              <el-radio v-model="form.delimiter" label="">&nbsp;&nbsp;</el-radio>
              <el-radio v-model="form.delimiter" label=".">.</el-radio>
              <el-radio v-model="form.delimiter" label="-">-</el-radio>
            </el-form-item>
            <el-form-item v-if="form.revLevel !== '0' && form.revLevel !== '1'" label="版次号规则:" label-width="110px"
                          prop="revLevel">
              <el-select v-model="form.versionRule" clearable>
                <el-option label="1.2.3..." value="0"></el-option>
                <el-option label="a.b.c..." value="1"></el-option>
                <el-option label="0.1.2..." value="2"></el-option>
              </el-select>
            <el-form-item v-if="form.revLevel !== '0' && form.revLevel !== '1'" label="版次号规则:" label-width="100px"
                          prop="versionRule">
              <el-radio v-model="form.versionRule" label="0">1.2.3...</el-radio>
              <el-radio v-model="form.versionRule" label="1">a.b.c...</el-radio>
              <el-radio v-model="form.versionRule" label="2">0.1.2...</el-radio>
            </el-form-item>
          </div>
          <div class="rightForm">
          <div class="rightForm" style="width: 25%">
            <el-form-item label="生命周期:" label-width="138px" prop="lifeCycleId">
              <div style="display: flex;gap: 5px;align-items: center">
                <el-input v-model="form.lifeCycleId" :readOnly="true"></el-input>
                <el-button plain size="small" style="margin-left: 5px;height: 30px" type="success"
                           @click="lifeAddHandler('input')">添加
                </el-button>
              </div>
              <avue-select v-model="form.lifeCycleId"
                           :dic="lifeData"
                           :filterable="true"
                           :props="{label: 'id', value: 'id'}"
                           placeholder="请选择生命周期"></avue-select>
            </el-form-item>
            <el-form-item label="备选生命周期列表:" label-width="138px">
              <div style="display: flex; align-items: center">
                <div style="height: 200px; width: 280px; border: 1px solid #bdbbbb;overflow-y: auto">
                  <!-- 内容 -->
                  <el-table
                    :data="dialogLifeTable"
                    :show-header="false"
                    style="width: 100%">
                    <el-table-column
                      align="center"
                      prop="id">
                    </el-table-column>
                    <el-table-column
                      fixed="right"
                      label="操作"
                      width="60">
                      <template slot-scope="scope">
                        <el-button
                          size="small"
                          style="color:#F56C6C;"
                          type="text"
                          @click.native.prevent="dialogDeleteLifeTable(scope.$index)">
                          移除
                        </el-button>
                      </template>
                    </el-table-column>
                  </el-table>
                </div>
                <el-button plain size="mini" style="margin-left: 5px" type="success"
                           @click="lifeAddHandler('table')">添加
                </el-button>
              </div>
            <el-form-item label="备选生命周期列表:" label-width="138px" prop="subLifeCycleIdList">
              <avue-select v-model="form.subLifeCycleIdList"
                           :dic="subLifeData"
                           :filterable="true"
                           :props="{label: 'id', value: 'id'}"
                           multiple
                           placeholder="请选择生命周期"
                           type="tree"
                           @change="subLifeChange"></avue-select>
            </el-form-item>
          </div>
        </div>
      </el-form>
      <div class="bottomForm">
        <h3>属性池列表</h3>
        <avue-crud
          :data="dialogAttrData"
          :option="dialogAttrOption">
          :option="dialogAttrOption"
          size="mini"
          @row-del="dialogBottomAttrDel">
          <template slot="menuLeft">
            <el-button icon="el-icon-plus" size="small" type="primary" @click="addDialogClickHandler">创建</el-button>
            <h3 style="display: inline-block;margin-right: 20px;margin-bottom: 10px;">属性池列表</h3>
            <el-button icon="el-icon-plus" size="mini" type="primary" @click="addDialogClickHandler">创建</el-button>
          </template>
        </avue-crud>
      </div>
      <span slot="footer" class="dialog-footer">
         <el-button @click="addDialogClose">取 消</el-button>
         <el-button type="primary" @click="addDialogSavaHandler">确 定</el-button>
         <el-button size="small" type="primary" @click="addDialogSavaHandler">确 定</el-button>
         <el-button size="small" @click="addDialogClose">取 消</el-button>
        </span>
    </el-dialog>
@@ -312,64 +350,118 @@
      >
      </avue-crud>
      <span slot="footer" class="dialog-footer">
         <el-button @click="dialogAttrClose">取 消</el-button>
         <el-button type="primary" @click="dialogAttrAddClickHandler">确 定</el-button>
         <el-button size="small" type="primary" @click="dialogAttrAddClickHandler">确 定</el-button>
         <el-button size="small" @click="dialogAttrClose">取 消</el-button>
        </span>
    </el-dialog>
    <!-- 导入 -->
    <upload-file ref="upload" :fileType="upFileType" :fileUrl="fileUrl" :tipList="tipList" title="导入"
                 @updata="getTreeList"></upload-file>
    <!-- 查看使用范围    -->
    <el-dialog
      v-dialogDrag
      :visible.sync="dialogVersionVisible"
      :visible.sync="checkViewVisible"
      append-to-body="true"
      class="avue-dialog"
      title="版本号规则"
      title="查看使用范围"
      width="60%"
    >
      <avue-crud
        :key="dialogVersionKey"
        ref="dialogAttrCrud"
        :data="dialogVersionData"
        :option="dialogVersionOption"
        :table-loading="dialogVersionLoading"
        @row-click="dialogVersionRowClick"
        @search-change="versionHandleSearch"
        @search-reset="versionHandleReset"
        ref="checkViewCrud"
        :data="checkViewData"
        :option="checkViewOption"
        :table-loading="checkViewLoading"
        @search-change="checkHandleSearch"
        @search-reset="checkHandleReset"
      >
      </avue-crud>
      <span slot="footer" class="dialog-footer">
         <el-button @click="dialogVersionVisible = false">取 消</el-button>
         <el-button type="primary" @click="dialogVersionAddClickHandler">确 定</el-button>
        </span>
    </el-dialog>
    <!-- 生命周期 -->
    <!-- 一致性检查 -->
    <el-dialog
      v-dialogDrag
      :visible.sync="dialogLfeVisible"
      :visible.sync="conCheckVisible"
      append-to-body="true"
      class="avue-dialog"
      title="生命周期模板"
      title="一致性检查"
      width="60%"
    >
      <avue-crud
        :key="dialogLifeKey"
        ref="dialogAttrCrud"
        :data="dialogLifeData"
        :option="dialogLifeOption"
        :table-loading="dialogLifeLoading"
        @row-click="dialogLifeRowClick"
        @search-change="lifeHandleSearch"
        @search-reset="lifeHandleReset"
      >
        :data="conCheckData"
        :option="conCheckOption"
        :table-loading="conCheckLoading">
      </avue-crud>
      <span slot="footer" class="dialog-footer">
         <el-button @click="dialogLfeVisible = false">取 消</el-button>
         <el-button type="primary" @click="dialogLifeAddClickHandler">确 定</el-button>
         <el-button size="small" type="primary" @click="repairClickHandler">修 复</el-button>
         <el-button size="small" @click="conCheckVisible = false">取 消</el-button>
        </span>
    </el-dialog>
    <!-- 查看索引 -->
    <el-dialog
      v-dialogDrag
      :visible.sync="indexVisible"
      append-to-body="true"
      class="avue-dialog"
      title="索引信息"
      width="60%"
      @close="indexDialogClose"
    >
      <div v-loading="indexLoading" style="display: flex;height: 500px;width: 100%">
        <basic-container>
          <div style="height: 390px">
            <el-button plain size="mini" style="margin-bottom: 5px" type="danger"
                       @click="deleteIndexLeftTreeClickHandler">删除索引
            </el-button>
            <avue-tree
              :data="indexLeftData"
              :option="indexLeftOption"
              @node-click="indexLeftNodeClick"></avue-tree>
          </div>
        </basic-container>
        <div style="padding: 20px;width: 75%">
          <div>
            <el-form ref="form" :model="indexForm" label-width="90px" size="mini">
              <el-form-item label="索引名称:">
                <el-input v-model="indexForm.name" :readOnly="indexFormRead"></el-input>
              </el-form-item>
              <el-form-item label="描述:">
                <el-input v-model="indexForm.desc"></el-input>
              </el-form-item>
            </el-form>
            <div style="display: flex;justify-content: center">
              <el-button plain size="mini" type="success" @click="rightIndexAddClick">增加</el-button>
              <el-button plain size="mini" type="danger">删除</el-button>
            </div>
          </div>
          <avue-crud
            :data="indexData"
            :option="indexOption"></avue-crud>
        </div>
      </div>
      <el-dialog
        v-dialogDrag
        :visible.sync="indexAttrVisible"
        append-to-body="true"
        class="avue-dialog"
        title="属性信息"
        width="60%"
      >
        <avue-crud
          :data="indexAttrData"
          :option="indexAttrOption"
          @row-click="indexAttrRowClick"></avue-crud>
        <span slot="footer" class="dialog-footer">
         <el-button type="primary" @click="indexAttrClickAddHandler">确 定</el-button>
         <el-button @click="indexAttrVisible = false">取 消</el-button>
        </span>
      </el-dialog>
      <span slot="footer" class="dialog-footer">
         <el-button size="small" type="primary" @click="indexClickAddHandler">保 存</el-button>
         <el-button size="small" @click="indexDialogClose">取 消</el-button>
        </span>
    </el-dialog>
  </el-container>
@@ -377,68 +469,177 @@
<script>
import basicOption from '@/util/basic-option'
import {getBizTypes, addLifeCycle} from "@/api/modeling/businessType/api"
import {
  getBizTypes,
  addLifeCycle,
  updateLifeCycle,
  deleteBtmType,
  createView,
  expData,
  getUsedBtmLinkList,
  checkBtmConsistency,
  executeRepair,
  getIndexByCondition,
  delIndex,
  getAllAttributesByBtmId,
  addIndex
} from "@/api/modeling/businessType/api"
import {gridAttribute} from "@/api/modeling/attributePool/api";
import func from "@/util/func";
import {getVersionRuleAllList} from "@/api/modeling/version/api";
import {getUsedVersionRuleList, getVersionRuleAllList} from "@/api/modeling/version/api";
import {gridLifeCycle} from "@/api/modeling/lifeCycle/api";
import {mapGetters} from "vuex";
export default {
  name: "index",
  data() {
    return {
      dialogLifeDefalutData: [], // 查询重置默认数据
      lifeType: '',
      dialogLifeTable: [],
      dialogLifeSaveRow: {},
      dialogLifeKey: Math.random(),
      dialogLifeData: [],
      dialogLifeOption: {
      indexLoading: false,
      indexFormRead: false,
      indexAttrRow: {},
      indexAttrOption: {
        ...basicOption,
        addBtn: false,
        selection: false,
        refreshBtn: false,
        menu: false,
        height: 450,
        searchMenuSpan: 8,
        height: 380,
        highlightCurrentRow: true,
        addBtn: false,
        refreshBtn: false,
        editBtn: false,
        delBtn: false,
        selection: false,
        menu: false,
        column: [
          {
            label: '生命周期模板名',
            label: '属性信息',
            prop: 'id',
            searchLabelWidth: 120,
            search: true
            sortable: true,
          },
        ]
      },
      indexAttrData: [],
      indexData: [],
      indexAttrVisible: false,
      indexLeftNodeRow: {},
      indexForm: {
        name: '',
        desc: ''
      },
      indexLeftData: [],
      indexLeftOption: {
        height: 'auto',
        menu: false,
        addBtn: false,
        props: {
          label: 'name',
          value: 'id',
          children: 'children',
        },
      },
      indexOption: {
        ...basicOption,
        height: 280,
        addBtn: false,
        refreshBtn: false,
        editBtn: false,
        delBtn: false,
        selection: false,
        menu: false,
        column: [
          {
            label: '业务类型名称',
            prop: 'typeName',
            sortable: true,
          },
          {
            label: '索引名称',
            prop: 'indexName',
            sortable: true,
          },
          {
            label: '属性名称',
            prop: 'attrNames',
            sortable: true,
          },
          {
            label: '描述',
            prop: 'desc',
            sortable: true,
          },
        ]
      },
      indexVisible: false,
      conDefaultCheckData: [], // 保留上个接口返回的数据
      conCheckLoading: false,
      conCheckOption: {
        ...basicOption,
        menu: false,
        addBtn: false,
        index: false,
        selection: false,
        refreshBtn: false,
        header: false,
        column: [
          {
            label: '类型名',
            prop: 'id',
            width: 250,
          },
          {
            label: '操作',
            prop: 'methods',
          },
          {
            label: '状态',
            prop: 'status',
            width: 250,
          }
        ]
      },
      dialogLifeLoading: false,
      dialogLfeVisible: false,
      dialogVersionDefalutData: [], // 查询重置默认数据
      dialogSwitchValue: false,
      dialogVersionSaveRow: {},
      dialogVersionVisible: false,
      dialogVersionKey: Math.random(),
      dialogVersionData: [],
      dialogVersionOption: {
      conCheckData: [],
      conCheckVisible: false,
      checkViewVisible: false,
      checkViewData: [],
      checkViewDataSearch: [],
      checkViewLoading: false,
      checkViewOption: {
        ...basicOption,
        addBtn: false,
        selection: false,
        refreshBtn: false,
        menu: false,
        height: 450,
        searchMenuSpan: 8,
        highlightCurrentRow: true,
        // calcHeight: 100,
        refreshBtn: false,
        selection: false,
        header: false,
        column: [
          {
            label: '版本号规则',
            prop: 'id',
            searchLabelWidth: 110,
            label: '名称',
            prop: 'name',
            sortable: true,
          },
          {
            label: '来源',
            prop: 'source',
            sortable: true,
            search: true
          },
          {
            label: '说明',
            prop: 'description',
          }
        ]
      },
      dialogVersionLoading: false,
      tipList: [
        "导入业务名称不可为空且链接类型名称只能为英文字母",
        "导入的文件包括属性、业务类型、生命周期等文件",
        "上传的文件为压缩文件,且压缩格式仅能为zip格式"
      ],
      upFileType: ['zip'],
      fileUrl: 'api/linkTypeController/impData',
      createViewLoading: false, // 创建视图
      versionAddFlag: false,
      inheritTreeData: [],
      lifeData: [],//生命周期下拉数据
      subLifeData: [],//备选生命周期下拉数据
      allLifeData: [],
      versionData: [],//版本规则数据
      dialogAttrSelectList: [],
      searchAttrParams: {},
      dialogAttrLoading: false,
@@ -458,22 +659,29 @@
        highlightCurrentRow: true,
        height: 450,
        searchMenuSpan: 8,
        header: false,
        selectable: function (row) {
          return row.selectable;
        },
        column: [
          {
            label: '属性名',
            prop: 'id',
            sortable: true,
            search: true,
            width: 260
          },
          {
            label: '属性类型',
            prop: 'attributeDataType',
            sortable: true,
            width: 150,
          },
          {
            label: '初始值',
            prop: 'defaultValue',
            sortable: true,
            width: 200
          },
          {
            label: '说明',
@@ -490,6 +698,9 @@
          {required: true, message: '请输类型名称', trigger: 'blur'},
          {validator: this.validateEnglishOnly, trigger: 'blur'}
        ],
        imageName: [
          {required: true, message: '请选择图标', trigger: 'submit'},
        ],
        revLevel: [
          {required: true, message: '请选择版本规则', trigger: 'blur'},
        ],
@@ -503,24 +714,37 @@
        editBtn: false,
        refreshBtn: false,
        selection: false,
        height: 210,
        height: 220,
        addBtn: false,
        gridBtn: false,
        columnBtn: false,
        menuWidth: 100,
        // index:false,
        column: [
          {
            label: '属性名',
            prop: 'id',
            sortable: true,
            width: 260,
          },
          {
            prop: 'btmTypeId',
            label: '业务类型',
            sortable: true,
            width: 200
          },
          {
            label: '属性类型',
            prop: 'attributeDataType',
            sortable: true,
            width: 150,
          },
          {
            label: '初始值',
            prop: 'defaultValue',
            sortable: true,
            width: 200,
          },
          {
            label: '说明',
@@ -544,22 +768,26 @@
          {
            prop: 'id',
            label: '属性名',
            sortable: true
            sortable: true,
            width: 260
          },
          {
            prop: 'btmTypeId',
            label: '业务类型',
            sortable: true
            sortable: true,
            width: 200
          },
          {
            prop: 'attrDataType',
            prop: 'attributeDataType',
            label: '属性类型',
            sortable: true
            sortable: true,
            width: 150
          },
          {
            prop: 'defaultValue',
            label: '默认值',
            sortable: true
            sortable: true,
            width: 200
          },
          {
            prop: 'description',
@@ -574,64 +802,240 @@
        fName: '', // 继承自
        implClass: '', // 实现类
        description: '', // 描述
        revLevel: '', // 版本规则
        revLevel: '2', // 版本规则
        revisionRuleId: '',// 版本号规则
        inputRevisionFlag: false, // 手工输入
        versionRule: '', // 版次号规则
        inputRevisionFlag: false, // 手工输入,
        delimiter: '', // 分隔符
        versionRule: '0', // 版次号规则
        lifeCycleId: '', // 生命周期
        subLifeCycleId: '', // 生命周期备选列表,
        subLifeCycleIdList: [],
        apNameArray: "", // 属性池列表’,‘分隔
      },
      nodeRow: {},
      treeOption: {
        height: 'auto',
        defaultExpandAll: false,
        defaultExpandedKeys: ['topNode'],
        menu: false,
        addBtn: false,
        props: {
          label: 'id',
          label: 'TreeName',
          value: 'id',
          children: 'children'
          children: 'children',
          name: 'name'
        }
      },
      treeData: [],
      treeData: [
        {
          TreeName: '业务类型树',
          id: 'topNode',
          children: []
        }
      ],
      descriptionOption: {
        labelStyle: 'text-align:center;width:100px;',
        contentStyle: 'max-width:200px;text-align:center;word-break;break-all;'
        labelStyle: 'text-align:center;width:110px;',
        contentStyle: 'min-width:200px;text-align:center;word-break:break-all;'
      },
      icons: {
        id: 'el-icon-finished',
        name: 'el-icon-tickets',
        desc: 'el-icon-chat-line-square'
      },
      treeLoading: false
    }
  },
  created() {
    this.getTreeList();
    this.getVersionList();
    this.getLifeCycle();
  },
  computed: {
    ...mapGetters(["permission"]),
    permissionList() {
      return {
        addBtn: this.vaildData(this.permission[this.$route.query.id].ADD, false),
        delBtn: this.vaildData(this.permission[this.$route.query.id].DELETE, false),
        editBtn: this.vaildData(this.permission[this.$route.query.id].EDIT, false),
        exportBtn: this.vaildData(this.permission[this.$route.query.id].EXPORT, false),
        importBtn: this.vaildData(this.permission[this.$route.query.id].IMPORT, false),
        consistencyCheckBtn: this.vaildData(this.permission[this.$route.query.id].USE, false),
        createViewBtn: this.vaildData(this.permission[this.$route.query.id].ADD2, false),
        createIndexBtn: this.vaildData(this.permission[this.$route.query.id].ADD3, false),
        deleteDataBtn: this.vaildData(this.permission[this.$route.query.id].DELETE2, false),
        deleteEveryTypeBtn: this.vaildData(this.permission[this.$route.query.id].DELETE3, false),
        viewTheScopeBtn: this.vaildData(this.permission[this.$route.query.id].SEARCH, false),
      };
    },
  },
  watch: {
    'form.lifeCycleId': {
      handler(newval) {
        if (this.form.lifeCycleId) {
          this.subLifeData = this.allLifeData.filter(item => {
            return item.id != this.form.lifeCycleId
          });
        } else {
          this.subLifeData = this.allLifeData
        }
      },
    }
  },
  methods: {
    //树表查询
    getTreeList() {
      this.treeLoading = true;
      getBizTypes().then(res => {
        const data = res.data.data.map(item => {
          return item.attributes;
          this.processChildren(item); // 处理每个节点
          item.attributes.TreeName = item.attributes.id;
          item.attributes.icon = item.attributes.imageName;
          return item.attributes; // 返回处理后的 attributes
        });
        this.treeData = data;
      })
        this.treeData[0].children = data;
        this.inheritTreeData = data;
        this.treeLoading = false;
      });
    },
    // 处理树形结构
    processChildren(item) {
      if (item.children && item.children.length > 0) {
        item.attributes.children = item.children.map(child => {
          child.attributes.TreeName = child.attributes.id;
          child.attributes.icon = child.attributes.imageName;
          this.processChildren(child); // 递归处理每个子节点
          return child.attributes; // 只返回子节点的 attributes
        });
      }
    },
    // 树点击
    nodeClick(row) {
      this.attrData = JSON.parse(row.attributes);
      this.attrData = row.attributes ? JSON.parse(row.attributes) : [];
      this.nodeRow = row;
    },
    //获取版本规则数据
    getVersionList() {
      getVersionRuleAllList().then(res => {
        this.versionData = res.data.data;
      });
    },
    //获取生命周期数据
    getLifeCycle() {
      gridLifeCycle().then(res => {
        this.allLifeData = res.data.data;
      });
    },
    // 创建按钮
    addClickHandler() {
      if (func.isEmptyObject(this.nodeRow)) {
        this.$message.error('请选择要添加的节点');
        return;
      }
      this.title = 'add';
      this.form.fName = this.nodeRow.id === 'topNode' ? "" : this.nodeRow.id;
      this.lifeData = this.allLifeData;
      this.subLifeData = this.allLifeData;
      this.form.inputRevisionFlag = JSON.parse(this.form.inputRevisionFlag); // 字符串false转换为布尔值
      this.visible = true;
    },
    // 新增编辑保存
    addDialogSavaHandler() {
      if (this.form.revLevel !== '0' && !this.form.inputRevisionFlag && (!this.form.revisionRuleId || this.form.revisionRuleId === "")) {
        this.$message.error('请检查版本号规则不能为空');
        return;
      }
      this.form.lifeCycleIds = this.form.subLifeCycleIdList.join(',');
      this.form.subLifeCycleId = this.form.subLifeCycleIdList.join(',');
      this.form.apNameArray = this.dialogAttrData ? this.dialogAttrData.map(item => item.id).join(',') : "";
      this.$refs.form.validate((valid) => {
        const saveFunction = this.title === 'add' ? addLifeCycle : updateLifeCycle;
        if (valid) {
          if (this.form.revLevel === 0) {
            this.form.versionRule = "";
          }
          saveFunction(this.form).then(res => {
            if (res.data.code === 200) {
              this.$message.success(res.data.obj);
              this.getTreeList();
              this.resetForm();
              this.visible = false;
            }
          })
        } else {
          return false;
        }
      });
    },
    // 编辑按钮点击事件
    editClickHandler() {
      /**
       * id 名称
       * name 标签
       * implClass 实现类
       * fName 继承自
       * description 描述
       * revLevel 版本规则
       * revisionRuleId 版本号规则
       * inputRevisionFlag 手工输入
       * delimiter 分隔符
       * versionRule 版次号规则
       * lifeCycleId 生命周期
       * lifeCycleIds 生命周期列表
       * attributes 属性池列表
       */
      if (func.isEmptyObject(this.nodeRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      if (this.nodeRow.id === 'topNode') {
        this.$message.error('请选择子节点进行修改')
        return;
      }
      this.form = {...this.nodeRow};
      this.form.inputRevisionFlag = JSON.parse(this.form.inputRevisionFlag); // 字符串false转换为布尔值
      // this.form.fName = this.nodeRow.id === 'topNode' ? "" : this.nodeRow.id;
      this.form.subLifeCycleIdList = this.nodeRow.lifeCycleIds ? this.nodeRow.lifeCycleIds.split(',') : [];
      this.dialogAttrData = this.nodeRow.attributes ? JSON.parse(this.nodeRow.attributes) : [];
      function processChildren(item, fName) {
        if (item.children && item.children.length > 0) {
          item.children = item.children.map(child => {
            processChildren(child, fName); // 递归处理每个子节点
            if (fName == child.id) {
              child.disabled = true;
            } else {
              child.disabled = false;
            }
            return child;
          });
        }
      };
      const inheritTreeData = this.inheritTreeData.map(item => {
        processChildren(item, this.form.id); // 处理每个节点
        if (this.form.id == item.id) {
          item.disabled = true;
        } else {
          item.disabled = false;
        }
        return item;
      });
      this.inheritTreeData = inheritTreeData
      this.title = 'edit';
      this.visible = true;
    },
    subLifeChange(data) {
      if (data.value.length == 0) {
        this.lifeData = this.allLifeData
      } else {
        this.lifeData = this.allLifeData.filter(item => {
          return !data.value.includes(item.id)
        });
      }
    },
    // 对话框 属性池列表增加按钮
    addDialogClickHandler() {
      this.dialogAttrLoading = true;
@@ -643,7 +1047,10 @@
    // 查询属性池列表数据
    getAttrDialogDta() {
      gridAttribute(this.attrPage.currentPage, this.attrPage.pageSize, this.searchAttrParams).then(res => {
        const data = res.data.data;
        const data = res.data.data.map(item => {
          item.selectable = !this.dialogAttrData.some(existingItem => existingItem.id === item.id);
          return item;
        });
        this.dialogAttrSaveData = data;
        this.attrPage.total = res.data.total;
        this.dialogAttrLoading = false;
@@ -665,7 +1072,9 @@
    // 添加属性池 行点击
    dialogAttrRowClickHandler(row) {
      if (!row.selectable) {
        return;
      }
      func.rowClickHandler(
        row,
        this.$refs.dialogAttrCrud,
@@ -674,7 +1083,7 @@
          this.attrLastIndex = newIndex;
        },
        () => {
          this.selectList = [];
          this.dialogAttrSelectList = [row];
        }
      );
    },
@@ -713,165 +1122,20 @@
    // 添加属性池 保存
    dialogAttrAddClickHandler() {
      let hasDuplicate = false;
      // 先创建一个临时数组来存储不重复的项
      const newItems = [];
      this.dialogAttrSelectList.forEach(item => {
        const exists = this.dialogAttrData.some(existingItem => existingItem.id === item.id);
        if (exists) {
          hasDuplicate = true;
          return;
        }
        // 如果没有重复项,则将该项添加到临时数组中
        newItems.push({
        this.dialogAttrData.push({
          id: item.id,
          attributeDataType: item.attributeDataType,
          defaultValue: item.defaultValue,
          description: item.description
        });
      });
      if (hasDuplicate) {
        this.$message.error('请检查是否有添加重复项!');
      } else {
        // 如果没有重复项,将新项添加到 dialogAttrData
        this.dialogAttrData.push(...newItems);
        this.attrPollDialogVisible = false;
      }
      this.attrPollDialogVisible = false;
    },
    // 版本规则管理添加
    versionAddHandler() {
      this.dialogVersionVisible = true;
      this.dialogVersionKey = Math.random(); // 打开时刷新表格避免表格错行
      this.dialogVersionLoading = true;
      getVersionRuleAllList().then(res => {
        const data = res.data.data.map(item => {
          return {
            id: item.id
          }
        });
        this.dialogVersionData = data;
        this.dialogVersionDefalutData = data;
        this.dialogVersionLoading = false;
      }).catch(err => {
        this.$message.error(err)
      });
    },
    // 版本规则行点击
    dialogVersionRowClick(row) {
      this.dialogVersionSaveRow = row;
    },
    // 版本规则搜索
    versionHandleSearch(params, done) {
      const {id} = params;
      if (!params.id) {
        this.dialogVersionData = this.dialogVersionDefalutData;
        return done();
      }
      ;
      this.dialogVersionData = this.dialogVersionDefalutData.filter(item => {
        return item.id && item.id.includes(id);
      });
      done();
    },
    // 版本管理置空
    versionHandleReset() {
      this.dialogVersionData = this.dialogVersionDefalutData;
    },
    // 版本号规则保存
    dialogVersionAddClickHandler() {
      if (func.isEmptyObject(this.dialogVersionSaveRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      this.form.revisionRuleId = this.dialogVersionSaveRow.id;
      this.dialogVersionVisible = false;
    },
    // 生命周期新增
    lifeAddHandler(val) {
      this.dialogLfeVisible = true;
      this.dialogLifeKey = Math.random(); // 打开时刷新表格避免表格错行
      this.dialogLifeLoading = true;
      this.lifeType = val;
      gridLifeCycle().then(res => {
        const data = res.data.data.map(item => {
          return {
            id: item.id
          }
        });
        this.dialogLifeData = data;
        this.dialogLifeDefalutData = data;
        this.dialogLifeLoading = false
      }).catch(err => {
        this.$message.error(err)
      });
    },
    // 生命周期行点击
    dialogLifeRowClick(row) {
      this.dialogLifeSaveRow = row;
    },
    // 生命周期保存
    dialogLifeAddClickHandler() {
      if (func.isEmptyObject(this.dialogLifeSaveRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      if (this.lifeType === 'input') {
        this.form.lifeCycleId = this.dialogLifeSaveRow.id;
      } else {
        const flag = this.dialogLifeTable.some(item => item.id === this.dialogLifeSaveRow.id);
        if (flag) {
          this.$message.error('已存在相同的数据,请添加其他数据');
          return;
        }
        this.dialogLifeTable.push(this.dialogLifeSaveRow);
      }
      this.dialogLfeVisible = false;
    },
    // 生命周期备选列表移除
    dialogDeleteLifeTable(index) {
      this.dialogLifeTable.splice(index, 1)
    },
    // 生命周期搜索
    lifeHandleSearch(params, done) {
      const {id} = params;
      if (!params.id) {
        this.dialogLifeData = this.dialogLifeDefalutData;
        return done();
      }
      ;
      this.dialogLifeData = this.dialogLifeDefalutData.filter(item => {
        return item.id && item.id.includes(id);
      });
      done();
    },
    // 生命周期重置
    lifeHandleReset() {
      this.dialogLifeData = this.dialogLifeDefalutData;
    // 属性池删除
    dialogBottomAttrDel(form, index) {
      this.dialogAttrData.splice(index, 1);
    },
    // 只能输入英文正则校验
@@ -885,28 +1149,326 @@
      callback(); // 验证通过
    },
    // 新增编辑保存
    addDialogSavaHandler() {
      console.log(this.form)
      this.$refs.form.validate((valid) => {
        if (valid) {
          addLifeCycle(this.form).then(res => {
            console.log(res);
    // 清空表单
    resetForm() {
      const form = {
        id: '', // 类型名称
        name: '', // 标签
        fName: '', // 继承自
        implClass: '', // 实现类
        description: '', // 描述
        revLevel: '2', // 版本规则
        revisionRuleId: '',// 版本号规则
        inputRevisionFlag: 'false', // 手工输入
        delimiter: '', // 分隔符
        versionRule: '0', // 版次号规则
        lifeCycleId: '', // 生命周期
        subLifeCycleId: '', // 生命周期备选列表,
        subLifeCycleIdList: [],
        lifeCycleIds: '',
        apNameArray: "", // 属性池列表’,‘分隔
      };
      this.dialogAttrData = []; // 将属性池表格置空
      this.form = {...form};
      this.$refs.form.clearValidate();
    },
    // 新增编辑对话框取消
    addDialogClose() {
      this.resetForm();
      this.visible = false;
    },
    // 版本规则切换 置空其他条件
    revLevelChange() {
      this.form.inputRevisionFlag = false;
      this.form.delimiter = "";
      this.form.versionRule = "0";
      this.form.revisionRuleId = "";
    },
    // 删除按钮
    deleteClickHandler() {
      if (func.isEmptyObject(this.nodeRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      this.$confirm('您确定要删除所选择的数据吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        const {id, oid, ts} = this.nodeRow;
        const obj = {id, oid, ts};
        deleteBtmType(obj).then(res => {
          if (res.data.code === 200) {
            this.$message.success(res.data.obj);
            this.getTreeList();
          }
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // 创建视图
    createViewClickHandler() {
      this.createViewLoading = true;
      createView().then(res => {
        if (res.data.code === 200) {
          this.createViewLoading = false;
          this.$message.success(res.data.obj);
        }
      }).catch(err => {
        this.createViewLoading = false;
      })
    },
    // 导出
    exportClickHandler() {
      if (func.isEmptyObject(this.nodeRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      let name = this.nodeRow.id;
      expData({name: name}).then(res => {
        func.downloadFileByBlobHandler(res);
        this.$message.success('导出成功');
      }).catch(err => {
        this.$message.error(err);
      });
    },
    // 导入
    upLoadClickHandler() {
      this.$refs.upload.visible = true;
    },
    // 查看使用范围按钮
    checkViewClickHandler() {
      if (func.isEmptyObject(this.nodeRow)) {
        this.$message.error('请至少选择一条数据!');
        return;
      }
      getUsedBtmLinkList({btmName: this.nodeRow.id}).then(res => {
        if (res.data.code === 200) {
          this.checkViewVisible = true;
          const data = res.data.data.map(item => {
            return {
              name: this.nodeRow.id,
              source: item
            }
          });
          this.checkViewData = data;
          this.checkViewDataSearch = data;
        }
      })
    },
    // 查看使用范围查询
    checkHandleSearch(params, done) {
      const {source} = params;
      if (!params.source) {
        this.checkViewData = this.checkViewDataSearch;
        return done();
      }
      this.checkViewData = this.checkViewDataSearch.filter(item => {
        return item.source && item.source.includes(source);
      });
      done();
    },
    // 查看使用范围重置
    checkHandleReset() {
      this.checkViewData = this.checkViewDataSearch;
    },
    // 一致性检查按钮点击
    checkClickHandler() {
      this.createViewLoading = true;
      checkBtmConsistency().then(res => {
        this.createViewLoading = false;
        if (res && res.data && res.data.data) {
          this.conCheckVisible = true;
          this.conCheckLoading = true;
          if (res.data.code === 200) {
            const data = res.data.data[0];
            this.conDefaultCheckData = data; // 保留一份原始数据
            this.conCheckLoading = false;
            const outputData = [];
            Object.entries(data).forEach(([id, methods]) => {
              let action;
              if (methods.includes('_CREATE')) {
                action = methods.replace('_CREATE', '创建表');
              } else if (methods.includes('_ADD')) {
                action = methods.replace('_ADD', '增加列');
              } else if (methods.includes('_DROP')) {
                action = methods.replace('_DROP', '移除列');
              } else {
                action = '未知';
              }
              outputData.push({
                id: id,
                methods: action,
                status: '未修复'
              })
            })
            this.conCheckData = outputData;
          }
        } else {
          this.$message.success(res.data.msg);
        }
      })
    },
    // 修复一致性检查
    repairClickHandler() {
      const params = this.conDefaultCheckData;
      executeRepair(params).then(res => {
        if (res.data.obj) {
          this.$message.success('修复成功');
          this.conCheckData = [];
        } else {
          this.$message.error('修复失败,请重新尝试!');
        }
        this.conCheckVisible = false;
      })
    },
    // 创建索引按钮点击
    indexClickHandler() {
      if (func.isEmptyObject(this.nodeRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      this.getLeftIndex();
      this.indexVisible = true;
    },
    // 左侧树更新
    getLeftIndex() {
      const params = {
        "conditionMap[typename]": this.nodeRow.id
      }
      getIndexByCondition(params).then(res => {
        if (res.data.code === 200) {
          const data = res.data.data.map(item => {
            return {
              indexName: item.indexName,
              name: `${item.indexName} ${item.attrNames}`,
              id: item.oid
            }
          })
        } else {
          return false;
          this.indexLeftData = data;
        }
      });
      })
    },
      this.$refs.form.validate((valid) => {
        if (valid) {
        } else {
          return false;
    // 索引左侧树点击
    indexLeftNodeClick(row) {
      this.indexLeftNodeRow = row;
    },
    // 删除左侧树索引
    deleteIndexLeftTreeClickHandler() {
      if (func.isEmptyObject(this.indexLeftNodeRow)) {
        this.$message.error('请选择一条数据进行删除');
        return;
      }
      const params = {
        btmName: this.nodeRow.id,
        indexName: this.indexLeftNodeRow.indexName
      };
      delIndex(params).then(res => {
        if (res.data.code === 200) {
          this.$message.success('删除索引成功');
          this.getLeftIndex();
        }
      });
      })
    },
    //右侧表格添加属性
    indexAttrClickAddHandler() {
      if (func.isEmptyObject(this.indexAttrRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      this.indexData.push(
        {
          typeName: this.nodeRow.id,
          attrNames: this.indexAttrRow.id,
          indexName: this.indexForm.name,
          desc: this.indexForm.desc
        }
      )
      this.indexFormRead = true;
      this.indexAttrVisible = false;
    },
    // 右侧属性表格行点击
    indexAttrRowClick(row) {
      this.indexAttrRow = row;
    },
    // 右侧表格增加
    rightIndexAddClick() {
      if (!this.indexForm.name) {
        this.$message.error('请输入索引名称');
        return;
      }
      // 检查是否为英文字符
      const englishRegex = /^[A-Za-z]+$/;
      if (!englishRegex.test(this.indexForm.name)) {
        this.$message.error('索引名称只能包含英文字符');
        return;
      }
      this.indexLoading = true;
      getAllAttributesByBtmId({btmId: this.nodeRow.id}).then(res => {
        if (res.data.code === 200) {
          const data = res.data.data.map(item => {
            return {
              id: item.id
            }
          })
          this.indexAttrData = data;
        }
        this.indexLoading = false;
        this.indexAttrVisible = true;
      })
    },
    // 创建保存索引
    indexClickAddHandler() {
      const params = {
        typeName: this.nodeRow.id,
        attrNames: this.indexData.map(item => item.attrNames).join(','),
        indexName: this.indexForm.name,
      }
      addIndex([params]).then(res => {
        this.$message.success('创建成功');
        this.indexDialogClose();
      }).catch(err => {
        this.indexDialogClose();
      })
    },
    // 索引对话框取消
    indexDialogClose() {
      this.indexFormRead = false;
      this.indexForm = {};
      this.indexData = [];
      this.indexVisible = false;
    }
  }
}
</script>
@@ -926,66 +1488,30 @@
    width: 100%;
  }
  .headerCon {
    .el-button {
      width: 82px;
    }
  }
}
.headerCon {
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 5px;
  .el-button + .el-button {
    margin-left: 5px;
  .el-tag {
    line-height: 22px;
    height: 24px;
  }
  .el-button {
    margin-top: 5px;
  .el-radio {
    margin-right: 20px;
  }
}
.headerCon > .el-button:nth-child(4) {
  margin-left: 0;
}
.headerCon > .el-button:nth-child(7) {
  margin-left: 0;
}
.headerCon > .el-button:nth-child(10) {
  margin-left: 0;
}
.miniBtn {
  width: 82px;
  text-align: center;
  padding-left: 7px;
}
.smallBtn {
  width: 82px;
  text-align: center;
  padding-left: 4.5px;
}
.descBox {
  width: 32%;
  margin-left: 20px;
  margin-right: 20px;
}
.dialogForm {
  display: flex;
  justify-content: space-around;
  justify-content: space-between;
}
.dialogForm > div {
  width: 29%;
  border: 1px solid #eee;
  padding: 25px 20px 5px 10px; /* 上 右 下 左 */
  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* 添加阴影效果 */
  border: 1px solid #EBEEF5;
  border-radius: 2px;
  padding: 15px 20px 0 10px; /* 上 右 下 左 */
  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); /* 添加阴影效果 */
}