From 729db9dd93f8884a8f1f0b32a4462708f858ea9b Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期二, 13 六月 2023 20:05:53 +0800
Subject: [PATCH] 代码整合

---
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeFallback.java           |  104 ++
 Source/UBCS-WEB/src/components/refer/vciWebRefer.vue                                                            |   29 
 Source/UBCS-WEB/src/components/Tree/classifyTrees.vue                                                           |   21 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeFallback.java          |   11 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeServiceImpl.java          |   53 +
 Source/UBCS-WEB/vue.config.js                                                                                   |   11 
 Source/UBCS-WEB/src/api/template/templateAttr.js                                                                |   26 
 Source/UBCS-WEB/src/components/template/FlowPath.vue                                                            |   77 
 Source/UBCS/ubcs-service-api/ubcs-dict-api/src/main/java/com/vci/ubcs/system/feign/IDictBizClient.java          |    2 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/LinkTypeClient.java                      |  183 +++
 Source/UBCS-WEB/src/option/user/info.js                                                                         |    2 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeClient.java            |   10 
 Source/UBCS-WEB/src/api/refer/table.js                                                                          |   32 
 Source/UBCS-WEB/src/views/flow/flowPath.vue                                                                     |   67 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java |   69 
 Source/UBCS-WEB/src/api/template/flowpath.js                                                                    |   80 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeService.java                  |   27 
 Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue                                                     |  289 +++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java                    |   11 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java                     |   16 
 Source/更改过的jar包(有更新).zip                                                                                        |    0 
 Source/UBCS-WEB/src/components/template/TableTransfer.vue                                                       |  322 ++++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java                |    6 
 Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue                                                       |  369 ++++++
 Source/UBCS-WEB/src/components/template/Stage.vue                                                               |  259 +++++
 Source/UBCS-WEB/src/components/FormTemplate/FormTempalte.vue                                                    |    2 
 Source/UBCS-WEB/src/views/modeling/status.vue                                                                   |   65 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeClient.java             |  136 ++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java       |  158 +-
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IBtmTypeClient.java              |    6 
 Source/UBCS-WEB/src/api/omd/status.js                                                                           |   12 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml                                  |    4 
 Source/UBCS-WEB/src/main.js                                                                                     |    5 
 Source/UBCS-WEB/public/src/option/user/info.js                                                                  |    2 
 Source/UBCS-WEB/src/components/Tree/TemplatePro.vue                                                             |   13 
 Source/UBCS-WEB/src/components/Tree/attrCrud.vue                                                                |  489 ++++++---
 Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue                                                        |   74 +
 37 files changed, 2,574 insertions(+), 468 deletions(-)

diff --git a/Source/UBCS-WEB/public/src/option/user/info.js b/Source/UBCS-WEB/public/src/option/user/info.js
index de76103..a664bd1 100644
--- a/Source/UBCS-WEB/public/src/option/user/info.js
+++ b/Source/UBCS-WEB/public/src/option/user/info.js
@@ -45,7 +45,7 @@
       }]
     },
     {
-      label: '淇敼瀵嗙爜',
+      label: '',
       prop: 'password',
       column: [{
         label: '鍘熷瘑鐮�',
diff --git a/Source/UBCS-WEB/src/api/omd/status.js b/Source/UBCS-WEB/src/api/omd/status.js
index e80f0f8..4a287a3 100644
--- a/Source/UBCS-WEB/src/api/omd/status.js
+++ b/Source/UBCS-WEB/src/api/omd/status.js
@@ -72,4 +72,14 @@
             pageSize
         }
     })
-}
\ No newline at end of file
+}
+
+export const getApplyRange = (id) => {
+  return request({
+    url: '/api/ubcs-omd/status/get-apply-range',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
diff --git a/Source/UBCS-WEB/src/api/refer/table.js b/Source/UBCS-WEB/src/api/refer/table.js
new file mode 100644
index 0000000..e05299b
--- /dev/null
+++ b/Source/UBCS-WEB/src/api/refer/table.js
@@ -0,0 +1,32 @@
+import request from "@/router/axios";
+
+export const getList = (params,page, limit, url) => {
+  return request({
+    url: url,
+    method: 'get',
+    params: {
+      ...params,
+      page,
+      limit,
+    }
+  })
+}
+
+export const getLazyList = (params,url) => {
+  return request({
+    url: url,
+    method: 'get',
+    params: {
+      ...params
+    }
+  })
+}
+export const getTableDefinedUrl = (params,url) => {
+  return request({
+    url: url,
+    method: 'get',
+    params: {
+      ...params
+    }
+  })
+}
diff --git a/Source/UBCS-WEB/src/api/template/flowpath.js b/Source/UBCS-WEB/src/api/template/flowpath.js
index dc276c5..d1fef57 100644
--- a/Source/UBCS-WEB/src/api/template/flowpath.js
+++ b/Source/UBCS-WEB/src/api/template/flowpath.js
@@ -2,25 +2,65 @@
 
 // 妯℃澘娴佺▼鍒楄〃
 export const getFlowpathList = (params) => {
-    return request({
-      url: '/api/ubcs-flow/processTS/tlist',
-      method: 'get',
-      params: params
-    })
-  }
-  // 妯℃澘娴佺▼鑾峰彇閫夐」
+  return request({
+    url: '/api/ubcs-flow/processTS/tlist',
+    method: 'get',
+    params: params
+  })
+}
+// 妯℃澘娴佺▼鑾峰彇閫夐」
 export const getStartList = () => {
-    return request({
-      url: '/api/ubcs-flow/work/start-list',
-      method: 'get',
-      params: {mode:'1',current:1,size:100}
-    })
-  }
-    // 妯℃澘娴佺▼鏂板
+  return request({
+    url: '/api/ubcs-flow/work/start-list',
+    method: 'get',
+    params: { mode: '1', current: 1, size: 100 }
+  })
+}
+// 妯℃澘娴佺▼鏂板
 export const flowpathSave = (params) => {
-    return request({
-      url: '/api/ubcs-flow/processTS/tsou',
-      method: 'post',
-      data: params
-    })
-  }
+  return request({
+    url: '/api/ubcs-flow/processTS/tsou',
+    method: 'post',
+    data: params
+  })
+}
+// 妯℃澘娴佺▼鍒犻櫎
+export const flowpathDelete = (params) => {
+  return request({
+    url: '/api/ubcs-flow/processTS/dt',
+    method: 'delete',
+    params: params
+  })
+}
+// 妯℃澘闃舵鍒楄〃
+export const stagelist = (params) => {
+  return request({
+    url: '/api/ubcs-flow/processTS/sslist',
+    method: 'get',
+    params: params
+  })
+}
+// 灞炴�у垪琛�
+export const attributeList = (params) => {
+  return request({
+    url: '/api/ubcs-code/codeTempPhaseController/gridUnUsedAttribute',
+    method: 'get',
+    params: params
+  })
+}
+// 灞炴�у垪琛ㄥ乏渚�
+export const attributeListRight = (params) => {
+  return request({
+    url: '/api/ubcs-flow/processTS/ssslist',
+    method: 'get',
+    params: params
+  })
+}
+// 妯℃澘闃舵鍒楄〃
+export const attributeSave = (params) => {
+  return request({
+    url: '/api/ubcs-flow/processTS/sasou',
+    method: 'post',
+    data: params
+  })
+}
diff --git a/Source/UBCS-WEB/src/api/template/templateAttr.js b/Source/UBCS-WEB/src/api/template/templateAttr.js
index d58256e..b0d6a1d 100644
--- a/Source/UBCS-WEB/src/api/template/templateAttr.js
+++ b/Source/UBCS-WEB/src/api/template/templateAttr.js
@@ -148,3 +148,29 @@
     }
   })
 }
