From 1a07db181c732729abc1d6ec71ae206ecffca86d Mon Sep 17 00:00:00 2001
From: lihang <lihang@vci-tech.com>
Date: 星期三, 24 五月 2023 18:33:45 +0800
Subject: [PATCH] 迁移链接类型后台接口,修正属性字段,增加元数据查找应用范围功能

---
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java                     |   68 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeMapper.java                       |   13 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java        |    4 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeConstant.java            |   76 -
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IModifyAttributeService.java             |   10 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java |    2 
 Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/IDdlService.java                         |   60 -
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeServiceImpl.java            |  868 +++++++++++++++++++++
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeAttributeService.java           |   35 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableAddColumnDTO.java               |   26 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeAttributeWrapper.java            |   55 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java              |    4 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeAttributeWrapper.java             |    3 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java                   |    5 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeAttributeServiceImpl.java   |   59 +
 Source/UBCS-WEB/src/api/omd/OmdAttribute.js                                                                       |   10 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/AttributeVO.java                      |    4 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkType.java                     |    9 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/LinkTypeAttributeVO.java              |   12 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java           |   68 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeMapper.xml                                    |   34 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/BtmTypeCache.java                  |    3 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeAttribute.java            |    6 
 Source/UBCS-WEB/src/views/modeling/cycle.vue                                                                      |   23 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeService.java                    |  206 +++++
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckResultDTO.java             |   30 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java                       |    2 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java                    |   54 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeAttributeMapper.xml                           |   38 
 Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java                 |  145 +--
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java                      |   10 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/ModifyAttributeServiceImpl.java     |   76 +
 Source/UBCS-WEB/src/views/modeling/original.vue                                                                   |  101 +
 /dev/null                                                                                                         |   29 
 Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/controller/DdlController.java                    |   29 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java          |   12 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java              |   20 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml                                   |   44 
 Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue                                                                |    6 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckDTO.java                   |   46 +
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java                      |    3 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeWrapper.java                     |   54 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml                         |    6 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/ModifyAttributeWrapper.java              |    2 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeAttributeMapper.java              |   14 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java                      |    3 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java             |   23 
 47 files changed, 2,031 insertions(+), 379 deletions(-)

diff --git a/Source/UBCS-WEB/src/api/omd/OmdAttribute.js b/Source/UBCS-WEB/src/api/omd/OmdAttribute.js
index 690ad99..0573ad8 100644
--- a/Source/UBCS-WEB/src/api/omd/OmdAttribute.js
+++ b/Source/UBCS-WEB/src/api/omd/OmdAttribute.js
@@ -63,3 +63,13 @@
   })
 }
 
+export const getApplyRange = (oid) => {
+  return request({
+    url: '/api/ubcs-omd/attribute/apply-range',
+    method: 'get',
+    params: {
+      oid
+    }
+  })
+}
+
diff --git a/Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue b/Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue
index 92098e3..bb1501a 100644
--- a/Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue
+++ b/Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue
@@ -366,8 +366,8 @@
             this.attrRef.queryNotIn = "";
             this.attrRef.selectData.forEach(item => {
                 this.btmType.attributes.push({
-                    id: item.key,
-                    name: item.label,
+                    id: item.id,
+                    name: item.name,
                     typeValue: item.typeValue,
                     typeKey: item.typeValue,
                     attrDataType : item.typeValue,
@@ -375,7 +375,7 @@
                     description: item.description,
                     attributeLength: item.maxLength
                 });
-                this.attrRef.queryNotIn += (item.key + ",")
+                this.attrRef.queryNotIn += (item.id + ",")
             });
             this.closeAttrDialog();
         },
diff --git a/Source/UBCS-WEB/src/views/modeling/cycle.vue b/Source/UBCS-WEB/src/views/modeling/cycle.vue
index d4372fb..5e3686d 100644
--- a/Source/UBCS-WEB/src/views/modeling/cycle.vue
+++ b/Source/UBCS-WEB/src/views/modeling/cycle.vue
@@ -10,14 +10,14 @@
   <basic-container >
     <el-button type="primary" @click="dialogTableVisible=true" size="small">鍒涘缓妯℃澘</el-button>
     <el-button type="primary"  size="small" @click="addHandlers">缂栬緫妯℃澘</el-button>
-    <el-button type="primary" size="small" @click="$refs.flow.addNode('娴嬭瘯鑺傜偣')">娣诲姞鑺傜偣</el-button>
+    <el-button type="primary" size="small" @click="$refs.flow.addNode('ffff')">娣诲姞鑺傜偣</el-button>
     <br/><br/>
     <avue-flow ref="flow" v-model="form" :height="703" :option="option" :width="1500">
       <template slot="header" slot-scope="scope">
         <i class="el-icon-delete" @click="$refs.flow.deleteNode(scope.node.id)" style="margin-top: 8px"></i>
       </template>
       <div slot-scope="{node}">
-        <span>鑷畾涔墈{ (node || {}).name }}</span>
+        <span>{{ (node || {}).name }}</span>
       </div>
     </avue-flow>
     <!--    鍒涘缓瀵硅瘽妗�-->
@@ -70,21 +70,6 @@
             prop:"filetype",
             formslot: true,
             span:24
-            // type:"select",
-            // dicData:[
-            //   {
-            //     label:"娴嬭瘯1",
-            //     value:0
-            //   },
-            //   {
-            //     label:"娴嬭瘯2",
-            //     value:1
-            //   },
-            //   {
-            //     label:"娴嬭瘯3",
-            //     value:2
-            //   },
-            // ]
           },
           {
             label: "鎻忚堪",
@@ -126,7 +111,7 @@
         defaultExpandAll: true,
       },
       option: {
-        "nodeList": [
+        nodeList: [
           {
             "id": "nodeA",
             "name": "娴佺▼A-鑺傜偣A",
@@ -152,7 +137,7 @@
             "top": 20,
           }
         ],
-        "lineList": [
+        lineList: [
           {
             "from": "nodeA",
             "to": "nodeB"
diff --git a/Source/UBCS-WEB/src/views/modeling/original.vue b/Source/UBCS-WEB/src/views/modeling/original.vue
index 0521748..fe46d55 100644
--- a/Source/UBCS-WEB/src/views/modeling/original.vue
+++ b/Source/UBCS-WEB/src/views/modeling/original.vue
@@ -17,7 +17,20 @@
                         :label="row.$index">&nbsp;
                     </el-radio>
                 </template>
+         <template slot="menuLeft">
+            <el-button size="small"
+                       plain
+                       type="primary"
+                       icon="el-icon-zoom-in"
+                       @click="applyRangeOpen">鏌ョ湅浣跨敤鑼冨洿
+            </el-button>
+          </template>
         </avue-crud>
+        <el-dialog :visible.sync="applyRange.display" append-to-body :title="applyRange.title" width="600px"
+        @close="applyRangeClose">
+            <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">
@@ -40,10 +53,10 @@
           <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.key" :disabled="true"></el-input>
+                <el-input v-model="itemData.id" :disabled="true"></el-input>
               </el-form-item>
               <el-form-item label="灞炴�у悕绉�">
-                <el-input v-model="itemData.label" :disabled="true"></el-input>
+                <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>
@@ -96,7 +109,7 @@
   getList,
   remove,
   add,
-  update, getPage
+  update, getPage, getApplyRange
 } from "@/api/omd/OmdAttribute";
 
 import { getDictionary } from "@/api/omd/enum";
@@ -157,17 +170,18 @@
             label: '閫夋嫨',
             prop: 'radio',
             width: 60,
-            hide: false
+            hide: false,
+            display: false
           },
           {
             label: '灞炴�х紪鍙�',
-            prop: 'key',
+            prop: 'id',
             align: 'left',
             display: false,
             width: 200
           }, {
             label: '灞炴�у悕绉�',
-            prop: 'label',
+            prop: 'name',
             align: 'left',
             display: false
           },
@@ -237,13 +251,13 @@
             prop: "index",
             column: [
               {
-                label: '灞炴�х紪鐮�',
-                prop: 'key',
+                label: '灞炴�х紪鍙�',
+                prop: 'id',
                 align: 'left',
               },
               {
                 label: '灞炴�у悕绉�',
-                prop: 'label',
+                prop: 'name',
                 align: 'left',
               },
               {
@@ -421,6 +435,36 @@
           }
         ]
       },
+      applyRange: {
+        model: "",
+        title: "搴旂敤鐨勪笟鍔$被鍨�",
+        option: {
+          height: 360,
+          addBtn: false,
+          refreshBtn: false,
+          columnBtn: false,
+          menu: false,
+          border: true,
+          reserveSelection: true,
+          searchMenuSpan:8,
+          searchShowBtn: false,
+          highlightCurrentRow: true,
+          column: [
+            {
+                label: '涓氬姟绫诲瀷缂栧彿',
+                prop: 'id',
+                align: 'left',
+              },
+              {
+                label: '涓氬姟绫诲瀷鍚嶇О',
+                prop: 'name',
+                align: 'left',
+              },
+          ]
+        },
+        data: [],
+        display: false,
+      }
     }
   },
 
@@ -466,7 +510,6 @@
       this.packageLinkBox = false
     },
     selectChange(val) {
-       console.log(val);
        this.referType.key = val.value
       if (val.value == 'businessType'){
         this.referType.value = '涓氬姟绫诲瀷'
@@ -477,7 +520,6 @@
       if(val.value){
         this.referType.disable = false
       }
-      console.log(this.referType.disable)
     },
     selchange(val) {
       this.banList = val
@@ -487,17 +529,7 @@
       this.onLoad(this.pageParent, this.query);
     },
     beforeOpen(done, type) {
-      if (['view', 'edit'].includes(type)) {
-        // 鏌ョ湅鍜岀紪杈戦�昏緫
-        console.log("缂栬緫")
-      } else {
-        //鏂板閫昏緫
-        console.log(this.Typelist)
-        console.log(this.banList)
-
-        console.log("鏂板")
-        console.log(this.typeSelectList)
-      }
+      
       done();
 
     },
@@ -563,8 +595,31 @@
         this.referType.display = true;
         this.referType.title = "璇烽�夋嫨" + this.referType.value
     },
+    applyRangeOpen(){
+        if (!this.selectRow){
+          this.$message({
+            type:"warning",
+            message: "璇峰厛閫夋嫨灞炴��"
+          })
+        }
+        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(){
+      this.applyRange.data = [];
+      this.applyRange.display = false;
+    }
   },
 }
 </script>
 
-<style lang="scss"></style>
+<style lang="scss">
+.applyRangeTable > .el-card:nth-of-type(2) > .el-card__body > .avue-crud__menu{
+    display: none !important;
+}
+</style>
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/BtmTypeCache.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/BtmTypeCache.java
index 2897d65..799f1fa 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/BtmTypeCache.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/cache/BtmTypeCache.java
@@ -9,6 +9,7 @@
 import org.springblade.core.tool.utils.SpringUtil;
 import org.springblade.core.tool.utils.StringPool;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
@@ -71,7 +72,7 @@
 	public static List<BtmTypeVO> listBtmTypeByOidCollection(Collection<String> pkBtmTypeCollection) {
 		String  keyPrefix = BTM_IDS.concat(StringPool.DASH).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
 		return CacheUtil.get(BTM_TYPE_CACHE,keyPrefix,Func.toStr(pkBtmTypeCollection.stream().map(s -> s.substring(0,5))),() ->{
-			R<List<BtmTypeVO>> result = getBtmTypeClient().listBtmTypeByOidCollection(pkBtmTypeCollection);
+			R<List<BtmTypeVO>> result = getBtmTypeClient().listBtmTypeByOidCollection(new ArrayList<>(pkBtmTypeCollection));
 			return result.getData();
 		});
 	}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeConstant.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeConstant.java
index 7ecdc9e..59145dd 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeConstant.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeConstant.java
@@ -11,130 +11,90 @@
 	/**
 	 * 灞炴�х殑涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_ATTRIBUTE_BTM_TYPE = "attribute";
+	public static final String ATTRIBUTE = "attribute";
 
 	/**
 	 * 涓氬姟绫诲瀷瀵硅薄鐨� 涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_BTMTYPE = "btmtype";
+	public static final String BTMTYPE = "btmType";
 
 	/**
 	 * 涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬х殑   涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_BTNTYPE_ATTRIBUTE_BTM_TYPE = "btmtypeAttribute";
+	public static final String BTM_TYPE_ATTRIBUTE = "btmTypeAttribute";
 
 	/**
 	 * 鏋氫妇鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_ENUM_BTM_TYPE = "enum";
+	public static final String ENUM = "enum";
 
 	/**
 	 * 鏋氫妇椤圭殑涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_ENUM_ITEM_BTM_TYPE = "enumitem";
+	public static final String ENUM_ITEM = "enumItem";
 
 	/**
 	 * 绫绘敞閲婄殑涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_CLASS_ANNOTATION_BTM_TYPE = "classannotation";
+	public static final String CLASS_ANNOTATION = "classAnnotation";
 
 	/**
 	 * 灞炴�ф敞閲婄殑涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_FIELD_ANNOTATION_BTM_TYPE = "fieldannotation";
+	public static final String FIELD_ANNOTATION = "fieldAnnotation";
 
 	/**
 	 * 鐢熷懡鍛ㄦ湡鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_LIFE_CYCLE_BTM_TYPE = "lifecycle";
+	public static final String LIFE_CYCLE = "lifecycle";
 
 	/**
 	 * 鐢熷懡鍛ㄦ湡浜嬩欢鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_LIFE_CYCLE_EVENT_BTM_TYPE = "lifecycleevent";
+	public static final String LIFE_CYCLE_EVENT = "lifeCycleEvent";
 
 	/**
 	 * 鐢熷懡鍛ㄦ湡杩炴帴绾跨殑涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_LIFE_CYCLE_LINE_BTM_TYPE = "lifecycleline";
+	public static final String LIFE_CYCLE_LINE = "lifeCycleLine";
 
 	/**
 	 * 鐢熷懡鍛ㄦ湡杩炴帴绾跨殑浜嬩欢  鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_LIFE_CYCLE_LINE_EVENT_BTM_TYPE = "lifecyclelineevent";
+	public static final String LIFE_CYCLE_LINE_EVENT = "lifeCycleLineEvent";
 
 	/**
 	 * 閾炬帴绫诲瀷鐨勫睘鎬� 鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_LINK_TYPE_ATTRIBUTE_BTM_TYPE = "linktypeattribute";
+	public static final String LINK_TYPE_ATTRIBUTE = "linkTypeAttribute";
 
 	/**
 	 * 閾炬帴绫诲瀷 鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_LINK_TYPE_BTM_TYPE = "linktype";
+	public static final String LINK_TYPE = "linkType";
 
 	/**
 	 * 鏂规硶娉ㄩ噴 鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_METHOD_ANNOTATION_BTM_TYPE = "methodannotation";
+	public static final String METHOD_ANNOTATION = "methodAnnotation";
 
 	/**
 	 * 淇敼灞炴�х殑 涓氬姟绫诲瀷鍚嶇О
 	 */
-	public static final String OMD_MODIFY_ATTRIBUTE_BTM_TYPE = "modifyattribute";
+	public static final String MODIFY_ATTRIBUTE = "modifyAttribute";
 
 	/**
 	 * 鍙傛暟娉ㄩ噴 鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_PARAM_ANNOTATION_BTM_TYPE = "paramannotation";
+	public static final String PARAM_ANNOTATION = "paramAnnotation";
 
 	/**
 	 * 鐗堟湰瑙勫垯 鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_REVISION_RULE_BTM_TYPE = "revisionrule";
+	public static final String REVISION_RULE = "revisionRule";
 
 	/**
 	 * 鐘舵�� 鐨勪笟鍔$被鍨嬪悕绉�
 	 */
