lihang
2023-05-26 f6e7d70e650536e7cafa0da24922b2dda1902f06
元数据页面调整完善
已修改8个文件
已添加1个文件
1062 ■■■■■ 文件已修改
Source/UBCS-WEB/src/api/omd/btmType.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/main.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/original.vue 541 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/originalAdd.vue 452 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/AttributeWrapper.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/omd/btmType.js
@@ -57,3 +57,15 @@
        data: btmType
    })
}
export const btmPage = (current,size,params) => {
    return request ({
        url: '/api/ubcs-omd/btm-type/page',
        method: 'get',
        params: {
            current,
            size,
            ...params
        }
    })
}
Source/UBCS-WEB/src/main.js
@@ -41,6 +41,7 @@
import referConfigFormDialog from "@/components/code-dialog-page/referConfigFormDialog"
import businessAdd from "@/views/modeling/BusinessAdd"
import TableCrud from "@/components/Crud/Crud"
import originalAdd from "@/views/modeling/originalAdd"
// å°†å·¥å…·å‡½æ•°æ·»åŠ åˆ°å…¨å±€
import utilFunc from './util/func'
@@ -83,6 +84,7 @@
Vue.component('businessAdd',businessAdd)
Vue.component('attrCrud',attrCrud)
Vue.component('TableCrud',TableCrud)
Vue.component('originalAdd',originalAdd)
// åŠ è½½ç›¸å…³url地址
Source/UBCS-WEB/src/views/modeling/original.vue
@@ -2,22 +2,30 @@
  <el-container>
    <el-main>
      <basic-container>
        <avue-crud v-model="form" :option="option" :data="data" ref="crud" @on-load="onLoad" @row-save="rowSave"
          @row-update="rowUpdate" :before-open="beforeOpen" @row-del="rowDel" :page.sync="page"
          @refresh-change="refreshChange" @row-click="rowClick"
          @selection-change="selectChange">
          <template slot-scope="{row,index,type}" slot="selInputForm">
          <div style="margin-left: 75px">
            <el-input v-model="form.text" :size="size" style="width: 210px" :readonly="true" @focus="selectBtmType" :disabled="referType.disable"></el-input>
          </div>
        </template>
        <avue-crud v-model="form"
          ref="crud"
          :option="option"
          :data="data"
          @on-load="onLoad"
          :page.sync="page"
          @refresh-change="refreshChange"
          @row-click="rowClick">
        <template slot="radio"
                slot-scope="{row}">
                    <el-radio v-model="selectRow"
                        :label="row.$index">&nbsp;
                    </el-radio>
                </template>
          <template slot="menu">
             <el-button icon="el-icon-edit" size="small" type="text" @click="updateSave">编辑</el-button>
             <el-button icon="el-icon-delete" size="small" type="text" @click="deleteSave">删除</el-button>
          </template>
         <template slot="menuLeft">
            <el-button size="small"
              type="primary"
              icon="el-icon-plus"
              @click="addSave">新&nbsp;&nbsp;增
            </el-button>
            <el-button size="small"
                       plain
                       type="primary"