+// 淇濆瓨鎺ュ彛
+export const  batchAddSave = (data) =>{
+  return request({
+    url:'/api/ubcs-code/codeClassifyTempAttrController/batchAddSave',
+    method: 'post',
+    data:data
+  })
+}
+//鍚屾鍒板叾浠栨ā鏉�
+export const  copyto = (data) =>{
+  return request({
+    url:'/api/ubcs-code/codeClassifyTempAttrController/copyto',
+    method: 'post',
+    data:data
+  })
+}
+//缂栫爜鐢宠棰勮
+export const  getFormDefineByTemplate = (params) =>{
+  return request({
+    url:'/api/ubcs-code/mdmEngineController/getFormDefineByTemplateOid',
+    method: 'get',
+    params:{
+      ...params
+    }
+  })
+}
diff --git a/Source/UBCS-WEB/src/components/FormTemplate/FormTempalte.vue b/Source/UBCS-WEB/src/components/FormTemplate/FormTempalte.vue
index c8e5b43..37c5899 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/FormTempalte.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/FormTempalte.vue
@@ -558,7 +558,7 @@
           maxlength: formItem.maxlength,
           filterable: true,
           referConfig:formItem.type=='refer'?{
-            title:formItem.text,
+            title:formItem.text ,
             showField:formItem.showField || formItem.field,
             field: formItem.field,
             placeholder: formItem.inputTip,
diff --git a/Source/UBCS-WEB/src/components/Tree/TemplatePro.vue b/Source/UBCS-WEB/src/components/Tree/TemplatePro.vue
index 0649477..116aa50 100644
--- a/Source/UBCS-WEB/src/components/Tree/TemplatePro.vue
+++ b/Source/UBCS-WEB/src/components/Tree/TemplatePro.vue
@@ -2,10 +2,15 @@
   <basic-container>
     <avue-tabs :option="Taboption" @change="handleChange"></avue-tabs>
     <span v-if="type.prop==='tab1'">
-      <attrCrud :ProData="ProData" :crudOid="crudOid" :crudArray="crudArray" :Formlist="Formlist"></attrCrud>
+      <attrCrud :ProData="ProData" :crudOid="crudOid" :crudArray="crudArray" :Formlist="Formlist" :codeClassifyOid="codeClassifyOid"></attrCrud>
     </span>
-    <span v-else-if="type.prop==='tab2'">妯℃澘娴佺▼</span>
-    <span v-else-if="type.prop==='tab3'">妯℃澘闃舵</span>
+    <span v-else-if="type.prop==='tab2'">
+       <FlowPath code="8b5e2017-990f-454a-9c39-4c4eeeb57553"></FlowPath>
+
+    </span>
+    <span v-else-if="type.prop==='tab3'">
+<!--          <stage :visible.sync="visibleStage" code="8b5e2017-990f-454a-9c39-4c4eeeb57553"></stage>-->
+    </span>
   </basic-container>
 
 </template>
@@ -13,7 +18,7 @@
 <script>
 export default {
   name: "TemplatePro.vue",
-  props: ['ProData','crudOid','crudArray','Formlist'],
+  props: ['ProData','crudOid','crudArray','Formlist','codeClassifyOid'],
   data: function () {
     return {
       type: {},
diff --git a/Source/UBCS-WEB/src/components/Tree/attrCrud.vue b/Source/UBCS-WEB/src/components/Tree/attrCrud.vue
index 5ea2bc4..6f7f758 100644
--- a/Source/UBCS-WEB/src/components/Tree/attrCrud.vue
+++ b/Source/UBCS-WEB/src/components/Tree/attrCrud.vue
@@ -1,10 +1,10 @@
 <template>
   <avue-crud :data="ProData" :option="option" @sort-change="sortChange" @row-update="addUpdate"
-             @cell-click="handleRowClick" @select="selectHandle">
+             @cell-click="handleRowClick" @select="selectHandle" @row-del="CrudRowDel">
     <template slot="menuLeft">
-      <el-button v-if="attrEditVisible == false" size="small" type="primary" @click="busineHandle">锛� 娣诲姞 {{msg}}</el-button>
-      <el-dialog :visible.sync="addVisible" append-to-body title="浠庝笟鍔$被鍨嬩腑閫夋嫨灞炴��">
-        <avue-crud :data="businessData" :option="businessOption">
+      <el-button v-if="attrEditVisible == false && attrFlagChiledren==false" size="small" type="primary" @click="busineHandle">锛� 娣诲姞 {{msg}}</el-button>
+      <el-dialog :visible.sync="addVisible" append-to-body title="浠庝笟鍔$被鍨嬩腑閫夋嫨灞炴��" >
+        <avue-crud :data="businessData" :option="businessOption" @select="businessSelect">
           <template slot="menuLeft">
             <div style="display: flex;">
               <el-select>
@@ -18,24 +18,24 @@
           </template>
         </avue-crud>
        <div style="display: flex;justify-content: flex-end;margin-top: 15px">
-         <el-button size="small" type="primary">淇濆瓨</el-button>
+         <el-button size="small" type="primary" @click="busineAddHandle">淇濆瓨</el-button>
          <el-button size="small" type="primary">鍙栨秷</el-button>
        </div>
       </el-dialog>
     </template>
     <!--        鍏ㄥ睆缂栬緫-->
     <template slot="menuLeft">
-      <el-button v-if="attrEditVisible == false" size="small" @click="attrEditVisible=true">鍏ㄥ睆缂栬緫</el-button>
-      <!--      <el-button @click.native="attrEditVisible=false" size="small">閫�鍑哄叏灞忕紪杈�</el-button>-->
+      <el-button v-if=" attrEditVisible == false && attrFlagChiledren==false" size="small" @click="fullscreenHandle">鍏ㄥ睆缂栬緫</el-button>
+<!--      <el-button v-if="attrFlagChiledren !=false" size="small" plain type="success" @click="escEdit">閫�鍑哄叏灞忕紪杈�</el-button>-->
       <el-dialog :visible.sync="attrEditVisible" append-to-body fullscreen="true">
-        <attrCrud></attrCrud>
+       <attrCrud :ProData="this.ProData" :attrFlagChiledren="this.attrFlag"></attrCrud>
       </el-dialog>
     </template>
 <!--    缁勫悎瑙勫垯-->
     <template slot="menuLeft">
-      <el-button size="small" @click="isShowformulaEdit = true">缁勫悎瑙勫垯</el-button>
-        <formula-editor :visible.sync="isShowformulaEdit" :systemVariableTableData="systemVariableTableData" :thisSceneTableData="thisSceneTableData">\
-        </formula-editor>
+      <el-button size="small" @click="isShowformulaEdit=true">缁勫悎瑙勫垯</el-button>
+        <formula-editor :visible.sync="isShowformulaEdit" :systemVariableTableData="systemVariableTableData" :thisSceneTableData="thisSceneTableData"></formula-editor>
+
     </template>
     <!--        楠岃瘉瑙勫垯-->
     <template slot="menuLeft">
@@ -83,16 +83,24 @@
     </template>
     <!--        灞炴�у垎缁�-->
     <template slot="menuLeft">
-      <el-button icon="el-icon-menu" size="small" @click="attrVisible=true">灞炴�у垎缁�</el-button>
+      <el-button icon="el-icon-menu" size="small" @click="attrVisibleHandle">灞炴�у垎缁�</el-button>
 
       <el-dialog :visible.sync="attrVisible" append-to-body style="width: 800px; left:30vw;top: 10vh ;"
                  title="杈撳叆鍒嗙粍鐨勫悕绉�">
-        <avue-form :option="attrOption"></avue-form>
+        <el-form ref="form"  label-width="70px">
+          <el-form-item label="灞炴�у垎缁�">
+            <el-input v-model="attrModel"></el-input>
+          </el-form-item>
+            <div style="display: flex;justify-content: flex-end">
+              <el-button type="primary" @click="attrHandle" size="small">鎻愪氦</el-button>
+              <el-button size="small" @click="attrRemove">娓呯┖</el-button>
+            </div>
+        </el-form>
       </el-dialog>
     </template>
     <!--        鍒嗙被娉ㄥ叆-->
     <template slot="menuLeft">
-      <el-button icon="el-icon-magic-stick" size="small" @click="injectVisible=true">鍒嗙被娉ㄥ叆</el-button>
+      <el-button icon="el-icon-magic-stick" size="small" @click="injectBtn">鍒嗙被娉ㄥ叆</el-button>
       <el-dialog :visible.sync="injectVisible" append-to-body class="mydialog"
                  style="width: 1400px; left:14vw ;top: 10vh;" title="鍒嗙被娉ㄥ叆">
         <div class="injectBox">
@@ -102,38 +110,63 @@
             <br/>4锛氬眰绾у繀椤绘槸澶т簬0鐨勬暣鏁板��
           </div>
           <div style="padding-top: 15px;padding-left: 35px">
-            <avue-form :option="injectOption" @reset-change="injectHandleReset">
-              <template slot="menuForm">
-                <el-button icon="el-icon-user" @click="injectRemove">鍙栨秷</el-button>
-              </template>
-            </avue-form>
+            <el-form ref="injectForm"  label-width="80px">
+              <el-form-item label="娉ㄥ叆绫诲瀷">
+                <el-radio-group v-model="injectOption.type">
+                  <el-radio label="鍒嗙被鍚嶇О"></el-radio>
+                  <el-radio label="鍒嗙被浠e彿"></el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item label="灞傜骇璁剧疆">
+                <el-radio-group v-model="injectOption.set">
+                  <el-radio label="鏈�灏忓眰"></el-radio>
+                  <el-radio label="鎸囧畾灞�"></el-radio>
+                  <el-input-number v-model="injectOption.injectNum" controls-position="right"  :min="0" :max="10" v-if="this.injectOption.set == '鎸囧畾灞�'"></el-input-number>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item label="鍙慨鏀�">
+                <el-radio-group v-model="injectOption.change">
+                  <el-radio label="鏄�"></el-radio>
+                  <el-radio label="鍚�"></el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-form>
           </div>
+        </div>
+        <div style="display: flex;justify-content: flex-end">
+          <el-button size="small" type="primary" @click="injectAddHandle">纭畾</el-button>
+          <el-button size="small" @click="injectHandleReset">娓呴櫎鍐呭</el-button>
+          <el-button size="small" @click="injectRemove">鍙栨秷</el-button>
         </div>
       </el-dialog>
     </template>
     <!--        鏋氫妇娉ㄥ叆-->
     <template slot="menuLeft">
-      <el-button size="small" @click="enumVisible=true">鏋氫妇娉ㄥ叆</el-button>
+      <el-button size="small" @click="enmuVisHandle">鏋氫妇娉ㄥ叆</el-button>
       <el-dialog :visible.sync="enumVisible" append-to-body title="鏋氫妇娉ㄥ叆">
         <!-- 娓叉煋琛ㄦ牸鍙婃寜閽� -->
         <!-- 娓叉煋琛ㄦ牸鍙婃寜閽� -->
         <div>
           <el-button icon="el-icon-plus" type="primary" @click="addRow">鏂板</el-button>
-          <el-table :data="tableData" style="width: 100%" @cell-click="handleCellClick" @cell-dblclick="dbclick">
+          <el-table :data="tableData" style="width: 100%" @cell-click="handleCellClick" @selection-change="handleSelectionChange">
             <!-- 娓叉煋琛ㄦ牸鍒楀強浼犲弬 -->
             <el-table-column label="搴忓彿" type="index"></el-table-column>
-            <el-table-column label="閫夐」鍊�" prop="name">
+            <el-table-column
+              type="selection"
+              width="55">
+            </el-table-column>
+            <el-table-column label="閫夐」鍊�" prop="key">
               <template slot-scope="{ row }">
                 <!-- 缂栬緫鍜屽睍绀洪�昏緫 -->
-                <el-input v-if="editingRow === row && editShow == 'name'" v-model="row.name" @blur="saveRow"></el-input>
-                <span v-else>{{ row.name }}</span>
+                <el-input v-if="editingRow === row && editShow == 'key'" v-model="row.key" @blur="saveRow"></el-input>
+                <span v-else>{{ row.key }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="閫夐」涓枃鏍囩" prop="age">
+            <el-table-column label="閫夐」涓枃鏍囩" prop="value">
               <template slot-scope="{ row }">
                 <!-- 缂栬緫鍜屽睍绀洪�昏緫 -->
-                <el-input v-if="editingRow === row && editShow == 'age'" v-model="row.age" @blur="saveRow"></el-input>
-                <span v-else>{{ row.age }}</span>
+                <el-input v-if="editingRow === row && editShow == 'value'" v-model="row.value" @blur="saveRow"></el-input>
+                <span v-else>{{ row.value }}</span>
               </template>
             </el-table-column>
             <el-table-column fixed="right" label="鎿嶄綔" width="120">
@@ -146,7 +179,7 @@
           </el-table>
           <template>
             <div style="display: flex;justify-content: right;margin-top: 15px">
-              <el-button type="primary"  size="small">淇濆瓨</el-button>
+              <el-button type="primary"  size="small" @click="enumAddHandle">淇濆瓨</el-button>
               <el-button size="small" @click="enumVisible=false">鍙栨秷</el-button>
             </div>
           </template>
@@ -166,7 +199,7 @@
           </template>
         </avue-crud>
         <div style="display: flex ;padding-top: 18px;justify-content: right">
-          <el-button size="small" type="primary">纭畾</el-button>
+          <el-button size="small" type="primary" @click="CascadeAddHandle">纭畾</el-button>
           <el-button size="small" style="margin-left: 10px" @click="casRemove">娓呴櫎鍐呭</el-button>
           <el-button size="small" style="margin-left: 10px" @click="CascadeVisible=false">鍙栨秷</el-button>
         </div>
@@ -182,26 +215,71 @@
     </template>
     <!--    鍒犻櫎-->
     <template slot="menuLeft">
-      <el-button size="small">鍒犻櫎</el-button>
+      <el-button size="small" @click="CrudRemove">鍒犻櫎</el-button>
     </template>
     <!--    閲嶇疆-->
     <template slot="menuLeft">
-      <el-button size="small">閲嶇疆</el-button>
+      <el-button size="small" @click="reset">閲嶇疆</el-button>
     </template>
     <!--    鍚屾鍒板叾浠栨ā鏉�-->
     <template slot="menuLeft">
-      <el-button size="small" style="margin-top: 10px">鍚屾鍒板叾浠栨ā鏉�</el-button>
+      <el-button size="small" style="margin-top: 10px" @click="syncHandle">鍚屾鍒板叾浠栨ā鏉�</el-button>
+    </template>
+<!--    缂栫爜鐢宠棰勮-->
+    <template slot="menuLeft">
+      <el-button size="small" style="margin-top: 10px" @click="applicationHandle">缂栫爜鐢宠棰勮</el-button>
+        <FormTemplateDialog
+          :visible.sync="addvisible"
+          :type="add"
+          :templateOid="this.crudOid"
+          :codeClassifyOid="this.codeClassifyOid"
+        >
+        </FormTemplateDialog>
     </template>
   </avue-crud>
 </template>
 
 <script>
-import {AttrByBtm,gridCodeClassifyTemplateAttr} from '@/api/template/templateAttr'
+import {AttrByBtm,gridCodeClassifyTemplateAttr,batchAddSave,copyto} from '@/api/template/templateAttr'
 export default {
   name: "attrCrud .vue",
-  props: ['ProData','crudOid','crudArray','Formlist'],
+  // props: ['ProData','crudOid','crudArray','Formlist','codeClassifyOid'],
+  props:{
+    ProData:{
+      type:Array,
+    },
+    crudOid:{
+      type:String,
+      default:''
+    },
+    crudArray:{
+      type:Array,
+    },
+    Formlist:{
+      type:Array,
+    },
+    codeClassifyOid:{
+      type:String,
+      default:''
+    },
+    attrFlagChiledren:{
+      type:Boolean,
+      default:false
+    },
+  },
   data() {
     return {
+      attrFlag:false,
+      //缂栫爜鐢宠棰勮option
+      applicationoption:{
+        column:[]
+      },
+      // 缂栫爜鐢宠棰勮data
+      applicationData:[],
+      //涓氬姟绫诲瀷鍗曢�夋暟缁�
+      busineSelectList:[],
+      //涓氬姟绫诲瀷娣诲姞鏁版嵁
+      busineAddList:{},
       //琛ㄦ牸鍗曢�夋暟缁�
       CrudSelect:[],
       //琛ㄦ牸oid
@@ -573,6 +651,8 @@
       editShow: "",
       //鏋氫妇娉ㄥ叆
       enumVisible: false,
+      //鏋氫妇娉ㄥ叆澶氶�変繚瀛樻暟缁�
+      enumRow:[],
       // 鍒嗙被娉ㄥ叆寮瑰嚭妗�
       injectVisible: false,
       // 娣诲姞寮瑰嚭妗�
@@ -581,67 +661,19 @@
       rulesVisible: false,
       //灞炴�у垎缁勫脊鍑烘
       attrVisible: false,
-      //灞炴�у垎缁刼ption
-      attrOption: {
-        column: [
-          {
-            label: "灞炴�у垎缁�",
-            span: 24,
-            prop: "attrIN"
-          }
-        ]
-      },
+      //灞炴�у垎缁勮緭鍏ユ
+      attrModel:"",
+      //褰撳墠鍗曢�夋ā鏉垮睘鎬�
+      attrRow:{},
+      //缂栫爜鐢宠棰勮寮瑰嚭妗�
+      addvisible:false,
       //鍒嗙被娉ㄥ叆option
       injectOption: {
-        column: [
-          {
-            label: "娉ㄥ叆绫诲瀷",
-            type: 'radio',
-            prop: "injection",
-            span: 24,
-            value: 0,
-            dicData: [
-              {
-                label: '鍒嗙被鍚嶇О',
-                value: 0
-              }, {
-                label: '鍒嗙被浠e彿',
-                value: 1
-              },
-            ]
-          },
-          {
-            label: "灞傜骇璁剧疆",
-            type: 'radio',
-            prop: "Level",
-            span: 24,
-            value: 0,
-            dicData: [
-              {
-                label: '鏈�灏忓眰',
-                value: 0
-              }, {
-                label: '鎸囧畾灞�',
-                value: 1
-              },
-            ]
-          },
-          {
-            label: "鍙慨鏀�",
-            type: 'radio',
-            prop: "revise",
-            value: 0,
-            dicData: [
-              {
-                label: '鏄�',
-                value: 0
-              }, {
-                label: '鍚�',
-                value: 1
-              },
-            ]
-          }
-        ]
+        type:"鍒嗙被鍚嶇О",
+        set:"鏈�灏忓眰",
+        change:"鏄�",
+        //鍒嗙被娉ㄥ叆璁℃暟鍣�
+        injectNum:0,
       },
       // 灞炴�ч獙璇佽緭鍏ユ
       RulesForm: {
@@ -682,6 +714,8 @@
         border: true,
         addBtn: false,
         menu:false,
+        selection:true,
+        height:500,
         column: [
           {
             label: "灞炴�ц嫳鏂囧悕绉�",
@@ -731,26 +765,6 @@
       },
       //妯℃澘灞炴��
       data: [
-        {
-          id: "娴嬭瘯涓�",
-          name: "娴嬭瘯name1",
-          attributegroup: "娴嬭瘯涓�",
-          attributeDataTypeText: "娴嬭瘯涓�",
-
-        },
-        {
-          id: "娴嬭瘯浜�",
-          name: "娴嬭瘯name2",
-          attributegroup: "娴嬭瘯浜�",
-          attributeDataTypeText: "娴嬭瘯浜�"
-        },
-        {
-          id: "娴嬭瘯涓�",
-          name: "娴嬭瘯name3",
-          attributegroup: "娴嬭瘯涓�",
-          attributeDataTypeText: "娴嬭瘯涓�",
-          keyattrflag: false
-        }
       ],
       // 褰撳墠琛�
       rowList: [],
@@ -791,7 +805,7 @@
           },
           {
             label: "灞炴�у垎缁�",
-            prop: "attributegroup",
+            prop: "attributeGroup",
             cell: false,
             sortable: true,
             width: 125,
@@ -811,101 +825,101 @@
           },
           {
             label: "鍏抽敭灞炴��",
-            prop: "keyattrflag",
+            prop: "keyAttrFlag",
             cell: false,
             type: "switch",
           },
           {
             label: "鏌ヨ灞炴��",
-            prop: "queryattrflag",
+            prop: "queryAttrFlag",
             cell: false,
           },
           {
             label: "楂樼骇鏌ヨ灞炴��",
-            prop: "seniorqueryattrflag",
+            prop: "seniorQueryAttrFlag",
             width: 95,
             cell: false,
           },
           {
             label: "鐩镐技鏌ヨ灞炴��",
-            prop: "samerepeatattrflag",
+            prop: "sameRepeatAttrFlag",
             width: 95,
             cell: false,
           },
           {
             label: "蹇呰緭",
-            prop: "requireflag",
+            prop: "requireFlag",
             cell: false,
           },
           {
             label: "琛ㄥ崟鏄剧ず",
-            prop: "formdisplayflag",
+            prop: "formDisplayFlag",
             cell: false,
           },
           {
             label: "鍒楄〃鏄剧ず",
-            prop: "tabledisplayflag",
+            prop: "tableDisplayFlag",
             cell: false,
           },
           {
             label: "鍙",
-            prop: "readonlyflag",
+            prop: "readonlyFlag",
             cell: false,
           },
           {
             label: "鍒楄〃鎺掑簭",
-            prop: "sortattrflag",
+            prop: "sortAttrFlag",
             cell: false,
           },
 
           {
             label: "澶氳鏂囨湰",
-            prop: "textareaflag",
+            prop: "textareaFlag",
             cell: false,
           },
           {
             label: "榛樿鍊�",
-            prop: "defaultvalue",
+            prop: "defaultValue",
             sortable: true,
             cell: false,
             width: 95,
           },
           {
             label: "鍓嶇紑",
-            prop: "prefixvalue",
+            prop: "prefixValue",
             sortable: true,
             cell: false,
           },
           {
             label: "鍚庣紑",
-            prop: "suffixvalue",
+            prop: "suffixValue",
             sortable: true,
             cell: false,
           },
           {
             label: "缁勫悎瑙勫垯",
-            prop: "componentrule",
+            prop: "componentRule",
             sortable: true,
             cell: false,
             width: 105,
           },
           {
             label: "楠岃瘉瑙勫垯",
-            prop: "verifyrule",
+            prop: "verifyRule",
             sortable: true,
             cell: false,
             width: 105,
           },
           {
             label: "鏃堕棿鏍煎紡",
-            prop: "codedateformat",
+            prop: "codeDateFormat",
             sortable: true,
             width: 105,
             cell: false,
           },
           {
             label: "鍒嗙被娉ㄥ叆",
-            prop: "classifyinvokelevel",
+            prop: "classifyInvokeLevel",
             cell: false,
           },
           {
@@ -942,61 +956,110 @@
           },
           {
             label: "琛ㄥ崟鏄剧ず鏍峰紡",
-            prop: "formdisplaystyle",
+            prop: "formDisplayStyle",
             width: 105,
             cell: false,
           },
           {
             label: "琛ㄦ牸鏄剧ず鏍峰紡",
-            prop: "tabledisplaystyle",
+            prop: "tableDisplayStyle",
             width: 105,
             cell: false,
           },
           {
             label: "琛ㄥ崟瓒呴摼鎺�",
-            prop: "formhref",
+            prop: "formHref",
             width: 95,
             cell: false,
           },
           {
             label: "琛ㄦ牸瓒呴摼鎺�",
-            prop: "tablehref",
+            prop: "tableHref",
             width: 95,
             cell: false,
           },
           {
             label: "琛ㄦ牸鏄剧ずjs",
-            prop: "tabledisplayjs",
+            prop: "tableDisplayJs",
             width: 95,
             cell: false,
           },
           {
             label: "闀垮害",
-            prop: "controllength",
+            prop: "controlLength",
             cell: false,
           },
           {
             label: "灏忔暟绮惧害",
-            prop: "precisionlength",
+            prop: "precisionLength",
             cell: false,
           },
           {
             label: "鍙栧�艰寖鍥�",
-            prop: "valuearea",
+            prop: "valueArea",
             sortable: true,
             cell: false,
             width: 105,
           },
         ],
+        List:[]
       }
     }
   },
   mounted() {
-    console.log(this.attrEditVisible)
-    console.log(this.ProData)
+  },
+  created() {
+
   },
   methods: {
-
+    //灞炴�у垎缁勬寜閽�
+    attrVisibleHandle(){
+      if(this.CrudSelect.length>1){
+        this.$message.warning('鍙兘閫夋嫨涓�鏉℃ā鏉垮睘鎬�')
+      }else if(this.CrudSelect<1){
+        this.$message.warning('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬�')
+      }else if(this.CrudSelect.length === 1){
+        this.attrVisible=true;
+      }
+    },
+    //灞炴�у垎缁勬彁浜�
+    attrHandle(){
+      this.$set(this.attrRow,'attributeGroup',this.attrModel)
+      this.attrModel=""
+      this.attrVisible=false
+    },
+    //灞炴�у垎缁勬竻绌�
+    attrRemove(){
+      this.attrModel=""
+    },
+    //琛ㄦ牸鏁版嵁
+    CrudRend(){
+      if(this.crudOid != ''){
+        gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.crudOid}).then(res => {
+          this.ProData = res.data.data;
+        }).catch(res => {
+          this.$message.error(res)
+        })
+      }
+    },
+    //涓氬姟绫诲瀷淇濆瓨
+    busineAddHandle(){
+      if(this.busineSelectList.length>1){
+        this.$message.warning('璇烽�夋嫨涓�鏉′笟鍔$被鍨嬫暟鎹�')
+      }else {
+        this.$set(this.busineAddList,'classifytemplateoid',this.crudOid)
+        this.$set(this.busineAddList,'oid','')
+        this.ProData.push(JSON.parse(JSON.stringify(this.busineAddList)))
+        console.log(this.busineAddList)
+        this.addVisible=false;
+        console.log('prodata',this.ProData)
+      }
+    },
+    //涓氬姟绫诲瀷鍗曢��
+    businessSelect(selection,row){
+      this.busineSelectList=selection
+      this.busineAddList=row
+    },
     // 浠庝笟鍔$被鍨嬩腑閫夋嫨鏁版嵁
     busineHandle(){
       if(this.crudArray.length<1){
@@ -1009,36 +1072,42 @@
         })
       }
     },
-    // 绾ц仈灞炴��
+    // 绾ц仈灞炴�ф寜閽�
     CascadeHandle(){
-      if(this.CrudSelect.length >0){
+      if(this.CrudSelect.length >1){
+       this.$message.warning('鍙兘閫夋嫨涓�鏉℃ā鏉垮睘鎬�')
+      }else if(this.CrudSelect.length<1){
+        this.$message.warning('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬�')
+      }else if(this.CrudSelect.length === 1){
         this.CascadeVisible=true;
         gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.Formlist[0].oid,
           'conditionMap[oid_notequal]':this.CrudOid
         }).then(res=>{
-         this.CascadeData=res.data.data
+          this.CascadeData=res.data.data;
         })
-      }else {
-        this.$message.warning('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬�')
       }
     },
     //琛ㄦ牸鍗曢��
     selectHandle(selection,row){
       this.CrudOid=row.oid;
-      this.CrudSelect=selection
+      this.CrudSelect=selection;
+      this.attrRow=row;
+      console.log(selection.length)
     },
+    //淇濆瓨
     addsHandler(){
-
+      batchAddSave(this.ProData).then(res=>{
+        console.log(res)
+        this.$message.success('淇濆瓨鎴愬姛')
+      })
     },
-    // screenEdit(){
-    //   debugger
-
-    //   this.attrEditVisible=true;
-    // },
-    // outEdit(){
-    //   debugger
-    //   this.attrEditVisible=false;
-    // },
+    //绾ц仈淇濆瓨
+    CascadeAddHandle(){
+      let CascadeString="";
+      CascadeString=this.attrRow.id+(this.attrRow.name);
+      this.$set(this.attrRow,'parentCode',CascadeString)
+      this.CascadeVisible=false;
+    },
     //绾ц仈灞炴�ф竻闄�
     casRemove() {
       this.selectRow = ""
@@ -1047,14 +1116,13 @@
     CascaderowClick(row) {
       this.selectRow = row.$index
       console.log(row)
-      this.$message.success('閫夋嫨搴忓彿' + row.$index)
     },
     // 鏋氫妇娉ㄥ叆娣诲姞涓�琛岀┖鏁版嵁
     addRow() {
-      this.tableData.push({
-        name: "",
-        age: ""
-      });
+      this.tableData.push(JSON.parse(JSON.stringify({
+        key: "",
+        value: ""
+      })));
     },
     // 鏋氫妇娉ㄥ叆鐩戝惉鍗曞厓鏍肩偣鍑讳簨浠跺苟瀛樺偍姝e湪缂栬緫鐨勮
     handleCellClick(row, column) {
@@ -1065,6 +1133,31 @@
     enumDeleteRow(row) {
       console.log(row)
       this.tableData.splice(row, 1)
+    },
+    //鏋氫妇娉ㄥ叆鎸夐挳
+    enmuVisHandle(){
+      if(this.CrudSelect.length>1){
+        this.$message.warning('鍙兘閫夋嫨涓�鏉℃ā鏉垮睘鎬�')
+      }else if(this.CrudSelect<1){
+        this.$message.warning('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬�')
+      }else if(this.CrudSelect.length === 1){
+        this.enumVisible=true;
+      }
+    },
+    //鏋氫妇娉ㄥ叆澶氶�夋
+    handleSelectionChange(row){
+      console.log(row)
+      this.enumRow=JSON.parse(JSON.stringify(row));
+    },
+    //鏋氫妇娉ㄥ叆淇濆瓨
+    enumAddHandle(){
+      console.log(this.enumRow)
+      if(this.enumRow.length<1){
+        this.$message.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
+      }else {
+        this.$set(this.attrRow,'enumString',this.enumRow);
+        this.enumVisible=false;
+      }
     },
     // 灏嗘鍦ㄧ紪杈戠殑琛岀殑鐘舵�佸彉涓� null 锛屽嵆閫�鍑虹紪杈戠姸鎬�
     saveRow() {
@@ -1087,9 +1180,27 @@
     rulesExamine() {
 
     },
+    //鐐瑰嚮鍒嗙被娉ㄥ叆鎸夐挳
+    injectBtn(){
+      if(this.CrudSelect.length>1){
+        this.$message.warning('鍙兘閫夋嫨涓�鏉℃ā鏉挎暟鎹�')
+      }else if(this.CrudSelect.length<1){
+        this.$message.warning('璇烽�夋嫨涓�鏉℃ā鏉挎暟鎹�')
+      }else if(this.CrudSelect.length === 1){
+        this.injectVisible=true
+      }
+    },
+    //鍒嗙被娉ㄥ叆淇濆瓨
+    injectAddHandle(){
+      this.$set(this.attrRow,'classifyInvokeLevel',this.injectOption);
+      this.injectVisible=false
+    },
     //鍒嗙被娉ㄥ叆娓呯┖
     injectHandleReset() {
-      console.log("娓呯┖")
+      this.injectOption.type="";
+      this.injectOption.set="";
+      this.injectOption.change="";
+      this.injectOption.injectNum="";
     },
     // 鍒嗙被娉ㄥ叆鍙栨秷
     injectRemove() {
@@ -1129,6 +1240,56 @@
       //鍔犱笂done鍏抽棴淇濆瓨鍚庝笉鍙紪杈戠殑鐘舵��
       done()
     },
+    //琛ㄦ牸鎿嶄綔鏍忓垹闄�
+    CrudRowDel(row){
+      this.ProData.splice(row.$index,1)
+    },
+    //琛ㄦ牸鍒犻櫎
+    CrudRemove(){
+      this.ProData.splice(this.attrRow.$index,1)
+    },
+    //琛ㄦ牸閲嶇疆
+    reset(){
+      this.CrudRend()
+    },
+    //鍚屾鍒板叾浠栨ā鏉�
+    syncHandle(){
+      if(this.CrudSelect.length>1){
+        this.$message.warning('鍙兘閫夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�')
+      }else if(this.CrudSelect.length<1){
+        this.$message.warning('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�')
+      }else if(this.CrudSelect.length === 1){
+        copyto({oid:this.attrRow.oid}).then(res=>{
+          this.$message.success('鍚屾鎴愬姛')
+        })
+      }
+    },
+    //缂栫爜鐢宠棰勮
+    applicationHandle(){
+      this.addvisible=true;
+      console.log('temp',this.crudOid)
+      console.log('code',this.codeClassifyOid)
+      // getFormDefineByTemplate({templateOid:this.crudOid,codeClassifyOid:this.codeClassifyOid}).then(res=>{
+      //   console.log(res)
+      // })
+    },
+    //鍏ㄥ睆缂栬緫
+    fullscreenHandle(){
+      if(this.crudArray.length<1){
+        this.$message.warning('璇烽�夋嫨涓�涓ā鏉�')
+      }else {
+        this.attrEditVisible=true;
+        this.attrFlag=true;
+        console.log(this.attrEditVisible)
+      }
+
+    },
+    //閫�鍑哄叏灞忕紪杈�
+    escEdit(){
+      this.attrFlagChiledren=false;
+      this.attrEditVisible=false;
+      console.log(this.attrEditVisible)
+    },
     // 鎺掑簭
     sortChange(val) {
       console.log(val)
diff --git a/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue b/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue
index 13cd051..9048526 100644
--- a/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue
+++ b/Source/UBCS-WEB/src/components/Tree/classifyTrees.vue
@@ -169,7 +169,7 @@
           </avue-crud>
 
           </basic-container>
-          <templatePro :ProData="this.ProData" :crudOid="this.crudOid" :crudArray="this.crudArray" :Formlist="this.Formlist"></templatePro>
+          <templatePro :ProData="this.ProData" :crudOid="this.crudOid" :crudArray="this.crudArray" :Formlist="this.Formlist" :codeClassifyOid="this.codeClassifyOid"></templatePro>
         </span>
       </basic-container>
     </el-main>
@@ -437,8 +437,14 @@
   methods: {
     //琛屽崟閫変簨浠�
     selectHandle(selection,row){
-      this.crudOid=row.oid
-      this.crudArray=selection
+      this.crudOid=row.oid;
+      this.crudArray=selection;
+      gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.Formlist[0].oid}).then(res => {
+        this.ProData = res.data.data;
+        console.log(this.ProData)
+      }).catch(res => {
+        this.$message.error(res)
+      })
     },
     //鍒嗙被鏍戞暟鎹鐞�
     getAttr() {
@@ -634,6 +640,7 @@
       //瀹氫箟涓�涓ā鏉垮睘鎬d锛屾暟鎹槸妯℃澘绠$悊琛ㄦ牸閲岄潰鐨刼id
       this.nodeClickList = data
       console.log(data.oid)
+      this.ProData=[]
       try {
         await TreeObjcet(data.oid).then(res => {
           this.FlagObj = res.data.data
@@ -648,14 +655,6 @@
               return item.codeclassifyoid == this.nodeClickList.oid
             }
           })
-          if(this.Formlist.length >0){
-            gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.Formlist[0].oid}).then(res => {
-              this.ProData = res.data.data;
-              console.log(this.ProData)
-            }).catch(res => {
-              this.$message.error(res)
-            })
-          }
         }).catch(res => {
           console.log(res)
         })
diff --git a/Source/UBCS-WEB/src/components/refer/vciWebRefer.vue b/Source/UBCS-WEB/src/components/refer/vciWebRefer.vue
index 27f49f0..5596490 100644
--- a/Source/UBCS-WEB/src/components/refer/vciWebRefer.vue
+++ b/Source/UBCS-WEB/src/components/refer/vciWebRefer.vue
@@ -1,14 +1,13 @@
 <template>
-  <vciWebReferTree v-if="refertype=='tree'" @setValue="setValue" :value="value" :text="text" :referConfig="referConfig"></vciWebReferTree>
-  <vciWebReferTable v-else-if="refertype=='table'" @setValue="setValue" :value="value" :text="text" :referConfig="referConfig"></vciWebReferTable>
-  <vciWebReferDefalut v-else  @setValue="setValue" :value="value" :text="text" :referConfig="referConfig"></vciWebReferDefalut>
+  <vciWebReferTree v-if="refertype=='tree'" @setValue="setValue" :value="value" :text="text" :title="title" :referConfig="referConfig"></vciWebReferTree>
+  <vciWebReferTable v-else-if="refertype=='table'" @setValue="setValue" :value="value" :text="text" :title="title" :referConfig="referConfig"></vciWebReferTable>
+  <vciWebReferDefalut v-else  @setValue="setValue" :value="value" :text="text" :title="title" :referConfig="referConfig"></vciWebReferDefalut>
 </template>
 
 <script>
 import vciWebReferTree from "./vciWebReferTree.vue";
 import vciWebReferTable from "./vciWebReferTable.vue";
-import vciWebReferDefalut from "./vciWebReferTable.vue";
-import {validatenull} from "@/util/validate";
+import vciWebReferDefalut from "./vciWebReferDefalut.vue";
 export default {
   name: "vciWebRefer",
   props: ["referConfig","value","text"],
@@ -16,20 +15,17 @@
   data() {
     return {
       refertype: this.referConfig.options.type,
-      isMuti: ("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
-      emitData:{}
+      emitData:{},
+      title:''
     };
   },
-  created() {
+  created() {},
+  mounted() {
     var title = this.referConfig.title || '';
     title = title.replace(":", "");
-    if (title) {
-      title = validatenull(this.referConfig.title) ? ('涓恒��' + title + '銆戦�夊彇鍊�') : this.referConfig.title;
-    } else {
-      title = validatenull(this.referConfig.title) ? ('涓恒��' + this.referConfig.showField + '銆戦�夊彇鍊�') : this.referConfig.title;
-    }
-    this.referConfig.title = title;
-    this.referConfig.isMuti = this.isMuti;
+    title = title ? ('涓恒��' + title + '銆戦�夊彇鍊�') : ('涓恒��' + this.referConfig.showField + '銆戦�夊彇鍊�');
+
+    this.title=title;
   },
   methods: {
     setValue(value) {
@@ -45,9 +41,6 @@
         this.$emit("setReferValue", newV);
       },
     }
-  },
-  mounted() {
-
   }
 }
 </script>
diff --git a/Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue b/Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue
new file mode 100644
index 0000000..8b3ec00
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue
@@ -0,0 +1,289 @@
+<template>
+  <div>
+    <el-dialog :title="title"
+               v-dialogDrag append-to-body="true"
+               :visible.sync="visible"
+               top="0"
+               class="avue-dialog avue-dialog--top"
+               :width="referConfig.options.width|| '80%'">
+      <avue-crud :option="option"
+                 :table-loading="loading"
+                 :data="data"
+                 :page.sync="page"
+                 v-model="value"
+                 ref="referDefalutCrud"
+                 @search-change="searchChange"
+                 @search-reset="searchReset"
+                 @selection-change="selectionChange"
+                 @current-change="currentChange"
+                 @size-change="sizeChange"
+                 @refresh-change="refreshChange"
+                 @on-load="onLoad">
+      </avue-crud>
+      <div class="avue-dialog__footer">
+        <div class="avue-dialog__footer--left valueInfo">{{ valueInfo }}</div>
+        <el-button @click="visible=false">鍙� 娑�</el-button>
+        <el-button @click="setValue" type="primary">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+
+    <avue-input v-model="text" :placeholder="title" @click="visible=true"></avue-input>
+    <!--<avue-input-table ref="referTable"  :props="props"  :column="column" :on-load="onLoad" v-model="value"  :placeholder="title" ></avue-input-table>
+  -->
+  </div>
+</template>
+
+<script>
+import { validatenull } from "@/util/validate";
+import {getList,getLazyList,getTableDefinedUrl} from "@/api/refer/table";
+export default {
+  name: "vciWebReferDefalut",
+  props:["referConfig","value","text","title"],
+  data() {
+    return {
+      visible: false,
+      options: this.referConfig.options,
+      isMuti: ("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
+      props: {
+        value: this.referConfig.valueField || this.referConfig.options.valueField || 'oid',
+        label: this.referConfig.textField || this.referConfig.options.textField || "name"
+      },
+      url: this.referConfig.options.url || '/api/ubcs-code/mdmEngineController/defaultReferDataGrid',
+      tableDefinedUrl:'',//骞冲彴琛ㄦ牸鍦板潃
+      copyParam: ['referBo', 'textField', 'valueField', 'displayTable', 'whereSql',  'queryScheme'],
+      query: {},
+      loading: false,
+      page: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      data:this.referConfig.options.data || [],
+      selectionList: [],
+      option: {
+        addBtn: false,
+        height: this.referConfig.options.height ? this.referConfig.options.height : 475,
+        calcHeight: 30,
+        tip: false,
+        menu:false,
+        searchShow: true,
+        searchMenuSpan: 6,
+        searchLabelWidth: 90,
+        border: true,
+        index: true,
+        selection: true,
+        dialogClickModal: false,
+        highlightCurrentRow: true,
+        column: []
+      }
+    };
+  },
+  created() {
+    this.getParams();
+    console.log('referConfig:')
+    console.log(this.referConfig)
+  },
+  mounted() {
+  },
+  computed:{
+    valueInfo:function (){
+      return this.text ? ("宸茶缃殑鍊间负[" + this.text + "]"): '鏈缃��'
+    }
+  },
+  methods: {
+    getParams:function () {
+      var queryParams = {};
+      if (this.options.extraParams) {
+        queryParams = this.options.extraParams;
+      }
+      if (this.options.useFormKey && this.options.formValues) {
+        //浣跨敤琛ㄥ崟涓婄殑瀛楁鏉ヨ繃婊�
+        queryParams['conditionMap["' + (this.options.paramForFormKey ? this.options.paramForFormKey : this.options.useFormKey) + '"]'] = this.options.formValues[this.options.useFormKey];
+      }
+      if (this.options.where) {
+        for (var key in this.options.where) {
+          queryParams['conditionMap["' + key + '"]'] = this.options.where[key];//鏂�
+        }
+      }
+      for (var i = 0; i < this.copyParam.length; i++) {
+        queryParams[this.copyParam[i]] = this.options[this.copyParam[i]];
+      }
+      queryParams["isMuti"] = this.isMuti;
+      queryParams.muti = this.isMuti;
+      if (!queryParams['referBo']) {
+        queryParams['referBo'] = this.options['referBo'] || this.options['referType'];
+      }
+      queryParams['referType'] = queryParams['referBo']
+      if (this.options.remoteSort && this.options.initSort) {
+        queryParams['order'] = this.options.initSort.type;//鏂规硶
+        queryParams['sort'] = this.options.initSort.field;//瀛楁
+      }
+      if (this.options.conditionParams) {
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in this.options.conditionParams) {
+          queryParams['conditionMap["' + key + '"]'] = this.options.conditionParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+      if (this.options.sourceDataParams) {
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in this.options.sourceDataParams) {
+          if (key && key.constructor === Object) return;
+          queryParams['sourceData["' + key + '"]'] = this.options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+      if (this.options.replaceParams) {
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in this.options.replaceParams) {
+          if (key && key.constructor === Object) return;
+          queryParams['replaceMap["' + key + '"]'] = this.options.replaceParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+      var paramsData = {};
+      //涓轰簡澶勭悊鍗曞紩鍙峰拰鍙屽紩鍙风殑
+      if (queryParams) {
+        for (var key in queryParams) {
+          paramsData[key.replace(/"/g, "'")] = queryParams[key];
+        }
+      }
+
+      if (!this.options.tableConfig || !this.options.tableConfig.cols || this.options.tableConfig.cols.length == 0) {
+        this.option.column = [{
+          prop: 'id',
+          label: '鑻辨枃鍚嶇О',
+          sort: true,
+          width: 150,
+          search: true
+        }, {
+          prop: 'name',
+          label: '涓枃鍚嶇О',
+          sort: true,
+          width: 150,
+          search: true
+        }, {
+          prop: 'description',
+          label: '鎻忚堪',
+          width: 250
+        }, {
+          prop: 'secretGradeText',
+          label: '瀵嗙骇',
+          width: 60,
+          hidden: (!this.controllerSecret)
+        }];
+      } else {
+        this.option.column = this.options.tableConfig.cols.map(item => {
+          if (item.field != 'LAY_TABLE_INDEX' && item.field != 'LAY_CHECKED') {
+            return {
+              ...item,
+              label: item.title,
+              prop: item.field,
+              search: true
+            }
+          }
+        })
+      }
+      if (!paramsData) {
+        paramsData = {
+          currentUserReferModelKey: this.options.currentUserReferModelKey,
+          currentUserReferMethodKey: this.options.currentUserReferMethodKey
+        };
+      } else {
+        paramsData['currentUserReferModelKey'] = this.options.currentUserReferModelKey;
+        paramsData['currentUserReferMethodKey'] = this.options.currentUserReferMethodKey;
+      }
+      this.params = paramsData;
+    },
+    setValue(){
+      if(this.selectionList.length==0){
+        this.$message.error( '娌℃湁閫夋嫨鏁版嵁');
+        return false;
+      }else if(this.selectionList.length>1 && !this.isMuti){
+        this.$message.error( '姣忔鍙兘閫夋嫨涓�鏉℃暟鎹�');
+        return false;
+      }
+
+      var value = [];
+      var text = [];
+      var isMutiValue = (this.props.value.indexOf(",")>-1);
+      var isMutiRaw = (this.props.label.indexOf(",")>-1);
+      var _that=this
+      this.selectionList.forEach((item,_index) =>{
+        if(isMutiValue){
+          var valueFieldArray = _that.props.value.split(",");
+          valueFieldArray.forEach((_indexField,_itemField)=>{
+            value.push( item[_itemField] + (_that.referConfig.valueSep?_that.referConfig.valueSep:' '));
+          })
+        }else {
+          value.push(item[_that.props.value]);
+        }
+        if(isMutiRaw) {
+          var rawFieldArray = _that.props.label.split(",");
+          rawFieldArray.forEach((_indexField,_itemField)=>{
+            text.push(item[_itemField] + (_that.referConfig.textSep?_that.referConfig.textSep:' ')) ;
+          })
+        }else{
+          text.push(item[_that.props.label]);
+        }
+      })
+
+      this.value=value.join(',');
+      this.text=text.join(',')
+      this.$emit("setValue", {field:this.referConfig.field,showField:this.referConfig.showField,value:this.value,text:this.text,rawData:this.selectionList});
+      this.visible=false;
+    },
+    searchReset() {
+      this.query = {};
+      this.onLoad(this.page);
+    },
+    searchChange(params, done) {
+      this.query = params;
+      this.page.currentPage = 1;
+      this.onLoad(this.page, params);
+      done();
+    },
+    currentChange(currentPage){
+      this.page.currentPage = currentPage;
+    },
+    sizeChange(pageSize){
+      this.page.pageSize = pageSize;
+    },
+    selectionChange(list) {
+      if (!this.isMuti && list.length > 1) {
+        const nowVal = list.shift();
+        this.$refs.referCrud.toggleRowSelection(nowVal, false);
+      }
+      this.selectionList = list
+    },
+    selectionClear() {
+      this.selectionList = [];
+      this.$refs.referCrud.toggleSelection();
+    },
+    refreshChange() {
+      this.onLoad(this.page, this.query);
+    },
+    onLoad(page, params = this.params) {
+      if(this.url){
+        this.loading = true;
+        getList(Object.assign(params, this.query),page.currentPage, page.pageSize, this.url).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+
+    }
+  }
+}
+</script>
+
+<style scoped>
+.valueInfo{
+  float: left;
+  border: 1px solid #E9E7E7;
+  display: inline-block;
+  vertical-align: middle;
+  padding: 9px 15px;
+  line-height: 1;
+}
+</style>
diff --git a/Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue b/Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue
index fbcb212..20bcad7 100644
--- a/Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue
+++ b/Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue
@@ -1,71 +1,350 @@
 <template>
-  <avue-input-table :props="props"  :column="column" :on-load="onLoad" v-model="value"  :placeholder="placeholder" ></avue-input-table>
+  <div>
+    <el-dialog :title="title"
+               v-dialogDrag append-to-body="true"
+               :visible.sync="visible"
+               top="0"
+               class="avue-dialog avue-dialog--top"
+               :width="referConfig.options.width|| '80%'">
+      <avue-crud :option="option"
+                 :table-loading="loading"
+                 :data="data"
+                 :page.sync="page"
+                 v-model="value"
+                 ref="referCrud"
+                 @search-change="searchChange"
+                 @search-reset="searchReset"
+                 @selection-change="selectionChange"
+                 @current-change="currentChange"
+                 @size-change="sizeChange"
+                 @refresh-change="refreshChange"
+                 @on-load="onLoad">
+      </avue-crud>
+      <div class="avue-dialog__footer">
+        <div class="avue-dialog__footer--left valueInfo">{{ valueInfo }}</div>
+        <el-button @click="visible=false">鍙� 娑�</el-button>
+        <el-button @click="setValue" type="primary">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+
+    <avue-input v-model="text" :placeholder="title" @click="visible=true"></avue-input>
+    <!--<avue-input-table ref="referTable"  :props="props"  :column="column" :on-load="onLoad" v-model="value"  :placeholder="title" ></avue-input-table>
+  -->
+  </div>
 </template>
 
 <script>
+import { validatenull } from "@/util/validate";
+import {getList,getLazyList,getTableDefinedUrl} from "@/api/refer/table";
 export default {
   name: "vciWebReferTable",
-  props:["referConfig","value"],
+  props:["referConfig","value","text","title"],
   data() {
     return {
-      placeholder:this.referConfig.placeholder || '璇烽�夋嫨鏁版嵁',
-      column:{
-        children:{
-          border: true,
-          column: [{
-            label: '濮撳悕',
-            width: 120,
-            search:true,
-            prop: 'name'
-          }, {
-            label: '鎬у埆',
-            search:true,
-            prop: 'sex'
-          }],
-        },
-      },
+      visible: false,
+      options: this.referConfig.options,
+      isMuti: ("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
       props: {
         value: this.referConfig.valueField || this.referConfig.options.valueField || 'oid',
         label: this.referConfig.textField || this.referConfig.options.textField || "name"
+      },
+      url: this.referConfig.options.url || '/api/ubcs-code/mdmEngineController/defaultReferDataGrid',
+      tableDefinedUrl:'',//骞冲彴琛ㄦ牸鍦板潃
+      copyParam: ['referBo', 'textField', 'valueField', 'displayTable', 'whereSql',  'queryScheme'],
+      query: {},
+      loading: false,
+      page: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      data:this.referConfig.options.data || [],
+      selectionList: [],
+      objTree: {//鐢ㄤ簬琛ㄦ牸鏍戯紝鐩墠杩樻病鍔犱笂浣跨敤
+        keyId: 'oid',//鏍戝舰id瀛楁鍚嶇О
+        keyPid: 'parentSaleProduct',//鏍戝舰鐖秈d瀛楁鍚嶇О
+        title: 'id',//浠ユ爲褰㈠紡鏄剧ず鐨勫瓧娈�
+        defaultShow: false//榛樿鎶樺彔
+      },
+      option: {
+        addBtn: false,
+        height: this.referConfig.options.height ? this.referConfig.options.height : 475,
+        calcHeight: 30,
+        tip: false,
+        menu:false,
+        searchShow: true,
+        searchMenuSpan: 6,
+        searchLabelWidth: 90,
+        border: true,
+        index: true,
+        selection: true,
+        dialogClickModal: false,
+        highlightCurrentRow: true,
+        column: []
       }
     };
   },
+  created() {
+    this.getParams();
+    console.log('referConfig:')
+    console.log(this.referConfig)
+  },
+  mounted() {
+  },
+  computed:{
+    valueInfo:function (){
+      return this.text ? ("宸茶缃殑鍊间负[" + this.text + "]"): '鏈缃��'
+    }
+  },
   methods: {
-    onLoad({page, value, data}, callback) {
-      //棣栨鍔犺浇鍘绘煡璇㈠搴旂殑鍊�
-      if (value) {
-        this.$message.success('棣栨鏌ヨ' + value)
-        callback({
-          id: '0',
-          name: '寮犱笁',
-          sex: '鐢�'
-        })
-        return
+    getParams:function (){
+      var queryParams = {};
+      if(this.options.extraParams){
+        queryParams = this.options.extraParams;
       }
-      if (data) {
-        this.$message.success('鎼滅储鏌ヨ鍙傛暟' + JSON.stringify(data))
+      if(this.options.useFormKey && this.options.formValues){
+        //浣跨敤琛ㄥ崟涓婄殑瀛楁鏉ヨ繃婊�
+        queryParams['conditionMap["' + (this.options.paramForFormKey?this.options.paramForFormKey:this.options.useFormKey)  + '"]'] = this.options.formValues[this.options.useFormKey];
       }
-      if (page) {
-        this.$message.success('鍒嗛〉鍙傛暟' + JSON.stringify(page))
+      if(this.options.where ) {
+        for (var key in this.options.where) {
+          queryParams['conditionMap["' + key + '"]'] = this.options.where[key];//鏂�
+        }
       }
-      //鍒嗛〉鏌ヨ淇℃伅
-      callback({
-        total: 2,
-        data: [{
-          id: '0',
-          name: '寮犱笁',
-          sex: '鐢�'
-        }, {
-          id: '1',
-          name: '鏉庡洓',
-          sex: '濂�'
-        }]
+      for(var i= 0 ; i < this.copyParam.length ; i ++){
+        queryParams[this.copyParam[i]] = this.options[this.copyParam[i]];
+      }
+      queryParams["isMuti"]=this.isMuti;
+      queryParams.muti =this.isMuti;
+      if(!queryParams['referBo']){
+        queryParams['referBo'] = this.options['referBo'] || this.options['referType'];
+      }
+      queryParams['referType']= queryParams['referBo']
+      if (this.options.remoteSort && this.options.initSort) {
+        queryParams['order'] = this.options.initSort.type;//鏂规硶
+        queryParams['sort'] = this.options.initSort.field;//瀛楁
+      }
+      if (this.options.conditionParams) {
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in this.options.conditionParams) {
+          queryParams['conditionMap["' + key + '"]'] = this.options.conditionParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+      if (this.options.sourceDataParams) {
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in this.options.sourceDataParams) {
+          if (key && key.constructor === Object) return;
+          queryParams['sourceData["' + key + '"]'] = this.options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+      if (this.options.replaceParams) {
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in this.options.replaceParams) {
+          if (key && key.constructor === Object) return;
+          queryParams['replaceMap["' + key + '"]'] = this.options.replaceParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+      var paramsData = {};
+      //涓轰簡澶勭悊鍗曞紩鍙峰拰鍙屽紩鍙风殑
+      if(queryParams){
+        for (var key in queryParams){
+          paramsData[key.replace(/"/g, "'")] = queryParams[key];
+        }
+      }
+
+      if(this.options.displayTable){
+        //璇存槑鏄娇鐢ㄥ钩鍙扮殑琛ㄦ牸
+        getTableDefinedUrl({btmType:(this.options.referBo||this.options.referType),code:this.options.displayTable,isMuti:this.isMuti},this.tableDefinedUrl).then(result => {
+          if(result.success){
+            var queryScheme = result.querySchema;
+            if(!validatenull(queryScheme) && validatenull(this.options.queryScheme)){
+              this.options.queryScheme = queryScheme;
+            }
+            paramsData['queryScheme'] = this.options.queryScheme;
+            if(result.showIndex){
+              this.option.index = true;
+            }
+            if(result.showCheckbox){
+              this.option.selection = true
+            }
+            var referColumn = "";
+            if(result.columns){
+              this.option.column= result.columns.map(item => {
+                if(item.field.indexOf(".")>-1){
+                  referColumn += item.field + ",";
+                  item.field = item.field.replace(".","_");
+                }
+                if(!validatenull(item.enumCode)) {
+                  //鏄灇涓剧殑鍐呭
+                  item.type = 'select';
+                  item.dicUrl = "/api/ubcs-omd/enum/dictionary?code=" + item.enumCode;
+                  item.dicData = item.enumMap;
+                  item.dataType = "String";
+                  item.search = true;
+                  item.props = {
+                    label: "itemName",
+                    value: "itemValue"
+                  };
+                  item.rules = [{
+                    required: true,
+                    message: "璇疯緭鍏�" + item.field,
+                    trigger: "blur"
+                  }];
+                  /*item.formatter=function(d,thisItem){
+                    var vciWebComboxStore = layui.vciWebComboxStore;
+                    return vciWebComboxStore.getComboxText(thisItem.enumCode,d[thisItem.field]);
+                  };*/
+                }
+                return {
+                  ...item,
+                  label: item.title,
+                  prop: item.field,
+                  search: true
+                }
+              })
+            }
+            paramsData['referColumn'] = referColumn;
+            if(result.limit>0){
+              this.page.pageSize = result.limit;
+              this.page.currentPage=1
+            }
+            if(this.options.isTreeGrid){
+              //琛ㄦ牸鏍戝姞涓婇厤缃�
+            }
+            this.params=paramsData;
+          }else{
+            this.$message.error(result.msg);
+          }
+
+        });
+      }else{
+        //璇存槑鏄嚜瀹氫箟鐨勮〃鏍�
+        var tableConfig = this.options.tableConfig;
+        if(!tableConfig){
+          this.$message.error( '娌℃湁瀹氫箟鍙傜収鐨勮〃鏍奸厤缃�');
+        }
+        this.page.pageSize=tableConfig.page.limit || 10;
+        if(!paramsData){
+          paramsData = {
+            currentUserReferModelKey:this.options.currentUserReferModelKey,
+            currentUserReferMethodKey:this.options.currentUserReferMethodKey
+          };
+        }else{
+          paramsData['currentUserReferModelKey'] = this.options.currentUserReferModelKey;
+          paramsData['currentUserReferMethodKey'] = this.options.currentUserReferMethodKey;
+        }
+        if(this.options.tableConfig && this.options.tableConfig.cols && this.options.tableConfig.cols.length>0) {
+          //璇存槑浼犻�掍簡鐨�
+          this.option.column= this.options.tableConfig.cols.map(item => {
+            if (item.field != 'LAY_TABLE_INDEX' && item.field != 'LAY_CHECKED') {
+              return {
+                ...item,
+                label: item.title,
+                prop: item.field,
+                formatter:item.template,
+                search: true
+              }
+            }
+          })
+        }
+        if(this.options.isTreeGrid){
+          //琛ㄦ牸鏍戝姞涓婇厤缃�
+        }
+      }
+      this.params=paramsData;
+    },
+    setValue(){
+      if(this.selectionList.length==0){
+        this.$message.error( '娌℃湁閫夋嫨鏁版嵁');
+        return false;
+      }else if(this.selectionList.length>1 && !this.isMuti){
+        this.$message.error( '姣忔鍙兘閫夋嫨涓�鏉℃暟鎹�');
+        return false;
+      }
+
+      var value = [];
+      var text = [];
+      var isMutiValue = (this.props.value.indexOf(",")>-1);
+      var isMutiRaw = (this.props.label.indexOf(",")>-1);
+      var _that=this
+      this.selectionList.forEach((item,_index) =>{
+        if(isMutiValue){
+          var valueFieldArray = _that.props.value.split(",");
+          valueFieldArray.forEach((_indexField,_itemField)=>{
+            value.push( item[_itemField] + (_that.referConfig.valueSep?_that.referConfig.valueSep:' '));
+          })
+        }else {
+          value.push(item[_that.props.value]);
+        }
+        if(isMutiRaw) {
+          var rawFieldArray = _that.props.label.split(",");
+          rawFieldArray.forEach((_indexField,_itemField)=>{
+            text.push(item[_itemField] + (_that.referConfig.textSep?_that.referConfig.textSep:' ')) ;
+          })
+        }else{
+          text.push(item[_that.props.label]);
+        }
       })
+
+      this.value=value.join(',');
+      this.text=text.join(',')
+      this.$emit("setValue", {field:this.referConfig.field,showField:this.referConfig.showField,value:this.value,text:this.text,rawData:this.selectionList});
+      this.visible=false;
+    },
+    searchReset() {
+      this.query = {};
+      this.onLoad(this.page);
+    },
+    searchChange(params, done) {
+      this.query = params;
+      this.page.currentPage = 1;
+      this.onLoad(this.page, params);
+      done();
+    },
+    currentChange(currentPage){
+      this.page.currentPage = currentPage;
+    },
+    sizeChange(pageSize){
+      this.page.pageSize = pageSize;
+    },
+    selectionChange(list) {
+      if (!this.isMuti && list.length > 1) {
+        const nowVal = list.shift();
+        this.$refs.referCrud.toggleRowSelection(nowVal, false);
+      }
+      this.selectionList = list
+    },
+    selectionClear() {
+      this.selectionList = [];
+      this.$refs.referCrud.toggleSelection();
+    },
+    refreshChange() {
+      this.onLoad(this.page, this.query);
+    },
+    onLoad(page, params = this.params) {
+      if(this.url){
+        this.loading = true;
+        getList(Object.assign(params, this.query),page.currentPage, page.pageSize, this.url).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+
     }
   }
 }
 </script>
 
 <style scoped>
-
+.valueInfo{
+  float: left;
+  border: 1px solid #E9E7E7;
+  display: inline-block;
+  vertical-align: middle;
+  padding: 9px 15px;
+  line-height: 1;
+}
 </style>
diff --git a/Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue b/Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue
index 4180372..118ea81 100644
--- a/Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue
+++ b/Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue
@@ -1,27 +1,31 @@
 <template>
-  <avue-input-tree ref="referTree" :props="props" :lazy="lazy" :tree-load="treeLoad" :node-click="nodeClick" :leaf-only="!referConfig.onlyLeaf" :multiple="isMuti" v-model="value" :placeholder="placeholder" :dic="treeData"></avue-input-tree>
+  <avue-input-tree ref="referTree" :props="props" :lazy="lazy" :tree-load="treeLoad" :node-click="nodeClick" :checked="checked" :leaf-only="referConfig.onlyLeaf" :multiple="isMuti" v-model="value" :placeholder="title" :dic="treeData"></avue-input-tree>
 </template>
 
 <script>
 import {getTree,getLazyTree} from "@/api/refer/tree";
+import {validatenull} from "@/util/validate";
 
 export default {
   name: "vciWebReferTree",
-  props:["referConfig","value","text"],
+  props:["referConfig","value","text","title"],
   data() {
     return {
       options: this.referConfig.options,
       lazy: this.referConfig.options.loadType == 'node',
-      isMuti: this.referConfig.isMuti,
-      placeholder: this.referConfig.placeholder || '璇烽�夋嫨鍐呭',
+      isMuti:("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
       props: {
-        value: this.referConfig.valueField || this.referConfig.options.valueField || 'oid',
-        label: this.referConfig.textField || this.referConfig.options.textField || "name"
-        //value:"value",
-        //label:"title"
+        value: 'oid',
+        label: "name"
       },
-      treeUrl: this.referConfig.options.url || '/api/ubcs-code/codeClassify/treeCodeClassify',
+      config:{
+        valueField: this.referConfig.valueField || this.referConfig.options.valueField || 'oid',
+        textField:this.referConfig.textField || this.referConfig.options.textField || "name",
+        textSep:this.referConfig.textSep || ' '
+      },
+      treeUrl: this.referConfig.options.url || '/api/ubcs-code/mdmEngineController/defaultReferTree',
       treeData: [],
+      selectionList: [],
       currentNode:{},
       params: {},
       loadType: {'all': 'all', 'node': 'node'},
@@ -42,6 +46,7 @@
       }
     }
   },
+  computed:{},
   methods: {
     getParams:function (){
       var queryParams = {};
@@ -56,10 +61,10 @@
         }
       }
       queryParams['referBo'] = this.options['referBo'] || this.options['referType'];
+      queryParams['referType']= queryParams['referBo']
       queryParams['selectAllLevel'] = (this.options.loadType == this.loadType.all?true:false);//true鏃跺悗鍙颁細鎶ラ敊
-      if(queryParams.isMuti =="true"){
-        queryParams.muti =true;
-      }
+
+      queryParams.muti =this.isMuti;
       if(queryParams.isQueryAllColumn =="true"){
         queryParams.isQueryAllColumn = true;
       }
@@ -143,16 +148,45 @@
         }))
       });
     },
-    nodeClick(data){
-      //涓嶈鐢╳atch鐩戝惉value鍊硷紝浼氭壘涓嶅埌text
-      this.value=data[this.props.value];
-      this.text=data[this.props.label];
-      this.currentNode=data;
-      this.$emit("setValue", {field:this.referConfig.field,showField:this.referConfig.showField,value:this.value,text:this.text,rawData:this.currentNode});
+    nodeClick(data, node, nodeComp){
+      if(!this.isMuti) {
+        this.setValue({checkedNodes:[data]})
+      }
+     },
+    checked(checkedNode, checkedData) {
+      this.setValue(checkedData)
+    },
+    setValue:function (checkedData){
+      var value = [];
+      var text = [];
+      const textSep =this.config.textSep;
+      for(var j =0;j<checkedData.checkedNodes.length;j++){
+        const item=checkedData.checkedNodes[j];
+        var v=this.config.valueField.indexOf("attribute.")>=0?item.attributes[this.config.valueField.replace("attribute.","")]:(item.attributes[this.config.valueField] || item[this.config.valueField])
+        value.push(v);
+        var tempRaw = [];
+        var textFieldArray = this.config.textField.split(",");
+        for (var i = 0; i < textFieldArray.length; i++) {//鏄剧ず鐨勫瓧娈靛彲鑳芥湁澶氫釜
+          if (!validatenull(textFieldArray[i])) {
+            var t=textFieldArray[i].indexOf("attribute.")>=0?item.attributes[textFieldArray[i].replace("attribute.","")]:(item.attributes[textFieldArray[i]] || item[textFieldArray[i]])
+            tempRaw.push(t);
+          }
+        }
+        text.push(tempRaw.join(textSep));
+      }
+      this.value = value.join(',');
+      this.text = text.join(',')
+      this.$emit("setValue", {
+        field: this.referConfig.field,
+        showField: this.referConfig.showField,
+        value: this.value,
+        text: this.text || '',
+        isTreeMuti:this.isMuti,
+        rawData: checkedData.checkedNodes
+      });
     }
   },
-  watch:{
-  }
+  watch:{}
 }
 </script>
 
diff --git a/Source/UBCS-WEB/src/components/template/FlowPath.vue b/Source/UBCS-WEB/src/components/template/FlowPath.vue
index 28885d6..2d7a508 100644
--- a/Source/UBCS-WEB/src/components/template/FlowPath.vue
+++ b/Source/UBCS-WEB/src/components/template/FlowPath.vue
@@ -1,32 +1,18 @@
 <template>
-    <el-dialog title="妯℃澘娴佺▼" width="90%" append-to-body="true" :visible.sync="dialogVisible">
+
         <avue-crud ref="crud" :table-loading="loading" :data="data" v-model="form" :option="option" :page.sync="page"
             :search.sync="search" @on-load="getDataList" @row-save="handleSave" @row-del="handleDelete"
             @row-update="handleEdit" @refresh-change="handleRefresh" @size-change="handleSizePage"
-            @current-change="handleCurrentPage" @selection-change="selectionChange" @row-click="handleRowClick">
-            <template slot="menuLeft">
-                <el-button icon="el-icon-delete" size="small" type="danger" @click="handleDeleteByIds">鍒� 闄�
-                </el-button>
-            </template>
-            <template slot="search" slot-scope="{row,size}">
-                <el-input :placeholder="`璇疯緭鍏�${selectValue === 'id' ? '绯荤粺缂栧彿' : '绯荤粺鍚嶇О'}骞舵寜鍥炶溅鏌ヨ`" :size="size"
-                    style="width:300px;margin-left: 10px;" v-model="search[selectValue]" clearable
-                    @keyup.enter.native="handleEnter" @clear="handleClear"></el-input>
-            </template>
+            @current-change="handleCurrentPage">
         </avue-crud>
-    </el-dialog>
+
 </template>
 
 <script>
-import { getFlowpathList, getStartList, flowpathSave } from '@/api/template/flowpath.js'
+import { getFlowpathList, getStartList, flowpathSave, flowpathDelete } from '@/api/template/flowpath.js'
 export default {
     name: 'FlowPath',
     props: {
-        // 鏄惁鎵撳紑
-        visible: {
-            typeof: Boolean,
-            default: false
-        },
         code: {
             typeof: String,
             required: true,
@@ -34,16 +20,10 @@
         }
     },
     watch: {
-        visible(n) {
-            this.dialogVisible = n;
-        },
-        dialogVisible(n) {
-            this.$emit('update:visible', n)
-        },
     },
     data() {
         return {
-            dialogVisible: this.visible,
+
             loading: false,
             page: {
                 currentPage: 1,
@@ -69,7 +49,6 @@
                     prop: 'id,name,description,version',
                     order: 'descending'
                 },
-                selection: true,
                 column: [
                     {
                         label: '妯℃澘key',
@@ -89,7 +68,7 @@
                         nodeClick: (data) => {
                             console.log(data)
                             // 鑺傜偣鐐瑰嚮鐨勬椂鍊欎細鑾峰彇鍒版暟鎹�
-                            this.form.modeName = data.name
+                            this.form.modelName = data.name
                         }
                     }, {
                         label: '妯℃澘鍚嶇О',
@@ -136,20 +115,20 @@
             console.log(this.search)
             const { pageSize, currentPage } = this.page
             let param = { size: pageSize, current: currentPage }
-            const response = await getFlowpathList({ ...param, ...this.search })
+            const response = await getFlowpathList({ ...param, ...{ templateId: this.code } })
             if (response.status === 200) {
                 console.log(response)
                 this.loading = false
                 const data = response.data.data
                 this.data = data.records
                 this.page.total = data.total
-            }else this.loading = false
+            } else this.loading = false
         },
         // 鏂板
         async handleSave(row, done, loading) {
             console.log(row)
-            const response = await flowpathSave({...row,...{templateId:this.code}})
-            if(response.status ===200){
+            const response = await flowpathSave({ ...row, ...{ templateId: this.code } })
+            if (response.status === 200) {
                 loading()
                 console.log(response)
                 this.$message({
@@ -164,9 +143,9 @@
         // 缂栬緫
         async handleEdit(row, index, done, loading) {
             console.log(row)
-            const {modelName,modelKey,buttonTypeKey,id} = row
-            let param = {modelName,modelKey,buttonTypeKey,id}
-            const response = await flowpathSave({...param,...{templateId:this.code}})
+            const { modelName, modelKey, buttonTypeKey, id } = row
+            let param = { modelName, modelKey, buttonTypeKey, id }
+            const response = await flowpathSave({ ...param, ...{ templateId: this.code } })
             if (response.status === 200) {
                 loading()
                 this.$message({
@@ -180,20 +159,27 @@
         },
         // 鍒犻櫎鍗曟潯
         handleDelete(row) {
-            const { oid } = row
-        },
-        // 澶氭潯鏁版嵁鍒犻櫎
-        handleDeleteByIds() {
-
+            console.log(row)
+            const { id } = row
+            this.deleteSysInfo({ id: id })
         },
         // 鍒犻櫎鎺ュ彛
         deleteSysInfo(param) {
-            this.$confirm('鏄惁纭畾鍒犻櫎閫夋嫨鐨勯泦鎴愮郴缁�?', '鎻愮ず', {
+            this.$confirm('鏄惁纭畾鍒犻櫎閫夋嫨鐨勬ā鏉挎祦绋�?', '鎻愮ず', {
                 confirmButtonText: '纭畾',
                 cancelButtonText: '鍙栨秷',
                 type: 'warning'
             }).then(async () => {
                 // 鎺ュ彛
+                const response = await flowpathDelete(param)
+                if (response.status === 200) {
+                    console.log(response)
+                    this.$message({
+                        type: 'success',
+                        message: '鍒犻櫎鎴愬姛!'
+                    });
+                    this.getDataList()
+                }
             })
         },
         // enter鎼滅储
@@ -215,15 +201,6 @@
         handleCurrentPage(event) {
             this.page.currentPage = event
         },
-        // 鐐瑰嚮閫夋嫨
-        handleRowClick(row) {
-            this.$refs.crud.toggleRowSelection(row, true)
-        },
-        // 澶氶��
-        selectionChange(list) {
-            console.log(list)
-
-        },
     }
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/Source/UBCS-WEB/src/components/template/Stage.vue b/Source/UBCS-WEB/src/components/template/Stage.vue
new file mode 100644
index 0000000..ef29b0f
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/template/Stage.vue
@@ -0,0 +1,259 @@
+<template>
+    <el-dialog title="妯℃澘闃舵" width="90%" append-to-body="true" :visible.sync="dialogVisible">
+        <avue-crud ref="crud" :table-loading="loading" :data="data" :option="option" :page.sync="page"
+            @on-load="getDataList" @size-change="handleSizePage" @current-change="handleCurrentPage"
+            @row-click="handleRowClick">
+            <template slot-scope="{type,size,row,index}" slot="menu">
+                <el-button icon="el-icon-check" :size="size" :type="type"
+                    @click="handleMaintenance(row, index)">缁存姢</el-button>
+            </template>
+        </avue-crud>
+        <el-dialog title="妯℃澘闃舵" width="50%" append-to-body="true" :visible.sync="dialogNode">
+            <avue-crud ref="crud" :table-loading="loading" :data="stageData" :option="stageOption" @on-load="getStagelist"
+                @row-click="handleRowStageClick">
+                <template slot-scope="{type,size,row,index}" slot="menu">
+                    <el-button icon="el-icon-check" :size="size" :type="type"
+                        @click="handleMaintenanceTransfer(row, index)">缁存姢</el-button>
+                </template>
+            </avue-crud>
+        </el-dialog>
+        <table-transfer :visible.sync="dialogTransfer" v-model="listVal" :dataList="tableData" :columns="columns"
+            keyName="oid" @save="handleSave"></table-transfer>
+    </el-dialog>
+</template>
+
+<script>
+import { getFlowpathList, stagelist, attributeListRight, attributeList, attributeSave } from '@/api/template/flowpath.js'
+import TableTransfer from '@/components/template/TableTransfer'
+export default {
+    name: 'Stage',
+    components: {
+        TableTransfer
+    },
+    props: {
+        // 鏄惁鎵撳紑
+        visible: {
+            typeof: Boolean,
+            default: false
+        },
+        code: {
+            typeof: String,
+            required: true,
+            default: ""
+        }
+    },
+    watch: {
+        visible(n) {
+            this.dialogVisible = n;
+        },
+        dialogVisible(n) {
+            this.$emit('update:visible', n)
+        },
+    },
+    computed: {
+        tableData() {
+            return this.setTable()
+        },
+        listVal() {
+            let data = this.setTable()
+            let newdata = data.map(item => {
+                return item.checked ? item.oid : undefined
+            })
+            console.log(newdata.filter(item => item))
+            return newdata.filter(item => item)
+        }
+    },
+    data() {
+        const options = {
+            height: "auto",
+            border: true,
+            addBtn: false,
+            align: 'center',
+            menuAlign: 'center',
+            index: true,
+            searchMenuSpan: 8,
+            searchBtn: false,
+            emptyBtn: false,
+            columnBtn: false,
+            delBtn: false,
+            refreshBtn: false,
+            header: false,
+            editBtn: false,
+        }
+        return {
+            list: [],
+            listRight: [],
+            dialogVisible: this.visible,
+            dialogTransfer: false,
+            dialogNode: false,
+            visibleTable: false,
+            loading: false,
+            page: {
+                currentPage: 1,
+                pageSize: 10,
+                total: 0
+            },
+            modelKey: '',
+            data: [],
+            stageData: [],
+            saveParam: {},
+            columns: [
+                {
+                    key: "oid",
+                    label: "oid",
+                    visible: false,
+                },
+                {
+                    key: "id",
+                    label: "灞炴�х紪鍙�",
+                    visible: true,
+                },
+                {
+                    key: "name",
+                    label: "灞炴�у悕绉�",
+                    visible: true,
+                },
+                {
+                    key: "attributeGroup",
+                    label: "灞炴�у垎缁�",
+                    visible: true,
+                },
+            ],
+            option: {
+                ...options,
+                column: [
+                    { label: '妯℃澘缂栧彿', prop: 'modelKey' },
+                    { label: '妯℃澘鍚嶇О', prop: 'modelName' },
+                    { label: '鎻忚堪', prop: 'buttonTypeValue' },
+                ]
+            },
+            stageOption: {
+                ...options,
+                column: [
+                    { label: '闃舵缂栧彿', prop: 'taskId' },
+                    { label: '闃舵鍚嶇О', prop: 'taskName' },
+                ]
+            },
+        }
+    },
+    mounted() {
+        this.getAttributeList()
+    },
+    methods: {
+        setTable() {
+            return this.list.map(item => {
+                if (this.listRight.length !== 0) {
+                    this.listRight.forEach(element => {
+                        if (item.id === element.attrId) item.checked = true
+                    });
+                }
+                return item
+            })
+        },
+        // 鑾峰彇鍒楄〃
+        async getDataList() {
+            this.loading = false
+            const { pageSize, currentPage } = this.page
+            let param = { size: pageSize, current: currentPage }
+            const response = await getFlowpathList({ ...param, ...{ templateId: this.code } })
+            if (response.status === 200) {
+                console.log(response)
+                this.loading = false
+                const data = response.data.data
+                this.data = data.records
+                this.page.total = data.total
+            } else this.loading = false
+        },
+        // 鑾峰彇闃舵鍒楄〃
+        async getStagelist() {
+            this.loading = false
+            console.log(this.modelKey)
+            const response = await stagelist({ modelKey: this.modelKey })
+            if (response.status === 200) {
+                this.loading = false
+                console.log(response.data)
+                this.stageData = response.data.data
+            } else this.loading = false
+        },
+        // 鑾峰彇鍏ㄩ儴灞炴��
+        async getAttributeList() {
+            const response = await attributeList({ 'conditionMap[classifyTemplateOid]': this.code })
+            if (response.status === 200) {
+                const data = response.data.data
+                this.list = data.records.map(item => {
+                    const { oid, id, name, attributeGroup } = item
+                    return { oid, id, name, attributeGroup, ...{ checked: false } }
+                })
+            }
+        },
+        // 鑾峰彇宸蹭繚瀛樺睘鎬�
+        async getAttributeListRight() {
+            const response = await attributeListRight({ templateId: this.code, modelKey: this.modelKey, taskId: this.saveParam.taskId })
+            if (response.status === 200) {
+                let data = response.data.data
+                data = data.map(item => {
+                    const { attrId, attrName, attrGroup } = item
+                    return { attrId, attrName, attrGroup }
+                })
+                this.listRight = data
+            }
+        },
+        // 缁存姢
+        handleMaintenance(row) {
+            console.log(row)
+            this.dialogNode = true
+            this.saveParam.modelKey = row.modelKey
+        },
+        handleMaintenanceTransfer(row) {
+            console.log(row)
+            this.dialogTransfer = true
+            this.saveParam.taskId = row.taskId
+            this.saveParam.taskName = row.taskName
+            this.getAttributeListRight()
+        },
+        handleSizePage(event) {
+            this.page.pageSize = event
+        },
+        handleCurrentPage(event) {
+            this.page.currentPage = event
+        },
+        handleRowClick(row) {
+            console.log(row)
+            this.modelKey = row.modelKey
+            this.saveParam.modelKey = row.modelKey
+            this.dialogNode = true
+        },
+        handleRowStageClick(row) {
+            this.dialogTransfer = true
+            this.saveParam.taskId = row.taskId
+            this.saveParam.taskName = row.taskName
+            this.getAttributeListRight()
+        },
+        async handleSave(event) {
+            console.log(event)
+            const data = event.map(item => {
+                const { id, name, attributeGroup } = item
+                return { attrId: id, attrName: name, attrGroup: attributeGroup }
+            })
+            let param = {
+                templateId: this.code,
+                processStageAttr: data,
+                ...this.saveParam
+            }
+            console.log(this.saveParam)
+            console.log(data)
+            const response = await attributeSave(param)
+            if (response.status === 200) {
+                // loading()
+                console.log(response)
+                this.$message({
+                    type: 'success',
+                    message: '鏂板鏁版嵁鎴愬姛锛�'
+                })
+                // done()
+                // this.getDataList()
+            }
+        }
+    }
+}
+</script>
diff --git a/Source/UBCS-WEB/src/components/template/TableTransfer.vue b/Source/UBCS-WEB/src/components/template/TableTransfer.vue
new file mode 100644
index 0000000..488fb95
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/template/TableTransfer.vue
@@ -0,0 +1,322 @@
+<template>
+    <el-dialog :title="title" width="70%" append-to-body="true" :visible.sync="dialogVisible">
+        <el-row :gutter="20">
+            <el-col :span="11">
+                <el-card class="box-card">
+                    <div slot="header" class="clearfix">
+                        <span>鍒濆鏁版嵁</span>
+                        <el-input class="input" v-if="showSearch" v-model="searchLeft" placeholder="璇疯緭鍏ユ悳绱㈠唴瀹�"
+                            @keyup.enter.native="handleEnter"></el-input>
+                    </div>
+                    <el-table ref="transferLeftTable" :data="leftData" height="500" highlight-current-row
+                        tooltip-effect="dark" @selection-change="handleLeftSelectionChange" @row-click="handleLeftRowClick">
+                        <el-table-column type="selection" width="50" align="center" fixed="left" :selectable="selectable" />
+                        <div v-for="(item, index) in columns" :key="index">
+                            <el-table-column v-if="item.visible" :label="item.label" align="center" :prop="item.key" />
+                        </div>
+                    </el-table>
+                </el-card>
+            </el-col>
+            <el-col :span="2" class="btns" :style="{ height: '500px' }">
+                <el-button class="btn" :disabled="leftMultiple" type="primary" icon="el-icon-arrow-right"
+                    @click="moveToRight" circle></el-button>
+                <el-button class="btn" :disabled="rightMultiple" type="primary" @click="moveToLeft"
+                    icon="el-icon-arrow-left" circle></el-button>
+            </el-col>
+            <el-col :span="11">
+                <el-card class="box-card">
+                    <div slot="header" class="clearfix">
+                        <span>鏀瑰彉鏁版嵁</span>
+                        <el-input class="input" v-if="showSearch" v-model="searchRight" placeholder="璇疯緭鍏ユ悳绱㈠唴瀹�"></el-input>
+                    </div>
+                    <el-table ref="transferRightTable" :data="rightData" height="500" highlight-current-row
+                        tooltip-effect="dark" @selection-change="handleRightSelectionChange"
+                        @row-click="handleRightRowClick">
+                        <el-table-column type="selection" width="50" align="center" fixed="left" />
+                        <div v-for="(item, index) in columns" :key="index">
+                            <el-table-column v-if="item.visible" :label="item.label" align="center" :prop="item.key" />
+                        </div>
+                    </el-table>
+                </el-card>
+            </el-col>
+        </el-row>
+        <div slot="footer" class="dialog-footer">
+            <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+            <el-button type="primary" @click="tableTransferSave">淇濆瓨</el-button>
+        </div>
+    </el-dialog>
+</template>
+
+<script>
+export default {
+    name: 'TableTransfer',
+    model: {
+        prop: "value",
+        event: "change",
+    },
+    props: {
+        // 鏄惁鎵撳紑
+        visible: {
+            typeof: Boolean,
+            default: false
+        },
+        title: {
+            typeof: String,
+            default: '妯℃澘闃舵缁存姢'
+        },
+        //缁戝畾鏁版嵁
+        value: {
+            type: Array,
+            default: () => {
+                return [];
+            },
+        },
+        //涓婚敭key鍊�
+        keyName: {
+            type: String,
+            default: "id",
+        },
+        columns: {
+            type: Array,
+            default: () => {
+                return [];
+            },
+        },
+        dataList: {
+            type: Array,
+            default: () => {
+                return [];
+            },
+        },
+        /**
+         * 鏄惁鏄剧ず鎼滅储妗�
+         */
+        showSearch: {
+            type: Boolean,
+            default: true,
+        },
+    },
+
+    watch: {
+        visible(n) {
+            this.dialogVisible = n;
+        },
+        dialogVisible(n) {
+            this.$emit('update:visible', n)
+        },
+        searchLeft: {
+            handler: function () {
+                this.handleQueryLeft();
+            },
+            deep: true,
+        },
+        searchRight: {
+            handler: function () {
+                this.handleQueryRight();
+            },
+            deep: true,
+        },
+        dataList: {
+            handler(data) {
+                console.log(data)
+
+            },
+            deep: true,
+        }
+    },
+    data() {
+        return {
+            dialogVisible: this.visible,
+            searchLeft: "",
+            leftIds: [],
+            leftMultiple: true,
+            leftDataList: [],
+            leftData: [],
+            searchRight: "",
+            rightIds: [],
+            rightMultiple: true,
+            rightDataList: [],
+            rightData: [],
+        }
+    },
+    mounted() {
+        this.init();
+    },
+    methods: {
+        selectable(row, index) {
+            console.log(row)
+            return row.checked === false //涓簍rue鐨勬椂鍊欏彲浠ラ�夛紝涓篺alse鍒欎笉鍙�夋嫨
+        },
+        init() {
+            this.rightIds = this.value;
+            console.log(this.rightIds)
+            for (let i = 0; i < this.dataList.length; i++) {
+                if (this.value.some((item) => item == this.dataList[i][this.keyName])) {
+                    this.rightDataList.push(this.dataList[i]);
+                } else {
+                    this.leftDataList.push(this.dataList[i]);
+                }
+            }
+            this.leftData = [...this.leftDataList];
+            this.rightData = [...this.rightDataList];
+        },
+        // left澶氶�夋閫変腑鏁版嵁
+        handleLeftSelectionChange(selection) {
+            this.leftIds = selection.map((item) => item[this.keyName]);
+            this.leftMultiple = !selection.length;
+        },
+        // right澶氶�夋閫変腑鏁版嵁
+        handleRightSelectionChange(selection) {
+            this.rightIds = selection.map((item) => item[this.keyName]);
+            this.rightMultiple = !selection.length;
+        },
+        // 鎸夐挳鐐瑰嚮
+        moveToRight() {
+            for (let i = 0; i < this.leftDataList.length; i++) {
+                let a = this.leftIds.findIndex(
+                    (item) => item == this.leftDataList[i][this.keyName]
+                );
+                console.log(a)
+                if (a !== -1) {
+                    this.rightDataList.push(this.leftDataList[i]);
+                    // this.leftDataList[i].checked = true
+                    // this.$refs.transferLeftTable.toggleRowSelection(this.leftDataList[i],true)
+                    this.$delete(this.leftDataList, i);
+                    i--;
+                }
+            }
+            // let obj = {}
+            // let filterright = this.rightDataList.reduce((cur, next) => {
+            //     obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
+            //     return cur;
+            // }, [])
+            // console.log('filterright', filterright)
+            this.leftData = this.setData(this.leftDataList, this.searchLeft);
+            this.rightData = this.setData(this.rightDataList, this.searchRight);
+            this.$emit(
+                "change",
+                this.rightDataList.map((item) => item[this.keyName])
+            );
+        },
+        // 鎸夐挳鐐瑰嚮
+        moveToLeft() {
+            for (let i = 0; i < this.rightDataList.length; i++) {
+                let a = this.rightIds.findIndex(
+                    (item) => item == this.rightDataList[i][this.keyName]
+                );
+                if (a !== -1) {
+                    this.leftDataList.push(this.rightDataList[i]);
+                    this.$delete(this.rightDataList, i);
+                    i--;
+                }
+            }
+            // let obj = {}
+            // let filterleft = this.leftDataList.reduce((cur, next) => {
+            //     obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
+            //     return cur;
+            // }, [])
+            // console.log('filterright', filterleft)
+            this.leftData = this.setData(this.leftDataList, this.searchLeft);
+            this.rightData = this.setData(this.rightDataList, this.searchRight);
+            this.$emit(
+                "change",
+                this.rightDataList.map((item) => item[this.keyName])
+            );
+        },
+
+        handleQueryLeft() {
+            this.leftData = this.setData(this.leftDataList, this.searchLeft);
+        },
+        handleQueryRight() {
+            this.rightData = this.setData(this.rightDataList, this.searchRight);
+        },
+        // 鍗曢��
+        handleLeftRowClick(row) {
+            if (this.leftData) {
+                this.$refs.transferLeftTable.toggleRowSelection(row)
+            } else {
+                this.$refs.transferLeftTable.clearSelection()
+            }
+        },
+        // 鍗曢��
+        handleRightRowClick(row) {
+            if (this.rightData) {
+                this.$refs.transferRightTable.toggleRowSelection(row)
+            } else {
+                this.$refs.transferRightTable.clearSelection()
+            }
+        },
+        setData(dataList, search) {
+            if (search != null || search != "") {
+                let list = [];
+                for (let i = 0; i < dataList.length; i++) {
+                    if (
+                        this.columns.some((item) =>
+                            dataList[i][item.key].toLowerCase().includes(search.toLowerCase())
+                        )
+                    ) {
+                        list.push(dataList[i]);
+                    }
+                }
+                return list;
+            } else {
+                return dataList;
+            }
+        },
+        change(val) {
+            console.log(val);
+            console.log(this.value)
+        },
+        done() {
+            this.dialogVisible = false
+        },
+        tableTransferSave() {
+            this.$emit('save', this.rightData)
+            this.leftData = [...this.rightData, ...this.leftData]
+            this.leftDataList = [...this.rightDataList, ...this.leftDataList]
+            this.rightDataList = []
+            this.rightData = []
+
+        }
+    },
+}
+</script>
+
+<style lang="scss" scoped>
+::v-deep(.el-col>.el-card >.el-card__header) {
+    background: #fff
+}
+
+.box-card {
+    background: #fff;
+}
+
+.clearfix {
+    display: -webkit-box;
+    display: flex;
+    display: -ms-flexbox;
+    -webkit-box-pack: justify;
+    -ms-flex-pack: justify;
+    justify-content: space-between;
+    -webkit-box-align: center;
+    -ms-flex-align: center;
+    align-items: center;
+}
+
+.input {
+    float: right;
+    padding: 3px 0;
+    max-width: 400px;
+}
+
+.btns {
+    display: flex;
+    align-items: center;
+    flex-direction: column;
+    justify-content: center;
+
+    .btn {
+        margin: 20px 0;
+    }
+}
+</style>
diff --git a/Source/UBCS-WEB/src/main.js b/Source/UBCS-WEB/src/main.js
index 297be45..c87fec9 100644
--- a/Source/UBCS-WEB/src/main.js
+++ b/Source/UBCS-WEB/src/main.js
@@ -48,9 +48,12 @@
 import FormTemplateDialog from "@/components/FormTemplate/index"
 import linkTypeAdd from "@/views/modeling/LinkTypeAdd"
 import MasterTree from "@/components/Master/MasterTree";
+import FlowPath from "@/components/template/FlowPath";
+import Stage from "@/components/template/Stage";
 
 // 灏嗗伐鍏峰嚱鏁版坊鍔犲埌鍏ㄥ眬
 import utilFunc from './util/func'
+import flowPath from "@/views/flow/flowPath";
 Vue.prototype.$utilFunc = utilFunc
 // 娉ㄥ唽鍏ㄥ眬crud椹卞姩
 window.$crudCommon = crudCommon;
@@ -97,6 +100,8 @@
 Vue.component('FormTemplateDialog',FormTemplateDialog)
 Vue.component('LinkTypeAdd',linkTypeAdd)
 Vue.component('MasterTree',MasterTree)
+Vue.component('FlowPath',FlowPath)
+Vue.component('Stage',Stage)
 
 // 鍔犺浇鐩稿叧url鍦板潃
 Object.keys(urls).forEach(key => {
diff --git a/Source/UBCS-WEB/src/option/user/info.js b/Source/UBCS-WEB/src/option/user/info.js
index de76103..a664bd1 100644
--- a/Source/UBCS-WEB/src/option/user/info.js
+++ b/Source/UBCS-WEB/src/option/user/info.js
@@ -45,7 +45,7 @@
       }]
     },
     {
-      label: '淇敼瀵嗙爜',
+      label: '',
       prop: 'password',
       column: [{
         label: '鍘熷瘑鐮�',
diff --git a/Source/UBCS-WEB/src/views/flow/flowPath.vue b/Source/UBCS-WEB/src/views/flow/flowPath.vue
index ef76289..2040668 100644
--- a/Source/UBCS-WEB/src/views/flow/flowPath.vue
+++ b/Source/UBCS-WEB/src/views/flow/flowPath.vue
@@ -2,31 +2,82 @@
     <div>
         <el-button @click="outerVisible = true">娴佺▼娴嬭瘯</el-button>
         <el-button @click="visibleFlow = true">妯℃澘娴佺▼</el-button>
+        <el-button @click="visibleStage = true">妯℃澘闃舵</el-button>
+        <el-button @click="visibleTable = true">table绌挎妗�</el-button>
         <flow-business :visible.sync="outerVisible"></flow-business>
-        <flow-path :visible.sync="visibleFlow" code="A12826E4-2B66-6D56-DE30-92BB1D7F607F"></flow-path>
+        <flow-path :visible.sync="visibleFlow" code="8b5e2017-990f-454a-9c39-4c4eeeb57553"></flow-path>
+        <stage :visible.sync="visibleStage" code="8b5e2017-990f-454a-9c39-4c4eeeb57553"></stage>
+        <table-transfer :visible.sync="visibleTable" v-model="value" :dataList="list" :columns="columns" keyName="id"
+            @change="change"></table-transfer>
     </div>
 </template>
 
 <script>
 import FlowBusiness from '@/components/template/Business'
 import FlowPath from '@/components/template/FlowPath'
+import Stage from '@/components/template/Stage'
+import TableTransfer from '@/components/template/TableTransfer'
 export default {
-    components:{
+    components: {
         FlowBusiness,
-        FlowPath
+        FlowPath,
+        Stage,
+        TableTransfer
     },
     data() {
+        const getTables = () => {
+            let data = []
+            for (let i = 0; i < 5; i++) {
+                let item = {
+                    id: `${i+1}`,
+                    name: 'name',
+                    address: '闆嗗洟鐮�',
+                    data:'',
+                    checked:false,
+                }
+                data.push(item)
+            }
+            return data
+        }
         return {
+            list: getTables(),
+            value: [],
             outerVisible: false,
             visibleFlow: false,
-           
+            visibleStage: false,
+            visibleTable: false,
+
+            columns: [
+                {
+                    key: "id",
+                    label: "id",
+                    visible: false,
+                },
+                {
+                    key: "name",
+                    label: "灞炴�х紪鍙�",
+                    visible: true,
+                },
+                {
+                    key: "address",
+                    label: "灞炴�у悕绉�",
+                    visible: true,
+                },
+                {
+                    key: "address",
+                    label: "灞炴�у垎缁�",
+                    visible: true,
+                },
+            ],
+
         }
     },
     methods: {
-        
+        change(val) {
+            console.log(val);
+            console.log(this.value)
+        },
     }
 }
 </script>
-<style lang="scss" scoped>
-
-</style>
\ No newline at end of file
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/Source/UBCS-WEB/src/views/modeling/status.vue b/Source/UBCS-WEB/src/views/modeling/status.vue
index 4fb492e..9d7c465 100644
--- a/Source/UBCS-WEB/src/views/modeling/status.vue
+++ b/Source/UBCS-WEB/src/views/modeling/status.vue
@@ -11,36 +11,41 @@
                  @row-del="rowDel"
                  @refresh-change="refreshChange"
                  @search-reset="searchChange"
-                 @search-change="searchChange">
+                 @search-change="searchChange"
+                 @row-click="rowClick">
         <template slot="menuLeft">
-          <el-tooltip class="item" effect="dark" content="鏌ユ壘鐘舵�佹睜浣跨敤鑼冨洿" placement="top">
+          <el-tooltip class="item" effect="dark" content="鏌ユ壘鐘舵�佷娇鐢ㄨ寖鍥�" placement="top">
             <el-button size="small"
                        plain
                        type="primary"
                        icon="el-icon-zoom-in"
-                       @click="handleSearch">鏌ョ湅浣跨敤鑼冨洿
+                       @click="applyRangeSearch">鏌ョ湅浣跨敤鑼冨洿
             </el-button>
           </el-tooltip>
-        </template>>
+        </template>
+        <template slot="radio"
+                  slot-scope="{row}">
+          <el-radio v-model="selectRow"
+                    :label="row.$index">&nbsp;
+          </el-radio>
+        </template>
       </avue-crud>
-      <el-dialog title="鏌ョ湅浣跨敤鑼冨洿"
-                 append-to-body
-                 :visible.sync="packageSearchBox"
-                 width="1200px">
-        <versionpackage></versionpackage>
-      </el-dialog>
+      <versionpackage :rangeData="applyRangeData" ref="applyRange"></versionpackage>
     </basic-container>
-  
+
   </template>
-  
+
   <script>
-  import { getPage,add,update,remove } from '../../api/omd/status';
+  import { getPage,add,update,remove,getApplyRange } from '../../api/omd/status';
   export default {
     name: "status",
     data(){
       return {
         //鏌ョ湅浣跨敤鑼冨洿
         packageSearchBox:false,
+        // 鐐瑰嚮鏁版嵁
+        selectRow: '',
+        selectRowData: {},
         //鍒嗛〉鏁版嵁
         page: {
           pageSize: 10,
@@ -56,7 +61,14 @@
           border: true,
           index: true,
           searchMenuSpan:5,
+          highlightCurrentRow: true,
+          stripe:true,
           column:[
+            {
+              label: '',
+              prop: 'radio',
+              width: 120
+            },
             {
               label:'鑻辨枃鍚嶇О',
               prop: 'id',
@@ -73,12 +85,28 @@
               type:'textarea'
             }
           ]
-        }
+        },
+        applyRangeData: []
       }
     },
     methods:{
-      handleSearch(){
-        // this.packageSearchBox=true
+      rowClick(row){
+        this.selectRow = row.$index;
+        this.selectRowData = row;
+      },
+      applyRangeSearch(){
+        if (!this.selectRow && this.selectRow != 0){
+          console.log(this.selectRow);
+          this.$message({
+            type:"warning",
+            message: "璇峰厛閫夋嫨灞炴��"
+          })
+        }
+        getApplyRange(this.selectRowData.id).then(res => {
+          this.applyRangeData = res.data.data;
+          this.$refs.applyRange.rangeData = this.applyRangeData;
+          this.$refs.applyRange.showDialog = true;
+        })
       },
       getList() {
         this.loading = true;
@@ -134,8 +162,7 @@
     }
   }
   </script>
-  
+
   <style scoped>
-  
+
   </style>
-  
\ No newline at end of file
diff --git a/Source/UBCS-WEB/vue.config.js b/Source/UBCS-WEB/vue.config.js
index 1e8bbca..016eb50 100644
--- a/Source/UBCS-WEB/vue.config.js
+++ b/Source/UBCS-WEB/vue.config.js
@@ -26,17 +26,16 @@
     proxy: {
       '/api': {
         //鏈湴鏈嶅姟鎺ュ彛鍦板潃
-        target: 'http://localhost:37000',
-        //  target: 'http://localhost:37000',
+         target: 'http://localhost:37000',
         // target: 'http://192.168.1.51:37000',
-        // target: 'http://192.168.3.7:37000',
+        // target: 'http://192.168.1.46:37000',
         // target: 'http://dev.vci-tech.com:37000',
         // target: 'http://192.168.1.51:37000/',
-        // target: 'http://localhost:37000',
+        //   target: 'http://localhost:37000',
         // target: 'http://192.168.1.63:37000',
-        // target: 'http://192.168.3.7:37000',
+        //target: 'http://192.168.3.7:37000',
         // target: 'http://dev.vci-tech.com:37000',
-        // target: 'http://192.168.1.51:37000/',
+        //target: 'http://192.168.1.51:37000/',
         //杩滅▼婕旂ず鏈嶅姟鍦板潃,鍙敤浜庣洿鎺ュ惎鍔ㄩ」鐩�
         // target: 'https://saber.bladex.vip/api',
         ws: true,
diff --git a/Source/UBCS/ubcs-service-api/ubcs-dict-api/src/main/java/com/vci/ubcs/system/feign/IDictBizClient.java b/Source/UBCS/ubcs-service-api/ubcs-dict-api/src/main/java/com/vci/ubcs/system/feign/IDictBizClient.java
index ce51779..59c2b25 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-dict-api/src/main/java/com/vci/ubcs/system/feign/IDictBizClient.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-dict-api/src/main/java/com/vci/ubcs/system/feign/IDictBizClient.java
@@ -34,7 +34,7 @@
  * @author Chill
  */
 @FeignClient(
-	value = AppConstant.APPLICATION_NAME_OMD,
+	value = AppConstant.APPLICATION_SYSTEM_NAME,
 	fallback = IDictBizClientFallback.class
 )
 public interface IDictBizClient {
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeClient.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeClient.java
index a002604..b9742fa 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeClient.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeClient.java
@@ -18,6 +18,7 @@
 
 
 import com.vci.ubcs.omd.entity.Attribute;
+import com.vci.ubcs.omd.vo.AttributeVO;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.tool.api.R;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -41,6 +42,8 @@
 	String GET_BY_ID = API_PREFIX + "/attribute/get-by-id";
 	String GET_LIST = API_PREFIX + "/attribute/get-list";
 
+	String GET_ALL = API_PREFIX + "/attribute/get-all";
+
 
 	/**
 	 * 鑾峰彇鍏冩暟鎹璞�
@@ -57,4 +60,11 @@
 	 */
 	@GetMapping(GET_LIST)
 	R<List<Attribute>> getList(@RequestParam("key") String key);
+
+	/**
+	 * 鑾峰彇鍏ㄩ儴灞炴��
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@GetMapping(GET_ALL)
+	R<List<AttributeVO>> getAll();
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeFallback.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeFallback.java
index f358100..7080831 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeFallback.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeFallback.java
@@ -17,6 +17,7 @@
 package com.vci.ubcs.omd.feign;
 
 import com.vci.ubcs.omd.entity.Attribute;
+import com.vci.ubcs.omd.vo.AttributeVO;
 import org.springblade.core.tool.api.R;
 import org.springframework.stereotype.Component;
 
@@ -39,5 +40,13 @@
 		return R.fail("鑾峰彇鏁版嵁澶辫触");
 	}
 
-
+	/**
+	 * 鎸夐鍩熻幏鍙栧叏閮ㄥ睘鎬�
+	 *
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public R<List<AttributeVO>> getAll() {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IBtmTypeClient.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IBtmTypeClient.java
index 7fea663..544e14e 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IBtmTypeClient.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IBtmTypeClient.java
@@ -50,11 +50,11 @@
 	 */
 	String GET_BY_OIDS = API_PREFIX + "/btm-type/get-by-oids";
 
-	String GET_DEFAULT_ATTR_BY_BTM_ID = API_PREFIX + "/btm-attribute/get-default-attr-by-btm-id";
+	String GET_DEFAULT_ATTR_BY_BTM_ID = API_PREFIX + "/btm-type/get-default-attr-by-btm-id";
 
-	String GET_ALL_ATTR_BY_BTM_ID = API_PREFIX + "/btm-attribute/get-all-attr-by-btm-id";
+	String GET_ALL_ATTR_BY_BTM_ID = API_PREFIX + "/btm-type/get-all-attr-by-btm-id";
 
-	String GET_ALL_ATTR_BY_BTM_OID = API_PREFIX + "/btm-attribute/get-all-attr-by-btm-oid";
+	String GET_ALL_ATTR_BY_BTM_OID = API_PREFIX + "/btm-type/get-all-attr-by-btm-oid";
 
 	/**
 	 * 鑾峰彇涓氬姟绫诲瀷璇︽儏淇℃伅
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeClient.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeClient.java
new file mode 100644
index 0000000..b5f682f
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeClient.java
@@ -0,0 +1,136 @@
+package com.vci.ubcs.omd.feign;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vci.ubcs.omd.vo.LinkTypeVO;
+import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
+import org.springblade.core.launch.constant.AppConstant;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * Description: 閾炬帴绫诲瀷Feign鎺ュ彛
+ *
+ * @author LiHang
+ * @date 2023/6/13
+ */
+@FeignClient(
+	value = AppConstant.APPLICATION_NAME_OMD,
+	fallback = ILinkTypeFallback.class
+)
+public interface ILinkTypeClient {
+	/**
+	 * 鍓嶇紑
+	 */
+	String API_PREFIX = "/client";
+
+	/**
+	 * 鍒嗛〉鍙傜収鏌ヨ
+	 */
+	String GET_REF_PAGE =API_PREFIX + "/link-type/get-ref-page";
+
+	/**
+	 * 鍙傜収鍒楄〃鏌ヨ鏃犲垎椤�
+	 */
+	String GET_REF = API_PREFIX + "/link-type/get-ref";
+	/**
+	 * 鍙傜収鏄庣粏
+	 */
+	String GET_DETAIL = API_PREFIX + "/link-type/get-detail";
+	/**
+	 * 鑻辨枃鍚嶇О鎵归噺鏌ヨ
+	 */
+	String GET_BY_IDS = API_PREFIX + "/link-type/get-by-ids";
+	/**
+	 * 涓婚敭鎵归噺鏌ヨ
+	 */
+	String GET_BY_OIDS = API_PREFIX + "/link-type/get-by-oids";
+	/**
+	 * 鎸夐摼鎺ョ被鍨嬭嫳鏂囧悕绉拌幏鍙栭粯璁ゅ瓧娈�
+	 */
+	String GET_DEFAULT_ATTR_BY_LINK_ID = API_PREFIX + "/link-type/get-default-attr-by-link-id";
+
+	/**
+	 * 鎸夐摼鎺ョ被鍨嬭嫳鏂囧悕绉拌幏鍙栧叏閮ㄥ瓧娈�
+	 */
+	String GET_ALL_ATTR_BY_LINK_ID = API_PREFIX + "/link-type/get-all-attr-by-link-id";
+
+	/**
+	 * 鎸夐摼鎺ョ被鍨嬩富閿幏鍙栧叏閮ㄥ瓧娈�
+	 */
+	String GET_ALL_ATTR_BY_LINK_OID = API_PREFIX + "/link-type/get-all-attr-by-link-oid";
+
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷璇︽儏淇℃伅
+	 *
+	 * @param oid 涓婚敭
+	 * @return 涓氬姟绫诲瀷璇︽儏淇℃伅
+	 */
+	@GetMapping(GET_DETAIL)
+	R<LinkTypeVO> getDetail(@RequestParam("oid") String oid);
+
+	/**
+	 * 鍙傜収鍒楄〃鏌ヨ
+	 *
+	 * @param baseQueryObject 鏌ヨ鏉′欢瀵硅薄
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@PostMapping(GET_REF_PAGE)
+	R<Page<LinkTypeVO>> getRefPage(@RequestBody BaseQueryObject baseQueryObject);
+
+	/**
+	 * 鍙傜収鍒楄〃鏌ヨ
+	 * @param baseQueryObject 鏌ヨ鏉′欢瀵硅薄
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@PostMapping(GET_REF)
+	R<List<LinkTypeVO>> getRef(@RequestBody BaseQueryObject baseQueryObject);
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О鎵归噺鏌ヨ瀵硅薄
+	 * @param ids 瀵硅薄鑻辨枃鍚嶇О 浣嗘槸涓嶈兘瓒呰繃1000
+	 * @return 涓氬姟瀵硅薄
+	 */
+	@PostMapping(GET_BY_IDS)
+	R<List<LinkTypeVO>> selectByIdCollection(@RequestBody List<String> ids);
+
+	/**
+	 * 鎵归噺鏍规嵁涓婚敭鑾峰彇涓氬姟绫诲瀷
+	 * @param pkLinkTypeCollection 涓氬姟绫诲瀷涓婚敭闆嗗悎
+	 * @return 涓氬姟绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 */
+	@PostMapping(GET_BY_OIDS)
+	R<List<LinkTypeVO>> listLinkTypeByOidCollection(@RequestBody List<String> pkLinkTypeCollection);
+
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷锛屽彧鏈夐粯璁ゅ瓧娈�
+	 *
+	 * @param linkTypeId 涓氬姟绫诲瀷id
+	 * @return 榛樿瀛楁灞炴��
+	 */
+	@GetMapping(GET_DEFAULT_ATTR_BY_LINK_ID)
+	R<LinkTypeVO> getDefaultAttrByLinkId(@RequestParam("linkTypeId") String linkTypeId);
+
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeId 涓氬姟绫诲瀷id
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@GetMapping(GET_ALL_ATTR_BY_LINK_ID)
+	R<LinkTypeVO> getAllAttributeByLinkId(@RequestParam("linkTypeId") String linkTypeId);
+
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeOid 涓氬姟绫诲瀷涓婚敭
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@GetMapping(GET_ALL_ATTR_BY_LINK_OID)
+	R<LinkTypeVO> getAllAttributeByLinkOid(@RequestParam("linkTypeOid") String linkTypeOid);
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeFallback.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeFallback.java
new file mode 100644
index 0000000..8310f6b
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeFallback.java
@@ -0,0 +1,104 @@
+package com.vci.ubcs.omd.feign;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vci.ubcs.omd.vo.LinkTypeVO;
+import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
+import org.springblade.core.tool.api.R;
+
+import java.util.List;
+
+/**
+ * Description: 閾炬帴绫诲瀷feign澶辫触鐨勯厤缃被
+ *
+ * @author LiHang
+ * @date 2023/6/13
+ */
+public class ILinkTypeFallback implements ILinkTypeClient{
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷璇︽儏淇℃伅
+	 *
+	 * @param oid 涓婚敭
+	 * @return 涓氬姟绫诲瀷璇︽儏淇℃伅
+	 */
+	@Override
+	public R<LinkTypeVO> getDetail(String oid) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	/**
+	 * 鍙傜収鍒楄〃鏌ヨ
+	 *
+	 * @param baseQueryObject 鏌ヨ鏉′欢瀵硅薄
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public R<Page<LinkTypeVO>> getRefPage(BaseQueryObject baseQueryObject) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	/**
+	 * 鍙傜収鍒楄〃鏌ヨ
+	 *
+	 * @param baseQueryObject 鏌ヨ鏉′欢瀵硅薄
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public R<List<LinkTypeVO>> getRef(BaseQueryObject baseQueryObject) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О鎵归噺鏌ヨ瀵硅薄
+	 *
+	 * @param ids 瀵硅薄鑻辨枃鍚嶇О 浣嗘槸涓嶈兘瓒呰繃1000
+	 * @return 涓氬姟瀵硅薄
+	 */
+	@Override
+	public R<List<LinkTypeVO>> selectByIdCollection(List<String> ids) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	/**
+	 * 鎵归噺鏍规嵁涓婚敭鑾峰彇涓氬姟绫诲瀷
+	 *
+	 * @param pkLinkTypeCollection 涓氬姟绫诲瀷涓婚敭闆嗗悎
+	 * @return 涓氬姟绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 */
+	@Override
+	public R<List<LinkTypeVO>> listLinkTypeByOidCollection(List<String> pkLinkTypeCollection) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷锛屽彧鏈夐粯璁ゅ瓧娈�
+	 *
+	 * @param linkTypeId 涓氬姟绫诲瀷id
+	 * @return 榛樿瀛楁灞炴��
+	 */
+	@Override
+	public R<LinkTypeVO> getDefaultAttrByLinkId(String linkTypeId) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeId 涓氬姟绫诲瀷id
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@Override
+	public R<LinkTypeVO> getAllAttributeByLinkId(String linkTypeId) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	/**
+	 * 鑾峰彇涓氬姟绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeOid 涓氬姟绫诲瀷涓婚敭
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@Override
+	public R<LinkTypeVO> getAllAttributeByLinkOid(String linkTypeOid) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java
index e2f6a78..1de1374 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java
@@ -31,7 +31,8 @@
 	 * @param mapList 闇�瑕佹彃鍏ョ殑鎵�鏈夎褰�
 	 * @return 鎻掑叆鎴愬姛鐨勬潯鏁�
 	 */
-	Integer insertByBaseModel(String tableName,Map<String,String> columnMap,List<Map<String,String>> mapList);/**
+	Integer insertByBaseModel(String tableName,Map<String,String> columnMap,List<Map<String,String>> mapList);
+	/**
 	 * 浼犲叆琛ㄥ悕锛宮ap锛宭ist<map>瀹屾垚鎵归噺鏇存柊鎿嶄綔
 	 * @param tableName 琛ㄥ悕
 	 * @param mapList 闇�瑕佹洿鏂扮殑鎵�鏈夎褰�
@@ -40,4 +41,12 @@
 	@InterceptorIgnore(tenantLine = "true")
 	Integer updateBatchByBaseModel(String tableName,List<Map<String,String>> mapList);
 
+	/**
+	 * 浼犲叆琛ㄥ悕锛宮ap锛宱ids瀹屾垚鎵归噺鍒犻櫎鎿嶄綔
+	 * @param tableName 琛ㄥ悕
+	 * @param oids 闇�瑕佸垹闄ょ殑鎵�鏈夎褰�
+	 * @return 鍒犻櫎鎴愬姛鐨勬潯鏁�
+	 */
+	Integer deleteByTaleAndOid(String tableName,String oids);
+
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
index bacba02..3b79f45 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
@@ -377,7 +377,7 @@
 	 * @param baseModels      澶勭悊鏁版嵁
 	 * @return 澶勭悊鎴愬姛鏁版嵁鏉℃暟
 	 */
-	Integer insertBatchByType(String btmType, List<BaseModel> baseModels) throws Exception;
+	Integer insertBatchByType(String btmType, List<BaseModel> baseModels);
 	/**
 	 * 浼犲叆涓氬姟绫诲瀷浠ュ強鐩竜id闆嗗悎鏌ヨ鏁版嵁杩涜杩斿洖
 	 *
@@ -385,7 +385,7 @@
 	 * @param oids      闇�瑕佹煡璇㈢殑oid闆嗗悎 閫楀彿鍒嗗紑
 	 * @return 鏌ヨ鍑虹殑鏁版嵁
 	 */
-	List<BaseModel> selectByTypeAndOid(String btmType, String oids) throws IllegalAccessException, NoSuchFieldException, InstantiationException, InvocationTargetException, IntrospectionException, SQLException;
+	List<BaseModel> selectByTypeAndOid(String btmType, String oids) ;
 	/**
 	 * 浼犲叆涓氬姟绫诲瀷浠ュ強鐩稿叧鏁版嵁杩涜鎵归噺鏇存柊鎿嶄綔
 	 *
@@ -393,6 +393,6 @@
 	 * @param baseModels      澶勭悊鏁版嵁
 	 * @return 澶勭悊鐘舵��
 	 */
-	R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) throws Exception;
+	R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels);
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
index bfb5344..7071514 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
@@ -89,7 +89,7 @@
 	private CodeClassifyTemplateButtonServiceImpl codeTempbuttonServiceImpl;
 	@Autowired(required = false)
 	private ICodeClassifyProcessTempService codeClsflowtempServiceImpl;
-//	@Autowired(required = false)
+	//	@Autowired(required = false)
 //	private CodeClsflowtempMapper codeClsflowtempMapper;
 	@Autowired(required = false)
 	private CodeTemplatePhaseMapper codeTempphaseMapper;
@@ -493,34 +493,34 @@
 //			ClientBusinessObject clientBusinessObject_template_insert = null;
 //		try {
 //			clientBusinessObject_template_insert = clientBusinessObjectOperation.reviseBusinessObject(clientBusinessObject_template, "");
-			codeCls_template_insert.setOid(VciBaseUtil.getPk());
-			codeCls_template_insert.setRevisionOid(VciBaseUtil.getPk());
-			codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
-			codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
-			codeCls_template_insert.setLastR(String.valueOf(1));
-			codeCls_template_insert.setFirstR(String.valueOf(0));
-			codeCls_template_insert.setFirstV(String.valueOf(1));
-			codeCls_template_insert.setLastV(String.valueOf(1));
-			codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
-			codeCls_template_insert.setCreateTime(new Date());
-			codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
-			codeCls_template_insert.setLastModifyTime(new Date());
-			codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
-			codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
-			Map rvObj = baseMapper.getNextRevision(codeCls_template.getNameOid());
-			codeCls_template_insert.setRevisionSeq(Integer.parseInt(rvObj.get("REVISIONSEQ").toString()));
-			codeCls_template_insert.setRevisionValue(rvObj.get("REVISIONVAL").toString());
+		codeCls_template_insert.setOid(VciBaseUtil.getPk());
+		codeCls_template_insert.setRevisionOid(VciBaseUtil.getPk());
+		codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
+		codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
+		codeCls_template_insert.setLastR(String.valueOf(1));
+		codeCls_template_insert.setFirstR(String.valueOf(0));
+		codeCls_template_insert.setFirstV(String.valueOf(1));
+		codeCls_template_insert.setLastV(String.valueOf(1));
+		codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
+		codeCls_template_insert.setCreateTime(new Date());
+		codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
+		codeCls_template_insert.setLastModifyTime(new Date());
+		codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
+		codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
+		Map rvObj = baseMapper.getNextRevision(codeCls_template.getNameOid());
+		codeCls_template_insert.setRevisionSeq(Integer.parseInt(rvObj.get("REVISIONSEQ").toString()));
+		codeCls_template_insert.setRevisionValue(rvObj.get("REVISIONVAL").toString());
 //			VersionValueObject versionObj = this.getVersionValue(item.verRuleName);
-			codeCls_template_insert.setVersionSeq(Integer.parseInt(rvObj.get("VERSIONSEQ").toString()));
-			codeCls_template_insert.setVersionValue(rvObj.get("VERSIONVAL").toString());
-			codeCls_template_insert.setLctid(codeCls_template.getLctid());
-			codeCls_template_insert.setLcStatus("Editing");
-			codeCls_template_insert.setId(codeCls_template.getId());
-			codeCls_template_insert.setName(codeCls_template.getName());
-			codeCls_template_insert.setDescription(codeCls_template.getDescription());
-			codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
+		codeCls_template_insert.setVersionSeq(Integer.parseInt(rvObj.get("VERSIONSEQ").toString()));
+		codeCls_template_insert.setVersionValue(rvObj.get("VERSIONVAL").toString());
+		codeCls_template_insert.setLctid(codeCls_template.getLctid());
+		codeCls_template_insert.setLcStatus("Editing");
+		codeCls_template_insert.setId(codeCls_template.getId());
+		codeCls_template_insert.setName(codeCls_template.getName());
+		codeCls_template_insert.setDescription(codeCls_template.getDescription());
+		codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
 //			codeCls_template_insert.setCheckinBy(userName);
-			codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
+		codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
 //		}catch (VCIError e){
 //			e.printStackTrace();
 //			logger.error("===============>鍒嗙被妯℃澘-鍗囩増澶嶅埗鍑洪敊oid锛� "+templateOldOid+",mes"+e.error_message);
@@ -919,6 +919,13 @@
 	@Override
 	public R<CodeClassifyTemplateVO> addSave(CodeClassifyTemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
 		VciBaseUtil.alertNotNull(codeClassifyTemplateDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+
+		QueryWrapper<CodeClassifyTemplate> wrapper = new QueryWrapper<>();
+		wrapper.eq("CODECLASSIFYOID",codeClassifyTemplateDTO.getCodeclassifyoid());
+		Long aLong = baseMapper.selectCount(wrapper);
+		if(aLong > 0){
+			return R.fail("璇ュ垎绫讳笅宸叉湁瀛愭ā鐗堬紝鏃犳硶鏂板锛屼粎鑳借繘琛屽崌鐗堟搷浣滐紒");
+		}
 		//灏咲TO杞崲涓篋O
 		CodeClassifyTemplate codeClassifyTemplateDO = new CodeClassifyTemplate();
 		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDTO,codeClassifyTemplateDO);
@@ -937,7 +944,7 @@
 		codeClassifyTemplateDO.setBtmTypeName(codeClassifyDO.getBtmTypeName());
 		codeClassifyTemplateDO.setLcStatus(FRAMEWORK_RELEASE_EDITING);
 		codeClassifyTemplateDO.setTs(new Date());
-		codeClassifyTemplateDO.setOwner(AuthUtil.getUser().getUserName());
+		codeClassifyTemplateDO.setOwner(String.valueOf(AuthUtil.getUser().getUserId()));
 		codeClassifyTemplateDO.setLctid("codeClsTempLc");
 		codeClassifyTemplateDO.setVersionValue("1");
 		codeClassifyTemplateDO.setVersionSeq(1);
@@ -946,8 +953,8 @@
 		codeClassifyTemplateDO.setVersionRule("0");
 		codeClassifyTemplateDO.setRevisionRule("numberversionrule");
 		codeClassifyTemplateDO.setLastModifyTime(new Date());
-		codeClassifyTemplateDO.setLastModifier(AuthUtil.getUser().getUserName());
-		codeClassifyTemplateDO.setCreator(AuthUtil.getUser().getUserName());
+		codeClassifyTemplateDO.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
+		codeClassifyTemplateDO.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));
 		codeClassifyTemplateDO.setCreateTime(new Date());
 		codeClassifyTemplateDO.setLastV("1");
 		codeClassifyTemplateDO.setLastR("1");
@@ -1043,7 +1050,7 @@
 //			condition.put("ts",codeClassifyTemplateDOCopyFromDTO.getTs());
 			CodeClassifyTemplate detail = baseMapper
 				.selectById(codeClassifyTemplateDOCopyFromDTO.getOid());
-	//		boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
+			//		boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
 			if(detail.getTs().compareTo(codeClassifyTemplateDOCopyFromDTO.getTs()) != 0){//涓嶆槸鏈�鏂扮殑涓嶈鏀�
 				return R.fail("褰撳墠鏁版嵁涓嶆槸鏈�鏂帮紝璇峰埛鏂板悗鍐嶄慨鏀癸紒");
 			}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
index 282fdb8..8565672 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -8,6 +8,7 @@
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
 import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
+import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
 import com.vci.ubcs.code.dto.CodeDeleteBatchDTO;
 import com.vci.ubcs.code.dto.CodeOrderDTO;
 import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
@@ -57,6 +58,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.Cache;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
@@ -327,6 +329,7 @@
 	 *
 	 * @param baseModelDTO 鏁版嵁浼犺緭瀵硅薄
 	 */
+	@Transactional
 	@Override
 	public void changeStatus(BaseModelDTO baseModelDTO) {
 		VciBaseUtil.alertNotNull(baseModelDTO, "鏁版嵁淇℃伅", baseModelDTO.getOid(), "涓婚敭", baseModelDTO.getBtmname(), "涓氬姟绫诲瀷", baseModelDTO.getLcStatus(), "鐩爣鐘舵��");
@@ -337,6 +340,14 @@
 		wrapper.eq("BTMNAME",baseModelDTO.getBtmname());
 		wrapper.in("OID",oids);
 		// TODO 寰呭畬鍠�
+		//鎻掍釜鐐� 涓氬姟绫诲瀷瀹屾垚鍚庨渶瑕佷慨鏀�
+//		QueryWrapper<BtmTypeVO> wrapper = new QueryWrapper<>();
+		List<BaseModel> baseModels = new ArrayList<>();
+		baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
+		if(baseModels.size() == 0){
+			throw new VciBaseException("鏈煡璇㈠埌鐩稿叧鏁版嵁銆�");
+		}
+		// 寰呭畬鍠�
 		List<BtmTypeVO> cboList =  null;  // btmTypeClient.selectList(wrapper);
 		//杩橀渶瑕佷慨鏀筧llCode鐨勭敓鍛藉懆鏈�
 //		Map<String, String> conditionMap = new HashMap<>();
@@ -349,6 +360,9 @@
 //		List<ClientBusinessObject> codeCbos = boService.queryCBO(MdmBtmTypeConstant.CODE_ALL_CODE, conditionMap);
 		// 鍥炴敹闇�瑕佷笟鍔℃暟鎹垹闄�
 		if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
+			R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
+//			String referTable = listR.getData().get(0).getTableName();
+			commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(),VciBaseUtil.toInSql(baseModelDTO.getOid()));
 			// BatchCBO batchCBO = new BatchCBO();
 			// batchCBO.getDeleteCbos().addAll(cboList);
 
@@ -357,8 +371,16 @@
 
 			//boService.persistenceBatch(batchCBO);
 		} else {
+			for (BaseModel baseModel : baseModels) {
+				baseModel.setLcStatus(baseModelDTO.getLcStatus());
+			}
+			updateBatchByBaseModel(baseModelDTO.getBtmname(),baseModels);
 			// lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
 		}
+		for (CodeAllCode codeCbo : codeCbos) {
+			codeCbo.setLcStatus(baseModelDTO.getLcStatus());
+		}
+		codeAllCodeService.updateBatchById(codeCbos);
 		// lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
 	}
 
@@ -625,9 +647,10 @@
 		//娌℃湁闄愬埗鍒嗙被锛屼絾鏄竴涓ā鏉垮彧鍙兘鍦ㄤ竴涓笟鍔$被鍨嬮噷闈紝鎵�浠ョ洿鎺ユ煡璇㈣繖涓笟鍔$被鍨嬪嵆鍙�
 
 		if (!CollectionUtils.isEmpty(conditionMap)) {
-			//琛ㄩ渶瑕佹敼
 //			final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
-			final String[] sql = {"select count(*) from pl_code_wupin t where 1 = 1 "};
+			R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(classifyFullInfo.getTopClassifyVO().getBtmtypeid()));
+//				String referTable = VciBaseUtil.getTableName(referVO.getReferType());
+			final String[] sql = {"select count(*) from "+ listR.getData().get(0).getTableName() +" t where 1 = 1 "};
 			conditionMap.forEach((key, value) -> {
 				sql[0] += " and " + key + " = " + value;
 			});
@@ -1408,31 +1431,45 @@
 
 		DataGrid<Map<String, String>> dataGrid = new DataGrid<>();
 		List<Map<String, String>> dataList = new ArrayList<>();
-//		if (!CollectionUtils.isEmpty(maps)) {
-//			maps.stream().forEach(map -> {
-//				Map<String, String> data = new HashMap<>();
-//				map.forEach((key, value) -> {
-//					data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
-//				});
-//				dataList.add(data);
-//			});
-//		}
-//		dataGrid.setData(dataList);
 		if (!CollectionUtils.isEmpty(maps)) {
-			wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
 			maps.stream().forEach(map -> {
 				Map<String, String> data = new HashMap<>();
+				for (String s : map.keySet()) {
+					data.put(s.toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
+				}
 //				map.forEach((key, value) -> {
 //					data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
 //				});
-				for (String s : map.keySet()) {
-					data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
-				}
 				dataList.add(data);
 			});
-			dataGrid.setData(dataList);
-			dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
+			wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), false);
+//			maps.stream().forEach(map -> {
+//				Map<String, String> data = new HashMap<>();
+////				map.forEach((key, value) -> {
+////					data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
+////				});
+//				for (String s : map.keySet()) {
+//					data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
+//				}
+//				dataList.add(data);
+//			});
 		}
+//		dataGrid.setData(dataList);
+//		if (!CollectionUtils.isEmpty(maps)) {
+//			wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
+//			maps.stream().forEach(map -> {
+//				Map<String, String> data = new HashMap<>();
+////				map.forEach((key, value) -> {
+////					data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
+////				});
+//				for (String s : map.keySet()) {
+//					data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
+//				}
+//				dataList.add(data);
+//			});
+		dataGrid.setData(dataList);
+		dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
+//		}
 		return dataGrid;
 	}
 
@@ -1708,9 +1745,7 @@
 			}
 			whereSql += " and ( t.secretGrade <= " + userSecret + ") ";
 		}
-		//瑕佹敼锛岃〃鏄庤幏鍙栨湁闂
 //		String tableName = VciBaseUtil.getTableName(btmType);
-//		String tableName = "pl_code_wupin";
 		R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
 //				String referTable = VciBaseUtil.getTableName(referVO.getReferType());
 		String tableName = listR.getData().get(0).getTableName();
@@ -2158,15 +2193,18 @@
 		//pageHelper.addDefaultDesc("createTime");
 		pageHelper.addDefaultDesc("id");
 		if (!classifyService.checkHasChild(codeClassifyOid)) {
-			conditionMap.put(CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
+			conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
 		} else {
-			//琛ㄩ渶瑕佹敼
 //			conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY)
-			conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from pl_code_classify where lcstatus='" + FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED +
-				"' start with parentCodeClassifyOid = '" + codeClassifyOid + "' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
+
+			conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from "+
+				btmTypeClient.selectByIdCollection(Collections.singletonList(MdmBtmTypeConstant.CODE_CLASSIFY))
+					.getData().get(0).getTableName() +" where lcstatus='" + FrameWorkDefaultValueConstant
+				.FRAMEWORK_DATA_ENABLED + "' start with parentCodeClassifyOid = '" + codeClassifyOid +
+				"' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
 		}
-		conditionMap.put("lastr", "1");
-		conditionMap.put("lastv", "1");
+		conditionMap.put("t.lastr", "1");
+		conditionMap.put("t.lastv", "1");
 		return queryGrid(btmTypeId, templateVO, conditionMap, pageHelper);
 //        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
 //        //鍙傜収璁╁钩鍙扮洿鎺ユ煡璇㈠氨琛�
@@ -3002,7 +3040,7 @@
 	 * @return 澶勭悊鎴愬姛鏁版嵁鏉℃暟
 	 */
 	@Override
-	public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) throws Exception {
+	public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) {
 		//浣跨敤浼犲叆鐨勪笟鍔$被鍨嬫煡璇㈣〃
 		R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
 		if(listR.getData().size() == 0){
@@ -3028,7 +3066,7 @@
 	 * @return 鏌ヨ鍑虹殑鏁版嵁
 	 */
 	@Override
-	public List<BaseModel> selectByTypeAndOid(String btmType, String oids) throws IllegalAccessException, NoSuchFieldException, InstantiationException, InvocationTargetException, IntrospectionException, SQLException {
+	public List<BaseModel> selectByTypeAndOid(String btmType, String oids)  {
 
 		//浣跨敤浼犲叆鐨勪笟鍔$被鍨嬫煡璇㈣〃
 		R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
@@ -3041,38 +3079,42 @@
 
 		List<BaseModel> baseModels = new ArrayList<>();
 		//灏嗘煡璇㈠埌鐨勬暟鎹浆鎹负basemodel锛屼娇鐢ㄧ殑鍙嶅皠鏂瑰紡鏉ヨ繘琛屽垱寤虹殑
-		for (Map map : maps) {
-			Object obj = BaseModel.class.newInstance();
-			BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
-			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
-			for (PropertyDescriptor property : propertyDescriptors) {
-				Method setter = property.getWriteMethod();
-				if (setter != null) {
-					//oracle鐨勬椂闂翠负TIMESTAMP鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚data锛屽惁鍒欏皢鎶ラ敊
-					if(map.get(property.getName().toUpperCase()) instanceof TIMESTAMP){
-						LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
-						ZoneId zoneId = ZoneId.systemDefault();
-						ZonedDateTime zdt = localDateTime.atZone(zoneId);
-						Date date = Date.from(zdt.toInstant());
-						setter.invoke(obj,date);
-						map.remove(property.getName().toUpperCase());
-					} //oracle鐨勬暟瀛椾负BigDecimal鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚Integer锛屽惁鍒欏皢鎶ラ敊
-					else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
-						&& ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())){
-						setter.invoke(obj, ((BigDecimal)map.get(property.getName().toUpperCase())).intValue());
-						map.remove(property.getName().toUpperCase());
-					}else if(map.get(property.getName().toUpperCase()) != null){
-						setter.invoke(obj, map.get(property.getName().toUpperCase()));
-						map.remove(property.getName().toUpperCase());
+		try{
+			for (Map map : maps) {
+				Object obj = BaseModel.class.newInstance();
+				BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
+				PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+				for (PropertyDescriptor property : propertyDescriptors) {
+					Method setter = property.getWriteMethod();
+					if (setter != null) {
+						//oracle鐨勬椂闂翠负TIMESTAMP鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚data锛屽惁鍒欏皢鎶ラ敊
+						if(map.get(property.getName().toUpperCase()) instanceof TIMESTAMP){
+							LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
+							ZoneId zoneId = ZoneId.systemDefault();
+							ZonedDateTime zdt = localDateTime.atZone(zoneId);
+							Date date = Date.from(zdt.toInstant());
+							setter.invoke(obj,date);
+							map.remove(property.getName().toUpperCase());
+						} //oracle鐨勬暟瀛椾负BigDecimal鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚Integer锛屽惁鍒欏皢鎶ラ敊
+						else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
+							&& ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())){
+							setter.invoke(obj, ((BigDecimal)map.get(property.getName().toUpperCase())).intValue());
+							map.remove(property.getName().toUpperCase());
+						}else if(map.get(property.getName().toUpperCase()) != null){
+							setter.invoke(obj, map.get(property.getName().toUpperCase()));
+							map.remove(property.getName().toUpperCase());
+						}
 					}
 				}
-			}
-			for (Object key : map.keySet()) {
-				map.put(key,String.valueOf(map.get(key)));
-			}
+				for (Object key : map.keySet()) {
+					map.put(key,String.valueOf(map.get(key)));
+				}
 
-			((BaseModel) obj).setData(map);
-			baseModels.add((BaseModel) obj);
+				((BaseModel) obj).setData(map);
+				baseModels.add((BaseModel) obj);
+			}
+		}catch (Exception e){
+			throw new VciBaseException("鏌ヨ澶辫触锛�" + e.getMessage());
 		}
 		return baseModels;
 	}
@@ -3148,7 +3190,7 @@
 	 * @return 澶勭悊鐘舵��
 	 */
 	@Override
-	public R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) throws Exception {
+	public R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) {
 		//浣跨敤浼犲叆鐨勪笟鍔$被鍨嬫煡璇㈣〃
 		R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
 		if(listR.getData().size() == 0){
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
index e53c1fc..76cb9cc 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
@@ -41,6 +41,10 @@
         </foreach>
     </insert>
 
+    <insert id="deleteByTaleAndOid" >
+        delete from ${tableName} where oid in (${oids})
+    </insert>
+
     <update  id="updateBatchByBaseModel"  parameterType="java.util.List" >
         BEGIN
         <foreach collection="mapList" item="columnMap" index="index" separator=";">
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 f246a67..dcfbc4f 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
@@ -1,7 +1,11 @@
 package com.vci.ubcs.omd.feign;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.vci.ubcs.omd.entity.Attribute;
 import com.vci.ubcs.omd.service.IAttributeService;
+import com.vci.ubcs.omd.vo.AttributeVO;
+import com.vci.ubcs.omd.wrapper.AttributeWrapper;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.tenant.annotation.NonDS;
@@ -40,4 +44,16 @@
 		condition.put("key",key);
 		return R.data(service.list(Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getId)));
 	}
+
+	/**
+	 * 鎸夐鍩熻幏鍙栧叏閮ㄥ睘鎬�
+	 *
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	@GetMapping(GET_ALL)
+	public R<List<AttributeVO>> getAll() {
+		List<AttributeVO> voList = AttributeWrapper.build().listEntityVO(service.list());
+		return R.data(voList);
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/LinkTypeClient.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/LinkTypeClient.java
new file mode 100644
index 0000000..e82d50f
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/LinkTypeClient.java
@@ -0,0 +1,183 @@
+package com.vci.ubcs.omd.feign;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vci.ubcs.omd.entity.LinkType;
+import com.vci.ubcs.omd.service.ILinkTypeService;
+import com.vci.ubcs.omd.vo.LinkTypeVO;
+import com.vci.ubcs.omd.wrapper.LinkTypeWrapper;
+import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
+import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.cglib.beans.BeanMap;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+import java.util.*;
+
+/**
+ * Description: 閾炬帴绫诲瀷Feign瀹炵幇绫�
+ *
+ * @author LiHang
+ * @date 2023/6/13
+ */
+@ApiIgnore()
+@RestController
+@AllArgsConstructor
+public class LinkTypeClient implements ILinkTypeClient{
+
+	private final ILinkTypeService linkTypeService;
+
+	private final String DOMAIN = "domain";
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷璇︽儏淇℃伅
+	 *
+	 * @param oid 涓婚敭
+	 * @return 閾炬帴绫诲瀷璇︽儏淇℃伅
+	 */
+	@Override
+	public R<LinkTypeVO> getDetail(String oid) {
+		LinkTypeVO vo = linkTypeService.getLinkTypeByOid(oid);
+		return R.data(vo);
+	}
+
+	/**
+	 * 鍙傜収鍒楄〃鏌ヨ
+	 *
+	 * @param baseQueryObject 鏌ヨ鏉′欢瀵硅薄
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public R<Page<LinkTypeVO>> getRefPage(BaseQueryObject baseQueryObject) {
+		Map<String, String> conditionMap = baseQueryObject.getConditionMap();
+		if (conditionMap == null){
+			conditionMap = new HashMap<>(16);
+		}
+		if (!conditionMap.containsKey(DOMAIN)){
+			return R.fail("棰嗗煙鍊间笉鑳戒负绌�");
+		}
+		PageHelper pageHelper = baseQueryObject.getPageHelper();
+		if (pageHelper == null){
+			pageHelper = new PageHelper(-1);
+		}
+		String domainValue = conditionMap.get(DOMAIN);
+		VciBaseUtil.alertNotNull(domainValue,"棰嗗煙鍊�");
+		conditionMap.remove(DOMAIN);
+		LinkType queryObj = new LinkType();
+		BeanMap.create(queryObj).putAll(conditionMap);
+		Query query = new Query();
+		query.setSize(pageHelper.getLimit());
+		query.setCurrent(pageHelper.getPage());
+		IPage<LinkType> page = linkTypeService.page(Condition.getPage(query), Condition.getQueryWrapper(queryObj).lambda().eq(LinkType::getDomain, domainValue).orderByAsc(LinkType::getId));
+		Page<LinkTypeVO> pageVO = new Page<>();
+		BeanUtil.copy(page,pageVO);
+		pageVO.setRecords(LinkTypeWrapper.build().listEntityVO(page.getRecords(),null));
+		R<Page<LinkTypeVO>> r = R.data(pageVO);
+		r.setSuccess(true);
+		return r;
+	}
+
+	/**
+	 * 鍙傜収鍒楄〃鏌ヨ
+	 *
+	 * @param baseQueryObject 鏌ヨ鏉′欢瀵硅薄
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public R<List<LinkTypeVO>> getRef(BaseQueryObject baseQueryObject) {
+		Map<String, String> conditionMap = baseQueryObject.getConditionMap();
+		if (conditionMap == null){
+			conditionMap = new HashMap<>(16);
+		}
+		if (!conditionMap.containsKey(DOMAIN)){
+			return R.fail("棰嗗煙鍊间笉鑳戒负绌�");
+		}
+		PageHelper pageHelper = baseQueryObject.getPageHelper();
+		if (pageHelper == null){
+			pageHelper = new PageHelper(-1);
+		}
+		String domainValue = conditionMap.get(DOMAIN);
+		VciBaseUtil.alertNotNull(domainValue,"棰嗗煙鍊�");
+		conditionMap.remove(DOMAIN);
+		LinkType queryObj = new LinkType();
+		BeanMap.create(queryObj).putAll(conditionMap);
+		List<LinkType> doList = linkTypeService.list(Condition.getQueryWrapper(queryObj).lambda().eq(LinkType::getDomain, domainValue).orderByAsc(LinkType::getId));
+		return R.data(LinkTypeWrapper.build().listEntityVO(doList,null));
+	}
+
+	/**
+	 * 鏍规嵁鑻辨枃鍚嶇О鎵归噺鏌ヨ瀵硅薄
+	 *
+	 * @param ids 瀵硅薄鑻辨枃鍚嶇О 浣嗘槸涓嶈兘瓒呰繃1000
+	 * @return 涓氬姟瀵硅薄
+	 */
+	@Override
+	public R<List<LinkTypeVO>> selectByIdCollection(List<String> ids) {
+		Func.requireNotNull(ids,"閾炬帴绫诲瀷鑻辨枃鍚嶇О");
+		List<LinkTypeVO> voList = LinkTypeWrapper.build().listEntityVO(
+			Optional.ofNullable(linkTypeService.list(
+					Wrappers.<LinkType>query().lambda().in(LinkType::getId, ids)
+				)
+			).orElseGet(ArrayList::new),null
+		);
+		return R.data(voList);
+	}
+
+	/**
+	 * 鎵归噺鏍规嵁涓婚敭鑾峰彇閾炬帴绫诲瀷
+	 *
+	 * @param pkLinkTypeCollection 閾炬帴绫诲瀷涓婚敭闆嗗悎
+	 * @return 閾炬帴绫诲瀷鍒楄〃锛屽鏋滄湁涓嶅瓨鍦ㄧ殑涓嶄細杩斿洖锛屽叏閮ㄤ笉瀛樺湪鐨勫垯杩斿洖绌哄垪琛�
+	 */
+	@Override
+	public R<List<LinkTypeVO>> listLinkTypeByOidCollection(List<String> pkLinkTypeCollection) {
+		Func.requireNotNull(pkLinkTypeCollection,"閾炬帴绫诲瀷涓婚敭");
+		List<LinkTypeVO> voList = LinkTypeWrapper.build().listEntityVO(
+			Optional.ofNullable(linkTypeService.list(
+					Wrappers.<LinkType>query().lambda().in(LinkType::getOid, pkLinkTypeCollection)
+				)
+			).orElseGet(ArrayList::new),null
+		);
+		return R.data(voList);
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屽彧鏈夐粯璁ゅ瓧娈�
+	 *
+	 * @param linkTypeId 閾炬帴绫诲瀷ID
+	 * @return 榛樿瀛楁灞炴��
+	 */
+	@Override
+	public R<LinkTypeVO> getDefaultAttrByLinkId(String linkTypeId) {
+		return R.data(linkTypeService.getLinkTypeDefaultAttrById(linkTypeId));
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeId 閾炬帴绫诲瀷id
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@Override
+	public R<LinkTypeVO> getAllAttributeByLinkId(String linkTypeId) {
+		return R.data(linkTypeService.getLinkTypeAllAttrById(linkTypeId));
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeOid 閾炬帴绫诲瀷涓婚敭
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@Override
+	public R<LinkTypeVO> getAllAttributeByLinkOid(String linkTypeOid) {
+		return R.data(linkTypeService.getLinkTypeAllAttrByOid(linkTypeOid));
+	}
+}
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
index 203a3cd..4dfece4 100644
--- 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
@@ -8,6 +8,7 @@
 import com.vci.ubcs.omd.vo.LinkTypeVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+import org.springblade.core.mp.base.BaseService;
 
 import java.util.Collection;
 import java.util.List;
@@ -20,7 +21,7 @@
  * @author LiHang
  * @date 2023/5/24
  */
-public interface ILinkTypeService extends IService<LinkType> {
+public interface ILinkTypeService extends BaseService<LinkType> {
 
 	/**
 	 * 鑾峰彇閾炬帴绫诲瀷鍒楄〃
@@ -209,4 +210,28 @@
 	 * @return 鏌ヨ缁撴灉
 	 */
 	List<BtmTreeVO> treeDomain();
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屽彧鏈夐粯璁ゅ瓧娈�
+	 *
+	 * @param linkTypeId 閾炬帴绫诲瀷id
+	 * @return 榛樿瀛楁灞炴��
+	 */
+	LinkTypeVO getLinkTypeDefaultAttrById(String linkTypeId);
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeId 閾炬帴绫诲瀷id
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	LinkTypeVO getLinkTypeAllAttrById(String linkTypeId);
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeOid 閾炬帴绫诲瀷涓婚敭
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	LinkTypeVO getLinkTypeAllAttrByOid(String linkTypeOid);
 }
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
index 409b4f2..1451bc7 100644
--- 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
@@ -45,6 +45,7 @@
 import org.springframework.transaction.support.DefaultTransactionDefinition;
 import org.springframework.util.CollectionUtils;
 
+import javax.validation.constraints.NotEmpty;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -901,4 +902,56 @@
 			throw new RuntimeException(e);
 		}
 	}
+
+	@Override
+	public boolean deleteLogic(@NotEmpty List<Long> ids) {
+		return false;
+	}
+
+	@Override
+	public boolean changeStatus(@NotEmpty List<Long> ids, Integer status) {
+		return false;
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屽彧鏈夐粯璁ゅ瓧娈�
+	 *
+	 * @param linkTypeId 閾炬帴绫诲瀷id
+	 * @return 榛樿瀛楁灞炴��
+	 */
+	@Override
+	public LinkTypeVO getLinkTypeDefaultAttrById(String linkTypeId) {
+		LinkTypeVO vo = getLinkTypeById(linkTypeId);
+		List<LinkTypeAttributeVO> attributes = linkTypeAttributeService.getDefaultAttributes(vo);
+		vo.setAttributes(attributes);
+		return vo;
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeId 閾炬帴绫诲瀷id
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@Override
+	public LinkTypeVO getLinkTypeAllAttrById(String linkTypeId) {
+		LinkTypeVO vo = getLinkTypeById(linkTypeId);
+		List<LinkTypeAttributeVO> attributes = linkTypeAttributeService.getAllAttributes(vo);
+		vo.setAttributes(attributes);
+		return vo;
+	}
+
+	/**
+	 * 鑾峰彇閾炬帴绫诲瀷锛屾湁鎵�鏈夌殑瀛楁
+	 *
+	 * @param linkTypeOid 閾炬帴绫诲瀷涓婚敭
+	 * @return 鎵�鏈夊瓧娈�
+	 */
+	@Override
+	public LinkTypeVO getLinkTypeAllAttrByOid(String linkTypeOid) {
+		LinkTypeVO vo = getLinkTypeByOid(linkTypeOid);
+		List<LinkTypeAttributeVO> attributes = linkTypeAttributeService.getAllAttributes(vo);
+		vo.setAttributes(attributes);
+		return vo;
+	}
 }
diff --git "a/Source/\346\233\264\346\224\271\350\277\207\347\232\204jar\345\214\205.zip" "b/Source/\346\233\264\346\224\271\350\277\207\347\232\204jar\345\214\205\357\274\210\346\234\211\346\233\264\346\226\260\357\274\211.zip"
similarity index 100%
rename from "Source/\346\233\264\346\224\271\350\277\207\347\232\204jar\345\214\205.zip"
rename to "Source/\346\233\264\346\224\271\350\277\207\347\232\204jar\345\214\205\357\274\210\346\234\211\346\233\264\346\226\260\357\274\211.zip"
Binary files differ

--
Gitblit v1.9.3