wangting
2024-11-01 f25ba67cb65c61892e38f1aacb113c6bf7a70556
Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/businessType/index.vue
@@ -2,39 +2,11 @@
  <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="indexClickHandler">创建索引
            </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" @click="checkViewClickHandler">查看使用范围
            </el-button>
          </div>
        <div ref="TreeBox" style="height: calc(100vh - 154px);!important;">
          <!-- 左侧树 -->
          <div style="height:  calc(100vh - 330px);">
            <avue-tree ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
          <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 style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
@@ -48,8 +20,21 @@
    </el-aside>
    <el-main>
      <basic-container>
        <div style="display: flex;justify-content: center; height: 230px">
          <div class="descBox" style="max-height: 100px">
        <div>
          <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 icon="el-icon-circle-plus-outline" plain size="small" type="primary" @click="createViewClickHandler">创建视图</el-button>
          <el-button icon="el-icon-circle-plus-outline" plain size="small" type="primary" @click="indexClickHandler">创建索引</el-button>
          <el-button icon="el-icon-menu" plain size="small" type="primary" @click="checkClickHandler">一致性检查</el-button>
          <el-button icon="el-icon-delete" plain size="small" type="danger" @click="checkClickHandler">删除数据</el-button>
          <el-button icon="el-icon-delete" plain size="small" type="danger" @click="checkClickHandler">删除全部类型</el-button>
          <el-button icon="el-icon-view" plain size="small" type="primary" @click="checkViewClickHandler">查看使用范围</el-button>
        </div>
        <div style="display: flex;justify-content:left;margin-top: 15px;">
          <div class="descBox" style="width: 40%">
            <el-descriptions :column="1" border class="margin-top" size="medium" title="属性信息">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
@@ -72,8 +57,7 @@
                </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"
@@ -85,7 +69,7 @@
              </el-descriptions-item>
            </el-descriptions>
          </div>
          <div class="descBox">
          <div class="descBox" style="width: 25%;">
            <el-descriptions :column="1" border class="margin-top" size="medium" title="版本规则">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
@@ -137,7 +121,7 @@
            </el-descriptions>
          </div>
          <div class="descBox">
          <div class="descBox" style="width: calc(35% - 40px);margin-right: 0">
            <el-descriptions :column="1" border class="margin-top" size="medium" title="生命周期">
              <el-descriptions-item :contentStyle="descriptionOption.contentStyle"
                                    :labelStyle="descriptionOption.labelStyle">
@@ -149,8 +133,8 @@
            </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,9 +152,9 @@
      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>
@@ -193,7 +177,7 @@
              <el-input v-model="form.description" :rows="2" type="textarea"></el-input>
            </el-form-item>
          </div>
          <div class="centerForm">
          <div class="centerForm" style="width: 24%">
            <el-form-item label="版本规则:" label-width="110px" prop="revLevel">
              <el-select v-model="form.revLevel" @change="revLevelChange">
                <el-option label="不可修订" value="0"></el-option>
@@ -231,7 +215,7 @@
              </el-select>
            </el-form-item>
          </div>
          <div class="rightForm">
          <div class="rightForm" style="width: 26%">
            <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>
@@ -279,7 +263,7 @@
        </div>
      </el-form>
      <div class="bottomForm">
        <h3>属性池列表</h3>
        <h3 style="margin-bottom: 10px;">属性池列表</h3>
        <avue-crud
          :data="dialogAttrData"
          :option="dialogAttrOption"
@@ -289,9 +273,9 @@
          </template>
        </avue-crud>
      </div>
      <span slot="footer" class="dialog-footer">
         <el-button @click="addDialogClose">取 消</el-button>
      <span slot="footer" class="dialog-footer avue-dialog__footer">
         <el-button type="primary" @click="addDialogSavaHandler">确 定</el-button>
         <el-button @click="addDialogClose">取 消</el-button>
        </span>
    </el-dialog>
@@ -402,8 +386,8 @@
          </span>
      </avue-tree>
      <span slot="footer" class="dialog-footer">
         <el-button @click="inheritClose">取 消</el-button>
         <el-button type="primary" @click="inheritSaveClickHandler">确 定</el-button>
         <el-button @click="inheritClose">取 消</el-button>
        </span>
    </el-dialog>
@@ -446,12 +430,12 @@
        :table-loading="conCheckLoading">
      </avue-crud>
      <span slot="footer" class="dialog-footer">
         <el-button @click="conCheckVisible = false">取 消</el-button>
         <el-button type="primary" @click="repairClickHandler">修 复</el-button>
         <el-button @click="conCheckVisible = false">取 消</el-button>
        </span>
    </el-dialog>
    <!-- 一致性检查 -->
    <!-- 查看索引 -->
    <el-dialog
      v-dialogDrag
      :visible.sync="indexVisible"
@@ -459,8 +443,61 @@
      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 type="primary" @click="indexClickAddHandler">保 存</el-button>
         <el-button @click="indexDialogClose">取 消</el-button>
        </span>
    </el-dialog>
  </el-container>