-	public static final String OMD_STATUS_BTM_TYPE = "status";
-
-	/**
-	 * 缂栫爜瑙勫垯 鐨勪笟鍔$被鍨嬪悕绉�
-	 */
-	public static final String OMD_CODE_RULE_BTM_TYPE = "codeRule";
-
-	/**
-	 * 缂栫爜瑙勫垯鍏冪礌鐨勪笟鍔$被鍨嬪悕绉�
-	 */
-	public static final String OMD_CODE_RULE_ELEMENT_BTM_TYPE = "codeRuleElement";
-
-	/**
-	 * 缂栫爜瑙勫垯涓殑鏋氫妇鍊兼槧灏�
-	 */
-	public static final String OMD_CODE_ENUM_BTM_TYPE = "codeEnum";
-
-	/**
-	 * 缂栫爜鍏冪礌涓殑鐗规畩鏄犲皠
-	 */
-	public static final String OMD_CODE_ELEMENT_MAP_BTM_TYPE = "codeElementMap";
-
-	/**
-	 * 缂栫爜鐨勬柇鍙�
-	 */
-	public static final String OMD_CODE_BREAK_CODE_BTM_TYPE = "codeBreakCode";
-
-	/**
-	 * 缂栫爜鐨勬祦姘村彿
-	 */
-	public static final String OMD_CODE_SERIAL_NUMBER_BTM_TYPE = "codeSerialNumber";
-
-	/**
-	 * 浠g爜鐢熸垚鏂规
-	 */
-	public static final String OMD_CODE_GEN_SCHEMA_BTM_TYPE =  "codeGenSchema";
-
-	/**
-	 * 浠g爜鐢熸垚鏂规js閰嶇疆
-	 */
-	public static final String OMD_CODE_GEN_SCHEMA_JS ="codeGenSchemaJs" ;
+	public static final String STATUS = "status";
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableAddColumnDTO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableAddColumnDTO.java
new file mode 100644
index 0000000..2290ebd
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableAddColumnDTO.java
@@ -0,0 +1,26 @@
+package com.vci.ubcs.omd.dto;
+
+import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
+import com.vci.ubcs.omd.vo.LinkTypeAttributeVO;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description:鏁版嵁琛ㄦ坊鍔犲瓧娈电殑浼犺緭瀵硅薄
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+@Data
+public class TableAddColumnDTO implements Serializable {
+
+	private static final long serialVersionUID = -2024919650323368441L;
+
+	private String tableName;
+
+	private List<BtmTypeAttributeVO> btmTypeAttributeVOList;
+
+	private List<LinkTypeAttributeVO> linkTypeAttributeVOList;
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckDTO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckDTO.java
new file mode 100644
index 0000000..d3cdb3b
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckDTO.java
@@ -0,0 +1,46 @@
+package com.vci.ubcs.omd.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Description: 鍙戦�丏DL鏈嶅姟鐨勫璞�
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+@Data
+public class TableCheckDTO implements Serializable {
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -8701934126197627838L;
+	/**
+	 * 绫诲瀷鍚嶇О
+	 */
+	private String btmName;
+	/**
+	 * 琛ㄥ悕
+	 */
+	private String tableName;
+
+	/**
+	 * 鏄惁妫�楠岃〃涓�
+	 */
+	private Boolean checkTableHasData;
+
+	/**
+	 * 鏄惁鍒犻櫎
+	 */
+	private Boolean needDelete;
+
+	/**
+	 * 棰嗗煙鍊�
+	 */
+	private String domain;
+
+	private Boolean done;
+
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckResultDTO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckResultDTO.java
new file mode 100644
index 0000000..ec18338
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/dto/TableCheckResultDTO.java
@@ -0,0 +1,30 @@
+package com.vci.ubcs.omd.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description: DDL鏈嶅姟鎿嶄綔鐨勮繑鍥炲��
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+@Data
+public class TableCheckResultDTO implements Serializable {
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 4014121972227815830L;
+
+	/**
+	 * 鎿嶄綔鎴愬姛鐨�
+	 */
+	private List<TableCheckDTO> successList;
+
+	/**
+	 * 鎿嶄綔澶辫触鐨�
+	 */
+	private List<TableCheckDTO> failList;
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java
index 6d45916..aa2c7cb 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java
@@ -7,12 +7,11 @@
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import org.springblade.core.mp.base.BaseEntity;
 import org.springframework.data.annotation.Transient;
 
 import javax.validation.constraints.NotNull;
+import java.io.Serializable;
 import java.util.Date;
 
 
@@ -24,33 +23,33 @@
  */
 @Data
 @ToString(callSuper = true)
-@EqualsAndHashCode(callSuper = true)
 @TableName("pl_omd_attribute")
 @ApiModel(value = "灞炴�у璞�", description = "灞炴�у璞�")
-public class Attribute extends BaseEntity {
+public class Attribute implements Serializable {
 	/**
 	 * 搴忓垪鍖�
 	 */
 	private static final long serialVersionUID = -6792640675358002410L;
 
 	/**
-	 * 绉熸埛ID
+	 * 涓婚敭
 	 */
-	@ApiModelProperty(value = "绉熸埛ID")
-	private String tenantId;
+	@ApiModelProperty(value = "涓婚敭")
+	@NotNull
+	private String oid;
 
 	/**
 	 * 瀛楁缂栧彿
 	 */
 	@ApiModelProperty(value = "瀛楁缂栧彿")
 	@NotNull
-	private String key;
+	private String id;
 
 	/**
 	 * 瀛楁鍚嶇О
 	 */
 	@ApiModelProperty(value = "瀛楁鍚嶇О")
-	private String label;
+	private String name;
 
 	/**
 	 * 灞炴�х被鍨嬪瓧鍏哥爜
@@ -184,4 +183,41 @@
 	@Transient
 	@TableField(exist = false)
 	private String calculateValue;
+
+	/**
+	 * 涓氬姟绫诲瀷鍚嶇О
+	 */
+	@ApiModelProperty("涓氬姟绫诲瀷鍚嶇О")
+	private String btmName;
+
+	/**
+	 * 鎷ユ湁鑰�
+	 */
+	@ApiModelProperty("鎷ユ湁鑰�")
+	private String owner;
+
+	/**
+	 * 鍒涘缓浜�
+	 */
+	@ApiModelProperty("鍒涘缓浜�")
+	private String creator;
+
+	/**
+	 * 鍒涘缓鏃堕棿
+	 */
+	@ApiModelProperty("鍒涘缓鏃堕棿")
+	private Date createTime;
+
+	/**
+	 * 鏈�鍚庝慨鏀逛汉
+	 */
+	@ApiModelProperty("鏈�鍚庝慨鏀逛汉")
+	private String lastModifier;
+
+	/**
+	 * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+	 */
+	@ApiModelProperty("鏈�鍚庝慨鏀规椂闂�")
+	private Date lastModifyTime;
+
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java
index e6c83e0..fa1e56c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java
@@ -16,7 +16,8 @@
 @Data
 @TableName("pl_omd_btm_type")
 @ApiModel(value = "涓氬姟绫诲瀷", description = "涓氬姟绫诲瀷")
-public class BtmType implements java.io.Serializable{
+public class
+BtmType implements java.io.Serializable{
 
 
     /**
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeDO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkType.java
similarity index 92%
rename from Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeDO.java
rename to Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkType.java
index 4d7862a..12f4ef1 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeDO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkType.java
@@ -15,7 +15,7 @@
 @Data
 @TableName("pl_omd_link_type")
 @ApiModel(value = "閾炬帴绫诲瀷", description = "閾炬帴绫诲瀷")
-public class LinkTypeDO implements java.io.Serializable{
+public class LinkType implements java.io.Serializable{
 
     /**
      * 绂佹淇敼杩欎釜鍊�
@@ -76,7 +76,7 @@
     /**
      * 涓氬姟绫诲瀷鍚嶇О
      */
-    private String btmname;
+    private String btmName;
 
     /**
      * 鎷ユ湁鑰�
@@ -108,4 +108,9 @@
      */
     private Date ts;
 
+	/**
+	 * 棰嗗煙鍊�
+	 */
+	private String domain;
+
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeAttribute.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeAttribute.java
index 9e1e620..af7355e 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeAttribute.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/LinkTypeAttribute.java
@@ -10,8 +10,8 @@
 /**
  *
  * 閾炬帴绫诲瀷鍖呭惈鐨勫睘鎬�
- * @author weidy
- * @date 2019/10/11 3:21 PM
+ * @author LiHang
+ * @date 2023/5/24
  */
 @Data
 @TableName("pl_omd_link_type_attr")
@@ -107,7 +107,7 @@
     /**
      * 涓氬姟绫诲瀷鍚嶇О
      */
-    private String btmname;
+    private String btmName;
 
     /**
      * 鎷ユ湁鑰�
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java
index 82a2d1c..d85eb5c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java
@@ -115,7 +115,7 @@
 	/**
 	 * 涓氬姟绫诲瀷鍚嶇О
 	 */
-	private String btmname;
+	private String btmName;
 	/**
 	 * 鍒涘缓浜�
 	 */
@@ -130,4 +130,14 @@
 	 * 鏃堕棿鎴�
 	 */
 	private Date ts;
+
+	/**
+	 * 鏈�鍚庝慨鏀逛汉
+	 */
+	private String lastModifier;
+
+	/**
+	 * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+	 */
+	private Date lastModifyTime;
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/AttributeVO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/AttributeVO.java
index 23b710e..591378b 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/AttributeVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/AttributeVO.java
@@ -28,10 +28,10 @@
 	private static final long serialVersionUID = 279638479374768539L;
 
 	/**
-	 * 涓婚敭ID
+	 * 涓婚敭
 	 */
 	@JsonSerialize(using = ToStringSerializer.class)
-	private Long id;
+	private String oid;
 
 	@ApiModelProperty("瀛楁鑼冨洿")
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/LinkTypeAttributeVO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/LinkTypeAttributeVO.java
index 6d80554..f922f9c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/LinkTypeAttributeVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/LinkTypeAttributeVO.java
@@ -113,7 +113,7 @@
     /**
      * 涓氬姟绫诲瀷鍚嶇О
      */
-    private String btmname;
+    private String btmName;
 
     /**
      * 鎷ユ湁鑰�
@@ -145,12 +145,12 @@
      */
     private Date ts;
 
-    public String getBtmname() {
-        return btmname;
+    public String getBtmName() {
+        return btmName;
     }
 
-    public void setBtmname(String btmname) {
-        this.btmname = btmname;
+    public void setBtmName(String btmName) {
+        this.btmName = btmName;
     }
 
     public String getOwner() {
@@ -378,7 +378,7 @@
                 ", enumName='" + enumName + '\'' +
                 ", enumFlag=" + enumFlag +
                 ", enumItemMap=" + enumItemMap +
-                ", btmname='" + btmname + '\'' +
+                ", btmname='" + btmName + '\'' +
                 ", owner='" + owner + '\'' +
                 ", creator='" + creator + '\'' +
                 ", createTime=" + createTime +
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java
index 6f024d0..d445b03 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java
@@ -7,7 +7,7 @@
 	/**
 	 * 缂栫爜瑙勫垯锛屾湇鍔″惎鍔ㄥ悕
 	 */
-	APPLICATION_NAME_CODE(AppConstant.APPLICATION_NAME_CODE,"缂栫爜瑙勫垯鏈嶅姟"),
+	APPLICATION_NAME_CODE(AppConstant.APPLICATION_NAME_CODE,"涓绘暟鎹�"),
 	;
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/controller/DdlController.java b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/controller/DdlController.java
index e40f69e..819c5e5 100644
--- a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/controller/DdlController.java
+++ b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/controller/DdlController.java
@@ -3,8 +3,7 @@
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.vci.ubcs.ddl.bo.DdlTableBO;
 import com.vci.ubcs.ddl.service.IDdlService;
-import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
-import com.vci.ubcs.omd.dto.BtmTypeDTO;
+import com.vci.ubcs.omd.dto.*;
 import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import io.swagger.annotations.Api;
@@ -83,4 +82,30 @@
 		Func.requireNotNull(ddlDTO,"涓氬姟绫诲瀷涓庨摼鎺ュ璞′紶杈撳璞′笉鑳戒负绌�");
 		return R.data(ddlService.checkDifferent(ddlDTO.getBtmTypeList(),ddlDTO.getLinkTypeList()));
 	}
+
+	/**
+	 * 妫�鏌ユ暟鎹〃鏄惁瀛樺湪鏁版嵁锛屼笉瀛樺湪鍒欏垹闄�
+	 * @param tableCheckDTOList 闇�瑕佹鏌ョ殑琛ㄩ泦鍚�
+	 * @return 妫�鏌ョ粨鏋�
+	 */
+	@PostMapping("/checkTableHasDataThenDelete")
+	@ApiOperation(value = "妫�鏌ユ暟鎹〃鏄惁瀛樺湪鏁版嵁锛屼笉瀛樺湪鍒欏垹闄�")
+	@ApiOperationSupport(order = 6)
+	public R<TableCheckResultDTO> checkTableHasDataThenDelete(@RequestBody List<TableCheckDTO> tableCheckDTOList){
+		Func.requireNotNull(tableCheckDTOList,"闇�瑕佹鏌ョ殑琛ㄩ泦鍚�");
+		return R.data(ddlService.checkTableHasDataThenDelete(tableCheckDTOList));
+	}
+
+	/**
+	 * 涓鸿〃娣诲姞瀛楁
+	 * @param addColumnDTO 娣诲姞鐨勫璞�
+	 * @return 鎵ц缁撴灉
+	 */
+	@PostMapping("/addColumnForTable")
+	@ApiOperation(value = "涓鸿〃娣诲姞瀛楁")
+	@ApiOperationSupport(order = 6)
+	public R addColumnForTable(@RequestBody TableAddColumnDTO addColumnDTO){
+		Func.requireNotNull(addColumnDTO,"娣诲姞鐨勫璞�");
+		return R.status(ddlService.addColumnForTable(addColumnDTO));
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/IDdlService.java b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/IDdlService.java
index ca66ffc..b8b06b3 100644
--- a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/IDdlService.java
+++ b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/IDdlService.java
@@ -1,8 +1,7 @@
 package com.vci.ubcs.ddl.service;
 
 import com.vci.ubcs.ddl.bo.DdlTableBO;
-import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
-import com.vci.ubcs.omd.dto.BtmTypeDTO;
+import com.vci.ubcs.omd.dto.*;
 import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
 import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
@@ -22,37 +21,6 @@
  * @date 2023/4/24
  */
 public interface IDdlService {
-
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鐨勬暟鎹簱琛ㄤ腑鏄惁鏈夋暟鎹�
-	 * @param pkBtmType 涓氬姟绫诲瀷鐨勪富閿�
-	 * @return true琛ㄧず鏈夋暟鎹紝false琛ㄧず娌℃湁鏁版嵁
-	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-	 */
-	boolean checkTableHasData(String pkBtmType) throws VciBaseException;
-
-	/**
-	 * 鏍规嵁涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑涓婚敭鑾峰彇鏁版嵁搴撹〃鏍肩殑鍚嶇О
-	 * @param pkBtmType  涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑涓婚敭
-	 * @return 鏁版嵁搴撹〃鍚嶇О
-	 */
-	String getTableNameByBtmTypeOid(String pkBtmType);
-
-	/**
-	 * 鏍规嵁涓氬姟绫诲瀷鑾峰彇閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉拌幏鍙栨暟鎹簱琛ㄦ牸鐨勫悕绉�
-	 * @param id 涓氬姟绫诲瀷鑾峰彇閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�
-	 * @return 鏁版嵁搴撹〃鍚嶇О
-	 */
-	String getTableNameByBtmTypeId(String id);
-
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鐨勬暟鎹簱琛ㄤ腑鏄惁鏈夋暟鎹�
-	 * @param id 涓氬姟绫诲瀷鐨勮嫳鏂囧悕绉�
-	 * @return true琛ㄧず鏈夋暟鎹紝false琛ㄧず娌℃湁鏁版嵁
-	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-	 */
-	boolean checkTableHasDataById(String id) throws VciBaseException;
-
 	/**
 	 * 鎵归噺灏嗕笟鍔$被鍨嬪垱寤烘暟鎹簱琛�
 	 * @param pkBtmTypes 涓氬姟绫诲瀷鐨勪富閿�
@@ -137,12 +105,6 @@
 	 */
 	void dropColumnByName(String tableName, String columnName);
 
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑瀵瑰簲鐨勮〃鏍兼槸鍚﹀瓨鍦�
-	 * @param pkBtmType 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑琛ㄦ牸
-	 * @return true琛ㄧず瀛樺湪锛宖alse琛ㄧず涓嶅瓨鍦�
-	 */
-	boolean checkTableExist(String pkBtmType);
 
 	/**
 	 * 鏍规嵁琛ㄦ牸鐨勫悕绉板垽鏂〃鏍兼槸鍚﹀瓨鍦�
@@ -151,12 +113,6 @@
 	 */
 	boolean checkTableExistByTableName(String tableName);
 
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬫墍瀵瑰簲鐨勮〃鏍兼槸鍚﹀瓨鍦�
-	 * @param id 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑鑻辨枃鍚嶇О
-	 * @return true琛ㄧず瀛樺湪锛宖alse琛ㄧず涓嶅瓨鍦�
-	 */
-	boolean checkTableExistById(String id);
 
 	/**
 	 * 鑾峰彇鏁版嵁搴撳拰涓氬姟绫诲瀷涓殑涓嶅悓鐨勫湴鏂�
@@ -246,4 +202,18 @@
 	 * @return 琛ㄤ俊鎭泦鍚�
 	 */
 	List<BtmTypeVO> getAllTableInfo();
+
+	/**
+	 * 妫�鏌ユ暟鎹〃鏄惁瀛樺湪鏁版嵁锛屼笉瀛樺湪鍒欏垹闄�
+	 * @param tableCheckDTOList 闇�瑕佹鏌ョ殑琛ㄩ泦鍚�
+	 * @return 妫�鏌ョ粨鏋�
+	 */
+	TableCheckResultDTO checkTableHasDataThenDelete(List<TableCheckDTO> tableCheckDTOList);
+
+	/**
+	 * 涓鸿〃娣诲姞瀛楁
+	 * @param addColumnDTO 娣诲姞鐨勫璞�
+	 * @return 鎵ц缁撴灉鏍囪瘑
+	 */
+	Boolean addColumnForTable(TableAddColumnDTO addColumnDTO);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java
index 91bb8c2..3a8e185 100644
--- a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java
@@ -17,6 +17,9 @@
 import com.vci.ubcs.omd.constant.BtmTypeFieldConstant;
 import com.vci.ubcs.omd.constant.BtmTypeLcStatusConstant;
 import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
+import com.vci.ubcs.omd.dto.TableAddColumnDTO;
+import com.vci.ubcs.omd.dto.TableCheckDTO;
+import com.vci.ubcs.omd.dto.TableCheckResultDTO;
 import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
 import com.vci.ubcs.omd.vo.*;
 import com.vci.ubcs.starter.exception.VciBaseException;
@@ -119,77 +122,6 @@
 		}
 	}
 
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鐨勬暟鎹簱琛ㄤ腑鏄惁鏈夋暟鎹�
-	 *
-	 * @param pkBtmType 涓氬姟绫诲瀷鐨勪富閿�
-	 * @return true琛ㄧず鏈夋暟鎹紝false琛ㄧず娌℃湁鏁版嵁
-	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-	 */
-	@Override
-	public boolean checkTableHasData(String pkBtmType) throws VciBaseException {
-		return checkTableHasDataByTableName(getTableNameByBtmTypeOid(pkBtmType));
-	}
-
-	/**
-	 * 鏍规嵁涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑涓婚敭鑾峰彇鏁版嵁搴撹〃鏍肩殑鍚嶇О
-	 *
-	 * @param pkBtmType 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑涓婚敭
-	 * @return 鏁版嵁搴撹〃鍚嶇О
-	 */
-	@Override
-	public String getTableNameByBtmTypeOid(String pkBtmType) {
-		VciBaseUtil.alertNotNull(pkBtmType, "涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑涓婚敭");
-		BtmTypeVO btmType = BtmTypeCache.getDetail(pkBtmType);
-		String tableName = "";
-		if (btmType == null || StringUtils.isBlank(btmType.getOid())) {
-			/*OsLinkTypeDO linkTypeDO = linkTypeDOMapper.selectByPrimaryKey(pkBtmType.trim());
-			if(linkTypeDO == null || StringUtils.isBlank(linkTypeDO.getOid()) ){
-				throw new com.vci.starter.web.exception.VciBaseException("涓嶆槸涓氬姟绫诲瀷锛屼篃涓嶆槸閾炬帴绫诲瀷锛岃鏌ヨ瘉");
-			}else{
-				tableName = linkTypeService.getTableName(linkTypeDO.getId());
-			}*/
-		} else {
-			tableName = btmType.getTableName();
-		}
-		return tableName;
-	}
-
-	/**
-	 * 鏍规嵁涓氬姟绫诲瀷鑾峰彇閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉拌幏鍙栨暟鎹簱琛ㄦ牸鐨勫悕绉�
-	 *
-	 * @param id 涓氬姟绫诲瀷鑾峰彇閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�
-	 * @return 鏁版嵁搴撹〃鍚嶇О
-	 */
-	@Override
-	public String getTableNameByBtmTypeId(String id) {
-		VciBaseUtil.alertNotNull(id, "涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑鑻辨枃鍚嶇О");
-		List<BtmTypeVO> btmTypeList = BtmTypeCache.selectByIdCollection(VciBaseUtil.str2List(id));
-		String tableName = "";
-		if (CollectionUtils.isEmpty(btmTypeList)) {
-			/*List<OsLinkTypeDO> linkTypeDOList = linkTypeDOMapper.selectByIdCollection(VciBaseUtil.str2List(id));
-			if(CollectionUtils.isEmpty(linkTypeDOList)){
-				throw new com.vci.starter.web.exception.VciBaseException("涓嶆槸涓氬姟绫诲瀷锛屼篃涓嶆槸閾炬帴绫诲瀷锛岃鏌ヨ瘉");
-			}else{
-				tableName = linkTypeService.getTableName(linkTypeDOList.get(0).getId());
-			}*/
-		} else {
-			tableName = btmTypeList.get(0).getTableName();
-		}
-		return tableName;
-	}
-
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鐨勬暟鎹簱琛ㄤ腑鏄惁鏈夋暟鎹�
-	 *
-	 * @param id 涓氬姟绫诲瀷鐨勮嫳鏂囧悕绉�
-	 * @return true琛ㄧず鏈夋暟鎹紝false琛ㄧず娌℃湁鏁版嵁
-	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
-	 */
-	@Override
-	public boolean checkTableHasDataById(String id) throws VciBaseException {
-		return checkTableHasDataByTableName(getTableNameByBtmTypeId(id));
-	}
 
 	/**
 	 * 鎵归噺灏嗕笟鍔$被鍨嬪垱寤烘暟鎹簱琛�
@@ -480,16 +412,6 @@
 		ddlMapper.dropTableColumn(tableName, columnName);
 	}
 
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑瀵瑰簲鐨勮〃鏍兼槸鍚﹀瓨鍦�
-	 *
-	 * @param pkBtmType 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑琛ㄦ牸
-	 * @return true琛ㄧず瀛樺湪锛宖alse琛ㄧず涓嶅瓨鍦�
-	 */
-	@Override
-	public boolean checkTableExist(String pkBtmType) {
-		return checkTableExistByTableName(getTableNameByBtmTypeOid(pkBtmType));
-	}
 
 	/**
 	 * 鏍规嵁琛ㄦ牸鐨勫悕绉板垽鏂〃鏍兼槸鍚﹀瓨鍦�
@@ -502,16 +424,6 @@
 		return ddlMapper.checkTableExist(tableName) > 0;
 	}
 
-	/**
-	 * 鏍¢獙涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬫墍瀵瑰簲鐨勮〃鏍兼槸鍚﹀瓨鍦�
-	 *
-	 * @param id 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑鑻辨枃鍚嶇О
-	 * @return true琛ㄧず瀛樺湪锛宖alse琛ㄧず涓嶅瓨鍦�
-	 */
-	@Override
-	public boolean checkTableExistById(String id) {
-		return checkTableExistByTableName(getTableNameByBtmTypeId(id));
-	}
 
 	/**
 	 * 鑾峰彇鏁版嵁搴撳拰涓氬姟绫诲瀷涓殑涓嶅悓鐨勫湴鏂�
@@ -1132,4 +1044,55 @@
 		}
 		return new ArrayList<>();
 	}
+
+	/**
+	 * 妫�鏌ユ暟鎹〃鏄惁瀛樺湪鏁版嵁锛屼笉瀛樺湪鍒欏垹闄�
+	 *
+	 * @param tableCheckDTOList 闇�瑕佹鏌ョ殑琛ㄩ泦鍚�
+	 * @return 妫�鏌ョ粨鏋�
+	 */
+	@Override
+	public TableCheckResultDTO checkTableHasDataThenDelete(List<TableCheckDTO> tableCheckDTOList) {
+		TableCheckResultDTO resultDTO = new TableCheckResultDTO();
+		List<TableCheckDTO> successList = new ArrayList<>();
+		List<TableCheckDTO> failList = new ArrayList<>();
+		tableCheckDTOList.forEach(table -> {
+			VciBaseUtil.alertNotNull(table.getTableName(),"鏁版嵁琛ㄥ悕绉�");
+			TableCheckDTO checkDTO = new TableCheckDTO();
+			boolean hasDataFlag = checkTableHasDataByTableName(table.getTableName());
+			if (hasDataFlag){
+				table.setDone(false);
+				failList.add(checkDTO);
+			}else {
+				dropTableByName(table.getTableName());
+				table.setDone(true);
+				successList.add(table);
+			}
+		});
+		if (!CollectionUtils.isEmpty(successList)){
+			resultDTO.setSuccessList(successList);
+		}
+		if (!CollectionUtils.isEmpty(failList)){
+			resultDTO.setFailList(failList);
+		}
+		return resultDTO;
+	}
+
+	/**
+	 * 涓鸿〃娣诲姞瀛楁
+	 *
+	 * @param addColumnDTO 娣诲姞鐨勫璞�
+	 * @return 鎵ц缁撴灉鏍囪瘑
+	 */
+	@Override
+	public Boolean addColumnForTable(TableAddColumnDTO addColumnDTO) {
+		VciBaseUtil.alertNotNull(addColumnDTO,"娣诲姞瀛楁鐨勫璞�");
+		if (!CollectionUtils.isEmpty(addColumnDTO.getLinkTypeAttributeVOList())){
+			addColumn2TableForLink(addColumnDTO.getLinkTypeAttributeVOList());
+		}
+		if(!CollectionUtils.isEmpty(addColumnDTO.getBtmTypeAttributeVOList())){
+			addColumn2TableForBtm(addColumnDTO.getBtmTypeAttributeVOList());
+		}
+		return true;
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
index 84a5c7b..c03805d 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
@@ -27,8 +27,6 @@
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.Valid;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -74,7 +72,7 @@
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "鏌ヨ鍒楄〃", notes = "浼犲叆鏌ヨ")
 	public R<List<AttributeVO>> list(@ApiIgnore @RequestParam Map<String, Object> condition) {
-		return R.data(AttributeWrapper.build().listEntityVO(attributeService.list(Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getKey))));
+		return R.data(AttributeWrapper.build().listEntityVO(attributeService.list(Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getId))));
 	}
 
 	/**
@@ -89,7 +87,7 @@
 	@ApiOperation(value = "鏌ヨ鍒楄〃", notes = "浼犲叆鏌ヨ")
 	public R<IPage<AttributeVO>> pageList(@ApiIgnore @RequestParam Map<String, Object> condition, Query query) {
 		IPage<AttributeVO> pageVO = new Page<>();
-		IPage<Attribute> page = attributeService.page(Condition.getPage(query), Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getKey));
+		IPage<Attribute> page = attributeService.page(Condition.getPage(query), Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getId));
 		BeanUtil.copy(page,pageVO);
 		pageVO.setRecords( AttributeWrapper.build().listEntityVO(page.getRecords()));
 		return R.data(pageVO);
@@ -107,13 +105,13 @@
 		if (StringUtil.isNotBlank(notInStr)){
 			List<String> notInList = Func.toStrList(",", notInStr);
 			if (!CollectionUtils.isEmpty(notInList)){
-				wrapper = wrapper.notIn(Attribute::getKey,notInList);
+				wrapper = wrapper.notIn(Attribute::getId,notInList);
 			}
 		}
 		if (StringUtil.isNotBlank(key)){
-			wrapper = wrapper.like(Attribute::getKey,key);
+			wrapper = wrapper.like(Attribute::getId,key);
 		}
-		IPage<Attribute> page = attributeService.page(Condition.getPage(query),wrapper.orderByAsc(Attribute::getKey));
+		IPage<Attribute> page = attributeService.page(Condition.getPage(query),wrapper.orderByAsc(Attribute::getId));
 		IPage<AttributeVO> pageVO = new Page<>();
 		BeanUtil.copy(page,pageVO);
 		pageVO.setRecords(AttributeWrapper.build().listEntityVO(page.getRecords()));
@@ -149,13 +147,13 @@
 
 	/**
 	 * 鏌ョ湅搴旂敤鑼冨洿
-	 * @param id 涓婚敭
+	 * @param oid 涓婚敭
 	 * @return 鏌ヨ缁撴灉
 	 */
-	@GetMapping("/applyRange")
+	@GetMapping("/apply-range")
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "鏌ョ湅搴旂敤鑼冨洿",notes = "浼犲叆涓婚敭")
-	public R applyRange(Long id){
-		return R.data(attributeService.applyRange(id));
+	public R applyRange(String oid){
+		return R.data(attributeService.applyRange(oid));
 	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java
index 870ccec..f246a67 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java
@@ -38,6 +38,6 @@
 	public R<List<Attribute>> getList(String key) {
 		Map<String,Object> condition = new HashMap<>();
 		condition.put("key",key);
-		return R.data(service.list(Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getKey)));
+		return R.data(service.list(Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getId)));
 	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java
index c0084a2..f54419c 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java
@@ -1,6 +1,8 @@
 package com.vci.ubcs.omd.mapper;
 
 import com.vci.ubcs.omd.entity.Attribute;
+import com.vci.ubcs.omd.entity.BtmType;
+import com.vci.ubcs.omd.vo.BtmTypeVO;
 import org.springblade.core.mp.mapper.BladeMapper;
 
 import java.util.Collection;
@@ -21,9 +23,9 @@
 	List<Attribute> selectAll();
 
 	/**
-	 * 涓婚敭鎵归噺鏌ヨ
-	 * @param primaryKeyCollection 涓婚敭闆嗗悎
-	 * @return 鏌ヨ缁撴灉
+	 * 鏌ヨ搴旂敤鐨勪笟鍔$被鍨�
+	 * @param oid
+	 * @return
 	 */
-	List<Attribute> selectByPrimaryKeyCollection(Collection<String> primaryKeyCollection);
+	List<BtmType> selectApplyRange(String oid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeAttributeMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeAttributeMapper.java
new file mode 100644
index 0000000..3601a2c
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeAttributeMapper.java
@@ -0,0 +1,14 @@
+package com.vci.ubcs.omd.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.vci.ubcs.omd.entity.LinkTypeAttribute;
+
+/**
+ * Description: 閾炬帴绫诲瀷鍖呭惈灞炴�х殑鏁版嵁灞�
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+public interface LinkTypeAttributeMapper extends BaseMapper<LinkTypeAttribute> {
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeMapper.java
new file mode 100644
index 0000000..aa779f4
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/LinkTypeMapper.java
@@ -0,0 +1,13 @@
+package com.vci.ubcs.omd.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.vci.ubcs.omd.entity.LinkType;
+
+/**
+ * Description:
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+public interface LinkTypeMapper extends BaseMapper<LinkType> {
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java
index 3a2df3a..86486e8 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java
@@ -9,6 +9,9 @@
 import com.alibaba.nacos.api.naming.pojo.Instance;
 import com.vci.ubcs.common.constant.LauncherConstant;
 import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
+import com.vci.ubcs.omd.dto.TableAddColumnDTO;
+import com.vci.ubcs.omd.dto.TableCheckDTO;
+import com.vci.ubcs.omd.dto.TableCheckResultDTO;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.vo.DomainVO;
 import com.vci.ubcs.omd.vo.LinkTypeVO;
@@ -16,6 +19,7 @@
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -63,6 +67,16 @@
 	public static final String API_CHECK_DIFFERENT_REFLEX = API_PREFIX + StringPool.SLASH + "checkDifferentAndReflex";
 
 	/**
+	 * 妫�鏌ユ暟鎹〃鏄惁鏈夋暟鎹紝娌℃湁鎸夐渶姹傚垹闄�
+	 */
+	public static final String API_CHECK_TABLE_HAS_DATA_THEN_DELETE = API_PREFIX + StringPool.SLASH + "checkTableHasDataThenDelete";
+
+	/**
+	 * 鏁版嵁琛ㄦ坊鍔犲瓧娈�
+	 */
+	public static final String API_TABLE_ADD_COLUMN = API_PREFIX + StringPool.SLASH + "addColumnForTable";
+
+	/**
 	 * 鐢ㄤ簬鏋勫缓闈欐�佹湇鍔$被
 	 */
 	public static DomainRepeater domainRepeater;
@@ -92,6 +106,60 @@
 		return R.fail(String.valueOf(responseEntity.getStatusCode().value()));
 	}
 
+	/**
+	 * 妫�鏌ユ暟鎹〃鏄惁瀛樺湪鏁版嵁锛屽鏋滀笉瀛樺湪鍒欏垹闄�
+	 * @param checkList 闇�瑕佹鏌ョ殑琛ㄩ泦鍚�
+	 * @return 妫�鏌ョ粨鏋�
+	 * @throws NacosException 鎵句笉鍒版湇鍔$殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	public static R checkTableHasDataByTableNameThenDrop(List<TableCheckDTO> checkList) throws NacosException {
+		Map<String, List<TableCheckDTO>> serviceMap = checkList.stream().collect(Collectors.groupingBy(TableCheckDTO::getDomain));
+		List<TableCheckResultDTO> result = new ArrayList<>();
+		for (String key : serviceMap.keySet()) {
+			String url = getUrl(key, API_CHECK_TABLE_HAS_DATA_THEN_DELETE);
+			ResponseEntity<R> responseEntity = executePost(url, JSONObject.toJSONString(serviceMap.get(key)), new HashMap<>(16));
+			if (responseEntity.getStatusCode().equals(HttpStatus.OK)) {
+				R r = responseEntity.getBody();
+				if (r.getData() instanceof List){
+					List dataList = (List) r.getData();
+					dataList.forEach(data -> {
+						TableCheckResultDTO dto = BeanUtil.copy(JSON.parseObject(JSON.toJSONString(data)), TableCheckResultDTO.class);
+						result.add(dto);
+					});
+				}
+			}
+		}
+		return R.data(result);
+	}
+
+	/**
+	 * 涓鸿〃娣诲姞瀛楁
+	 * @param addColumnDTO 娣诲姞鐨勫璞�
+	 * @param serviceName 鏈嶅姟鍚�
+	 * @return 鎵ц缁撴灉
+	 * @throws NacosException 鎵句笉鍒版湇鍔℃椂鎶涘嚭寮傚父
+	 */
+	public static R addColumnForTable(TableAddColumnDTO addColumnDTO, String serviceName) throws NacosException {
+		try {
+			String url = getUrl(serviceName,API_TABLE_ADD_COLUMN);
+			ResponseEntity<R> responseEntity = executePost(url, JSONObject.toJSONString(addColumnDTO), null);
+			if (responseEntity.getStatusCode().equals(HttpStatus.OK)) {
+				R body = Objects.requireNonNull(responseEntity.getBody());
+				return body;
+			}
+			return R.fail(String.valueOf(responseEntity.getStatusCode().value()));
+		}catch (HttpClientErrorException e) {
+			if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) {
+				R fail = R.fail("璋冪敤鏈嶅姟澶辫触");
+				fail.setCode(HttpStatus.NOT_FOUND.value());
+				return fail;
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+		return R.fail("鏈煡閿欒");
+	}
+
 	@PostConstruct
 	private void init() {
 		domainRepeater = this;
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java
index a4bb36e..c6ed540 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java
@@ -4,6 +4,7 @@
 import com.vci.ubcs.omd.dto.BtmTypeLinkAttributesDTO;
 import com.vci.ubcs.omd.entity.Attribute;
 import com.vci.ubcs.omd.vo.AttributeVO;
+import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import org.springblade.core.mp.base.BaseService;
 
@@ -42,10 +43,10 @@
 
 	/**
 	 * 鏌ョ湅搴旂敤鑼冨洿
-	 * @param id 涓婚敭
+	 * @param oid 涓婚敭
 	 * @return 鏌ヨ宸插簲鐢ㄧ殑涓氬姟绫诲瀷鍚嶇О
 	 */
-	List<String> applyRange(Long id);
+	List<BtmTypeVO> applyRange(String oid);
 
 	/**
 	 * 妫�鏌ュ睘鎬ф槸鍚﹀瓨鍦�
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeAttributeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeAttributeService.java
new file mode 100644
index 0000000..fb44a66
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeAttributeService.java
@@ -0,0 +1,35 @@
+package com.vci.ubcs.omd.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.omd.entity.LinkTypeAttribute;
+import com.vci.ubcs.omd.vo.LinkTypeAttributeVO;
+
+import java.util.List;
+
+/**
+ * Description: 閾炬帴绫诲瀷鍖呭惈灞炴�х殑鏈嶅姟鎺ュ彛
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+public interface ILinkTypeAttributeService extends IService<LinkTypeAttribute> {
+
+	/**
+	 * 鎵归噺鍒犻櫎
+	 * @param oids 涓婚敭闆嗗悎
+	 */
+	void batchDeleteByOids(List<String> oids);
+
+	/**
+	 * 鏍¢獙灞炴�ф槸鍚︾鍚堣姹�
+	 * @param attributeVO 灞炴�ф暟鎹紶杈撳璞�
+	 */
+	void checkAttribute(LinkTypeAttributeVO attributeVO);
+
+	/**
+	 * 涓婚敭鏌ヨ
+	 * @param oid 涓婚敭
+	 * @return 鏌ヨ缁撴灉
+	 */
+	LinkTypeAttribute selectByPrimaryKey(String oid);
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeService.java
new file mode 100644
index 0000000..716a052
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeService.java
@@ -0,0 +1,206 @@
+package com.vci.ubcs.omd.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.omd.entity.LinkType;
+import com.vci.ubcs.omd.vo.LinkTypeAttributeVO;
+import com.vci.ubcs.omd.vo.LinkTypeVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Description: 閾炬帴绫诲瀷鐨勬湇鍔℃帴鍙�
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+public interface ILinkTypeService extends IService<LinkType> {
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷鍒楄〃
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉淇℃伅鍜屾帓搴忎俊鎭紝榛樿浣跨敤id鎺掑簭
+	 * @return 閾炬帴绫诲瀷瀵硅薄鍒楄〃
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鏃朵細鎶涘嚭寮傚父
+	 */
+	IPage<LinkTypeVO> listLinkType(Map<String,String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁涓婚敭鑾峰彇閾炬帴绫诲瀷
+	 * @param pkLinkType 閾炬帴绫诲瀷涓婚敭
+	 * @return 閾炬帴绫诲瀷锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	LinkTypeVO getLinkTypeByOid(String pkLinkType) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁涓婚敭鎵归噺鑾峰彇閾炬帴绫诲瀷
+	 * @param pkLinkTypes 閾炬帴绫诲瀷涓婚敭锛岀敤閫楀彿鍒嗛殧
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	List<LinkTypeVO> listLinkTypeByOids(String pkLinkTypes) throws VciBaseException;
+
+	/**
+	 * 鎵归噺鏍规嵁涓婚敭鑾峰彇閾炬帴绫诲瀷
+	 * @param pkLinkTypeCollection 閾炬帴绫诲瀷涓婚敭闆嗗悎
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	List<LinkTypeVO> listLinkTypeByOidCollection(Collection<String> pkLinkTypeCollection) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О鑾峰彇閾炬帴绫诲瀷
+	 * @param id 鑻辨枃鍚嶇О
+	 * @return 閾炬帴绫诲瀷锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+	 * @throws VciBaseException
+	 */
+	LinkTypeVO getLinkTypeById(String id) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О鎵归噺鑾峰彇閾炬帴绫诲瀷
+	 * @param ids 鑻辨枃鍚嶇О锛屼娇鐢ㄩ�楀彿鍒嗛殧
+	 * @return  閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	List<LinkTypeVO> listLinkTypeByIds(String ids) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О闆嗗悎鎵归噺鑾峰彇閾炬帴绫诲瀷
+	 * @param linkTypeIdCollection 鑻辨枃鍚嶇О闆嗗悎锛屼娇鐢ㄩ�楀彿鍒嗛殧
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	List<LinkTypeVO> listLinkTypeByIdCollection(Collection<String> linkTypeIdCollection) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷鐨勬寚瀹氬睘鎬�
+	 * @param id 閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�
+	 * @param attributeIdCollection 灞炴�х殑闆嗗悎锛屽鏋滀负绌哄垯鑾峰彇鍏ㄩ儴
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	List<LinkTypeAttributeVO> listAttributeVOByIdsForLink(String id, Collection<String> attributeIdCollection);
+
+	/**
+	 * 鏍规嵁閾炬帴绫诲瀷涓婚敭鑾峰彇涓枃鍚嶇О
+	 * @param oid 閾炬帴绫诲瀷涓婚敭
+	 * @return 涓枃鍚嶇О锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull;澶氫釜浼氫互閫楀彿鍒嗛殧
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	String getNameByOid(String oid) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁閾炬帴绫诲瀷鑻辨枃鍚嶇О鑾峰彇涓枃鍚嶇О
+	 * @param id 閾炬帴绫诲瀷鑻辨枃鍚嶇О
+	 * @return 涓枃鍚嶇О锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull;澶氫釜浼氫互閫楀彿鍒嗛殧
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	String getNameById(String id) throws VciBaseException;
+	/**
+	 * 娣诲姞閾炬帴绫诲瀷
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @return 娣诲姞鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 娣诲姞鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	LinkTypeVO addSave(LinkTypeVO linkTypeVO) throws VciBaseException;
+
+	/**
+	 * 娣诲姞閾炬帴绫诲瀷
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @param autoCreateTable 鑷姩鍒涘缓琛ㄦ牸
+	 * @return 娣诲姞鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 娣诲姞鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	LinkTypeVO addSave(LinkTypeVO linkTypeVO,boolean autoCreateTable) throws VciBaseException;
+
+	/**
+	 * 淇敼閾炬帴绫诲瀷
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @return 淇敼鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 淇敼鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	LinkTypeVO editSave(LinkTypeVO linkTypeVO) throws VciBaseException;
+
+	/**
+	 * 淇敼閾炬帴绫诲瀷
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @param autoCreateTable 鑷姩鍒涘缓琛ㄦ牸
+	 * @return 淇敼鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 淇敼鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	LinkTypeVO editSave(LinkTypeVO linkTypeVO,boolean autoCreateTable) throws VciBaseException;
+
+	/**
+	 * 鍒犻櫎閾炬帴绫诲瀷
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄
+	 * @throws VciBaseException 濡傛灉閾炬帴绫诲瀷琚紩鐢紝鎴栬�呭垹闄ゅ嚭閿欐椂浼氭姏鍑哄紓甯�
+	 */
+	void delete(LinkTypeVO linkTypeVO) throws VciBaseException;
+
+	/**
+	 * 鎵归噺鍒犻櫎閾炬帴绫诲瀷
+	 * @param linkTypeVOList 瑕佸垹闄ょ殑閾炬帴绫诲瀷鏄剧ず瀵硅薄鍒楄〃
+	 * @throws VciBaseException 濡傛灉閾炬帴绫诲瀷琚紩鐢紝鎴栬�呭垹闄ゅ嚭閿欐椂浼氭姏鍑哄紓甯�
+	 */
+	void batchDelete(List<LinkTypeVO> linkTypeVOList) throws VciBaseException;
+
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬫坊鍔犲睘鎬у璞�
+	 * @param attributeVO 灞炴�ф樉绀哄璞�
+	 * @param tableName 琛ㄥ悕
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	void addSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName,String serviceName) throws VciBaseException;
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬫坊鍔犲睘鎬у璞�
+	 * @param attributeVO 灞炴�ф樉绀哄璞�
+	 * @param tableName 琛ㄥ悕
+	 * @param autoAdd2Table 鏄惁鑷姩娣诲姞鍒拌〃鏍间腑
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	void addSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName,boolean autoAdd2Table,String serviceName) throws VciBaseException;
+
+	/**
+	 * 妫�鏌ユ煇涓富閿殑閾炬帴绫诲瀷鏄惁瀛樺湪
+	 * @param pkLinkType 閾炬帴绫诲瀷涓婚敭
+	 * @return true琛ㄧず瀛樺湪锛宖alse琛ㄧず涓嶅瓨鍦�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鎴栬�呭弬鏁颁负绌虹殑鏃跺�欐姏鍑哄紓甯�
+	 */
+	boolean checkLinkTypeExist(String pkLinkType) throws VciBaseException;
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬩慨鏀瑰睘鎬у璞�
+	 * @param attributeVO 灞炴�ф樉绀哄璞�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	void editSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName,String domain) throws VciBaseException;
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬩慨鏀瑰睘鎬у璞�
+	 * @param attributeVO 灞炴�ф樉绀哄璞�
+	 * @param autoEdit2Table 鏄惁鑷姩淇敼鍒拌〃鏍�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	void editSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName,String domain,boolean autoEdit2Table) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷鐨勬暟鎹簱琛ㄥ悕绉�
+	 * @param id 閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�
+	 * @param domain 棰嗗煙鍊�
+	 * @return 鏁版嵁搴撹〃鍚嶇О
+	 */
+	String getTableName(String id,String domain) ;
+
+	/**
+	 * 鑾峰彇鎵�鏈変娇鐢ㄧ殑涓氬姟绫诲瀷鐨勮嫳鏂囧悕绉帮紝杞崲涓哄皬鍐�
+	 * @return 鑻辨枃鍚嶇О鑻辨枃灏忓啓
+	 */
+	Set<String> listUsedBtmType();
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IModifyAttributeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IModifyAttributeService.java
index 5ec3afe..0d98401 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IModifyAttributeService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IModifyAttributeService.java
@@ -1,7 +1,10 @@
 package com.vci.ubcs.omd.service;
 
 import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
+import com.vci.ubcs.starter.exception.VciBaseException;
 import org.springblade.core.mp.base.BaseService;
+
+import java.util.List;
 
 /**
  * Description:闇�瑕佷慨鏀规暟鎹簱琛ㄤ腑瀛楁鐨勪俊鎭湇鍔�
@@ -10,4 +13,11 @@
  * @date 2023/5/4
  */
 public interface IModifyAttributeService extends BaseService<ModifyAttributeInfo> {
+
+	/**
+	 * 瀹屾垚璋冩暣
+	 * @param modifyAttributeInfoDOList 瀹屾垚璋冩暣鐨勪俊鎭�
+	 * @throws VciBaseException 淇敼鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+    void finishModify(List<ModifyAttributeInfo> modifyAttributeInfoDOList) throws VciBaseException;
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
index 6e02f0d..03f8eaf 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
@@ -4,15 +4,22 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.vci.ubcs.omd.constant.OmdCacheConstant;
 import com.vci.ubcs.omd.dto.AttributeDTO;
 import com.vci.ubcs.omd.dto.BtmTypeLinkAttributesDTO;
 import com.vci.ubcs.omd.entity.Attribute;
+import com.vci.ubcs.omd.entity.BtmType;
+import com.vci.ubcs.omd.entity.BtmTypeAttribute;
 import com.vci.ubcs.omd.mapper.AttributeMapper;
+import com.vci.ubcs.omd.mapper.BtmTypeMapper;
 import com.vci.ubcs.omd.service.IAttributeService;
 import com.vci.ubcs.omd.vo.AttributeVO;
+import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.wrapper.AttributeWrapper;
+import com.vci.ubcs.omd.wrapper.BtmTypeWrapper;
 import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.util.Map2MPJLambdaUtil;
 import com.vci.ubcs.starter.web.constant.OmdRegExpConstant;
 import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
@@ -21,14 +28,17 @@
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import javax.annotation.Resource;
 import javax.validation.constraints.NotEmpty;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 
@@ -40,6 +50,11 @@
  */
 @Service
 public class AttributeServiceImpl extends ServiceImpl<AttributeMapper, Attribute>  implements IAttributeService {
+
+	private final String REGEXP = "^[A-Za-z]+$";
+
+	@Resource
+	private BtmTypeMapper btmTypeMapper;
 
 	@Override
 	public boolean deleteLogic(@NotEmpty List<Long> ids) {
@@ -71,12 +86,14 @@
 	 */
 	@Override
 	public boolean submit(AttributeDTO dto) {
-		LambdaQueryWrapper<Attribute> wrapper = Wrappers.<Attribute>query().lambda().eq(Attribute::getKey, dto.getKey());
+		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()));
 		if (count > 0L) {
 			throw new ServiceException("灞炴�у悕宸插瓨鍦�!");
 		}
-		dto.setIsDeleted(BladeConstant.DB_NOT_DELETED);
 		Attribute omdAttribute = BeanUtil.copy(dto, Attribute.class);
 		CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
 		return saveOrUpdate(omdAttribute);
@@ -97,18 +114,27 @@
 	/**
 	 * 鏌ョ湅搴旂敤鑼冨洿
 	 *
-	 * @param id 涓婚敭
+	 * @param oid 涓婚敭
 	 * @return 鏌ヨ宸插簲鐢ㄧ殑涓氬姟绫诲瀷鍚嶇О
 	 */
 	@Override
-	public List<String> applyRange(Long id) {
-		return new ArrayList<>();
+	public List<BtmTypeVO> applyRange(String oid) {
+		List<BtmType> btmTypes = baseMapper.selectApplyRange(oid);
+		if (!CollectionUtils.isEmpty(btmTypes)){
+			return btmTypes.stream().map(btm -> {
+				BtmTypeVO vo = new BtmTypeVO();
+				vo.setId(btm.getId());
+				vo.setName(btm.getName());
+				return vo;
+			}).collect(Collectors.toList());
+		}
+		return null;
 	}
 
 	/**
 	 * 妫�鏌ュ睘鎬ф槸鍚﹀瓨鍦�
 	 *
-	 * @param keyCollections 鑻辨枃鍚嶇О闆嗗悎
+	 * @param keyCollections 缂栧彿闆嗗悎
 	 * @return true琛ㄧず閮藉瓨鍦紝false琛ㄧず涓嶅瓨鍦紝涓嶅瓨鍦ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
 	 * @throws VciBaseException 涓嶅瓨鍦ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
@@ -118,9 +144,9 @@
 		if (CollectionUtils.isEmpty(existAttributeVOList)) {
 			throw new VciBaseException("浣跨敤鐨勫睘鎬ч兘鍦ㄧ郴缁熶腑涓嶅瓨鍦紝璇峰厛鏌ヨ瘉");
 		} else {
-			Set<String> existAttributeIdSet = (existAttributeVOList.stream().collect(Collectors.toMap(s -> s.getKey().toLowerCase().trim(), t -> t))).keySet();
+			Set<String> existAttributeOidSet = (existAttributeVOList.stream().collect(Collectors.toMap(s -> s.getId().toLowerCase().trim(), t -> t))).keySet();
 			keyCollections.stream().forEach(s -> {
-				if (!existAttributeIdSet.contains(s)) {
+				if (!existAttributeOidSet.contains(s)) {
 					throw new VciBaseException("浣跨敤鐨勫睘鎬0}鍦ㄧ郴缁熶腑涓嶅瓨鍦紝璇峰厛鏌ヨ瘉", new Object[]{s});
 				}
 			});
@@ -129,9 +155,9 @@
 	}
 
 	/**
-	 * 鏍规嵁鑻辨枃鍚嶇О闆嗗悎鎵归噺鑾峰彇灞炴�у璞�
+	 * 鏍规嵁缂栧彿闆嗗悎鎵归噺鑾峰彇灞炴�у璞�
 	 *
-	 * @param attributeIdCollection 鑻辨枃鍚嶇О闆嗗悎
+	 * @param attributeIdCollection 缂栧彿闆嗗悎
 	 * @return 灞炴�у璞″垪琛紝濡傛灉鏈変笉瀛樺湪鐨勪笉浼氳繑鍥烇紝鍏ㄩ儴涓嶅瓨鍦ㄧ殑鍒欒繑鍥炵┖鍒楄〃
 	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
 	 */
@@ -147,8 +173,8 @@
 	}
 
 	/**
-	 * 鏍规嵁鑻辨枃鍚嶇О闆嗗悎鑾峰彇灞炴�ф暟鎹璞�
-	 * @param attributeIdCollection 灞炴�х殑鑻辨枃鍚嶇О闆嗗悎
+	 * 鏍规嵁缂栧彿闆嗗悎鑾峰彇灞炴�ф暟鎹璞�
+	 * @param attributeIdCollection 灞炴�х殑缂栧彿闆嗗悎
 	 * @return 灞炴�ф暟鎹璞″垪琛紝濡傛灉鏈変笉瀛樺湪鐨勪笉浼氳繑鍥烇紝鍏ㄩ儴涓嶅瓨鍦ㄧ殑鍒欒繑鍥炵┖鍒楄〃
 	 * @throws VciBaseException mybatis鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
 	 */
@@ -159,7 +185,7 @@
 			Collection<Collection<String>> idCollections = VciBaseUtil.switchCollectionForOracleIn(distAttributeIdCollection);
 			if(!CollectionUtils.isEmpty(idCollections)) {
 				idCollections.stream().forEach(s -> {
-					List<Attribute> attributeDOS = baseMapper.selectList(Wrappers.<Attribute>query().lambda().in(Attribute::getKey, s));
+					List<Attribute> attributeDOS = baseMapper.selectList(Wrappers.<Attribute>query().lambda().in(Attribute::getId, s));
 					if(!CollectionUtils.isEmpty(attributeDOS)){
 						attributeDOList.addAll(attributeDOS);
 					}
@@ -173,7 +199,7 @@
 	/**
 	 * 鍒ゆ柇灞炴�х殑鍐呭鏄惁绗﹀悎瑕佹眰
 	 *
-	 * @param id              灞炴�х殑涓婚敭
+	 * @param id              灞炴�х殑缂栧彿
 	 * @param attrDataType    灞炴�х殑绫诲瀷
 	 * @param attributeLength 灞炴�х殑闀垮害
 	 * @param defaultValue    榛樿鍊�
@@ -184,26 +210,26 @@
 	public boolean checkAttributePass(String id, String attrDataType, Integer attributeLength, String defaultValue) throws VciBaseException {
 		String attributeDataTypeText = VciFieldTypeEnum.getTextByValue(attrDataType);
 		if(StringUtils.isBlank(attributeDataTypeText)){
-			throw new VciBaseException("鑻辨枃鍚嶇О涓簕0}鐨勫睘鎬х殑绫诲瀷涓嶇鍚堣姹�",new Object[]{id});
+			throw new VciBaseException("缂栧彿涓簕0}鐨勫睘鎬х殑绫诲瀷涓嶇鍚堣姹�",new Object[]{id});
 		}
 		//蹇呴』瑕佽緭鍏ラ暱搴�
-		if( VciBaseUtil.inArray(new String[] {VciFieldTypeEnum.VTString.name()},attrDataType)
+		if(VciBaseUtil.inArray(new String[] {VciFieldTypeEnum.VTString.name()},attrDataType)
 			&& (attributeLength == null ||attributeLength < 1)){
-			throw new VciBaseException("鑻辨枃鍚嶇О涓簕0}鐨勫睘鎬х殑涓簕1}绫诲瀷鏃讹紝蹇呴』瑕佽緭鍏ラ暱搴︾殑鍊�",new Object[]{id,attributeDataTypeText});
+			throw new VciBaseException("缂栧彿涓簕0}鐨勫睘鎬х殑涓簕1}绫诲瀷鏃讹紝蹇呴』瑕佽緭鍏ラ暱搴︾殑鍊�",new Object[]{id,attributeDataTypeText});
 		}
 		//鍒ゆ柇榛樿鍊�
 		if(StringUtils.isNotBlank(defaultValue)){
 			if(VciFieldTypeEnum.VTDouble.name().equalsIgnoreCase(attrDataType)
 				&& !defaultValue.matches(OmdRegExpConstant.DOUBLE)){
-				throw new VciBaseException("鑻辨枃鍚嶇О涓簕0}鐨勫睘鎬х殑榛樿鍊间笉鏄弻绮惧害绫诲瀷",new Object[]{id});
+				throw new VciBaseException("缂栧彿涓簕0}鐨勫睘鎬х殑榛樿鍊间笉鏄弻绮惧害绫诲瀷",new Object[]{id});
 			}
 			if(VciFieldTypeEnum.VTInteger.name().equalsIgnoreCase(defaultValue)
 				&& !defaultValue.matches(OmdRegExpConstant.INT)){
-				throw new VciBaseException("鑻辨枃鍚嶇О涓簕0}鐨勫睘鎬х殑榛樿鍊间笉鏄暣鏁板瀷",new Object[]{id});
+				throw new VciBaseException("缂栧彿涓簕0}鐨勫睘鎬х殑榛樿鍊间笉鏄暣鏁板瀷",new Object[]{id});
 			}
 			if(VciFieldTypeEnum.VTLong.name().equalsIgnoreCase(defaultValue)
 				&& !defaultValue.matches(OmdRegExpConstant.LONG)){
-				throw new VciBaseException("鑻辨枃鍚嶇О涓簕0}鐨勫睘鎬х殑榛樿鍊间笉鏄暱鏁村舰",new Object[]{id});
+				throw new VciBaseException("缂栧彿涓簕0}鐨勫睘鎬х殑榛樿鍊间笉鏄暱鏁村舰",new Object[]{id});
 			}
 		}
 		return true;
@@ -218,7 +244,7 @@
 	 */
 	@Override
 	public boolean checkAttribute(BtmTypeLinkAttributesDTO attributesDTO) throws VciBaseException {
-		VciBaseUtil.alertNotNull(attributesDTO.getId(), "灞炴�х殑鑻辨枃鍚嶇О", attributesDTO.getName(), "灞炴�х殑涓枃鍚嶇О",
+		VciBaseUtil.alertNotNull(attributesDTO.getId(), "灞炴�х殑缂栧彿", attributesDTO.getName(), "灞炴�х殑鍚嶇О",
 			attributesDTO.getAttrDataType(), "灞炴�х殑鏁版嵁绫诲瀷");
 		boolean pass = checkAttributePass(attributesDTO.getId(), attributesDTO.getAttrDataType(), attributesDTO.getAttributeLength(), attributesDTO.getDefaultValue());
 		if (!pass){
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
index 154d4a0..266fe5a 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
@@ -6,7 +6,7 @@
 import com.alibaba.nacos.api.exception.NacosException;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.vci.ubcs.omd.cache.EnumCache;
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
 import com.vci.ubcs.omd.constant.BtmTypeFieldConstant;
 import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
 import com.vci.ubcs.omd.entity.Attribute;
@@ -722,7 +722,7 @@
 			btmType.setOid(VciBaseUtil.getPk());
 			btmType.setTs(now);
 			btmType.setCreator(user);
-			btmType.setBtmName("btmType");
+			btmType.setBtmName(BtmTypeConstant.BTMTYPE);
 			btmType.setCreateTime(now);
 			btmType.setDomain(domain);
 			btmType.setLastModifyTime(now);
@@ -737,8 +737,8 @@
 			}).map(attr -> {
 				// 娣诲姞灞炴�э紝1鏄牎楠岋紝2鏄坊鍔�
 				Attribute attribute = new Attribute();
-				attribute.setKey(attr.getId());
-				attribute.setLabel(attr.getName());
+				attribute.setId(attr.getId());
+				attribute.setName(attr.getName());
 				attribute.setTypeCode("attributeType");
 				attribute.setTypeKey(attr.getAttrDataType());
 //				attribute.setDictKey(attr.getAttrDataType());
@@ -751,10 +751,14 @@
 				attribute.setReferToId(attr.getReferBtmTypeId());
 				attribute.setReferToName(attr.getReferBtmTypeName());
 				attribute.setTs(now);
+				attribute.setOwner(user);
 				attribute.setCreateTime(now);
-				attribute.setIsDeleted(0);
-				attribute.setCreateUser(AuthUtil.getUserId());
-				idAttrMap.put(attribute.getKey(),attribute);
+				attribute.setLastModifier(user);
+				attribute.setLastModifyTime(now);
+				attribute.setBtmName(BtmTypeConstant.ATTRIBUTE);
+				attribute.setCreator(user);
+				attribute.setOid(VciBaseUtil.getPk());
+				idAttrMap.put(attribute.getId(),attribute);
 				// 鍦ㄨ繖閲岀粰涓氬姟绫诲瀷璁剧疆鐗堟湰鎺у埗銆佺敓鍛藉懆鏈熸帶鍒躲�佸瘑绾ф帶鍒剁浉鍏崇殑淇℃伅
 
 				// 娣诲姞涓氬姟绫诲瀷鍜屽睘鎬х殑鍏崇郴
@@ -764,7 +768,6 @@
 				btmTypeAttribute.setCreateTime(now);
 				btmTypeAttribute.setLastModifier(user);
 				btmTypeAttribute.setLastModifyTime(now);
-//				btmTypeAttribute.setBtmName("btmTypeAttribute");
 				btmTypeAttribute.setOid(VciBaseUtil.getPk());
 				btmTypeAttribute.setBtmName(btmType.getId());
 				btmTypeAttribute.setOwner(user);
@@ -778,7 +781,7 @@
 			btmType.setConsistence(BooleanEnum.TRUE.getValue());
 			btmList.add(btmType);
 		});
-		List<Attribute> existAttr = attributeService.list(Wrappers.<Attribute>query().lambda().in(Attribute::getKey, attributeIds));
+		List<Attribute> existAttr = attributeService.list(Wrappers.<Attribute>query().lambda().in(Attribute::getId, attributeIds));
 		if (!CollectionUtils.isEmpty(btmList)){
 			baseMapper.batchInsert(btmList);
 		}
@@ -800,7 +803,7 @@
 		if (CollectionUtils.isEmpty(existAttr)){
 			attributeService.saveBatch(idAttrMap.values());
 		}else {
-			List<Attribute> addList = idAttrMap.values().stream().filter(a -> existAttr.stream().noneMatch(b -> StringUtils.equals(a.getKey(), b.getKey()))).collect(Collectors.toList());
+			List<Attribute> addList = idAttrMap.values().stream().filter(a -> existAttr.stream().noneMatch(b -> StringUtils.equals(a.getId(), b.getId()))).collect(Collectors.toList());
 			if (!CollectionUtils.isEmpty(addList)) {
 				attributeService.saveBatch(addList);
 			}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeAttributeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeAttributeServiceImpl.java
new file mode 100644
index 0000000..f71b4d3
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeAttributeServiceImpl.java
@@ -0,0 +1,59 @@
+package com.vci.ubcs.omd.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.omd.entity.LinkTypeAttribute;
+import com.vci.ubcs.omd.mapper.LinkTypeAttributeMapper;
+import com.vci.ubcs.omd.service.IAttributeService;
+import com.vci.ubcs.omd.service.ILinkTypeAttributeService;
+import com.vci.ubcs.omd.vo.LinkTypeAttributeVO;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * Description: 閾炬帴绫诲瀷鍖呭惈灞炴�х殑鏈嶅姟
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+@Service
+public class LinkTypeAttributeServiceImpl extends ServiceImpl<LinkTypeAttributeMapper, LinkTypeAttribute> implements ILinkTypeAttributeService {
+
+	/**
+	 * 灞炴�ф湇鍔�
+	 */
+	@Autowired
+	private IAttributeService attributeService;
+	/**
+	 * 鎵归噺鍒犻櫎
+	 *
+	 * @param oids 涓婚敭闆嗗悎
+	 */
+	@Override
+	public void batchDeleteByOids(List<String> oids) {
+		baseMapper.delete(Wrappers.<LinkTypeAttribute>query().lambda().in(LinkTypeAttribute::getOid,oids));
+	}
+
+	@Override
+	public void checkAttribute(LinkTypeAttributeVO attributeVO) {
+		VciBaseUtil.alertNotNull(attributeVO.getId(),"灞炴�х殑鑻辨枃鍚嶇О",attributeVO.getName(),"灞炴�х殑涓枃鍚嶇О",
+			attributeVO.getAttrDataType(),"灞炴�х殑鏁版嵁绫诲瀷");
+		attributeService.checkAttributePass(attributeVO.getId(),attributeVO.getAttrDataType(),attributeVO.getAttributeLength(),attributeVO.getDefaultValue());
+	}
+
+	/**
+	 * 涓婚敭鏌ヨ
+	 *
+	 * @param oid 涓婚敭
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public LinkTypeAttribute selectByPrimaryKey(String oid) {
+		VciBaseUtil.alertNotNull(oid);
+		return baseMapper.selectOne(Wrappers.<LinkTypeAttribute>query().lambda().eq(LinkTypeAttribute::getOid,oid));
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeServiceImpl.java
new file mode 100644
index 0000000..80820f9
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeServiceImpl.java
@@ -0,0 +1,868 @@
+package com.vci.ubcs.omd.service.impl;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.api.exception.NacosException;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
+import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
+import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
+import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.kotlin.KtUpdateChainWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
+import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
+import com.vci.ubcs.omd.dto.TableAddColumnDTO;
+import com.vci.ubcs.omd.dto.TableCheckDTO;
+import com.vci.ubcs.omd.dto.TableCheckResultDTO;
+import com.vci.ubcs.omd.entity.BtmType;
+import com.vci.ubcs.omd.entity.LinkType;
+import com.vci.ubcs.omd.entity.LinkTypeAttribute;
+import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
+import com.vci.ubcs.omd.mapper.LinkTypeMapper;
+import com.vci.ubcs.omd.repeater.DomainRepeater;
+import com.vci.ubcs.omd.service.*;
+import com.vci.ubcs.omd.vo.LinkTypeAttributeVO;
+import com.vci.ubcs.omd.vo.LinkTypeVO;
+import com.vci.ubcs.omd.wrapper.LinkTypeAttributeWrapper;
+import com.vci.ubcs.omd.wrapper.LinkTypeWrapper;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.constant.RegExpConstant;
+import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import com.vci.ubcs.starter.web.util.VciDateUtil;
+import org.springblade.core.launch.constant.AppConstant;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringPool;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanMap;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
+import org.springframework.util.CollectionUtils;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Description: 閾炬帴绫诲瀷鐨勬湇鍔�
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+@Service
+public class LinkTypeServiceImpl extends ServiceImpl<LinkTypeMapper, LinkType> implements ILinkTypeService {
+	/**
+	 * 閾炬帴绫诲瀷鍏宠仈灞炴�х殑鏈嶅姟
+	 */
+	@Autowired
+	private ILinkTypeAttributeService linkTypeAttributeService;
+
+	/**
+	 * 涓氬姟绫诲瀷鏈嶅姟
+	 */
+	@Autowired
+	private IBtmTypeService btmTypeService;
+
+	/**
+	 * 灞炴�х殑鏈嶅姟
+	 */
+	@Autowired
+	private IAttributeService attributeService;
+
+	/**
+	 * 浜嬪姟
+	 */
+	@Autowired
+	private DataSourceTransactionManager dataSourceTransactionManager;
+
+	/**
+	 * 鏇存敼鐨勫睘鎬т俊鎭湇鍔�
+	 */
+	@Autowired
+	private IModifyAttributeService modifyAttributeService;
+
+	public final String BTM_NAME = "linkType";
+
+	/**
+	 * 琛ㄥ悕鍓嶇紑
+	 */
+	public static final String PL = "PL";
+
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷鍒楄〃
+	 *
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper   鍒嗛〉淇℃伅鍜屾帓搴忎俊鎭紝榛樿浣跨敤id鎺掑簭
+	 * @return 閾炬帴绫诲瀷瀵硅薄鍒楄〃
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鏃朵細鎶涘嚭寮傚父
+	 */
+	@Override
+	public IPage<LinkTypeVO> listLinkType(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+		if (conditionMap == null){
+			conditionMap = new HashMap<>(16);
+		}
+		if (pageHelper == null) {
+			pageHelper = new PageHelper(-1);
+		}
+		LinkType queryObj = new LinkType();
+		BeanMap.create(queryObj).putAll(conditionMap);
+		Query query = new Query();
+		query.setCurrent(pageHelper.getPage());
+		query.setSize(pageHelper.getLimit());
+
+		return LinkTypeWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(query),Condition.getQueryWrapper(queryObj).lambda().orderByAsc(LinkType::getId)));
+	}
+
+	/**
+	 * 鏍规嵁涓婚敭鑾峰彇閾炬帴绫诲瀷
+	 *
+	 * @param pkLinkType 閾炬帴绫诲瀷涓婚敭
+	 * @return 閾炬帴绫诲瀷锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	@Override
+	public LinkTypeVO getLinkTypeByOid(String pkLinkType) throws VciBaseException {
+		VciBaseUtil.alertNotNull(pkLinkType,"閾炬帴绫诲瀷鐨勪富閿�");
+		List<LinkTypeVO> linkTypeVOList = listLinkTypeByOids(pkLinkType);
+		if(!CollectionUtils.isEmpty(linkTypeVOList)){
+			return linkTypeVOList.get(0);
+		}
+		return null;
+	}
+
+	/**
+	 * 鏍规嵁涓婚敭鎵归噺鑾峰彇閾炬帴绫诲瀷
+	 *
+	 * @param pkLinkTypes 閾炬帴绫诲瀷涓婚敭锛岀敤閫楀彿鍒嗛殧
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	@Override
+	public List<LinkTypeVO> listLinkTypeByOids(String pkLinkTypes) throws VciBaseException {
+		VciBaseUtil.alertNotNull(pkLinkTypes,"閾炬帴绫诲瀷鐨勪富閿�");
+		List<String> pkList = Func.toStrList(",",pkLinkTypes);
+		return listLinkTypeByOidCollection(pkList);
+	}
+
+	/**
+	 * 鎵归噺鏍规嵁涓婚敭鑾峰彇閾炬帴绫诲瀷
+	 *
+	 * @param pkLinkTypeCollection 閾炬帴绫诲瀷涓婚敭闆嗗悎
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	@Override
+	public List<LinkTypeVO> listLinkTypeByOidCollection(Collection<String> pkLinkTypeCollection) throws VciBaseException {
+		if(!CollectionUtils.isEmpty(pkLinkTypeCollection)){
+			List<LinkType> linkTypeDOList = listLinkTypeDOByOidCollection(pkLinkTypeCollection);
+			if(!CollectionUtils.isEmpty(linkTypeDOList)) {
+				return LinkTypeWrapper.build().listEntityVO(linkTypeDOList);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 鏍规嵁涓婚敭闆嗗悎鎵归噺鑾峰彇鏁版嵁瀵硅薄
+	 * @param oidCollection 涓婚敭闆嗗悎
+	 * @return 涓氬姟绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException  鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	private List<LinkType> listLinkTypeDOByOidCollection(Collection<String> oidCollection) throws VciBaseException {
+		if(!CollectionUtils.isEmpty(oidCollection)){
+			List<LinkType> linkTypeDOList = new ArrayList<>();
+			Collection<Collection<String>> pksCollections = VciBaseUtil.switchCollectionForOracleIn(oidCollection);
+			if(CollectionUtils.isEmpty(pksCollections)) {
+				return linkTypeDOList;
+			}
+			pksCollections.forEach(s -> {
+				List<LinkType> linkTypeDOS = baseMapper.selectList(Wrappers.<LinkType>query().lambda().in(LinkType::getOid, s));
+				if(!CollectionUtils.isEmpty(linkTypeDOS)){
+					linkTypeDOList.addAll(linkTypeDOS);
+				}
+			});
+		}
+		return null;
+	}
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О鑾峰彇閾炬帴绫诲瀷
+	 *
+	 * @param id 鑻辨枃鍚嶇О
+	 * @return 閾炬帴绫诲瀷锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+	 * @throws VciBaseException
+	 */
+	@Override
+	public LinkTypeVO getLinkTypeById(String id) throws VciBaseException {
+		VciBaseUtil.alertNotNull(id,"閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�");
+		List<LinkTypeVO> linkTypeVOList = listLinkTypeByIds(id);
+		if(CollectionUtils.isEmpty(linkTypeVOList)){
+			return null;
+		}
+		return linkTypeVOList.get(0);
+	}
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О鎵归噺鑾峰彇閾炬帴绫诲瀷
+	 *
+	 * @param ids 鑻辨枃鍚嶇О锛屼娇鐢ㄩ�楀彿鍒嗛殧
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	@Override
+	public List<LinkTypeVO> listLinkTypeByIds(String ids) throws VciBaseException {
+		VciBaseUtil.alertNotNull(ids,"閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�");
+		List<String> idList = Func.toStrList(",",ids);
+		return listLinkTypeByIdCollection(idList);
+	}
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О闆嗗悎鎵归噺鑾峰彇閾炬帴绫诲瀷
+	 *
+	 * @param linkTypeIdCollection 鑻辨枃鍚嶇О闆嗗悎锛屼娇鐢ㄩ�楀彿鍒嗛殧
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	@Override
+	public List<LinkTypeVO> listLinkTypeByIdCollection(Collection<String> linkTypeIdCollection) throws VciBaseException {
+		if(!CollectionUtils.isEmpty(linkTypeIdCollection)){
+			List<LinkType> linkTypeDOList = listLinkTypeDOByIdCollection(linkTypeIdCollection);
+			if(!CollectionUtils.isEmpty(linkTypeDOList)) {
+				return LinkTypeWrapper.build().listEntityVO(linkTypeDOList);
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 鏍规嵁涓婚敭闆嗗悎鎵归噺鑾峰彇鏁版嵁瀵硅薄
+	 * @param idCollection 鑻辨枃鍚嶇О闆嗗悎
+	 * @return 涓氬姟绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 * @throws VciBaseException  鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	private List<LinkType> listLinkTypeDOByIdCollection(Collection<String> idCollection) throws VciBaseException {
+		if(!CollectionUtils.isEmpty(idCollection)){
+			List<LinkType> linkTypeDOList = new ArrayList<>();
+			Collection<Collection<String>> pksCollections = VciBaseUtil.switchCollectionForOracleIn(idCollection);
+			if(!CollectionUtils.isEmpty(pksCollections)) {
+				pksCollections.forEach(s -> {
+					List<LinkType> linkTypeDOS = baseMapper.selectList(Wrappers.<LinkType>query().lambda().in(LinkType::getId,s));
+					if(!CollectionUtils.isEmpty(linkTypeDOS)){
+						linkTypeDOList.addAll(linkTypeDOS);
+					}
+				});
+			}
+			return linkTypeDOList;
+		}
+		return null;
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷鐨勬寚瀹氬睘鎬�
+	 *
+	 * @param id                    閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�
+	 * @param attributeIdCollection 灞炴�х殑闆嗗悎锛屽鏋滀负绌哄垯鑾峰彇鍏ㄩ儴
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<LinkTypeAttributeVO> listAttributeVOByIdsForLink(String id, Collection<String> attributeIdCollection) {
+		//涓�涓〃閲屼笉浼氭湁1000涓睘鎬�
+		if(attributeIdCollection == null){
+			attributeIdCollection = new ArrayList<>();
+		}
+		List<LinkTypeAttribute> attributeDOList = linkTypeAttributeService.list(Wrappers.<LinkTypeAttribute>query().lambda().in(LinkTypeAttribute::getId,attributeIdCollection));
+		return LinkTypeAttributeWrapper.build().listEntityVO(attributeDOList);
+	}
+
+	/**
+	 * 鏍规嵁閾炬帴绫诲瀷涓婚敭鑾峰彇涓枃鍚嶇О
+	 *
+	 * @param oid 閾炬帴绫诲瀷涓婚敭
+	 * @return 涓枃鍚嶇О锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull;澶氫釜浼氫互閫楀彿鍒嗛殧
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	@Override
+	public String getNameByOid(String oid) throws VciBaseException {
+		VciBaseUtil.alertNotNull(oid,"閾炬帴绫诲瀷涓婚敭");
+		return baseMapper.selectOne(Wrappers.<LinkType>query().lambda().eq(LinkType::getOid,oid)).getName();
+	}
+
+	/**
+	 * 鏍规嵁閾炬帴绫诲瀷鑻辨枃鍚嶇О鑾峰彇涓枃鍚嶇О
+	 *
+	 * @param id 閾炬帴绫诲瀷鑻辨枃鍚嶇О
+	 * @return 涓枃鍚嶇О锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull;澶氫釜浼氫互閫楀彿鍒嗛殧
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欐椂浼氭姏鍑洪敊璇�
+	 */
+	@Override
+	public String getNameById(String id) throws VciBaseException {
+		VciBaseUtil.alertNotNull(id,"閾炬帴绫诲瀷鑻辨枃鍚嶇О");
+		return baseMapper.selectOne(Wrappers.<LinkType>query().lambda().eq(LinkType::getId,id)).getName();
+	}
+
+	/**
+	 * 鏍规嵁涓氬姟绫诲瀷涓婚敭鑾峰彇鍖呭惈鐨勫睘鎬ф暟鎹璞�
+	 * @param oidCollection 涓婚敭闆嗗悎
+	 * @return 灞炴�ф暟鎹璞�
+	 */
+	private List<LinkTypeAttribute> listHasAttributeDOByOidCollection(Collection<String> oidCollection){
+		VciBaseUtil.alertNotNull("涓氬姟绫诲瀷涓婚敭",oidCollection);
+		Collection<Collection<String>> oidCollections = VciBaseUtil.switchCollectionForOracleIn(oidCollection);
+		List<LinkTypeAttribute> attributeDOList = new ArrayList<>();
+		for(Collection<String> oids : oidCollections){
+			List<LinkTypeAttribute> attributeDOs = linkTypeAttributeService.list(Wrappers.<LinkTypeAttribute>query().lambda().in(LinkTypeAttribute::getPkLinkType,oids));
+			if(!CollectionUtils.isEmpty(attributeDOs)){
+				attributeDOList.addAll(attributeDOs);
+			}
+		}
+		return attributeDOList;
+	}
+
+	/**
+	 * 娣诲姞閾炬帴绫诲瀷
+	 *
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @return 娣诲姞鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 娣诲姞鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public LinkTypeVO addSave(LinkTypeVO linkTypeVO) throws VciBaseException {
+		return addSave(linkTypeVO,true);
+	}
+
+	/**
+	 * 娣诲姞閾炬帴绫诲瀷
+	 *
+	 * @param linkTypeVO      閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @param autoCreateTable 鑷姩鍒涘缓琛ㄦ牸
+	 * @return 娣诲姞鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 娣诲姞鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public LinkTypeVO addSave(LinkTypeVO linkTypeVO, boolean autoCreateTable) throws VciBaseException {
+		TransactionStatus transaction = null;
+		if(autoCreateTable) {
+			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+			def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+			// 浜嬬墿闅旂绾у埆锛屽紑鍚柊浜嬪姟锛岃繖鏍蜂細姣旇緝瀹夊叏浜涖��
+			transaction = dataSourceTransactionManager.getTransaction(def);
+			// 鑾峰緱浜嬪姟鐘舵��
+		}
+		try {
+			VciBaseUtil.alertNotNull(linkTypeVO, "瑕佹坊鍔犵殑閾炬帴绫诲瀷",
+				linkTypeVO.getId(), "閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�", linkTypeVO.getName(), "閾炬帴绫诲瀷涓枃鍚嶇О",
+				linkTypeVO.getFromBtmType(),"from绔殑涓氬姟绫诲瀷",linkTypeVO.getFromBtmTypeName(),"from绔殑涓氬姟绫诲瀷鐨勫悕绉�",
+				linkTypeVO.getToBtmType(),"to绔殑涓氬姟绫诲瀷",linkTypeVO.getToBtmType(),"to绔殑涓氬姟绫诲瀷鐨勫悕绉�");
+			if (!linkTypeVO.getId().matches(RegExpConstant.LETTER)) {
+				throw new VciBaseException("閾炬帴绫诲瀷鑻辨枃鍚嶇О鍙兘鏄函鑻辨枃锛岀洰鍓嶄负{0}", new Object[]{linkTypeVO.getId()});
+			}
+			if (linkTypeVO.getId().length() > 24) {
+				throw new VciBaseException("閾炬帴绫诲瀷鑻辨枃鍚嶇О涓嶈兘瓒呰繃18锛岀洰鍓嶉暱搴︿负{0}", new Object[]{linkTypeVO.getId().length()});
+			}
+			List<LinkType> linkTypeDOList = listLinkTypeDOByIdCollection(VciBaseUtil.str2List(linkTypeVO.getId()));
+			if (!CollectionUtils.isEmpty(linkTypeDOList) && linkTypeDOList.size() > 0) {
+				LinkType existLinkType= linkTypeDOList.get(0);
+				throw new VciBaseException("閾炬帴绫诲瀷鑻辨枃鍚嶇О宸茬粡瀛樺湪锛堜笉鍖哄垎澶у皬鍐欙級锛岃繖涓嫳鏂囧悕绉板搴旂殑涓枃鍚嶇О涓簕0},鍒涘缓浜簕1},鍒涘缓鏃堕棿{2}"
+					, new Object[]{existLinkType.getName(), existLinkType.getCreator(), VciDateUtil.date2Str(existLinkType.getCreateTime(), VciDateUtil.DateFormat)});
+			}
+			//妫�鏌ヤ娇鐢ㄧ殑涓氬姟绫诲瀷鏄惁瀛樺湪
+			Set<String> usedBtmTypeSet = new HashSet<>();
+			Collections.addAll(usedBtmTypeSet,linkTypeVO.getFromBtmType().split(","));
+			Collections.addAll(usedBtmTypeSet,linkTypeVO.getToBtmType().split(","));
+
+			List<BtmType> btmTypeDOList = btmTypeService.listBtmTypeDOByIdCollection(usedBtmTypeSet);
+			if(CollectionUtils.isEmpty(btmTypeDOList)){
+				throw new VciBaseException("閾炬帴绫诲瀷浣跨敤鐨勪笟鍔$被鍨嬪叏閮ㄤ笉瀛樺湪锛岃鏌ヨ瘉");
+			}
+			Set<String> existBtmTypeIdSet = btmTypeDOList.stream().collect(Collectors.toMap(s -> s.getId().trim().toLowerCase(), t -> t)).keySet();
+			String unExistBtmTypeId = usedBtmTypeSet.stream().filter(s -> !existBtmTypeIdSet.contains(s.toLowerCase().trim())).collect(Collectors.joining(","));
+			if(StringUtils.isNotBlank(unExistBtmTypeId)){
+				throw new VciBaseException("閾炬帴绫诲瀷浣跨敤鐨勪笟鍔$被鍨媨0}涓嶅瓨鍦紝璇锋煡璇�",new Object[]{unExistBtmTypeId});
+			}
+
+			if (StringUtils.isBlank(linkTypeVO.getOid())) {
+				linkTypeVO.setOid(VciBaseUtil.getPk());
+			}
+			LinkType linkTypeDO = new LinkType();
+			BeanUtil.copy(linkTypeVO, linkTypeDO);
+			String creator = AuthUtil.getUserAccount();
+			Date now = new Date();
+			linkTypeDO.setCreator(creator);
+			linkTypeDO.setCreateTime(now);
+			linkTypeDO.setOwner(creator);
+			linkTypeDO.setBtmName(BtmTypeConstant.LINK_TYPE);
+			linkTypeDO.setTs(now);
+
+			//澶勭悊灞炴��
+			addAttributeForLink(linkTypeVO.getAttributes(),linkTypeDO.getOid(),creator,now);
+
+			baseMapper.insert(linkTypeDO);
+			if(autoCreateTable) {
+				dataSourceTransactionManager.commit(transaction);
+			}
+		}catch (VciBaseException e){
+			if(autoCreateTable) {
+				dataSourceTransactionManager.rollback(transaction);
+			}
+			throw e;
+		}catch (Throwable e){
+			if(autoCreateTable) {
+				dataSourceTransactionManager.rollback(transaction);
+			}
+			throw e;
+		}
+		if(autoCreateTable) {
+			checkTableSame(linkTypeVO);
+		}
+		return linkTypeVO;
+	}
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬫坊鍔犲睘鎬�
+	 * @param attributesVOList 灞炴�х殑鏄剧ず瀵硅薄鍒楄〃
+	 * @param pkLinkType 閾炬帴绫诲瀷鐨勪富閿�
+	 * @param creator 鍒涘缓浜�
+	 * @param now 褰撳墠鏃堕棿
+	 */
+	private void addAttributeForLink(List<LinkTypeAttributeVO> attributesVOList,String pkLinkType,String creator,Date now){
+		List<LinkTypeAttribute> linkTypeAttributeDOList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(attributesVOList)) {
+			List<String> attributeIdList = new ArrayList<>();
+			attributesVOList.stream().forEachOrdered(s -> {
+				linkTypeAttributeService.checkAttribute(s);
+				linkTypeAttributeDOList.add(LinkTypeAttributeWrapper.build().copyVO2DO(s, pkLinkType, creator, now));
+				attributeIdList.add(s.getId().toLowerCase().trim());
+			});
+			//妫�鏌ュ睘鎬ф槸鍚﹂兘瀛樺湪
+			attributeService.checkAttributeExists(attributeIdList);
+			linkTypeAttributeService.saveOrUpdateBatch(linkTypeAttributeDOList,10000);
+		}
+	}
+
+	/**
+	 * 妫�鏌ラ摼鎺ョ被鍨嬬殑灞炴�ф槸鍚﹀拰鏁版嵁搴撲腑鐩稿悓
+	 * @param linkTypeVO 閾炬帴绫诲瀷鐨勬樉绀哄璞�
+	 */
+	private void checkTableSame(LinkTypeVO linkTypeVO){
+		List<LinkTypeVO> linkTypeVOList = new ArrayList<>();
+		linkTypeVOList.add(linkTypeVO);
+		BtmAndLinkTypeDdlDTO btmAndLinkTypeDdlDTO = new BtmAndLinkTypeDdlDTO();
+		btmAndLinkTypeDdlDTO.setLinkTypeList(linkTypeVOList);
+		List<ModifyAttributeInfo> modifyAttributeInfoDOList = new ArrayList<>();
+		try {
+			R result = DomainRepeater.checkDifferent(btmAndLinkTypeDdlDTO, AppConstant.APPLICATION_NAME_CODE);
+			if (result.isSuccess()){
+				Object dataList = result.getData();
+				if (dataList instanceof  List){
+					((List<?>) dataList).forEach(data -> {
+						JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(data));
+						modifyAttributeInfoDOList.add(BeanUtil.copy(jsonObject,ModifyAttributeInfo.class));
+					});
+				}
+			}
+		} catch (NacosException e) {
+			throw new RuntimeException(e);
+		}
+		if (!CollectionUtils.isEmpty(modifyAttributeInfoDOList)) {
+			modifyAttributeService.saveOrUpdateBatch(modifyAttributeInfoDOList);
+		}
+		modifyAttributeService.finishModify(modifyAttributeInfoDOList);
+	}
+
+	/**
+	 * 淇敼閾炬帴绫诲瀷
+	 *
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @return 淇敼鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 淇敼鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public LinkTypeVO editSave(LinkTypeVO linkTypeVO) throws VciBaseException {
+		return editSave(linkTypeVO,true);
+	}
+
+	/**
+	 * 淇敼閾炬帴绫诲瀷
+	 *
+	 * @param linkTypeVO      閾炬帴绫诲瀷鏄剧ず瀵硅薄锛堝拰DTO鍏辩敤锛�
+	 * @param autoCreateTable 鑷姩鍒涘缓琛ㄦ牸
+	 * @return 淇敼鍚庣殑閾炬帴绫诲瀷
+	 * @throws VciBaseException 淇敼鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public LinkTypeVO editSave(LinkTypeVO linkTypeVO, boolean autoCreateTable) throws VciBaseException {
+		TransactionStatus transaction = null;
+		if(autoCreateTable) {
+			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+			def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+			// 浜嬬墿闅旂绾у埆锛屽紑鍚柊浜嬪姟锛岃繖鏍蜂細姣旇緝瀹夊叏浜涖��
+			transaction = dataSourceTransactionManager.getTransaction(def);
+			// 鑾峰緱浜嬪姟鐘舵��
+		}
+		try{
+			VciBaseUtil.alertNotNull(linkTypeVO, "瑕佷慨鏀圭殑閾炬帴绫诲瀷", linkTypeVO.getOid(),"閾炬帴绫诲瀷鐨勪富閿�",
+				linkTypeVO.getId(), "閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�", linkTypeVO.getName(), "閾炬帴绫诲瀷涓枃鍚嶇О");
+			if (!linkTypeVO.getId().matches(RegExpConstant.LETTER)) {
+				throw new VciBaseException("閾炬帴绫诲瀷鑻辨枃鍚嶇О鍙兘鏄函鑻辨枃锛岀洰鍓嶄负{0}", new Object[]{linkTypeVO.getId()});
+			}
+			if (linkTypeVO.getId().length() > 24) {
+				throw new VciBaseException("閾炬帴绫诲瀷鑻辨枃鍚嶇О涓嶈兘瓒呰繃18锛岀洰鍓嶉暱搴︿负{0}", new Object[]{linkTypeVO.getId().length()});
+			}
+			List<LinkType> linkTypeDOList = listLinkTypeDOByIdCollection(VciBaseUtil.str2List(linkTypeVO.getId()));
+			if (CollectionUtils.isEmpty(linkTypeDOList)) {
+				throw new VciBaseException("杩欎釜閾炬帴绫诲瀷{0}[{1}]鍦ㄧ郴缁熶腑涓嶅瓨鍦ㄣ�傛垨鑰呰妫�鏌ユ偍鏄惁淇敼浜嗛摼鎺ョ被鍨嬬殑鑻辨枃鍚嶇О锛堢郴缁熶笉鍏佽淇敼鑻辨枃鍚嶇О锛屽彧鍙互淇敼鑻辨枃鍚嶇О瀛楁瘝鐨勫ぇ灏忓啓锛�"
+					,new Object[]{linkTypeVO.getId(),linkTypeVO.getName()});
+			}
+			LinkType linkTypeDO = linkTypeDOList.get(0);
+
+			//妫�鏌ヤ娇鐢ㄧ殑涓氬姟绫诲瀷鏄惁瀛樺湪
+			Set<String> usedBtmTypeSet = new HashSet<>();
+			Collections.addAll(usedBtmTypeSet,linkTypeVO.getFromBtmType().split(","));
+			Collections.addAll(usedBtmTypeSet,linkTypeVO.getToBtmType().split(","));
+
+			List<BtmType> btmTypeDOList = btmTypeService.listBtmTypeDOByIdCollection(usedBtmTypeSet);
+			if(CollectionUtils.isEmpty(btmTypeDOList)){
+				throw new VciBaseException("閾炬帴绫诲瀷浣跨敤鐨勪笟鍔$被鍨嬪叏閮ㄤ笉瀛樺湪锛岃鏌ヨ瘉");
+			}
+			Set<String> existBtmTypeIdSet = btmTypeDOList.stream().collect(Collectors.toMap(s -> s.getId().trim().toLowerCase(), t -> t)).keySet();
+			String unExistBtmTypeId = usedBtmTypeSet.stream().filter(s -> !existBtmTypeIdSet.contains(s.toLowerCase().trim())).collect(Collectors.joining(","));
+			if(StringUtils.isNotBlank(unExistBtmTypeId)){
+				throw new VciBaseException("閾炬帴绫诲瀷浣跨敤鐨勪笟鍔$被鍨媨0}涓嶅瓨鍦紝璇锋煡璇�",new Object[]{unExistBtmTypeId});
+			}
+
+			String creator = AuthUtil.getUserAccount();
+			Date now = new Date();
+			linkTypeDO.setLastModifier(creator);
+			linkTypeDO.setLastModifyTime(now);
+			linkTypeDO.setTs(now);
+			//澶勭悊灞炴��
+
+
+			LinkTypeWrapper.build().copyLinkTypeVO2DO(linkTypeVO,linkTypeDO,creator,new Date());
+
+			//鍏堟煡璇㈣繖涓摼鎺ョ被鍨嬪寘鍚灏戝睘鎬�
+			List<LinkTypeAttribute> hasAttributeList = linkTypeAttributeService.list(Wrappers.<LinkTypeAttribute>query().lambda().in(LinkTypeAttribute::getPkLinkType,Func.toStrList(",",linkTypeVO.getOid())));
+			//澶勭悊灞炴��
+			addAttributeForLink(linkTypeVO.getAttributes(),linkTypeDO.getOid(),creator,now);
+
+			if(!CollectionUtils.isEmpty(hasAttributeList)){
+				//鏈夊睘鎬х殑鏃跺�欑洿鎺ュ垹闄ゅ悗鍐嶆坊鍔�
+				linkTypeAttributeService.batchDeleteByOids(hasAttributeList.stream().map(s->s.getOid()).collect(Collectors.toList()));
+			}
+			saveOrUpdate(linkTypeDO);
+			if(autoCreateTable) {
+				dataSourceTransactionManager.commit(transaction);
+			}
+		}catch (VciBaseException e){
+			if(autoCreateTable) {
+				dataSourceTransactionManager.rollback(transaction);
+			}
+			throw e;
+		}catch (Throwable e) {
+			if(autoCreateTable) {
+				dataSourceTransactionManager.rollback(transaction);
+			}
+			throw e;
+		}
+		if(autoCreateTable) {
+			checkTableSame(linkTypeVO);
+		}
+		return linkTypeVO;
+	}
+
+	/**
+	 * 鍒犻櫎閾炬帴绫诲瀷
+	 *
+	 * @param linkTypeVO 閾炬帴绫诲瀷鏄剧ず瀵硅薄
+	 * @throws VciBaseException 濡傛灉閾炬帴绫诲瀷琚紩鐢紝鎴栬�呭垹闄ゅ嚭閿欐椂浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public void delete(LinkTypeVO linkTypeVO) throws VciBaseException {
+		VciBaseUtil.alertNotNull(linkTypeVO,"瑕佸垹闄ょ殑閾炬帴绫诲瀷",linkTypeVO.getOid(),"瑕佸垹闄ょ殑閾炬帴绫诲瀷鐨勪富閿�");
+		List<LinkTypeVO> linkTypeVOList = new ArrayList<>();
+		linkTypeVOList.add(linkTypeVO);
+		batchDelete(linkTypeVOList);
+	}
+
+	/**
+	 * 鎵归噺鍒犻櫎閾炬帴绫诲瀷
+	 *
+	 * @param linkTypeVOList 瑕佸垹闄ょ殑閾炬帴绫诲瀷鏄剧ず瀵硅薄鍒楄〃
+	 * @throws VciBaseException 濡傛灉閾炬帴绫诲瀷琚紩鐢紝鎴栬�呭垹闄ゅ嚭閿欐椂浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public void batchDelete(List<LinkTypeVO> linkTypeVOList) throws VciBaseException {
+		VciBaseUtil.alertNotNull("瑕佸垹闄ょ殑閾炬帴绫诲瀷",linkTypeVOList);
+		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+		// 浜嬬墿闅旂绾у埆锛屽紑鍚柊浜嬪姟锛岃繖鏍蜂細姣旇緝瀹夊叏浜涖��
+		TransactionStatus transaction= dataSourceTransactionManager.getTransaction(def);
+		// 鑾峰緱浜嬪姟鐘舵��
+		List<LinkType> linkTypeDOList = null;
+		try {
+			List<String> oidList = linkTypeVOList.stream().map(LinkTypeVO::getOid).collect(Collectors.toList());
+			linkTypeDOList = listLinkTypeDOByOidCollection(oidList);
+			//闇�瑕佸垽鏂〃鏍兼槸鍚﹀瓨鍦ㄦ暟鎹紝
+			if (CollectionUtils.isEmpty(linkTypeDOList)) {
+				throw new VciBaseException("瑕佸垹闄ょ殑閾炬帴绫诲瀷瀵硅薄鏈湪绯荤粺涓壘鍒�");
+			}
+			List<TableCheckDTO> checkList = linkTypeDOList.stream().map(linkType -> {
+				TableCheckDTO tableCheckDTO = new TableCheckDTO();
+				tableCheckDTO.setBtmName(linkType.getId());
+				tableCheckDTO.setTableName(getTableName(linkType.getId(),linkType.getDomain()));
+				tableCheckDTO.setCheckTableHasData(true);
+				tableCheckDTO.setNeedDelete(true);
+				tableCheckDTO.setDomain(linkType.getDomain());
+				return tableCheckDTO;
+			}).collect(Collectors.toList());
+			R result = DomainRepeater.checkTableHasDataByTableNameThenDrop(checkList);
+			if (result.isSuccess()){
+				JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(result.getData()));
+				TableCheckResultDTO tableCheckResult = BeanUtil.copy(jsonObject, TableCheckResultDTO.class);
+				if (tableCheckResult == null){
+					throw new VciBaseException("璋冪敤DDL鏈嶅姟澶辫触");
+				}
+				List<String> successOidList = linkTypeDOList.stream().filter(s -> Optional.ofNullable(tableCheckResult.getSuccessList()).orElseGet(ArrayList::new).stream().anyMatch(r -> StringUtils.equals(s.getId(), r.getBtmName())))
+					.map(LinkType::getOid).collect(Collectors.toList());
+				if (!CollectionUtils.isEmpty(successOidList)) {
+					//鍒犻櫎灞炴��
+					List<LinkTypeAttribute> hasAttributesList = listHasAttributeDOByOidCollection(successOidList);
+					List<String> attributeOidList = hasAttributesList.stream().map(LinkTypeAttribute::getOid).collect(Collectors.toList());
+					Collection<Collection<String>> attributeOidCollections = VciBaseUtil.switchCollectionForOracleIn(attributeOidList);
+					for (Collection<String> attrOidCollection : attributeOidCollections) {
+						linkTypeAttributeService.batchDeleteByOids(new ArrayList<>(attrOidCollection));
+					}
+
+					//鍒犻櫎閾炬帴绫诲瀷
+					Collection<Collection<String>> oidCollections = VciBaseUtil.switchCollectionForOracleIn(successOidList);
+					for (Collection<String> oids : oidCollections) {
+						baseMapper.delete(Wrappers.<LinkType>query().lambda().in(LinkType::getOid, oids));
+					}
+				}
+				if (!CollectionUtils.isEmpty(tableCheckResult.getFailList())){
+					throw new VciBaseException("閾炬帴绫诲瀷:" + tableCheckResult.getFailList().stream().map(TableCheckDTO::getBtmName).collect(Collectors.joining("],[")) + "瀛樺湪鏁版嵁涓嶈兘鍒犻櫎");
+				}
+			}else {
+				throw new VciBaseException("娌℃湁鎵惧埌DDL鏈嶅姟");
+			}
+			dataSourceTransactionManager.commit(transaction);
+		} catch (NacosException e) {
+			dataSourceTransactionManager.rollback(transaction);
+			throw new RuntimeException(e);
+		} catch (Throwable e){
+			dataSourceTransactionManager.rollback(transaction);
+			throw e;
+		}
+
+	}
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬫坊鍔犲睘鎬у璞�
+	 *
+	 * @param attributeVO 灞炴�ф樉绀哄璞�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public void addSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName,String serviceName) throws VciBaseException {
+		addSaveAttribute(attributeVO,tableName,true,serviceName);
+	}
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬫坊鍔犲睘鎬у璞�
+	 *
+	 * @param attributeVO   灞炴�ф樉绀哄璞�
+	 * @param autoAdd2Table 鏄惁鑷姩娣诲姞鍒拌〃鏍间腑
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public void addSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName, boolean autoAdd2Table,String serviceName) throws VciBaseException {
+		TransactionStatus transaction = null;
+		if(autoAdd2Table) {
+			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+			def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+			// 浜嬬墿闅旂绾у埆锛屽紑鍚柊浜嬪姟锛岃繖鏍蜂細姣旇緝瀹夊叏浜涖��
+			transaction = dataSourceTransactionManager.getTransaction(def);
+		}
+		try {
+			linkTypeAttributeService.checkAttribute(attributeVO);
+			LinkTypeAttribute attributeDO = new LinkTypeAttribute();
+			if (StringUtils.isBlank(attributeVO.getOid())) {
+				attributeVO.setOid(VciBaseUtil.getPk());
+			}
+			attributeVO.setPkLinkType(attributeVO.getPkLinkType());
+			attributeVO.setCreator(AuthUtil.getUserAccount());
+			attributeVO.setCreateTime(new Date());
+			attributeVO.setOwner(attributeVO.getCreator());
+			attributeVO.setBtmName(BtmTypeConstant.LINK_TYPE_ATTRIBUTE);
+			attributeVO.setTs(attributeDO.getCreateTime());
+			//鏌ヨ閾炬帴绫诲瀷鏄惁瀛樺湪
+			checkLinkTypeExist(attributeVO.getPkLinkType());
+			BeanUtil.copy(attributeVO, attributeDO);
+
+			linkTypeAttributeService.saveOrUpdate(attributeDO);
+			if (autoAdd2Table) {
+				//鎵ц娣诲姞灞炴�у垪
+				List<LinkTypeAttributeVO> attributeVOList = new ArrayList<>();
+				attributeVOList.add(attributeVO);
+				if (autoAdd2Table) {
+					TableAddColumnDTO addColumnDTO = new TableAddColumnDTO();
+					addColumnDTO.setTableName(tableName);
+					addColumnDTO.setLinkTypeAttributeVOList(attributeVOList);
+					R result = DomainRepeater.addColumnForTable(addColumnDTO, serviceName);
+					if (result.isSuccess()) {
+						dataSourceTransactionManager.commit(transaction);
+					} else {
+						dataSourceTransactionManager.rollback(transaction);
+
+					}
+				}
+			}
+		}catch (NacosException e){
+			if(autoAdd2Table) {
+				dataSourceTransactionManager.rollback(transaction);
+			}
+			throw new RuntimeException(e);
+		}catch (Throwable e){
+			if(autoAdd2Table) {
+				dataSourceTransactionManager.rollback(transaction);
+			}
+			throw e;
+		}
+	}
+
+	/**
+	 * 妫�鏌ユ煇涓富閿殑閾炬帴绫诲瀷鏄惁瀛樺湪
+	 *
+	 * @param pkLinkType 閾炬帴绫诲瀷涓婚敭
+	 * @return true琛ㄧず瀛樺湪锛宖alse琛ㄧず涓嶅瓨鍦�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鎴栬�呭弬鏁颁负绌虹殑鏃跺�欐姏鍑哄紓甯�
+	 */
+	@Override
+	public boolean checkLinkTypeExist(String pkLinkType) throws VciBaseException {
+		VciBaseUtil.alertNotNull(pkLinkType,"瑕佹牎楠屾槸鍚﹀瓨鍦ㄧ殑閾炬帴绫诲瀷涓婚敭涓虹┖");
+		String name = getNameByOid(pkLinkType);
+		if(StringUtils.isBlank(name)){
+			return false;
+		}else{
+			return true;
+		}
+	}
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬩慨鏀瑰睘鎬у璞�
+	 *
+	 * @param attributeVO 灞炴�ф樉绀哄璞�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public void editSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName,String domain) throws VciBaseException {
+		editSaveAttribute(attributeVO,tableName,domain,true);
+	}
+
+	/**
+	 * 涓洪摼鎺ョ被鍨嬩慨鏀瑰睘鎬у璞�
+	 *
+	 * @param attributeVO    灞炴�ф樉绀哄璞�
+	 * @param autoEdit2Table 鏄惁鑷姩淇敼鍒拌〃鏍�
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public void editSaveAttribute(LinkTypeAttributeVO attributeVO,String tableName,String domain, boolean autoEdit2Table) throws VciBaseException {
+		TransactionStatus transaction = null;
+		if(autoEdit2Table) {
+			DefaultTransactionDefinition def = new DefaultTransactionDefinition();
+			def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+			// 浜嬬墿闅旂绾у埆锛屽紑鍚柊浜嬪姟锛岃繖鏍蜂細姣旇緝瀹夊叏浜涖��
+			transaction = dataSourceTransactionManager.getTransaction(def);
+		}
+		try {
+			VciBaseUtil.alertNotNull(attributeVO.getOid(), "浣跨敤灞炴�х殑涓婚敭");
+			linkTypeAttributeService.checkAttribute(attributeVO);
+			LinkType linkTypeDO = baseMapper.selectOne(Wrappers.<LinkType>query().lambda().eq(LinkType::getOid, attributeVO.getPkLinkType()));
+			if (linkTypeDO == null || StringUtils.isBlank(linkTypeDO.getOid())) {
+				throw new VciBaseException("瑕佷慨鏀圭殑灞炴�у叧鑱旂殑閾炬帴绫诲瀷涓嶅瓨鍦�");
+			}
+			LinkTypeAttribute attributeDO = linkTypeAttributeService.selectByPrimaryKey(attributeVO.getOid());
+			String creator = AuthUtil.getUserAccount();
+			Date now = new Date();
+			BeanUtil.copy(attributeVO, attributeDO);
+			attributeDO.setPkLinkType(linkTypeDO.getOid());
+			attributeDO.setLastModifier(creator);
+			attributeDO.setLastModifyTime(now);
+			attributeDO.setTs(now);
+
+			attributeVO.setLastModifier(creator);
+			attributeVO.setLastModifyTime(now);
+			attributeVO.setTs(now);
+			//鏌ヨ閾炬帴绫诲瀷鏄惁瀛樺湪
+			linkTypeAttributeService.saveOrUpdate(attributeDO);
+			if (autoEdit2Table) {
+				BtmAndLinkTypeDdlDTO ddlDTO = new BtmAndLinkTypeDdlDTO();
+//				ddlDTO.setLinkTypeList();
+//				DomainRepeater.checkDifferent(,domain);
+				dataSourceTransactionManager.commit(transaction);
+			}
+//		}catch (NacosException e){
+//			if(autoEdit2Table) {
+//				dataSourceTransactionManager.rollback(transaction);
+//			}
+//			throw new RuntimeException(e);
+		}catch (Throwable e){
+			if(autoEdit2Table) {
+				dataSourceTransactionManager.rollback(transaction);
+			}
+			throw e;
+		}
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷鐨勬暟鎹簱琛ㄥ悕绉�
+	 *
+	 * @param id 閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�
+	 * @param domain 棰嗗煙鍊�
+	 * @return 鏁版嵁搴撹〃鍚嶇О
+	 */
+	@Override
+	public String getTableName(String id,String domain) {
+		VciBaseUtil.alertNotNull(id,"涓氬姟绫诲瀷鑻辨枃鍚嶇О",domain,"棰嗗煙鍚嶇О");
+		if (domain.contains("ubcs-")){
+			domain = domain.split("ubcs-")[1];
+		}else {
+			throw new VciBaseException("棰嗗煙鍚嶇О涓嶇鍚堣鍒�");
+		}
+		return PL + StringPool.UNDERSCORE + domain + StringPool.UNDERSCORE + id;
+	}
+
+	/**
+	 * 鑾峰彇鎵�鏈変娇鐢ㄧ殑涓氬姟绫诲瀷鐨勮嫳鏂囧悕绉帮紝杞崲涓哄皬鍐�
+	 *
+	 * @return 鑻辨枃鍚嶇О鑻辨枃灏忓啓
+	 */
+	@Override
+	public Set<String> listUsedBtmType() {
+		List<LinkType> allLinkTypeDOList = baseMapper.selectList(Wrappers.query());
+		Set<String> btmTypeSet = new HashSet<>();
+		if(!CollectionUtils.isEmpty(allLinkTypeDOList)){
+			allLinkTypeDOList.stream().forEach( s -> {
+				Collections.addAll(btmTypeSet,s.getFromBtmType().split(","));
+				Collections.addAll(btmTypeSet,s.getToBtmType().split(","));
+			});
+		}
+		return btmTypeSet;
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/ModifyAtributeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/ModifyAtributeServiceImpl.java
deleted file mode 100644
index 1849cb5..0000000
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/ModifyAtributeServiceImpl.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.vci.ubcs.omd.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
-import com.vci.ubcs.omd.mapper.ModifyAttributeInfoMapper;
-import com.vci.ubcs.omd.service.IModifyAttributeService;
-import org.springframework.stereotype.Service;
-
-import javax.validation.constraints.NotEmpty;
-import java.util.List;
-
-/**
- * Description: 闇�瑕佷慨鏀规暟鎹簱琛ㄤ腑瀛楁鐨勪俊鎭湇鍔″疄鐜扮被
- *
- * @author LiHang
- * @date 2023/5/4
- */
-@Service
-public class ModifyAtributeServiceImpl extends ServiceImpl<ModifyAttributeInfoMapper, ModifyAttributeInfo> implements IModifyAttributeService {
-	@Override
-	public boolean deleteLogic(@NotEmpty List<Long> ids) {
-		return false;
-	}
-
-	@Override
-	public boolean changeStatus(@NotEmpty List<Long> ids, Integer status) {
-		return false;
-	}
-}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/ModifyAttributeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/ModifyAttributeServiceImpl.java
new file mode 100644
index 0000000..103bb92
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/ModifyAttributeServiceImpl.java
@@ -0,0 +1,76 @@
+package com.vci.ubcs.omd.service.impl;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
+import com.vci.ubcs.omd.mapper.ModifyAttributeInfoMapper;
+import com.vci.ubcs.omd.service.IModifyAttributeService;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Description: 闇�瑕佷慨鏀规暟鎹簱琛ㄤ腑瀛楁鐨勪俊鎭湇鍔″疄鐜扮被
+ *
+ * @author LiHang
+ * @date 2023/5/4
+ */
+@Service
+public class ModifyAttributeServiceImpl extends ServiceImpl<ModifyAttributeInfoMapper, ModifyAttributeInfo> implements IModifyAttributeService {
+	@Override
+	public boolean deleteLogic(@NotEmpty List<Long> ids) {
+		return false;
+	}
+
+	@Override
+	public boolean changeStatus(@NotEmpty List<Long> ids, Integer status) {
+		return false;
+	}
+
+	/**
+	 * 瀹屾垚璋冩暣
+	 *
+	 * @param modifyAttributeInfoDOList 瀹屾垚璋冩暣鐨勪俊鎭�
+	 * @throws VciBaseException 淇敼鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public void finishModify(List<ModifyAttributeInfo> modifyAttributeInfoDOList) throws VciBaseException {
+		VciBaseUtil.alertNotNull(modifyAttributeInfoDOList,"瀹屾垚璋冩暣鐨勪俊鎭�");
+		Map<String,String> oidHandleResultMap = modifyAttributeInfoDOList.stream().collect(Collectors.toMap(ModifyAttributeInfo::getOid, ModifyAttributeInfo::getHandleResult));
+		BladeUser user = Optional.ofNullable(AuthUtil.getUser()).orElseGet(BladeUser::new);
+		String handlerUser = user.getAccount() + "(" + user.getUserName() + ")";
+		Date now = new Date();
+		if(!CollectionUtils.isEmpty(oidHandleResultMap)){
+			Collection<Collection<String>> oidCollections = VciBaseUtil.switchCollectionForOracleIn(oidHandleResultMap.keySet());
+			for(Collection<String> oidCollection : oidCollections){
+				List<ModifyAttributeInfo> attributeInfoDOList = baseMapper.selectList(Wrappers.<ModifyAttributeInfo>query().lambda().in(ModifyAttributeInfo::getOid,oidCollection));
+				if(!CollectionUtils.isEmpty(attributeInfoDOList)){
+					attributeInfoDOList.stream().forEach( s -> {
+						s.setHandleFinishFlag(BooleanEnum.TRUE.getValue());
+						s.setHandleUserName(handlerUser);
+						s.setHandleDate(now);
+						s.setLastModifier(user.getAccount());
+						s.setLastModifyTime(now);
+						s.setTs(now);
+						if(oidHandleResultMap.containsKey(s.getOid())){
+							s.setHandleResult(oidHandleResultMap.get(s.getOid()));
+						}
+						if(StringUtils.isBlank(s.getHandleResult())){
+							s.setHandleResult("鎵ц鎴愬姛");
+						}
+					});
+					saveOrUpdateBatch(attributeInfoDOList);
+				}
+			}
+		}
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java
index 01f6cf0..9741d8a 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
 import com.vci.ubcs.omd.dto.RevisionRuleDTO;
 import com.vci.ubcs.omd.entity.BtmType;
 import com.vci.ubcs.omd.entity.RevisionRule;
@@ -212,7 +213,6 @@
 		Set<String> idSet = new HashSet<>();
 		String creator = AuthUtil.getUserAccount();
 		Date now = new Date();
-		String btmName = "revision-rule";
 		List<RevisionRule> revisionRuleList = new ArrayList<>();
 		revisionRuleDTOList.forEach(s -> {
 			//鍒ゆ柇涓虹┖
@@ -231,7 +231,7 @@
 			ruleDO.setCreator(creator);
 			ruleDO.setCreateTime(now);
 			ruleDO.setOwner(creator);
-			ruleDO.setBtmName(btmName);
+			ruleDO.setBtmName(BtmTypeConstant.REVISION_RULE);
 			ruleDO.setTs(now);
 			ruleDO.setLastModifier(creator);
 			ruleDO.setLastModifyTime(now);
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java
index 460ec37..5193ccc 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
 import com.vci.ubcs.omd.entity.Status;
 import com.vci.ubcs.omd.mapper.StatusMapper;
 import com.vci.ubcs.omd.service.IStatusService;
@@ -273,7 +274,6 @@
 		Set<String> idSet = new HashSet<>();
 		String creator = AuthUtil.getUserAccount();
 		Date now = new Date();
-		String btmName = "status";
 		Pattern pattern = Pattern.compile(REGEXP);
 		statusVOList.forEach(s -> {
 			if (!pattern.matcher(s.getId()).matches()){
@@ -288,7 +288,7 @@
 			if(StringUtils.isBlank(s.getOid())){
 				s.setOid(VciBaseUtil.getPk());
 			}
-			s.setBtmName(btmName);
+			s.setBtmName(BtmTypeConstant.STATUS);
 			s.setOwner(creator);
 			s.setCreator(creator);
 			s.setCreateTime(now);
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeAttributeWrapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeAttributeWrapper.java
index ac9030c..f9574b3 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeAttributeWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeAttributeWrapper.java
@@ -1,5 +1,6 @@
 package com.vci.ubcs.omd.wrapper;
 
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
 import com.vci.ubcs.omd.dto.BtmTypeLinkAttributesDTO;
 import com.vci.ubcs.omd.entity.BtmTypeAttribute;
 import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
@@ -55,7 +56,7 @@
 	public BtmTypeAttribute copyBtmTypeAttributeDTO2Entity(BtmTypeLinkAttributesDTO dto, String btmTypeOid, String creator, Date now){
 		BtmTypeAttribute entity = Objects.requireNonNull(BeanUtil.copy(dto, BtmTypeAttribute.class));
 		entity.setOid(VciBaseUtil.getPk());
-		entity.setBtmName("btmTypeAttribute");
+		entity.setBtmName(BtmTypeConstant.BTM_TYPE_ATTRIBUTE);
 		entity.setOwner(creator);
 		entity.setCreator(creator);
 		entity.setCreateTime(now);
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java
index c5b577a..8d091d7 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java
@@ -1,5 +1,6 @@
 package com.vci.ubcs.omd.wrapper;
 
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
 import com.vci.ubcs.omd.dto.BtmTypeDTO;
 import com.vci.ubcs.omd.entity.BtmType;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
@@ -89,7 +90,7 @@
 	 */
 	public BtmType entityBeforeSave(BtmType btmTypeDO) {
 		btmTypeDO.setOid(VciBaseUtil.getPk());
-		btmTypeDO.setBtmName("btmType");
+		btmTypeDO.setBtmName(BtmTypeConstant.BTMTYPE);
 		Date now  = new Date();
 		String userAccount = AuthUtil.getUserAccount();
 		btmTypeDO.setLastModifier(userAccount);
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeAttributeWrapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeAttributeWrapper.java
new file mode 100644
index 0000000..9186157
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeAttributeWrapper.java
@@ -0,0 +1,55 @@
+package com.vci.ubcs.omd.wrapper;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
+import com.vci.ubcs.omd.entity.LinkTypeAttribute;
+import com.vci.ubcs.omd.vo.LinkTypeAttributeVO;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Description:
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+public class LinkTypeAttributeWrapper extends BaseEntityWrapper<LinkTypeAttribute, LinkTypeAttributeVO> {
+
+	public static LinkTypeAttributeWrapper build() {
+		return new LinkTypeAttributeWrapper();
+	}
+
+	@Override
+	public LinkTypeAttributeVO entityVO(LinkTypeAttribute entity) {
+		LinkTypeAttributeVO vo = BeanUtil.copy(entity, LinkTypeAttributeVO.class);
+		return vo;
+	}
+
+	public List<LinkTypeAttributeVO> listEntityVO(List<LinkTypeAttribute> entityList){
+		return Optional.ofNullable(entityList).orElseGet(ArrayList::new).stream().map(this::entityVO).collect(Collectors.toList());
+	}
+
+	public LinkTypeAttribute copyVO2DO(LinkTypeAttributeVO attributeVO, String pkLinkType, String creator, Date now) {
+		LinkTypeAttribute attributeDO = BeanUtil.copy(attributeVO, LinkTypeAttribute.class);
+		if(attributeDO == null){
+			attributeDO = new LinkTypeAttribute();
+		}
+		attributeDO.setPkLinkType(pkLinkType);
+		if(StringUtils.isBlank(attributeDO.getOid())){
+			attributeDO.setOid(VciBaseUtil.getPk());
+		}
+		attributeDO.setCreator(creator);
+		attributeDO.setCreateTime(now);
+		attributeDO.setTs(now);
+		attributeDO.setOwner(creator);
+		attributeDO.setBtmName(BtmTypeConstant.LINK_TYPE_ATTRIBUTE);
+		return attributeDO;
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeWrapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeWrapper.java
new file mode 100644
index 0000000..6086205
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/LinkTypeWrapper.java
@@ -0,0 +1,54 @@
+package com.vci.ubcs.omd.wrapper;
+
+import com.vci.ubcs.omd.constant.BtmTypeConstant;
+import com.vci.ubcs.omd.entity.LinkType;
+import com.vci.ubcs.omd.vo.LinkTypeVO;
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Description: 閾炬帴绫诲瀷鐨勫寘瑁呯被
+ *
+ * @author LiHang
+ * @date 2023/5/24
+ */
+public class LinkTypeWrapper extends BaseEntityWrapper<LinkType, LinkTypeVO>{
+
+	public static LinkTypeWrapper build() {
+		return new LinkTypeWrapper();
+	}
+
+	@Override
+	public LinkTypeVO entityVO(LinkType entity) {
+		LinkTypeVO vo = BeanUtil.copy(entity, LinkTypeVO.class);
+		// 鏋氫妇澶勭悊
+		return vo;
+	}
+
+	public List<LinkTypeVO> listEntityVO(List<LinkType> entityList){
+		return Optional.ofNullable(entityList).orElseGet(ArrayList::new).stream().map(this::entityVO).collect(Collectors.toList());
+	}
+
+	public void copyLinkTypeVO2DO(LinkTypeVO linkTypeVO, LinkType linkTypeDO, String creator, Date now) {
+		//鏈夊彲鑳藉ぇ灏忓啓鍙樺寲浜�
+		linkTypeDO.setId(linkTypeVO.getId());
+		linkTypeDO.setName(linkTypeVO.getName());
+		linkTypeDO.setDescription(linkTypeVO.getDescription());
+		linkTypeDO.setImplClass(linkTypeVO.getImplClass());
+		linkTypeDO.setShape(linkTypeVO.getShape());
+		linkTypeDO.setFromBtmType(linkTypeVO.getToBtmType());
+		linkTypeDO.setFromBtmTypeName(linkTypeVO.getFromBtmTypeName());
+		linkTypeDO.setToBtmType(linkTypeVO.getToBtmType());
+		linkTypeDO.setToBtmTypeName(linkTypeVO.getToBtmTypeName());
+		linkTypeDO.setTs(now);
+		linkTypeDO.setLastModifier(creator);
+		linkTypeDO.setLastModifyTime(now);
+		linkTypeDO.setBtmName(BtmTypeConstant.LINK_TYPE);
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/ModifyAttributeWrapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/ModifyAttributeWrapper.java
index b024482..955a58d 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/ModifyAttributeWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/ModifyAttributeWrapper.java
@@ -32,7 +32,7 @@
 			data.setOid(VciBaseUtil.getPk());
 			data.setCreateTime(new Date());
 			data.setCreator(AuthUtil.getUserAccount());
-			data.setBtmname("modifyAttributeInfo");
+			data.setBtmName("modifyAttributeInfo");
 			data.setHandleDate(new Date());
 			data.setHandleFinishFlag(BooleanEnum.TRUE.getValue());
 			data.setHandleUserName(AuthUtil.getUserAccount());
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml
index 7da922c..2baadc1 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml
@@ -4,10 +4,9 @@
 
     <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
     <resultMap id="baseResultMap" type="com.vci.ubcs.omd.entity.Attribute">
-        <id column="id" property="id"/>
-        <result column="tenant_id" property="tenantId"/>
-        <result column="key" property="key"/>
-        <result column="label" property="label"/>
+        <id column="oid" property="oid"/>
+        <result column="id" property="id"/>
+        <result column="name" property="name"/>
         <result column="type_code" property="typeCode"/>
         <result column="type_key" property="typeKey"/>
         <result column="hashtag" property="hashtag" jdbcType="VARCHAR"/>
@@ -23,13 +22,12 @@
         <result column="dict_code" property="dictCode"/>
         <result column="dict_key" property="dictKey"/>
         <result column="default_value" property="defaultValue"/>
-        <result column="status" property="status"/>
-        <result column="is_deleted" property="isDeleted"/>
-        <result column="create_user" property="createUser" jdbcType="VARCHAR"/>
-        <result column="create_dept" property="createDept" jdbcType="VARCHAR"/>
         <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
-        <result column="update_user" property="updateUser" jdbcType="VARCHAR"/>
-        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
+        <result column="creator" property="creator" jdbcType="VARCHAR"/>
+        <result column="owner" property="owner" jdbcType="VARCHAR"/>
+        <result column="last_modifier" property="lastModifier" jdbcType="VARCHAR"/>
+        <result column="last_modify_time" property="lastModifyTime" jdbcType="TIMESTAMP"/>
+        <result column="btm_name" property="btmName" jdbcType="TIMESTAMP"/>
         <result column="ts" property="ts" jdbcType="TIMESTAMP"/>
     </resultMap>
 
@@ -38,9 +36,9 @@
     </resultMap>
 
     <sql id="base_query_column">
-        id, tenant_id ,key ,label ,type_code , type_key , hashtag , description, nullable , max_length, precision,
-            refer_type_code, refer_type_key, refer_to_id, refer_to_name, using_dict, dict_code, dict_key, default_value,
-            status, is_deleted, create_user, create_dept, create_time, update_user, update_time , ts
+        oid, id, name, type_code, type_key, hashtag, description, nullable, max_length, precision,
+            refer_type_code, refer_type_key, refer_to_id, refer_to_name, using_dict, dict_code, dict_key,
+            default_value, create_time, creator, owner, last_modifier, last_modify_time, btm_name, ts
     </sql>
     <sql id="tableName">
         pl_omd_attribute
@@ -51,18 +49,14 @@
         from
         <include refid="tableName"/>
     </select>
-    <select id="selectByPrimaryKeyCollection" resultMap="baseResultMap">
-        select DISTINCT <include refid="base_query_column" />
-        from <include refid="tableName"/>
-        <where>
-            <foreach collection="oids" item="item" index="arrayindex" open=" OID in ( " close=")" >
-                #{item,jdbcType=VARCHAR}
-                <if test="(arrayindex != oids.size() -1)">
-                    ,
-                </if>
-            </foreach>
-        </where>
+    <select id="selectApplyRange" resultType="com.vci.ubcs.omd.entity.BtmType">
+        select
+            btm.name,
+            btm.ID
+        from pl_omd_btm_type btm
+        join pl_omd_btm_type_attribute btmAttr on btmAttr.pk_btm_type = btm.oid
+        join <include refid="tableName"/> attr on attr.id = btmAttr.id
+        where attr.oid = #{oid}
     </select>
-
 
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeAttributeMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeAttributeMapper.xml
new file mode 100644
index 0000000..87e6848
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeAttributeMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vci.ubcs.omd.mapper.LinkTypeAttributeMapper">
+    <resultMap id="BaseResultMap" type="com.vci.ubcs.omd.entity.LinkTypeAttribute">
+        <id column="oid" jdbcType="VARCHAR" property="oid" />
+        <result column="id" jdbcType="VARCHAR" property="id" />
+        <result column="name" jdbcType="VARCHAR" property="name" />
+        <result column="description" jdbcType="VARCHAR" property="description" />
+        <result column="pk_link_type" jdbcType="VARCHAR" property="pkLinkType" />
+        <result column="attribute_length" jdbcType="DECIMAL" property="attributeLength" />
+        <result column="attr_data_type" jdbcType="VARCHAR" property="attrDataType" />
+        <result column="nullable_flag" jdbcType="VARCHAR" property="nullableFlag" />
+        <result column="default_value" jdbcType="VARCHAR" property="defaultValue" />
+        <result column="precision_length" jdbcType="DECIMAL" property="precisionLength" />
+        <result column="scale_length" property="scaleLength" jdbcType="DECIMAL" />
+        <result column="range" jdbcType="VARCHAR" property="range" />
+        <result column="refer_btm_type_id" jdbcType="VARCHAR" property="referBtmTypeId" />
+        <result column="refer_btm_type_name" jdbcType="VARCHAR" property="referBtmTypeName" />
+        <result column="enum_id" jdbcType="VARCHAR" property="enumId" />
+        <result column="enum_name" jdbcType="VARCHAR" property="enumName" />
+        <result column="btm_name" property="btmName" jdbcType="VARCHAR" />
+        <result column="owner" property="owner" jdbcType="VARCHAR" />
+        <result column="creator" jdbcType="VARCHAR" property="creator" />
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+        <result column="last_modifier" jdbcType="VARCHAR" property="lastModifier" />
+        <result column="last_modify_time" jdbcType="TIMESTAMP" property="lastModifyTime" />
+        <result column="ts" jdbcType="TIMESTAMP" property="ts" />
+    </resultMap>
+    <sql id="base_query_column">
+        oid, id, name, description, pk_link_type, attr_data_type, nullable_flag, default_value,
+            precision_length, scale_length, range, refer_btm_type_id, refer_btm_type_name, enum_id,
+            enum_name, btm_name, owner, creator, create_time, last_modifier, last_modify_time, ts
+    </sql>
+
+    <sql id="tableName">
+        pl_omd_link_type_attr
+    </sql>
+</mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeMapper.xml
new file mode 100644
index 0000000..c21779e
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/LinkTypeMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vci.ubcs.omd.mapper.LinkTypeMapper">
+    <resultMap id="BaseResultMap" type="com.vci.ubcs.omd.entity.LinkType">
+        <id column="oid" jdbcType="VARCHAR" property="oid" />
+        <result column="id" jdbcType="VARCHAR" property="id" />
+        <result column="name" jdbcType="VARCHAR" property="name" />
+        <result column="description" jdbcType="VARCHAR" property="description" />
+        <result column="shape" jdbcType="VARCHAR" property="shape" />
+        <result column="impl_class" jdbcType="VARCHAR" property="implClass" />
+        <result column="from_btm_type" jdbcType="VARCHAR" property="fromBtmType" />
+        <result column="from_btm_type_name" jdbcType="VARCHAR" property="fromBtmTypeName" />
+        <result column="to_btm_type" jdbcType="VARCHAR" property="toBtmType" />
+        <result column="to_btm_type_name" jdbcType="VARCHAR" property="toBtmTypeName" />
+        <result column="btm_name" property="btmName" jdbcType="VARCHAR" />
+        <result column="owner" property="owner" jdbcType="VARCHAR" />
+        <result column="creator" jdbcType="VARCHAR" property="creator" />
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+        <result column="last_modifier" jdbcType="VARCHAR" property="lastModifier" />
+        <result column="last_modify_time" jdbcType="TIMESTAMP" property="lastModifyTime" />
+        <result column="ts" jdbcType="TIMESTAMP" property="ts" />
+        <result column="domain" jdbcType="VARCHAR" property="domain" />
+    </resultMap>
+
+    <sql id="base_query_column">
+        oid, id, name, descrption, shape, impl_class, from_btm_type, from_btm_type_name,
+            to_btm_type, to_btm_type_name, btm_name, owner, creator, create_time, last_modifier, last_modify_time,
+            ts, domain
+    </sql>
+
+    <sql id="tableName">
+        pl_omd_link_type
+    </sql>
+</mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml
index d7b80ff..988d96e 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml
@@ -18,9 +18,11 @@
         <result column="handle_user_name" property="handleUserName" jdbcType="VARCHAR" />
         <result column="handle_date" property="handleDate" jdbcType="TIMESTAMP" />
         <result column="handle_result" property="handleResult" jdbcType="VARCHAR" />
-        <result column="btm_name" property="btmname" jdbcType="VARCHAR" />
+        <result column="btm_name" property="btmName" jdbcType="VARCHAR" />
         <result column="creator" property="creator" jdbcType="VARCHAR" />
         <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
+        <result column="last_modifier" property="lastModifier" jdbcType="VARCHAR" />
+        <result column="last_modify_time" property="lastModifyTime" jdbcType="TIMESTAMP" />
         <result column="TS" property="ts" jdbcType="TIMESTAMP" />
         <result column="add_attributes" property="addAttributes" jdbcType="CLOB" />
         <result column="modify_attributes" property="modifyAttributes" jdbcType="CLOB" />
@@ -36,7 +38,7 @@
     <sql id="base_query_column">
         oid, id, name, description, business_type, table_name, task_name, modify_column_reason, order_modify_user_name,
         order_modify_date, handle_finish_flag, handle_user_name, handle_date, handle_result, btm_name, creator, create_time,
-        ts, add_attributes, modify_attributes, delete_attributes, before_modify_attributes
+        last_modifier, last_modify_time, ts, add_attributes, modify_attributes, delete_attributes, before_modify_attributes
     </sql>
     <sql id="tableName">
         pl_omd_modify_attribute_info

--
Gitblit v1.9.3