@@ -31,76 +39,105 @@
            <avue-crud v-model="applyRange.model" :option="applyRange.option" :data="applyRange.data" class="applyRangeTable"
            ></avue-crud>
        </el-dialog>
        <el-dialog :visible.sync="referType.display" append-to-body :title="referType.title" width="1000px">
          <original-range @rowchange="rowchange"></original-range>
          <span slot="footer" class="dialog-footer">
            <el-button @click="dialoghandelfalse">取 æ¶ˆ</el-button>
            <el-button type="primary" @click="dialoghandeltrue">ç¡® å®š</el-button>
          </span>
        </el-dialog>
        <!-- <el-dialog :visible.sync="packageLinkBox" append-to-body title="查看链接类型" width="1000px">
          <original-link @rowLinkchange="rowLinkchange"></original-link>
          <span slot="footer" class="dialog-footer">
            <el-button @click="Linkdialoghandelfalse">取 æ¶ˆ</el-button>
            <el-button type="primary" @click="Linkdialoghandeltrue">ç¡® å®š</el-button>
          </span>
        </el-dialog> -->
      </basic-container>
    </el-main>
    <el-aside>
      <basic-container class="itemForm">
        <el-tabs v-model="activeName" @tab-click="handleClick">
          <el-tab-pane label="属性项" name="attrTab">
            <el-form ref="form" :model="itemData" label-width="80px" style="height: 656px;">
              <el-form-item label="属性编码">
                <el-input v-model="itemData.id" :disabled="true"></el-input>
              </el-form-item>
              <el-form-item label="属性名称">
                <el-input v-model="itemData.name" :disabled="true"></el-input>
              </el-form-item>
              <el-form-item label="属性类型">
                <el-input v-model="itemData.typeValue" :disabled="true"></el-input>
              </el-form-item>
              <el-form-item label="标签">
                <el-input v-model="itemData.hashtag" :disabled="true"></el-input>
              </el-form-item>
              <el-form-item label="默认值">
                <el-input v-model="itemData.defaultValue" :disabled="true"></el-input>
              </el-form-item>
              <el-form-item label="允许为空">
                <el-switch v-model="itemData.nullable" :disabled="true"></el-switch>
              </el-form-item>
              <el-form-item label="长度">
                <el-input v-model="itemData.maxLength" :disabled="true"></el-input>
              </el-form-item>
              <el-form-item label="描述">
                <el-input v-model="itemData.description" :disabled="true"></el-input>
              </el-form-item>
            </el-form>
          </el-tab-pane>
          <el-tab-pane label="参照" name="valueTab">
            <el-form ref="form" :model="itemData" label-width="80px" style="height: 656px;">
              <el-form-item label="参照类型">
                <el-input v-model="itemData.referTypeValue" :disabled="true"></el-input>
              </el-form-item>
              <el-form-item label="参照名称">
                <el-input v-model="itemData.referToName" :disabled="true"></el-input>
              </el-form-item>
            </el-form>
            <el-descriptions class="margin-top" :column="1" size="medium" border title="属性项">
              <el-descriptions-item>
                <template slot="label">
                  å±žæ€§ç¼–号
                </template>
                {{ itemForm.itemData.id }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  å±žæ€§åç§°
                </template>
                {{ itemForm.itemData.name }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  å±žæ€§ç±»åž‹
                </template>
                {{ itemForm.itemData.typeValue }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  æ ‡ç­¾
                </template>
                {{ itemForm.itemData.hashtag }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  é»˜è®¤å€¼
                </template>
                {{ itemForm.itemData.defaultValue }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  å…è®¸ä¸ºç©º
                </template>
                {{ itemForm.itemData.nullable }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  é•¿åº¦
                </template>
                {{ itemForm.itemData.maxLength }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  æè¿°
                </template>
                {{ itemForm.itemData.description }}
              </el-descriptions-item>
            </el-descriptions>
            <div style="height:15px"></div>
        <el-descriptions class="margin-top" :column="1" size="medium" border title="属性配置"></el-descriptions>
        <el-tabs v-model="itemForm.activeName" @tab-click="handleClick" stretch="true" style="height:235px">
        <el-tab-pane label="参照" name="referTab">
            <el-descriptions class="margin-top" :column="1" size="medium" border>
              <el-descriptions-item>
                <template slot="label">
                  ä½¿ç”¨å‚ç…§
                </template>
                {{ itemForm.itemData.referTypeValue ? '是' : '否' }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  å‚照类型
                </template>
                {{ itemForm.itemData.referTypeValue }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  å‚照名称
                </template>
                {{ itemForm.itemData.referToName }}
              </el-descriptions-item>
            </el-descriptions>
          </el-tab-pane>
          <el-tab-pane label="枚举" name="enumTab">
            <el-form ref="form" :model="itemData" label-width="80px" style="height: 656px;">
              <el-form-item label="使用枚举">
                <el-switch v-model="itemData.usingDict" :disabled="true"></el-switch>
              </el-form-item>
              <el-form-item label="枚举类型">
                <el-input v-model="form.dictCode" :disabled="true"></el-input>
              </el-form-item>
            </el-form>
            <el-descriptions class="margin-top" :column="1" :size="small" border>
              <el-descriptions-item>
                <template slot="label">
                  ä½¿ç”¨æžšä¸¾
                </template>
                {{ itemForm.itemData.usingDict ? '是' : '否' }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label">
                  æžšä¸¾ç±»åž‹
                </template>
                {{ itemForm.itemData.dictCode }}
              </el-descriptions-item>
            </el-descriptions>
          </el-tab-pane>
        </el-tabs>
      </basic-container>
    </el-aside>
    <originalAdd ref="originalAdd" :attribute="attribute" @refreshTable="refreshChange"></originalAdd>
  </el-container>
</template>
@@ -112,52 +149,21 @@
  update, getPage, getApplyRange
} from "@/api/omd/OmdAttribute";
import { getDictionary } from "@/api/omd/enum";
export default {
  name: "original",
  data() {
    return {
      datas: [],
      itemData: {},
      activeName: 'attrTab',
      formAtrr: {},
      rouname: "",
      referType: {
        code: 'referType',
        key: '',
        value: '',
        display: false,
        title: '',
        disable: true
      },
      //值域下拉框数据
      Typelist: [],
      //版本数据
      banList: [],
      // å±žæ€§ç±»åž‹ä¸‹æ‹‰æ¡†æ•°æ®
      typeSelectList: [
        {
          label: "哈哈哈",
          value: 0
        },],
      // æ˜¯å¦ä¸ºç©º
      nullable: [],
      form: {
        text: ""
      },
      detailForm: {
        text: ""
      },
      page: {
        pageSize: 10,
        currentPage: 1,
        total: 100
      },
      selectRow: '',
      data: [
      ],
      data: [],
      form:{},
      attribute: {
        nullable: true
      },
      option: {
        height: "550px",
        headerAlign: 'center',
@@ -165,7 +171,13 @@
        index: true,
        rowKey: 'id',
        tabs: true,
        stripe:true,
        indexFixed: false,
        menuWidth: 150,
        highlightCurrentRow: true,
        addBtn:false,
        editBtn:false,
        delBtn:false,
        column: [{
            label: '选择',
            prop: 'radio',
@@ -178,7 +190,8 @@
            prop: 'id',
            align: 'left',
            display: false,
            width: 200
            width: 200,
            required: true
          }, {
            label: '属性名称',
            prop: 'name',
@@ -200,10 +213,10 @@
            display: false,
            dicData: [{
              label: '是',
              value: 0
              value: 'true'
            }, {
              label: '否',
              value: 1
              value: 'false'
            }]
          },
          {
@@ -226,10 +239,10 @@
            labelWidth: 132,
            dicData: [{
              label: '否',
              value: 1
              value: 'false'
            }, {
              label: '是',
              value: 0
              value: 'true'
            }]
          },
          {
@@ -244,195 +257,6 @@
            type: "textarea",
            display: false
          },
        ],
        group: [
          {
            label: '属性项',
            prop: "index",
            column: [
              {
                label: '属性编号',
                prop: 'id',
                align: 'left',
              },
              {
                label: '属性名称',
                prop: 'name',
                align: 'left',
              },
              {
                label: '标签',
                prop: 'hashtag',
                hide: true
              }, {
                label: '属性类型字典码',
                prop: 'typeCode',
                display: false,
                value: 'attributeType'
              },
              {
                label: '属性类型',
                prop: 'typeKey',
                type: "select",
                dicUrl: '/api/ubcs-omd/dict-biz/dictionary?code=attributeType',
                dicType: 'String',
                props: {
                  label: 'dictValue',
                  value: 'dictKey'
                },
                rules: [
                  {
                    required: true,
                    message: "请选择属性类型",
                    trigger: "click"
                  }
                ]
              },
              {
                label: '默认值',
                prop: 'defaultValue',
              },
              {
                label: '允许为空',
                prop: 'nullable',
                type: 'switch',
                hide: true,
                labelWidth: 132,
                dicData: [{
                  label: '否',
                  value: 1
                }, {
                  label: '是',
                  value: 0
                }]
              },
              {
                label: "长度",
                prop: "maxLength",
                hide: true
              },
              {
                label: '描述',
                prop: 'description',
                type: "textarea"
              },
            ]
          },
          {
            label: '参照',
            column: [
              {
                label: '参照类别',
                prop: 'referTypeCode',
                display: false,
                hide: true
              },{
                span: 12,
                label: '参照类别',
                prop: 'referTypeKey',
                type: "select",
                change: this.selectChange,
                dicUrl: '/api/ubcs-omd/dict-biz/dictionary?code=referType',
                dicType: 'String',
                props: {
                  label: 'dictValue',
                  value: 'dictKey'
                },
                rules: [
                  {
                    required: true,
                    message: "请选择参照类别",
                    trigger: "click"
                  }
                ]
              },
              {
                prop: "selInput",
                placeholder: false,
                readonly: true,
                display: true,
                formslot: true,
              },
              // {
              //   label: "选择版本",
              //   prop: "banben",
              //   type: 'select',
              //   value: 0,
              //   change: this.selchange,
              //   display: true,
              //   dicData: [
              //     {
              //       label: '当前版本次',
              //       value: 0
              //     },
              //     {
              //       label: '最新版本次',
              //       value: 1
              //     }
              //   ]
              // },
              {
                //默认表格插槽
                prop: "default",
                span: 24,
                display: false
              }
            ]
          },
          {
            label: '枚举',
            column: [
              {
                label: '是否使用枚举',
                prop: 'isnot',
                type: 'switch',
                hide: true,
                labelWidth: 132,
                span: 8,
                dicData: [{
                  label: '否',
                  value: 1
                }, {
                  label: '是',
                  value: 0
                }]
              },
              {
                prop: 'text',
                type: 'input',
                placeholder: '请输入内容',
                hide: true,
                display: false
              },
              {
                prop: 'enumerationSelect',
                type: 'select',
                placeholder: '请选择',
                hide: true,
                span: 12,
                dicData: [
                  {
                    label: 'a',
                    value: 0
                  },
                  {
                    label: 'b',
                    value: 1
                  },
                  {
                    label: 'c',
                    value: 2
                  }
                ]
              },
              {
                label: '描述',
                prop: 'endesc',
                type: "textarea",
                labelWidth: 132,
              },
            ]
          }
        ]
      },
      applyRange: {
@@ -464,115 +288,32 @@
        },
        data: [],
        display: false,
      },
      itemForm:{
        itemData: {},
        activeName: 'referTab',
        form:{}
      }
    }
  },
  created() {
    const column =this.findObject(this.option.group,"referTypeKey")
    console.log(column);
  },
  methods: {
    rowLinkchange(row) {
      this.form.text = row.name
    },
    rowchange(row) {
      this.form.text = row.name
    },
    //值域类型选择
    addHandle() {
      this.packageBox = true
      if (this.Typelist.value == 0) {
        this.packageBox = true
        this.packageLinkBox = false
      } else if (this.Typelist.value == 1) {
        this.packageBox = false
        this.packageLinkBox = true
      }
    },
    // å€¼åŸŸä¸šåŠ¡ç±»åž‹å¯¹è¯æ¡†å–æ¶ˆ
    dialoghandelfalse() {
      this.packageBox = false;
      this.form.text = ""
    },
    //值域业务类型对话框确定
    dialoghandeltrue() {
      this.packageBox = false
    },
    // å€¼åŸŸé“¾æŽ¥ç±»åž‹å¯¹è¯æ¡†å–消
    Linkdialoghandelfalse() {
      this.packageLinkBox = false;
      this.form.text = ""
    },
    //值域链接类型对话框确定
    Linkdialoghandeltrue() {
      this.packageLinkBox = false
    },
    selectChange(val) {
       this.referType.key = val.value
      if (val.value == 'businessType'){
        this.referType.value = '业务类型'
      }
      if (val.value == 'linkType'){
        this.referType.value = '链接类型'
      }
      if(val.value){
        this.referType.disable = false
      }
    },
    selchange(val) {
      this.banList = val
      console.log(val);
    },
    refreshChange() {
      this.onLoad(this.pageParent, this.query);
    },
    beforeOpen(done, type) {
      done();
    addSave(){
      this.$refs.originalAdd.showSubmitDialog = true;
      this.$refs.originalAdd.attribute = {};
    },
    rowDel(row) {
      this.$confirm("确定将选择数据删除?", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning"
      })
        .then(() => {
          return remove(row.id);
        })
        .then(() => {
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          this.onLoad();
        });
    updateSave(){
      this.$refs.originalAdd.showSubmitDialog = true;
      this.$refs.originalAdd.attribute = this.attribute;
    },
    rowSave(row, done) {
      add(row).then(() => {
        this.$message({
          type: "success",
          message: "操作成功!"
        });
        done(row)
        this.onLoad()
      }).catch((res) => {
        this.$message({
          type: "success",
          message: res
        });
      })
    },
    rowUpdate(row, index, done) {
      update(row).then(() => {
        this.onLoad()
        this.$message({
          type: "success",
          message: "修改成功!"
        });
        done(row)
    deleteSave(){
      remove(this.itemForm.itemData).then(res => {
        this.$message.success("删除成功");
      })
    },
    onLoad(page, params = {}) {
@@ -587,9 +328,9 @@
      })
    },
    rowClick(row) {
      this.itemData = row;
      this.itemForm.itemData = row;
      this.selectRow = row.$index;
      this.attribute = row;
    }
    ,selectBtmType(){
        this.referType.display = true;
@@ -603,11 +344,9 @@
          })
        }
        var oid = this.data[this.selectRow].oid;
        console.log(oid);
        getApplyRange(oid).then(res => {
            this.applyRange.data = res.data.data;
        })
        console.log("success");
        this.applyRange.display = true;
    },
    applyRangeClose(){
Source/UBCS-WEB/src/views/modeling/originalAdd.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,452 @@
<template>
    <el-container>
        <el-dialog title="元数据" :visible.sync="showSubmitDialog" append-to-body @close="closeSubmitDialog" width="50%"
            style="height: 115vh;">
            <!-- å…ƒæ•°æ®çš„增改弹窗 -->
            <el-form ref="form" :model="attribute" show-message="true" inline size="medium" label-suffix=":"
                class="attributeForm" :rules="rules" @resetFields="resetAttributeForm" status-icon="true">
                <el-form-item label="属性编号" label-width="100px" prop="id">
                    <el-input v-model="attribute.id" maxlength="15" show-word-limit type="text"></el-input>
                </el-form-item>
                <el-form-item label="属性名称" label-width="100px" prop="name">
                    <el-input v-model="attribute.name"></el-input>
                </el-form-item>
                <el-form-item label="属性类型" label-width="100px" prop="typeValue">
                    <el-select v-model="attribute.typeValue" placeholder="请选择属性类型" @change="typeSelectChange">
                        <el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value">
                        </el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="标签" label-width="100px">
                    <el-input v-model="attribute.hashtag"></el-input>
                </el-form-item>
                <el-form-item label="默认值" label-width="100px">
                    <el-input v-model="attribute.defaultValue"></el-input>
                </el-form-item>
                <el-form-item label="允许为空" label-width="100px">
                    <el-switch v-model="attribute.nullable" active-text="允许" inactive-text="不允许"></el-switch>
                </el-form-item>
                <el-form-item label="长度" label-width="100px" prop="maxLength">
                    <el-input-number v-model="attribute.maxLength" :min="1" :max="4000" :step="1" controls-position="right"></el-input-number>
                </el-form-item>
                <el-form-item label="精度" label-width="100px" v-if="attribute.typeValue == 'VTDouble'">
                    <el-input-number v-model="attribute.precision" :min="1" :max="20" :step="1" controls-position="right" @change="changeNumber"></el-input-number>
                </el-form-item>
                <el-form-item label="描述" label-width="100px">
                    <el-input v-model="attribute.description" type="text"></el-input>
                </el-form-item>
                <el-tabs v-model="activeName" @tab-click="handleClick" stretch="true">
                    <el-tab-pane label="参照" name="referTab">
                        <el-form-item label="参照类型" label-width="100px">
                            <el-select v-model="attribute.referTypeKey" @change="referTypeSelectChange">
                                <el-option v-for="item in btmRefer.referTypeList" :key="item.value" :label="item.label"
                                    :value="item.value">
                                </el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="参照名称" label-width="100px">
                            <el-input v-model="attribute.referToName" @focus="openReferConfig" clearable="true"
                                :disabled="referToFlag" @clear="clearReferTo">
                                <i slot="suffix" class="el-input__icon el-icon-search"></i>
                            </el-input>
                        </el-form-item>
                    </el-tab-pane>
                    <el-tab-pane label="枚举" name="enumTab">
                        <el-form-item label="枚举" label-width="100px">
                            <el-input v-model="attribute.dictValue" @focus="openEnumConfig" clearable="true">
                                <i slot="suffix" class="el-input__icon el-icon-search"></i>
                            </el-input>
                        </el-form-item>
                        <el-form-item label="枚举项" label-width="100px">
                        </el-form-item>
                    </el-tab-pane>
                </el-tabs>
            </el-form>
            <div slot="footer" class="dialog-footer">
                <el-button type="primary" @click="submitAttribute">确定</el-button>
                <el-button @click="cancleSubmit">取消</el-button>
            </div>
            <!-- é€‰æ‹©å‚照时的弹窗 -->
            <el-dialog title="参照列表" :visible.sync="btmRefer.show" append-to-body @close="closeReferDialog" width="80%"
                style="height: 115vh;">
                <el-container>
                    <el-aside>
                        <basic-container>
                           <span class="el-dialog__title"> {{ domain.treeOption.title }} </span>
                            <div style="height:20px;"></div>
                            <avue-tree id="domain" :data="domain.data" :option="domain.treeOption" @node-click="nodeClick"
                                class="businessTree" style="height: 418px">
                                <span class="el-tree-node__label" slot-scope="{ node, data }">
                                    <span>
                                        <i class="el-icon-star-on"></i>
                                        {{ (node || {}).label }}
                                    </span>
                                </span>
                            </avue-tree>
                        </basic-container>
                    </el-aside>
                    <el-main>
                        <basic-container>
                            <avue-crud ref="btmTable" :option="btmRefer.option" :data="btmRefer.data" class="btmTable" @row-click="btmReferClick">
                                <template slot="radio" slot-scope="{row}">
                                    <el-radio v-model="btmRefer.selectRow" :label="row.$index">&nbsp;
                                    </el-radio>
                                </template>
                            </avue-crud>
                        </basic-container>
                    </el-main>
                </el-container>
                <div slot="footer" class="dialog-footer">
                    <el-button type="primary" @click="confirmBtm" size="small">确定</el-button>
                    <el-button @click="cancleBtm" size="small">取消</el-button>
                </div>
            </el-dialog>
            <!-- é€‰æ‹©æžšä¸¾æ—¶çš„弹窗 -->
            <el-dialog title="枚举列表" :visible.sync="enumRefer.show" append-to-body @close="closeEnumDialog" width="70%"
                style="height: 115vh;">
                <avue-crud ref="eunmTable" :option="enumRefer.option" :data="enumRefer.data" class="enumTable" @row-click="enumReferClick" :page.sync="enumRefer.enumPage">
                    <template slot="radio" slot-scope="{row}">
                        <el-radio v-model="enumRefer.selectRow" :label="row.$index">&nbsp;
                        </el-radio>
                    </template>
                </avue-crud>
                <div slot="footer" class="dialog-footer">
                    <el-button type="primary" @click="confirmEnum" size="small">确定</el-button>
                    <el-button @click="cancleEnum" size="small">取消</el-button>
                </div>
            </el-dialog>
        </el-dialog>
    </el-container>
</template>
<script>
import { getDictionary,getParentList } from '@/api/omd/enum'
import { initTree,btmPage } from '@/api/omd/btmType'
import { add} from '@/api/omd/OmdAttribute'
export default {
    name: 'originalAdd',
    props: {
        attribute: {
            type: Object
        },
    },
    data() {
        return {
            showSubmitDialog: false,
            // é»˜è®¤çš„页签
            activeName: 'referTab',
            // å±žæ€§ç±»åž‹ä¸‹æ‹‰æ¡†æ•°æ®
            typeList: [],
            // å‚照下拉框是否可用
            referToFlag: true,
            // è¡¨å•校验规则
            rules: {
                id: [
                    { required: true, message: '请输入属性编号', trigger: 'blur' },
                    { pattern: /^[A-Za-z]+$/, message: '属性编号只能为英文', trigger: 'blur' },
                    { min: 2, max: 15, message: '长度在2到15个字符', trigger: 'blur' }
                ],
                name: [
                    { required: true, message: '请输入属性名称', trigger: 'blur' }
                ],
                typeValue: [
                    { required: true, message: '请选择属性类型', trigger: 'change' }
                ],
                maxLength: [
                    { required: true, message: '需要指定长度', trigger: 'blur' }
                ]
            },
            // å‚照页面表格配置
            btmRefer: {
                show: false,
                btmPage: {
                    pageSize: 10,
                    currentPage: 1,
                    total: 100
                },
                option: {
                    height: 405,
                    addBtn: false,
                    refreshBtn: false,
                    columnBtn: false,
                    menu: false,
                    border: true,
                    reserveSelection: true,
                    searchMenuSpan: 32,
                    searchShowBtn: false,
                    highlightCurrentRow: true,
                    column: [
                        {
                        label: '',
                        prop: 'radio',
                        width: 60,
                        hide: false
                    },
                    {
                        label: '英文名称',
                        prop: 'id',
                        align: 'center',
                        searchSpan:8,
                        search: true,
                    }, {
                        label: '中文名称',
                        prop: 'name',
                        align: 'center',
                        searchSpan:8,
                        search: true,
                    }]
                },
                // å‚照页面表格数据
                data: [],
                selectRow: '',
                selectItem: {},
                referTypeList: []
            },
            // æžšä¸¾å‚照表格配置
            enumRefer: {
                show: false,
                enumPage: {
                    pageSize: 10,
                    currentPage: 1,
                    total: 100
                },
                option: {
                    height: 360,
                    addBtn: false,
                    refreshBtn: false,
                    columnBtn: false,
                    selection: true,
                    menu: false,
                    border: true,
                    reserveSelection: true,
                    searchMenuSpan: 32,
                    searchShowBtn: false,
                    highlightCurrentRow: true,
                    column: [{
                        label: '',
                        prop: 'radio',
                        width: 60,
                        hide: false
                    },{
                        label: '枚举代号',
                        prop: 'name',
                        align: 'center',
                        searchSpan:8,
                        search: true,
                    }, {
                        label: '枚举名称',
                        prop: 'label',
                        align: 'center',
                        searchSpan:8,
                        search: true,
                    }]
                },
                // æžšä¸¾å‚照表格数据
                data: [],
                enumDictionary: [],
                // é€‰å®šè¡Œ
                selectRow: '',
                selectItem: {}
            },
            domain: {
                data: [],
                treeOption: {
                    defaultExpandAll: true,
                    title: '领域服务树',
                    props: {
                        labelText: '',
                        label: 'name',
                        value: 'oid',
                    }
                }
            }
        }
    },
    created() {
        this.initAttributeTypeList();
        this.initAttributeReferTypeList();
    },
    methods: {
        closeSubmitDialog() {
            this.resetAttributeForm();
            this.showSubmitDialog = false;
        },
        resetAttributeForm() {
            this.attribute = {
                nullable: true,
                referTypeKey: '',
            };
            this.referToFlag = true;
            this.$refs.form.resetFields();
        },
        submitAttribute() {
            add(this.attribute).then(res => {
                this.$message.success("保存成功");
                this.showSubmitDialog = false;
                this.attribute = {};
                this.$emit('refreshTable');
            });
        },
        cancleSubmit() {
            this.closeSubmitDialog();
        },
        closeEnumDialog() {
            this.cancleEnum();
         },
        closeReferDialog() {
            this.cancleBtm();
        },
        confirmBtm() {
            this.attribute.referToId = this.btmRefer.selectItem.oid;
            this.attribute.referToName = this.btmRefer.selectItem.name;
            this.btmRefer.show = false;
        },
        cancleBtm() {
            this.btmRefer.selectItem = {};
            this.btmRefer.show = false;
            this.btmRefer.selectRow = '';
        },
        confirmEnum() {
            this.attribute.usingDict = true;
            this.attribute.dictCode = this.enumRefer.selectItem.name;
            this.attribute.dictValue = this.enumRefer.selectItem.label;
            this.enumRefer.show = false;
         },
        cancleEnum() {
            this.enumRefer.selectItem = {};
            this.enumRefer.show = false;
            this.enumRefer.selectRow = '';
        },
        // å‚照名称输入框获取焦点时的事件
        openReferConfig() {
            if (!this.attribute.referTypeKey) {
                this.$message.warning('请先选择参照的类型');
                this.referToFlag = true;
                return;
            }
            this.domain.data = [];
            this.btmRefer.data = [];
            initTree().then(res => {
                this.domain.data = res.data.data;
            })
            this.btmRefer.show = true;
        },
        // å‚照类型树的点击事件
        nodeClick(data) {
            // åŒºåˆ†ä¸šåŠ¡ç±»åž‹çš„æŸ¥è¯¢å’Œé“¾æŽ¥ç±»åž‹çš„æŸ¥è¯¢
            if(this.attribute.referTypeKey == 'btmType'){
                btmPage(this.btmRefer.btmPage.currentPage,this.btmRefer.btmPage.pageSize,{domain:data.id}).then(res => {
                    this.btmRefer.data = res.data.data.records;
                    this.btmRefer.btmPage.total = res.data.data.total;
                })
            }
            if(this.attribute.referTypeKey == 'linkType'){
            }
        },
        // æžšä¸¾ç±»åž‹è¾“入框获得焦点时的事件
        openEnumConfig() {
            getParentList(this.enumRefer.enumPage.currentPage,this.enumRefer.enumPage.pageSize).then(res => {
                this.enumRefer.enumPage.total = res.data.data.total;
                this.enumRefer.data = res.data.data.records;
            })
            this.enumRefer.show = true;
        },
        // å±žæ€§ç±»åž‹ä¸‹æ‹‰æ¡†é€‰æ‹©äº‹ä»¶
        typeSelectChange(value) {
            if (value == 'VTString') {
                this.$set(this.attribute,"maxLength",150)
            } else if (value == 'VTInteger') {
                this.$set(this.attribute,"maxLength",50)
            } else if (value == 'VTBoolean') {
                this.$set(this.attribute,"maxLength",5)
            } else if (value == 'VTDouble') {
                this.$set(this.attribute,"maxLength",26)
                this.$set(this.attribute,"precision",8)
            } else if (value == 'VTLong') {
                this.$set(this.attribute,"maxLength",150)
            } else if (value == 'VTDate' || value == 'VTTime' || value == 'VTDateTime') {
                this.$set(this.attribute,"maxLength",6)
            } else {
                this.$set(this.attribute,"maxLength",50)
            }
            this.attribute.typeCode = 'attributeType';
            this.attribute.typeKey = value;
        },
        referTypeSelectChange(value) {
            this.attribute.referTypeCode = 'attributeReferType';
            this.attribute.referTypeKey = value;
            this.referToFlag = false;
        },
        initAttributeTypeList() {
            getDictionary({ code: 'attributeType' }).then(res => {
                res.data.data.forEach(element => {
                    this.typeList.push(
                        { value: element.itemValue, label: element.itemName }
                    )
                });
            }).catch(() => {
                this.$message.error('属性类型没找到或者未定义')
            })
        },
        initAttributeReferTypeList(){
            getDictionary({ code: 'attributeReferType' }).then(res => {
                res.data.data.forEach(element => {
                    this.btmRefer.referTypeList.push(
                        { value: element.itemValue, label: element.itemName }
                    )
                });
            }).catch(() => {
                this.$message.error('参照类型没找到或者未定义')
            })
        },
        btmReferClick(row){
            this.btmRefer.selectItem = row;
            this.btmRefer.selectRow = row.$index;
        },
        enumReferClick(row){
            this.enumRefer.selectItem = row;
            this.enumRefer.selectRow = row.$index;
        },
        // å‚照名称点击清除数据
        clearReferTo(){
            this.$delete(this.attribute,'referToId');
            this.$delete(this.attribute,'referToName');
            this.btmRefer.selectItem = {};
            this.btmRefer.selectRow = '';
        },
        handleClick(tab){
            // å› ä¸ºåªèƒ½å‚照和枚举二选一。所以在切换的时候把属性给清空。
            this.$delete(this.attribute,'referTypeCode');
            this.$delete(this.attribute,'referTypeKey');
            this.$delete(this.attribute,'referTypeValue');
            this.$delete(this.attribute,'referToId');
            this.$delete(this.attribute,'referToName');
            this.$delete(this.attribute,'dictCode');
            this.$delete(this.attribute,'dictKey');
            this.$delete(this.attribute,'dictValue');
            this.$delete(this.attribute,'usingDict');
        }
    }
}
</script>
<style>
.btmTable>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
    display: none !important;
}
.enumTable>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
    display: none !important;
}
.attributeForm>.el-form-item>.el-form-item__content>.el-input>.el-input__inner {
    width: 200px;
}
</style>
Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java
@@ -41,7 +41,7 @@
     * nacos dev åœ°å€
     */
    //String NACOS_DEV_ADDR = "dev.vci-tech.com:38848";
    String NACOS_DEV_ADDR = "localhost:8848";
    String NACOS_DEV_ADDR = "127.0.0.1:8848";
    /**
     * nacos prod åœ°å€
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.omd.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
@@ -36,6 +37,7 @@
     */
    @ApiModelProperty(value = "主键")
    @NotNull
    @TableId
    private String oid;
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
@@ -127,7 +127,7 @@
    @PostMapping("/submit")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "新增或修改", notes = "传入元数据对象")
    public R submit(@Valid @RequestBody AttributeDTO dto) {
    public R submit(@RequestBody AttributeDTO dto) {
        CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
        return R.status(attributeService.submit(dto));
    }
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
@@ -53,9 +53,6 @@
    private final String REGEXP = "^[A-Za-z]+$";
    @Resource
    private BtmTypeMapper btmTypeMapper;
    @Override
    public boolean deleteLogic(@NotEmpty List<Long> ids) {
        return false;
@@ -86,17 +83,17 @@
     */
    @Override
    public boolean submit(AttributeDTO dto) {
        if (Pattern.compile(REGEXP).matcher(dto.getId()).matches()){
        if (!Pattern.compile(REGEXP).matcher(dto.getId()).matches()){
            throw new VciBaseException("属性名称{0}只能是英文",new Object[]{dto.getId()});
        }
        LambdaQueryWrapper<Attribute> wrapper = Wrappers.<Attribute>query().lambda().eq(Attribute::getId, dto.getId());
        Long count = baseMapper.selectCount((Func.isEmpty(dto.getId())) ? wrapper : wrapper.notIn(Attribute::getId, dto.getId()));
        Long count = baseMapper.selectCount((Func.isEmpty(dto.getOid())) ? wrapper : wrapper.notIn(Attribute::getOid, dto.getOid()));
        if (count > 0L) {
            throw new ServiceException("属性名已存在!");
        }
        Attribute omdAttribute = BeanUtil.copy(dto, Attribute.class);
        Attribute attribute = AttributeWrapper.build().copyBeforeSave(dto);
        CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
        return saveOrUpdate(omdAttribute);
        return saveOrUpdate(attribute);
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/AttributeWrapper.java
@@ -1,12 +1,18 @@
package com.vci.ubcs.omd.wrapper;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.omd.constant.BtmTypeConstant;
import com.vci.ubcs.omd.dto.AttributeDTO;
import com.vci.ubcs.omd.entity.Attribute;
import com.vci.ubcs.omd.vo.*;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.system.cache.DictBizCache;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.StringUtil;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -32,12 +38,13 @@
    @Override
    public AttributeVO entityVO(Attribute entity) {
        AttributeVO vo = Objects.requireNonNull(BeanUtil.copy(entity, AttributeVO.class));
        vo.setTypeValue(DictBizCache.getValue(vo.getTypeCode(),vo.getTypeKey()));
        vo.setTypeValue(EnumCache.getValue(vo.getTypeCode(),vo.getTypeKey()));
        if (StringUtil.isNotBlank(vo.getReferTypeCode())){
            vo.setReferTypeValue(DictBizCache.getValue(vo.getReferTypeCode(),vo.getReferTypeKey()));
            vo.setReferTypeValue(EnumCache.getValue(vo.getReferTypeCode(),vo.getReferTypeKey()));
        }
        vo.setDictValue(vo.getDictKey());
        vo.setTypeValue(vo.getTypeKey());
        if (StringUtil.isNotBlank(vo.getDictCode())) {
            vo.setDictValue(EnumCache.getValue(vo.getDictCode(),vo.getDictKey()));
        }
        return vo;
    }
@@ -49,4 +56,27 @@
    public List<AttributeVO> listEntityVO(List<Attribute> list) {
        return list.stream().map(this::entityVO).collect(Collectors.toList());
    }
    /**
     * åœ¨ä¿å­˜ä¹‹å‰è¦è®¾ç½®é»˜è®¤å±žæ€§
     * @param dto
     * @return
     */
    public Attribute copyBeforeSave(AttributeDTO dto) {
        Attribute attribute = BeanUtil.copy(dto, Attribute.class);
        Objects.requireNonNull(attribute);
        String currentUser = AuthUtil.getUserAccount();
        Date now = new Date();
        if (StringUtil.isBlank(dto.getOid())) {
            attribute.setBtmName(BtmTypeConstant.ATTRIBUTE);
            attribute.setCreator(currentUser);
            attribute.setCreateTime(now);
            attribute.setOwner(currentUser);
            attribute.setOid(VciBaseUtil.getPk());
        }
        attribute.setLastModifier(currentUser);
        attribute.setLastModifyTime(now);
        attribute.setTs(now);
        return attribute;
    }
}