@@ -478,7 +515,10 @@
  getUsedBtmLinkList,
  checkBtmConsistency,
  executeRepair,
  getIndexByCondition
  getIndexByCondition,
  delIndex,
  getAllAttributesByBtmId,
  addIndex
} from "@/api/modeling/businessType/api"
import {gridAttribute} from "@/api/modeling/attributePool/api";
import func from "@/util/func";
@@ -489,7 +529,79 @@
  name: "index",
  data() {
    return {
      indexVisible:false,
      indexLoading: false,
      indexFormRead: false,
      indexAttrRow: {},
      indexAttrOption: {
        ...basicOption,
        height: 380,
        highlightCurrentRow: true,
        addBtn: false,
        refreshBtn: false,
        editBtn: false,
        delBtn: false,
        selection: false,
        menu: false,
        column: [
          {
            label: '属性信息',
            prop: 'id',
            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: {
@@ -527,6 +639,7 @@
        searchMenuSpan: 8,
        refreshBtn: false,
        selection: false,
        header:false,
        column: [
          {
            label: '名称',
@@ -640,6 +753,7 @@
        highlightCurrentRow: true,
        height: 450,
        searchMenuSpan: 8,
        header: false,
        column: [
          {
            label: '属性名',
@@ -651,6 +765,7 @@
            label: '属性类型',
            prop: 'attributeDataType',
            sortable: true,
            width:150,
          },
          {
            label: '初始值',
@@ -687,6 +802,7 @@
        selection: false,
        height: 210,
        addBtn: false,
        menuWidth:100,
        // index:false,
        column: [
          {
@@ -704,11 +820,13 @@
            label: '属性类型',
            prop: 'attributeDataType',
            sortable: true,
            width:150,
          },
          {
            label: '初始值',
            prop: 'defaultValue',
            sortable: true,
            width:150,
          },
          {
            label: '说明',
@@ -780,7 +898,8 @@
        props: {
          label: 'TreeName',
          value: 'id',
          children: 'children'
          children: 'children',
          name: 'name'
        }
      },
      treeData: [
@@ -799,6 +918,7 @@
        name: 'el-icon-tickets',
        desc: 'el-icon-chat-line-square'
      },
      treeLoading: false
    }
  },
  created() {
@@ -809,6 +929,7 @@
  methods: {
    //树表查询
    getTreeList() {
      this.treeLoading = true;
      getBizTypes().then(res => {
        const data = res.data.data.map(item => {
          this.processChildren(item); // 处理每个节点
@@ -816,8 +937,8 @@
          return item.attributes; // 返回处理后的 attributes
        });
        this.treeData[0].children = data;
        console.log(this.treeData);
        this.inheritTreeData = data;
        this.treeLoading = false;
      });
    },
@@ -1171,7 +1292,7 @@
    // 新增编辑保存
    addDialogSavaHandler() {
      if (!this.form.inputRevisionFlag && (!this.form.revisionRuleId || this.form.revisionRuleId === "")) {
      if (this.form.revLevel !== '0' &&!this.form.inputRevisionFlag && (!this.form.revisionRuleId || this.form.revisionRuleId === "")) {
        this.$message.error('请检查版本号规则不能为空');
        return;
      }
@@ -1305,9 +1426,9 @@
        if (res.data.code === 200) {
          this.checkViewVisible = true;
          const data = res.data.data.map(item => {
            return{
              name:this.nodeRow.id,
              source:item
            return {
              name: this.nodeRow.id,
              source: item
            }
          });
          this.checkViewData = data;
@@ -1340,12 +1461,14 @@
    },
    // 一致性检查按钮点击
    checkClickHandler(){
      checkBtmConsistency().then(res =>{
        if(res && res.data && res.data.data){
    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){
          if (res.data.code === 200) {
            const data = res.data.data[0];
            this.conDefaultCheckData = data; // 保留一份原始数据
            this.conCheckLoading = false;
@@ -1374,7 +1497,7 @@
            })
            this.conCheckData = outputData;
          }
        }else {
        } else {
          this.$message.success(res.data.msg);
        }
      })
@@ -1395,17 +1518,130 @@
    },
    // 创建索引按钮点击
    indexClickHandler(){
      if(func.isEmptyObject(this.nodeRow)){
    indexClickHandler() {
      if (func.isEmptyObject(this.nodeRow)) {
        this.$message.error('请至少选择一条数据');
        return;
      }
      this.getLeftIndex();
      this.indexVisible = true;
    },
    // 左侧树更新
    getLeftIndex() {
      const params = {
        "conditionMap[typename]":this.nodeRow.id
        "conditionMap[typename]": this.nodeRow.id
      }
      getIndexByCondition(params).then(res => {
        console.log(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
            }
          })
          this.indexLeftData = data;
        }
      })
    },
    // 索引左侧树点击
    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 => {
        console.log(res)
        this.$message.success('创建成功');
        this.indexDialogClose();
      }).catch(err => {
        this.indexDialogClose();
      })
    },
    // 索引对话框取消
    indexDialogClose() {
      this.indexFormRead = false;
      this.indexForm = {};
      this.indexData = [];
      this.indexVisible = false;
    }
  }
}
@@ -1426,66 +1662,26 @@
    width: 100%;
  }
  .headerCon {
    .el-button {
      width: 82px;
    }
  .el-tag{
    line-height:22px;
    height: 24px;
  }
}
.headerCon {
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 5px;
  .el-button + .el-button {
    margin-left: 5px;
  }
  .el-button {
    margin-top: 5px;
  }
}
.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;
  border: 1px solid #EBEEF5;
  border-radius: 2px;
  padding: 25px 20px 5px 10px; /* 上 右 下 左 */
  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2); /* 添加阴影效果 */
  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); /* 添加阴影效果 */
}