From 549ecbf13b14a4deb74e42828abcd46ccb68a7c0 Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期二, 09 五月 2023 17:18:07 +0800
Subject: [PATCH] 前端代码提交

---
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciQueryWrapperForDO.java         |  136 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java                            |   75 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeTemplatePhaseMapper.xml                                 |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java |    8 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeWupinEntity.java                   |  376 +++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeTemplatePhaseMapper.java                   |    8 
 Source/UBCS/pom.xml                                                                                                      |    5 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTempphaseEntity.java               |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeTempphaseWrapper.java                     |   10 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeWupinController.java                   |  126 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyController.java                |   11 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmAttributeServiceImpl.java               |   12 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeWupinClient.java                           |   49 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeWupinClient.java                            |   55 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java                 |    5 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeAttributeMapper.xml                                   |  111 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml                                     |    4 
 Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/processor/dll/DllMapperProcessor.java                   |   16 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeAttributeService.java                   |    6 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java                  |   32 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempphaseClient.java                       |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java                        |    8 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeWupinService.java                        |   43 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyProcessTempDTO.java           |  104 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeVO.java                               |    5 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyValueWrapper.java                 |    2 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeMapper.xml                                            |  221 ++
 Source/UBCS-WEB/src/views/modeling/Business.vue                                                                          |  621 ++---
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeTreeVO.java                           |   27 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodePhaseattrVO.java                       |    5 
 Source/UBCS-WEB/src/views/code/code.vue                                                                                  |   75 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodePhaseattrController.java               |   28 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java            |   79 
 Source/UBCS-WEB/src/views/modeling/original.vue                                                                          |    4 
 Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue                                                                       |  112 +
 Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java                                 |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java                |  779 +++++++
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java             |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java                       |   10 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java                   |  147 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java                     |   16 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java            |  155 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml                                   |   13 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeAttributeMapper.java                      |    4 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java                    |  184 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeBasicSecService.java                     |   23 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeWupinWrapper.java                         |   50 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/annotation/VciBusinessLog.java             |   31 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java                     |    7 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java                             |   25 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeWupinVO.java                           |   23 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/BtmTypeController.java                       |   75 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeWupinDTO.java                         |   22 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmTypeAttribute.java                    |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodePhaseattrServiceImpl.java            |    6 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodePhaseattrWrapper.java                     |    8 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeDefaultLC.java                           |  141 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java                         |    7 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeSerialValueMapper.java                     |    4 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeTemplatePhaseEntityVO.java   |    5 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java          |  202 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java                  |    3 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeMapper.java                               |   14 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseattrClient.java                        |   11 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeWupinMapper.java                           |   18 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyProcessTempController.java     |    1 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempphaseClient.java                        |    6 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyTemplateAttrService.java         |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyProcessTempServiceImpl.java  |   46 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java                           |    2 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java                  |    6 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java                             |    7 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/BaseModelVO.java                 |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseattrClient.java                       |    5 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java                     |    1 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml                                          |   76 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml                                |   47 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeWupinMapper.xml                                         |  108 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java                 |   34 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java                             |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java                    |   23 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeFieldConstant.java              |    8 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyattrrepeatServiceImpl.java        |   72 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeWupinServiceImpl.java                |   42 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java              |    2 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseattrEntity.java               |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java             |   83 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeTemplatePhaseController.java           |   31 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java           |  708 ++++++
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/RegExpConstant.java           |   23 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java                    |  419 +++
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyProcessTempVO.java   |  118 -
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyattrrepeatService.java                |   15 
 Source/UBCS-WEB/src/api/omd/btmType.js                                                                                   |   43 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java             |   47 
 Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java                        |    7 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java                         |   63 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodePhaseattrService.java                    |    4 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java                             |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyProcessTempWrapper.java           |   31 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java                            |   22 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java                    |   26 
 Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/Param.java                         |    2 
 Source/UBCS/ubcs-service/ubcs-ddl/pom.xml                                                                                |   13 
 104 files changed, 5,549 insertions(+), 988 deletions(-)

diff --git a/Source/UBCS-WEB/src/api/omd/btmType.js b/Source/UBCS-WEB/src/api/omd/btmType.js
new file mode 100644
index 0000000..1d9218e
--- /dev/null
+++ b/Source/UBCS-WEB/src/api/omd/btmType.js
@@ -0,0 +1,43 @@
+import request from '@/router/axios';
+
+export const initTree = () => {
+    return request({
+        url: '/api/ubcs-omd/btm-type/tree-domain',
+        method: 'get',
+    })
+}
+
+export const refOnLoad = (domain) => {
+    return request({
+        url: '/api/ubcs-omd/btm-type/get-from-table',
+        method: 'get',
+        params: {
+            domain: domain
+        }
+    })
+}
+
+export const getDomain = () => {
+    return request({
+        url: '/api/ubcs-omd/btm-type/domain',
+        method: 'get'
+    })
+}
+
+export const saveFromTable = (list,domain) => {
+    return request({
+        url: '/api/ubcs-omd/btm-type/save-from-table/' + domain,
+        method: 'post',
+        data: list
+    })
+}
+
+export const getDetail = (oid) => {
+    return request({
+        url: '/api/ubcs-omd/btm-type/detail',
+        method: 'get',
+        params: {
+            oid: oid
+        }
+    })
+}
\ No newline at end of file
diff --git a/Source/UBCS-WEB/src/views/code/code.vue b/Source/UBCS-WEB/src/views/code/code.vue
index ba79473..704bd33 100644
--- a/Source/UBCS-WEB/src/views/code/code.vue
+++ b/Source/UBCS-WEB/src/views/code/code.vue
@@ -1133,6 +1133,7 @@
             type: "success",
             message: "鎿嶄綔鎴愬姛!"
           });
+<<<<<<< HEAD
         })
       },
       //鍩虹鐮佹鏌ヨ
@@ -1169,6 +1170,31 @@
           this.$message({
             type: "success",
             message: "鎿嶄綔鎴愬姛!"
+=======
+        },
+        //鍒锋柊浣跨敤鑼冨洿鍒楄〃
+        refreshUseRangeChange(){
+          this.getRangeCodeList();
+        },
+        //鍗曞嚮缂栫爜瑙勫垯瀹炵幇琛岄�夋嫨
+        codeRuleRowClick (row) {
+          this.$refs.crud.toggleSelection();
+          this.selectionList = row;
+          this.$refs.crud.setCurrentRow(row);
+          this.$refs.crud.toggleRowSelection(row); //閫変腑褰撳墠琛�
+          this.loadBasic(row);
+        },
+        // 鍚敤涓庡仠鐢�
+        enableOrDeactivatse(oId,update){
+          updateStatus({"oid":oId,"ts":new Date().getTime,"update":update}).then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "鎿嶄綔鎴愬姛!"
+            });
+          }, error => {
+            window.console.log(error);
+>>>>>>> 7938e5bedb3ff3b17dae51eb9588e8c8e71136c2
           });
         }, error => {
           window.console.log(error);
@@ -1299,7 +1325,56 @@
 };
 </script>
 
+<<<<<<< HEAD
 <style>
+=======
+<style scope>
+
+  .code-rule-crud > .avue-crud__search ,.code-basic-crud > .avue-crud__search {
+    margin-bottom: -15px;
+  }
+
+  .code-rule-crud > .avue-crud__pagination {
+    padding: 14px 0 2px 20px;
+  }
+  
+
+  .clone-input-textarea > .el-form-item__content {
+    width: 495px;
+  }
+
+  .clone-avue-crud > .el-card > .el-card__body > .avue-crud__menu {
+    display: none!important;
+  }
+
+  .fixed-avue-crud > .el-card> .el-card__body > .avue-crud__menu {
+    display: none!important;
+  }
+
+  .other-clone-codebasic-crud > .el-card> .el-card__body > .avue-crud__menu {
+    display: none!important;
+  }
+
+  .other-clone-coderule-crud > .el-card> .el-card__body > .avue-crud__menu {
+    display: none!important;
+  }
+  
+  .el-table--small .el-table__cell {
+    padding: 3px 0;
+  }
+
+  .classify_value_box > .el-scrollbar {
+    height: 95%;
+  }
+
+  .basic-container > .el-card  > .el-card__body {
+    margin: -10px 0;
+  }
+  .code-basicsec-container{
+    padding: 1px 6px;
+  }
+
+>>>>>>> 7938e5bedb3ff3b17dae51eb9588e8c8e71136c2
   .el-divider--horizontal {
       margin-top: 19px !important;
       margin-bottom: -20px !important;
diff --git a/Source/UBCS-WEB/src/views/modeling/Business.vue b/Source/UBCS-WEB/src/views/modeling/Business.vue
index 260b626..3b4b64d 100644
--- a/Source/UBCS-WEB/src/views/modeling/Business.vue
+++ b/Source/UBCS-WEB/src/views/modeling/Business.vue
@@ -1,74 +1,141 @@
 <template>
-
   <el-container>
-    <el-aside width="240px">
-      <basic-container>
-        <avue-tree id="basic" :data="treeData" :option="treeOption" @node-click="nodeClick">
-        </avue-tree>
-      </basic-container>
-    </el-aside>
-    <el-main>
-      <!--        鍩烘湰淇℃伅-->
-      <basic-container>
-        <p style="margin-top: 10px;font-weight: 570;font-size: 19px">鍩烘湰淇℃伅</p>
-        <avue-crud
-          v-model="objs"
-          :data="basicData"
-          :option="basicOption"
-          @row-save="basicSave"
-        >
-          <!--           鐗堟湰瑙勫垯-->
-          <template slot="rulesForm" slot-scope="{disabled,size}">
-            <div>
-              <el-input v-if="rulesFalg==false" v-model="objs.tex" :size="size" placeholder="璇疯緭鍏ョ増鏈彿瑙勫垯"
-                        style="width: 290px"></el-input>
-              <el-select v-if="rulesFalg" v-model="objs.select" placeholder="璇烽�夋嫨鐗堟湰鍙疯鍒�" style="max-width: 300px">
-                <el-option label="娴嬭瘯1" value="1"></el-option>
-                <el-option label="娴嬭瘯2" value="2"></el-option>
-                <el-option label="娴嬭瘯3" value="3"></el-option>
-              </el-select>
-              <el-button style="margin-bottom: 5px;margin-left: 10px" type="primary" @click="handelRules">
-                {{ rulesFalg == false ? "閫夋嫨鐗堟湰鍙疯鍒�" : "鎵嬪姩杈撳叆" }}
-              </el-button>
-            </div>
-          </template>
-          <!--            鐢熷懡鍛ㄦ湡-->
-          <template slot="lifeCycleForm">
-            <el-select v-model="objs.select" placeholder="璇烽�夋嫨鐢熷懡鍛ㄦ湡" style="max-width: 300px">
-              <el-option label="娴嬭瘯1" value="1"></el-option>
-              <el-option label="娴嬭瘯2" value="2"></el-option>
-              <el-option label="娴嬭瘯3" value="3"></el-option>
-            </el-select>
-            <el-button style="margin-bottom: 5px;display: inline-block;margin-left: 10px" type="primary"
-                       @click="handelLife">鐢熷懡鍛ㄦ湡鍒楄〃
-            </el-button>
-          </template>
-        </avue-crud>
-        <el-dialog :visible.sync="packageLifeBox"
-                   append-to-body
-                   title="鏌ョ湅浣跨敤鑼冨洿"
-                   width="1000px">
-          <Businpackage></Businpackage>
+    <el-header>
+      <el-button type="primary" @click="businessAdd">鏂板</el-button>
+      <el-button type="primary" @click="businessEdit">淇敼</el-button>
+      <el-button type="primary" @click="selectFromTable">浠庡凡鏈変腑鑾峰彇</el-button>
+    </el-header>
+    <el-container>
+      <el-aside width="240px">
+        <basic-container>
+          <avue-tree id="basic" :data="treeData" :option="treeOption" @node-click="nodeClick">
+            <span class="el-tree-node__label" slot-scope="{ node, data }">
+              <span>
+                <i class="el-icon-star-on"></i>
+                {{ (node || {}).label }}
+              </span>
+            </span>
+          </avue-tree>
+        </basic-container>
+      </el-aside>
+      <el-container>
+        <el-main>
+          <!--鍩烘湰淇℃伅-->
+          <basic-container>
+            <p style="margin-top: 10px;font-weight: 570;font-size: 19px">鍩烘湰淇℃伅</p>
+            <el-descriptions class="margin-top" :column="3" :size="size" border>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-finished"></i>
+                  鑻辨枃鍚嶇О
+                </template>
+                {{ obj.id }}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-info"></i>
+                  涓枃鍚嶇О
+                </template>
+                {{ obj.name }}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-date"></i>
+                  鏁版嵁搴撹〃鍚�
+                </template>
+                {{ obj.tableName }}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-folder-opened"></i>
+                  鎵�灞為鍩�
+                </template>
+                {{ obj.domain }}
+              </el-descriptions-item>
+              <!-- <el-descriptions-item>
+            <template slot="label">
+              <i class="el-icon-s-ticket"></i>
+              鏍囩
+            </template>
+            {{obj.hashtag}}
+          </el-descriptions-item> -->
+              <!-- <el-descriptions-item>
+            <template slot="label">
+              <i class="el-icon-arrow-up"></i>
+              缁ф壙鑷�
+            </template>
+            {{ obj.sss }}
+          </el-descriptions-item> -->
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-s-check"></i>
+                  鐗堟湰瑙勫垯
+                </template>
+                {{ obj.versionRule }}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-refresh-right"></i>
+                  鐢熷懡鍛ㄦ湡
+                </template>
+                {{ obj.lifeCycleId }}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-view"></i>
+                  瑙嗗浘
+                </template>
+                {{ obj.viewFlag }}
+              </el-descriptions-item>
+              <!-- <el-descriptions-item>
+            <template slot="label">
+              <i class="el-icon-arrow-down"></i>
+              瀹炵幇绫�
+            </template>
+            {{ obj.implClass }}
+          </el-descriptions-item> -->
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-chat-line-square"></i>
+                  鎻忚堪
+                </template>
+                {{ obj.description }}
+              </el-descriptions-item>
+            </el-descriptions>
+          </basic-container>
+          <!-- 灞炴�у垪琛�-->
+          <basic-container>
+            <p style="margin-top: 10px;font-weight: 570;font-size: 19px">灞炴�у垪琛�</p>
+            <avue-crud v-model="obj" :data="obj.attributes" :option="loadOption" @row-save="loadSave"></avue-crud>
+          </basic-container>
+        </el-main>
+        <el-dialog :visible="ref.visible" title="浠庢暟鎹簱涓坊鍔�" width="700px" append-to-body @close="dialoghandelfalse">
+          閫夋嫨棰嗗煙锛�
+          <el-select v-model="domain" placeholder="璇烽�夋嫨" @change="refOnLoad">
+            <el-option v-for="item in domainOptions" :key="item" :label="item" :value="item">
+            </el-option>
+          </el-select>
+          <avue-crud class="businessCrud" v-model="ref.form" :option="ref.option" :data="ref.data" @selection-change="selectionChange">
+          </avue-crud>
           <span slot="footer" class="dialog-footer">
             <el-button @click="dialoghandelfalse">鍙� 娑�</el-button>
             <el-button type="primary" @click="dialoghandeltrue">纭� 瀹�</el-button>
-  </span>
+          </span>
         </el-dialog>
-      </basic-container>
-      <!--        灞炴�у垪琛�-->
-      <basic-container>
-        <p style="margin-top: 10px;font-weight: 570;font-size: 19px">灞炴�у垪琛�</p>
-        <avue-crud
-          v-model="obj"
-          :data="loadData"
-          :option="loadOption"
-          @row-save="loadSave"
-        ></avue-crud>
-      </basic-container>
-    </el-main>
+      </el-container>
+    </el-container>
+    <business-add ref="btmAdd" :btmType="addOption.btmType" :domainOption="domainOptions">
+  </business-add>
   </el-container>
 </template>
 <script>
+import {
+  initTree,
+  refOnLoad,
+  getDomain,
+  saveFromTable,
+  getDetail
+} from "@/api/omd/btmType"
 export default {
   name: "Business",
   data() {
@@ -78,282 +145,99 @@
       //鐗堟湰瑙勫垯鐘舵��
       rulesFalg: false,
       obj: {},
-      treeData: [{
-        value: 0,
-        label: '涓氬姟绫诲瀷鏍�',
-        children: [
-          {
-            value: 1,
-            label: 'A',
-          },
-          {
-            value: 2,
-            label: 'B',
-          },
-          {
-            value: 3,
-            label: 'C',
-          },
-          {
-            value: 4,
-            label: 'D',
-          },
-          {
-            value: 5,
-            label: 'E',
-          }
-        ]
-      }],
+      selectionList: [],
+      treeData: [],
       treeOption: {
         defaultExpandAll: true,
+        title: '涓氬姟绫诲瀷鏍�',
+        props: {
+          labelText: '',
+          label: 'name',
+          value: 'oid',
+          children: 'childList',
+        }
       },
-      loadData: [],
-      loadData1: [
-        {
-          name: '寮犱笁',
-          business: '娴嬭瘯',
-          attrType: "娴嬭瘯",
-          default: "娴嬭瘯",
-          explain: "娴嬭瘯璇存槑"
-        },
-        {
-          name: '鏉庡洓',
-          business: '娴嬭瘯',
-          attrType: "娴嬭瘯",
-          default: "娴嬭瘯",
-          explain: "娴嬭瘯璇存槑"
-        }
-      ],
-      loadData2: [
-        {
-          name: '鐜嬩簲',
-          business: '娴嬭瘯',
-          attrType: "娴嬭瘯",
-          default: "娴嬭瘯",
-          explain: "娴嬭瘯璇存槑"
-        },
-        {
-          name: '瀹嬪叚',
-          business: '娴嬭瘯',
-          attrType: "娴嬭瘯",
-          default: "娴嬭瘯",
-          explain: "娴嬭瘯璇存槑"
-        }
-      ],
+      addOption:{
+        btmType:{},
+      },
       loadOption: {
         border: true,
-        height: 422,
+        height: 466,
         editBtn: false,
+        addBtn: false,
+        menu: false,
+        highlightCurrentRow: true,
+        refreshBtn:false,
+        columnBtn:false,
         column: [
           {
-            label: '灞炴�у悕',
-            prop: 'name'
-          },
-          {
-            label: '涓氬姟绫诲瀷',
-            prop: 'business'
+            label: '灞炴�ц嫳鏂囧悕绉�',
+            prop: 'id',
+            align: 'center'
+          }, {
+            label: '灞炴�т腑鏂囧悕绉�',
+            prop: 'name',
+            align: 'center'
           },
           {
             label: "灞炴�х被鍨�",
-            prop: "attrType"
+            prop: "attrDataType",
+            align: 'center'
           },
           {
             label: "榛樿鍊�",
-            prop: "default",
+            prop: "defaultValue",
+            align: 'center'
           },
           {
             label: "璇存槑",
-            prop: "explain"
+            prop: "description",
+            align: 'center'
           }
         ]
       },
-      //鍩烘湰淇℃伅
-      objs: {
-        tex: "",
-        select: "",
-        lifeTex: ""
-      },
-      basicData: [],
-      basicData1: [
-        {
-          typeName: "娴嬭瘯1",
-          tag: "瀹㈡埛",
-          inherit: "娴嬭瘯",
-          implement: "娴嬭瘯",
-          lifeCycle: "鍛ㄦ湡",
-          desc: "杩欐槸涓�涓弿杩�"
-        }
-      ],
-      basicData2: [
-        {
-          typeName: "娴嬭瘯2",
-          tag: "瀹㈡埛",
-          inherit: "娴嬭瘯",
-          implement: "娴嬭瘯",
-          lifeCycle: "鍛ㄦ湡",
-          desc: "杩欐槸涓�涓弿杩�"
-        }
-      ],
-      basicOption: {
-        border: true,
-        height: 88,
-        tabs: true,
-        column: [
-          {
-            label: "绫诲瀷鍚嶇О",
-            prop: "typeName",
-            display: false
-          },
-          {
-            label: "鏍囩",
-            prop: "tag",
-            display: false
-          },
-          {
-            label: "缁ф壙鑷�",
-            prop: "inherit",
-            display: false
-          },
-          {
-            label: "瀹炵幇绫�",
-            prop: "implement",
-            display: false
-          },
-          {
-            label: "鎻忚堪",
-            prop: "desc",
-            display: false
-          }
-        ],
-        group: [
-          {
-            label: "鍩烘湰淇℃伅",
-            column: [
-              {
-                label: "绫诲瀷鍚嶇О",
-                prop: "typeName"
-              },
-              {
-                label: "鏍囩",
-                prop: "tag"
-              },
-              {
-                label: "缁ф壙鑷�",
-                prop: "inherit"
-              },
-              {
-                label: "鏄惁瀹炰緥鍖�",
-                prop: "case",
-                type: "switch",
-                align: "center",
-                hide: true,
-                labelWidth: 90,
-                dicData: [
-                  {
-                    label: "鍚�",
-                    value: 0
-                  },
-                  {
-                    label: "鏄�",
-                    value: 1
-                  }
-                ],
-              },
-              {
-                label: "鎻忚堪",
-                prop: "desc",
-                type: "textarea"
-              },
-              {
-                label: "瀹炵幇绫�",
-                prop: "implement"
-              },
-
-            ]
-          },
-          {
-            label: "鐗堟湰瑙勫垯",
-            column: [
-              {
-                label: '鐗堟湰瑙勫垯',
-                prop: 'radio',
-                type: 'radio',
-                button: true,
-                change: this.radioChange,
-                value: 0,
-                dicData: [{
-                  label: '涓嶅彲淇',
-                  value: 0
-                }, {
-                  label: '閲囩敤涓�绾х増鏈鐞�',
-                  value: 1
-                }, {
-                  label: '閲囩敤浜岀骇鐗堟湰绠$悊',
-                  value: 2
-                }]
-              },
-              {
-                label: "鐗堟湰鍙疯鍒�",
-                prop: "rules",
-                display: true,
-                formslot: true,
-              },
-              {
-                label: "鍒嗛殧绗�",
-                prop: "interval",
-                type: "select",
-                display: true,
-                dicData: [
-                  {
-                    label: ".",
-                    value: 0
-                  },
-                  {
-                    label: "-",
-                    value: 1
-                  },
-                  {
-                    label: " ",
-                    value: 2
-                  }
-                ]
-              },
-              {
-                label: '鐗堟鍙疯鍒�',
-                prop: 'radioRules',
-                type: 'radio',
-                display: true,
-                dicData: [{
-                  label: '1.2.3...',
-                  value: 0
-                }, {
-                  label: 'a.b.c...',
-                  value: 1
-                }, {
-                  label: '0.1.2...',
-                  value: 2
-                }]
-              },
-            ]
-          },
-          {
-            label: "鐢熷懡鍛ㄦ湡",
-            column: [
-              {
-                label: "鐢熷懡鍛ㄦ湡",
-                prop: "lifeCycle"
-              }
-            ]
-          }
-        ]
-      },
-
+      domain: null,
+      domainOptions: [],
+      ref: {
+        // 浠庤〃涓�夋嫨dialog鐘舵��
+        visible: false,
+        form: {},
+        option: {
+          height: "550px",
+          selection: true,
+          headerAlign: 'center',
+          border: true,
+          index: true,
+          rowKey: 'id',
+          tabs: true,
+          addBtn: false,
+          menu: false,
+          highlightCurrentRow: true,
+          column: [
+            {
+              label: '琛ㄥ悕',
+              prop: 'tableName',
+              align: 'center',
+              display: false
+            },
+            {
+              label: '鎻忚堪',
+              prop: 'description',
+              align: 'center',
+              display: false
+            }
+          ]
+        },
+        data: [{
+          tableName: '1',
+          description: '2'
+        }]
+      }
     }
   },
   created() {
-    this.loadData = this.loadData1;
-    this.basicData = this.basicData1
-
+    this.initTreeOnLoad();
+    this.initDomainOption();
   },
   methods: {
     //鐢熷懡鍛ㄦ湡瀵硅瘽妗嗗彇娑堢偣鍑讳簨浠�
@@ -389,40 +273,80 @@
       }
     },
     nodeClick(data) {
-      if (data.value == 1) {
-        this.loadData = this.loadData1;
-        this.basicData = this.basicData1
-      } else if (data.value == 2) {
-        this.loadData = this.loadData2;
-        this.basicData = this.basicData2
-      }
-      this.$message.success(JSON.stringify(data))
+      getDetail(data.oid).then(res => {
+        this.obj = res.data.data;
+      })
+    },
+    //  鍩烘湰淇℃伅娣诲姞
+    basicSave(row, done, loading) {
+      add(Object.assign({
+        createUser: this.userInfo.name
+      }, row)).then(() => {
+        this.$message.success('鏂板鎴愬姛')
+        done();
+        this.getList();
+      }).catch(() => {
+        loading()
+      })
+    },
+    //灞炴�ф坊鍔�
+    loadSave(row, done, loading) {
+      add(Object.assign({
+        createUser: this.userInfo.name
+      }, row)).then(() => {
+        this.$message.success('鏂板鎴愬姛')
+        done();
+        this.getList();
+      }).catch(() => {
+        loading()
+      })
+    },
+    selectFromTable() {
+      console.log('鑾峰彇');
+      this.ref.visible = true;
+    },
+    refOnLoad(domain) {
+      refOnLoad(domain).then(res => {
+        this.ref.data = res.data.data;
+      })
+    },
+    initTreeOnLoad() {
+      initTree().then(res => {
+        console.log('123');
+        this.treeData = res.data.data;
+      });
+    },
+    initDomainOption() {
+      getDomain().then(res => {
+        this.domainOptions = res.data.data;
+      })
+    },
+    selectionChange(list) {
+      this.selectionList = list;
+      console.log(this.selectionList);
+    },
+    dialoghandelfalse() {
+      this.ref.visible = false;
+      this.selectionList = [];
+      this.domain = null;
+    },
+    dialoghandeltrue() {
+      saveFromTable(this.selectionList, this.domain).then(res => {
+        this.$message.success('淇濆瓨鎴愬姛');
+        this.dialoghandelfalse();
+        this.initTreeOnLoad();
+      })
+    },
+    businessAdd(){
+      this.$refs.btmAdd.showSubmitDialog = true;
+      console.log('娣诲姞');
+    },
+    businessEdit(){
+      this.addOption.btmType = this.obj;
+      this.$refs.addOption.showSubmitDialog = true;
+      console.log('缂栬緫');
     }
   },
-//  鍩烘湰淇℃伅娣诲姞
-  basicSave(row, done, loading) {
-    add(Object.assign({
-      createUser: this.userInfo.name
-    }, row)).then(() => {
-      this.$message.success('鏂板鎴愬姛')
-      done();
-      this.getList();
-    }).catch(() => {
-      loading()
-    })
-  },
-  //灞炴�ф坊鍔�
-  loadSave(row, done, loading) {
-    add(Object.assign({
-      createUser: this.userInfo.name
-    }, row)).then(() => {
-      this.$message.success('鏂板鎴愬姛')
-      done();
-      this.getList();
-    }).catch(() => {
-      loading()
-    })
-  }
 }
 </script>
 
@@ -432,4 +356,7 @@
   border-radius: 10px;
 }
 
+.businessCrud > .el-card > .el-card__body > .avue-crud_menu{
+        display: none!important;
+    }
 </style>
diff --git a/Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue b/Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue
new file mode 100644
index 0000000..5a75644
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/modeling/BusinessAdd.vue
@@ -0,0 +1,112 @@
+<template>
+    <el-dialog 
+    title="涓氬姟绫诲瀷"
+    :visible.sync="showSubmitDialog"
+    append-to-body
+    @close="closeSubmitDialog"
+    width="70%"
+    >
+        <el-form ref="form" :model="btmType" show-message="true" inline>
+            <el-form-item label="鑻辨枃鍚嶇О:" label-width="100px">
+                <el-input v-model="btmType.id" prefix-icon="el-icon-finished"></el-input>
+            </el-form-item>
+            <el-form-item label="涓枃鍚嶇О:" label-width="100px">
+                <el-input v-model="btmType.name" prefix-icon="el-icon-info"></el-input>
+            </el-form-item>
+            <el-form-item label="鏁版嵁搴撹〃鍚�:" label-width="100px">
+                <el-input v-model="btmType.tableName" prefix-icon="el-icon-date"></el-input>
+            </el-form-item>
+            <el-form-item label="鎵�灞為鍩�:" label-width="100px">
+                <el-select v-model="btmType.domain" prefix-icon="el-icon-folder-opened">
+                    <el-option v-for="item in domainOption"
+                    :label="item"></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="鐗堟湰瑙勫垯:" label-width="100px">
+                <el-input v-model="btmType.revisionRuleId" prefix-icon="el-icon-s-check"></el-input>
+            </el-form-item>
+            <el-form-item label="鐢熷懡鍛ㄦ湡:" label-width="100px">
+                <el-input v-model="btmType.lifeCycleId" prefix-icon="el-icon-refresh-right"></el-input>
+            </el-form-item>
+            <el-form-item label="瑙嗗浘:" label-width="100px">
+                <el-input v-model="btmType.view" prefix-icon="el-icon-view"></el-input>
+            </el-form-item>
+            <el-form-item label="鎻忚堪:" label-width="100px">
+                <el-input v-model="btmType.description" 
+                prefix-icon="el-icon-chat-line-square" 
+                style="width:254%;"></el-input>
+            </el-form-item>
+        </el-form>
+        <avue-crud :option="option" :data="btmType.attributes"></avue-crud>
+    </el-dialog>
+</template>
+
+
+<script>
+import { } from '@/api/omd/btmType';
+import { } from '@/api/omd/OmdAttribute';
+export default {
+    name: 'BusinessAdd',
+    props: {
+        btmType:{
+            type: Object
+        },
+        domainOption:{
+            type: Array
+        }
+    },
+    data() {
+        return {
+            form: {},
+            showSubmitDialog : false,
+            option: {
+                height: "330px",
+                selection: true,
+                headerAlign: 'center',
+                border: true,
+                index: true,
+                rowKey: 'id',
+                tabs: true,
+                menu: false,
+                highlightCurrentRow: true,
+                column: [
+                    {
+                        label: '灞炴�ц嫳鏂囧悕绉�',
+                        prop: 'id',
+                        align: 'center'
+                    }, {
+                        label: '灞炴�т腑鏂囧悕绉�',
+                        prop: 'name',
+                        align: 'center'
+                    },
+                    {
+                        label: "灞炴�х被鍨�",
+                        prop: "attrDataType",
+                        align: 'center'
+                    },
+                    {
+                        label: "榛樿鍊�",
+                        prop: "defaultValue",
+                        align: 'center'
+                    },
+                    {
+                        label: "璇存槑",
+                        prop: "description",
+                        align: 'center'
+                    }
+                ]
+            },
+        }
+    },
+    created() {
+        console.log('123');
+    },
+    methods: {
+        closeSubmitDialog(){
+            this.showSubmitDialog = false;
+        }
+    }
+}
+</script>
+
+<style></style>
\ No newline at end of file
diff --git a/Source/UBCS-WEB/src/views/modeling/original.vue b/Source/UBCS-WEB/src/views/modeling/original.vue
index 8597d3e..818ba05 100644
--- a/Source/UBCS-WEB/src/views/modeling/original.vue
+++ b/Source/UBCS-WEB/src/views/modeling/original.vue
@@ -147,6 +147,7 @@
         index: true,
         rowKey: 'id',
         tabs: true,
+        highlightCurrentRow:true,
         column: [
           {
             label: '灞炴�х紪鍙�',
@@ -540,6 +541,9 @@
         this.loading = false;
         this.data = res.data.data.records
         this.itemData = this.data[0];
+        this.$nextTick(() => {
+          this.$refs.crud.setCurrentRow(this.data[0]);
+        })
       })
     },
     rowClick(row) {
diff --git a/Source/UBCS/pom.xml b/Source/UBCS/pom.xml
index f8735c7..937c0ff 100644
--- a/Source/UBCS/pom.xml
+++ b/Source/UBCS/pom.xml
@@ -185,11 +185,10 @@
                     <skip>true</skip>
                 </configuration>
             </plugin>
-            <!--springboot鎵撳寘鎻掍欢浼氬幓鎵炬瘡涓ā鍧椾笅闈㈢殑鍚姩绫伙紝鍥犱负褰撳墠鏈変笉闇�瑕佸惎鍔ㄧ被鐨勯渶姹傦紝鎵�浠ユ敞閲婃帀锛屼娇鐢╩vn鐨勬墦鍖呮彃浠�-->
-            <!--<plugin>
+            <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-            </plugin>-->
+            </plugin>
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>${maven.plugin.version}</version>
diff --git a/Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java b/Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java
index 38a5faf..21b6872 100644
--- a/Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java
+++ b/Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java
@@ -41,7 +41,7 @@
 	 * nacos dev 鍦板潃
 	 */
 	//String NACOS_DEV_ADDR = "dev.vci-tech.com:38848";
-	String NACOS_DEV_ADDR = "192.168.93.185:38848";
+	String NACOS_DEV_ADDR = "192.168.93.186:38848";
 
 	/**
 	 * nacos prod 鍦板潃
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyProcessTempDTO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyProcessTempDTO.java
index 81972c6..f843c11 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyProcessTempDTO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyProcessTempDTO.java
@@ -2,6 +2,7 @@
 
 
 import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
+import lombok.Data;
 
 /**
  * 鍒嗙被浣跨敤鐨勬祦绋嬫ā鏉挎暟鎹紶杈撳璞�
@@ -9,6 +10,7 @@
  * @author weidy
  * @date 2022-01-24
  */
+@Data
 public class CodeClassifyProcessTempDTO extends BaseModelVO {
 
 	/**
@@ -19,12 +21,12 @@
 	/**
 	 * 涓婚搴撳垎绫讳富閿�
 	 */
-	private String codeclassifyoid;
+	private String codeClassifyOid;
 
 	/**
 	 * 涓婚搴撳垎绫讳富閿樉绀烘枃鏈�
 	 */
-	private String codeclassifyoidName;
+	private String codeClassifyoidName;
 
 	/**
 	 * 鎵�灞炴ā鏉�
@@ -33,12 +35,12 @@
 	/**
 	 * 娴佺▼妯℃澘鐢ㄩ��
 	 */
-	private String codeprocessuse;
+	private String codeProcessUse;
 
 	/**
 	 * 娴佺▼妯℃澘鐢ㄩ�旀樉绀烘枃鏈�
 	 */
-	private String codeprocessuseText;
+	private String codeProcessUseText;
 
 	/**
 	 * 娴佺▼妯℃澘鐨勭増鏈�
@@ -55,98 +57,4 @@
 	 */
 	private String codeTempAttrOidArrName;
 
-	/**
-	 * 鑾峰彇 涓婚搴撳垎绫讳富閿�
-	 */
-	public String getCodeclassifyoid (){
-		return codeclassifyoid;
-	}
-
-	/**
-	 * 璁剧疆 涓婚搴撳垎绫讳富閿�
-	 */
-	public void setCodeclassifyoid (String codeclassifyoid){
-		this.codeclassifyoid = codeclassifyoid;
-	}
-
-	/**
-	 * 鑾峰彇涓婚搴撳垎绫讳富閿樉绀烘枃鏈�
-	 */
-	public String getCodeclassifyoidName (){
-		return codeclassifyoidName;
-	}
-
-	/**
-	 * 璁剧疆涓婚搴撳垎绫讳富閿樉绀烘枃鏈�
-	 */
-	public void setCodeclassifyoidName (String codeclassifyoidName){
-		this.codeclassifyoidName = codeclassifyoidName;
-	}
-	/**
-	 * 鑾峰彇 娴佺▼妯℃澘鐢ㄩ��
-	 */
-	public String getCodeprocessuse (){
-		return codeprocessuse;
-	}
-
-	/**
-	 * 璁剧疆 娴佺▼妯℃澘鐢ㄩ��
-	 */
-	public void setCodeprocessuse (String codeprocessuse){
-		this.codeprocessuse = codeprocessuse;
-	}
-
-	public String getCodeprocessuseText() {
-		return codeprocessuseText;
-	}
-
-	public void setCodeprocessuseText(String codeprocessuseText) {
-		this.codeprocessuseText = codeprocessuseText;
-	}
-
-	public String getProcessVersion() {
-		return processVersion;
-	}
-
-	public void setProcessVersion(String processVersion) {
-		this.processVersion = processVersion;
-	}
-
-	public String getClassifyTemplateOid() {
-		return classifyTemplateOid;
-	}
-
-	public void setClassifyTemplateOid(String classifyTemplateOid) {
-		this.classifyTemplateOid = classifyTemplateOid;
-	}
-
-	public String getCodeTempAttrOidArr() {
-		return codeTempAttrOidArr;
-	}
-
-	public void setCodeTempAttrOidArr(String codeTempAttrOidArr) {
-		this.codeTempAttrOidArr = codeTempAttrOidArr;
-	}
-
-	public String getCodeTempAttrOidArrName() {
-		return codeTempAttrOidArrName;
-	}
-
-	public void setCodeTempAttrOidArrName(String codeTempAttrOidArrName) {
-		this.codeTempAttrOidArrName = codeTempAttrOidArrName;
-	}
-
-	@Override
-	public String toString() {
-		return "CodeClassifyProcessTempDTO{" +
-				"codeclassifyoid='" + codeclassifyoid + '\'' +
-				", codeclassifyoidName='" + codeclassifyoidName + '\'' +
-				", classifyTemplateOid='" + classifyTemplateOid + '\'' +
-				", codeprocessuse='" + codeprocessuse + '\'' +
-				", codeprocessuseText='" + codeprocessuseText + '\'' +
-				", processVersion='" + processVersion + '\'' +
-				", codeTempAttrOidArr='" + codeTempAttrOidArr + '\'' +
-				", codeTempAttrOidArrName='" + codeTempAttrOidArrName + '\'' +
-				"} " + super.toString();
-	}
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeWupinDTO.java
similarity index 63%
copy from Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java
copy to Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeWupinDTO.java
index cbcaa43..5b6f264 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeWupinDTO.java
@@ -14,29 +14,21 @@
  *  this software without specific prior written permission.
  *  Author: Chill 搴勯獮 (smallchill@163.com)
  */
-package com.vci.ubcs.code.entity;
+package com.vci.ubcs.code.dto;
 
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.vci.ubcs.starter.revision.model.BaseModel;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
 import lombok.Data;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.EqualsAndHashCode;
 
 /**
- * 缂栫爜搴撳畾涔�-妯℃澘闃舵 瀹炰綋绫�
+ * 缂栫爜淇℃伅 鏁版嵁浼犺緭瀵硅薄瀹炰綋绫�
  *
  * @author yuxc
- * @since 2023-04-20
+ * @since 2023-05-05
  */
 @Data
-@TableName("PL_CODE_TEMPPHASE")
-@ApiModel(value = "CodeTempphase瀵硅薄", description = "缂栫爜搴撳畾涔�-妯℃澘闃舵")
 @EqualsAndHashCode(callSuper = true)
-public class CodeTemplatePhase extends BaseModel {
-	/**
-	 *
-	 */
-	@ApiModelProperty(value = "")
-	private String codeClassifyTemplateOid;
+public class CodeWupinDTO extends CodeWupinEntity {
+	private static final long serialVersionUID = 1L;
+
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseAttr.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseattrEntity.java
similarity index 96%
rename from Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseAttr.java
rename to Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseattrEntity.java
index bd9536e..bc2e34d 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseAttr.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseattrEntity.java
@@ -33,7 +33,7 @@
 @TableName("PL_CODE_PHASEATTR")
 @ApiModel(value = "CodePhaseattr瀵硅薄", description = "缂栫爜搴撳畾涔�-妯℃澘闃舵-灞炴��")
 @EqualsAndHashCode(callSuper = true)
-public class CodePhaseAttr extends BaseModel {
+public class CodePhaseattrEntity extends BaseModel {
 
 
 	/**
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTempphaseEntity.java
similarity index 96%
rename from Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java
rename to Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTempphaseEntity.java
index cbcaa43..110925f 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTempphaseEntity.java
@@ -33,7 +33,7 @@
 @TableName("PL_CODE_TEMPPHASE")
 @ApiModel(value = "CodeTempphase瀵硅薄", description = "缂栫爜搴撳畾涔�-妯℃澘闃舵")
 @EqualsAndHashCode(callSuper = true)
-public class CodeTemplatePhase extends BaseModel {
+public class CodeTempphaseEntity extends BaseModel {
 	/**
 	 *
 	 */
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeWupinEntity.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeWupinEntity.java
new file mode 100644
index 0000000..82e50b4
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeWupinEntity.java
@@ -0,0 +1,376 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.code.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.vci.ubcs.starter.revision.model.BaseModel;
+import lombok.Data;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+/**
+ * 缂栫爜淇℃伅 瀹炰綋绫�
+ *
+ * @author yuxc
+ * @since 2023-05-05
+ */
+@Data
+@TableName("PL_CODE_WUPIN")
+@ApiModel(value = "CodeWupin瀵硅薄", description = "缂栫爜淇℃伅")
+@EqualsAndHashCode(callSuper = true)
+public class CodeWupinEntity  extends BaseModel {
+
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String checkinby;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private Date checkintime;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String checkoutby;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private Date checkouttime;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String codeclsfid;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String codeclsfpath;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String codetemplateoid;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String materialclassify;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String materialid;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String tuhao;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String pinpai;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String morengongys;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xieyijiage;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String hesuanpici;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String beizhushuoming;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private Short materialtype;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String materialname;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String ruanjianbanben;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String qitachicun;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String morencaigouy;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String yumaileixing;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String chuangjiangongsi;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String caigouwl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String wuliaoxingzhi;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xieyibianhao;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String caizhi;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String chukufangshi;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String shifoupihaoguanli;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String kucunwl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xinghaoguige;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String duiwaiguige;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String zhibaoqi;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String caigoutiqianqi;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String hesuanfenlei;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xiaoshouwl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String changjiaxinghao;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String zuixiaoqiding;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jiliangdw;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String zhiliangbz;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String firstfl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String secondfl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String thrifl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String oldcode;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String baozhuangguige;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String passing;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xbj;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xbxkxs;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xfjjstj;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xgzccdgcd;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xxndj;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xzjmc;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String zjxh;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String clph;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String bmcl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String cpxs;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xbzjbmc;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String xwlwwmc;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jjzyq;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jsbmc;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jsbxh;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jsccj;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jssxt;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jszgl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jzl;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jzrxx;
+	/**
+	 *
+	 */
+	@ApiModelProperty(value = "")
+	private String jzxzb;
+
+	@ApiModelProperty(value = "")
+	@TableField(exist = false)
+	private String codeSecLengthField;
+
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodePhaseattrVO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodePhaseattrVO.java
index 6ffc784..b98fc98 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodePhaseattrVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodePhaseattrVO.java
@@ -16,8 +16,7 @@
  */
 package com.vci.ubcs.code.vo;
 
-import com.vci.ubcs.code.entity.CodePhaseAttr;
-import org.springblade.core.tool.node.INode;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -29,7 +28,7 @@
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-public class CodePhaseattrVO extends CodePhaseAttr {
+public class CodePhaseattrVO extends CodePhaseattrEntity {
 	private static final long serialVersionUID = 1L;
 
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeWupinVO.java
similarity index 63%
copy from Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java
copy to Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeWupinVO.java
index cbcaa43..94a1859 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeWupinVO.java
@@ -14,29 +14,22 @@
  *  this software without specific prior written permission.
  *  Author: Chill 搴勯獮 (smallchill@163.com)
  */
-package com.vci.ubcs.code.entity;
+package com.vci.ubcs.code.vo;
 
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.vci.ubcs.starter.revision.model.BaseModel;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import org.springblade.core.tool.node.INode;
 import lombok.Data;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.EqualsAndHashCode;
 
 /**
- * 缂栫爜搴撳畾涔�-妯℃澘闃舵 瀹炰綋绫�
+ * 缂栫爜淇℃伅 瑙嗗浘瀹炰綋绫�
  *
  * @author yuxc
- * @since 2023-04-20
+ * @since 2023-05-05
  */
 @Data
-@TableName("PL_CODE_TEMPPHASE")
-@ApiModel(value = "CodeTempphase瀵硅薄", description = "缂栫爜搴撳畾涔�-妯℃澘闃舵")
 @EqualsAndHashCode(callSuper = true)
-public class CodeTemplatePhase extends BaseModel {
-	/**
-	 *
-	 */
-	@ApiModelProperty(value = "")
-	private String codeClassifyTemplateOid;
+public class CodeWupinVO extends CodeWupinEntity {
+	private static final long serialVersionUID = 1L;
+
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/BaseModelVO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/BaseModelVO.java
index fb756b9..0600175 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/BaseModelVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/BaseModelVO.java
@@ -4,6 +4,7 @@
 //
 package com.vci.ubcs.code.vo.pagemodel;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import org.springframework.data.annotation.Transient;
 import java.io.Serializable;
 import java.util.Date;
@@ -33,6 +34,9 @@
 	private String versionValue;
 	private String lcStatus;
 	private String lcStatusText;
+	@JsonFormat(
+		pattern = "yyyy-MM-dd HH:mm:ss.SSS"
+	)
 	private Date ts;
 	private String owner;
 //	private String checkInBy;
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyProcessTempVO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyProcessTempVO.java
index 17a172b..1c5d5fd 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyProcessTempVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyProcessTempVO.java
@@ -2,16 +2,18 @@
 
 import com.vci.ubcs.code.entity.CodeClassifyProcessTemp;
 import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
+import lombok.Data;
 
 import java.util.List;
 
 /**
  * 鍒嗙被浣跨敤鐨勬祦绋嬫ā鏉挎樉绀哄璞�
  *
- * @author weidy
- * @date 2022-01-24
+ * @author ludc
+ * @date 2023-05-6
  */
-public class CodeClassifyProcessTempVO extends CodeClassifyProcessTemp {
+@Data
+public class CodeClassifyProcessTempVO extends BaseModelVO {
 
 	/**
      * 绂佹淇敼杩欎釜鍊�
@@ -21,12 +23,12 @@
 	/**
 	* 涓婚搴撳垎绫讳富閿�
 	*/
-	private String codeclassifyoid;
+	private String codeClassifyOid;
 
 	/**
 	* 涓婚搴撳垎绫讳富閿樉绀烘枃鏈�
 	*/
-	private String codeclassifyoidName;
+	private String codeClassifyoidName;
 
 	/**
 	 * 鎵�灞炴ā鏉�
@@ -36,12 +38,12 @@
 	/**
 	* 娴佺▼妯℃澘鐢ㄩ��
 	*/
-	private String codeprocessuse;
+	private String codeProcessUse;
 
 	/**
 	 * 娴佺▼妯℃澘鐢ㄩ�斿悕绉�
 	 */
-	private String codeprocessuseText;
+	private String codeProcessUseText;
 
 	/**
 	 * 娴佺▼妯℃澘鐨勭増鏈�
@@ -63,106 +65,4 @@
 	 */
 	private List<CodeClassifyTemplateAttrVO> attrList;
 
-	/**
-	 * 鑾峰彇 涓婚搴撳垎绫讳富閿�
-	 */
-	public String getCodeclassifyoid (){
-		return codeclassifyoid;
-	}
-
-	/**
-	* 璁剧疆 涓婚搴撳垎绫讳富閿�
-	*/
-	public void setCodeclassifyoid (String codeclassifyoid){
-		this.codeclassifyoid = codeclassifyoid;
-	}
-	/**
-	 * 鑾峰彇涓婚搴撳垎绫讳富閿樉绀烘枃鏈�
-	 */
-	public String getCodeclassifyoidName (){
-		return codeclassifyoidName;
-	}
-
-	/**
-	* 璁剧疆涓婚搴撳垎绫讳富閿樉绀烘枃鏈�
-	*/
-	public void setCodeclassifyoidName (String codeclassifyoidName){
-		this.codeclassifyoidName = codeclassifyoidName;
-	}
-	/**
-	 * 鑾峰彇 娴佺▼妯℃澘鐢ㄩ��
-	 */
-	public String getCodeprocessuse (){
-		return codeprocessuse;
-	}
-
-	/**
-	* 璁剧疆 娴佺▼妯℃澘鐢ㄩ��
-	*/
-	public void setCodeprocessuse (String codeprocessuse){
-		this.codeprocessuse = codeprocessuse;
-	}
-
-	public String getCodeprocessuseText() {
-		return codeprocessuseText;
-	}
-
-	public void setCodeprocessuseText(String codeprocessuseText) {
-		this.codeprocessuseText = codeprocessuseText;
-	}
-
-	public String getClassifyTemplateOid() {
-		return classifyTemplateOid;
-	}
-
-	public void setClassifyTemplateOid(String classifyTemplateOid) {
-		this.classifyTemplateOid = classifyTemplateOid;
-	}
-
-	public String getProcessVersion() {
-		return processVersion;
-	}
-
-	public void setProcessVersion(String processVersion) {
-		this.processVersion = processVersion;
-	}
-
-	public List<CodeClassifyTemplateAttrVO> getAttrList() {
-		return attrList;
-	}
-
-	public void setAttrList(List<CodeClassifyTemplateAttrVO> attrList) {
-		this.attrList = attrList;
-	}
-
-	public String getCodeTempAttrOidArr() {
-		return codeTempAttrOidArr;
-	}
-
-	public void setCodeTempAttrOidArr(String codeTempAttrOidArr) {
-		this.codeTempAttrOidArr = codeTempAttrOidArr;
-	}
-
-	public String getCodeTempAttrOidArrName() {
-		return codeTempAttrOidArrName;
-	}
-
-	public void setCodeTempAttrOidArrName(String codeTempAttrOidArrName) {
-		this.codeTempAttrOidArrName = codeTempAttrOidArrName;
-	}
-
-	@Override
-	public String toString() {
-		return "CodeClassifyProcessTempVO{" +
-				"codeclassifyoid='" + codeclassifyoid + '\'' +
-				", codeclassifyoidName='" + codeclassifyoidName + '\'' +
-				", classifyTemplateOid='" + classifyTemplateOid + '\'' +
-				", codeprocessuse='" + codeprocessuse + '\'' +
-				", codeprocessuseText='" + codeprocessuseText + '\'' +
-				", processVersion='" + processVersion + '\'' +
-				", codeTempAttrOidArr='" + codeTempAttrOidArr + '\'' +
-				", codeTempAttrOidArrName='" + codeTempAttrOidArrName + '\'' +
-				", attrList=" + attrList +
-				'}' + super.toString();
-	}
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeTemplatePhaseVO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeTemplatePhaseEntityVO.java
similarity index 90%
rename from Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeTemplatePhaseVO.java
rename to Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeTemplatePhaseEntityVO.java
index 3a3f7c8..db23730 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeTemplatePhaseVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeTemplatePhaseEntityVO.java
@@ -1,7 +1,6 @@
 package com.vci.ubcs.code.vo.pagemodel;
 
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
-import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
+import com.vci.ubcs.code.entity.CodeTempphaseEntity;
 
 /**
  * 妯℃澘闃舵鏄剧ず瀵硅薄
@@ -9,7 +8,7 @@
  * @author weidy
  * @date 2022-01-24
  */
-public class CodeTemplatePhaseVO extends CodeTemplatePhase {
+public class CodeTemplatePhaseEntityVO extends CodeTempphaseEntity {
 
 	/**
      * 绂佹淇敼杩欎釜鍊�
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeFieldConstant.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeFieldConstant.java
index 67c34cc..674618c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeFieldConstant.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/constant/BtmTypeFieldConstant.java
@@ -74,10 +74,10 @@
 		};
 		BASE_MODEL_COMPATIBILITY_MAP = new HashMap() {
 			{
-				this.put("lastr", "islastr");
-				this.put("firstr", "isfirstr");
-				this.put("lastv", "islastv");
-				this.put("firstv", "isfirstv");
+				this.put("lastr", "lastr");
+				this.put("firstr", "firstr");
+				this.put("lastv", "lastv");
+				this.put("firstv", "firstv");
 			}
 		};
 		LIFECYCLE_MANAGE_FIELD_MAP = new HashMap() {
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java
index 8abd472..6d45916 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/Attribute.java
@@ -126,7 +126,7 @@
 	 */
 	@ApiModelProperty("鍙傜収鐨勪富閿�")
 	@JsonSerialize(using = ToStringSerializer.class)
-	private Long referToId;
+	private String referToId;
 
 	/**
 	 * 鍙傜収瀵硅薄鐨勫悕绉�
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java
index c221329..e6c83e0 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmType.java
@@ -135,7 +135,7 @@
     /**
      * 涓氬姟绫诲瀷鍚嶇О
      */
-    private String btmname;
+    private String btmName;
 
     /**
      * 鎷ユ湁鑰�
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmTypeAttribute.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmTypeAttribute.java
index 28738a4..9d902d0 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmTypeAttribute.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/BtmTypeAttribute.java
@@ -14,7 +14,7 @@
  * @date 2019/10/11 3:21 PM
  */
 @Data
-@TableName("pl_omd_btm_type_attr")
+@TableName("pl_omd_btm_type_attribute")
 @ApiModel(value = "涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬�", description = "涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬�")
 public class BtmTypeAttribute implements java.io.Serializable{
 
@@ -106,7 +106,7 @@
     /**
      * 涓氬姟绫诲瀷鍚嶇О
      */
-    private String btmname;
+    private String btmName;
 
     /**
      * 鎷ユ湁鑰�
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java
index 6526d96..82a2d1c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/entity/ModifyAttributeInfo.java
@@ -125,4 +125,9 @@
 	 * 鍒涘缓鏃堕棿
 	 */
 	private Date createTime;
+
+	/**
+	 * 鏃堕棿鎴�
+	 */
+	private Date ts;
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeTreeVO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeTreeVO.java
new file mode 100644
index 0000000..e0d2770
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeTreeVO.java
@@ -0,0 +1,27 @@
+package com.vci.ubcs.omd.vo;
+
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Description: 涓氬姟绫诲瀷鏍戠殑鏄剧ず瀵硅薄
+ *
+ * @author LiHang
+ * @date 2023/5/5
+ */
+@Data
+public class BtmTypeTreeVO implements Serializable{
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -1243940048761060562L;
+
+	private String name;
+
+	private String oid;
+
+	private List<BtmTypeTreeVO> childList;
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeVO.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeVO.java
index 4c4f54e..74bee2c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/vo/BtmTypeVO.java
@@ -2,6 +2,7 @@
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
@@ -11,7 +12,7 @@
  * @date 2019/10/11 5:24 PM
  */
 @Data
-public class BtmTypeVO implements java.io.Serializable{
+public class BtmTypeVO implements Serializable {
 
     /**
      * 绂佹淇敼杩欎釜鍊�
@@ -139,7 +140,7 @@
     /**
      * 涓氬姟绫诲瀷鍚嶇О
      */
-    private String btmname;
+    private String btmName;
 
     /**
      * 鎷ユ湁鑰�
diff --git a/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/Param.java b/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/Param.java
index a72e25a..596b22e 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/Param.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/Param.java
@@ -21,7 +21,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.springblade.core.mp.base.BaseEntity;
+import org.springblade.core.mp.import com.vci.ubcs.starter.revision.model.TreeQueryObject;.BaseEntity;
 
 /**
  * 瀹炰綋绫�
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/annotation/VciBusinessLog.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/annotation/VciBusinessLog.java
new file mode 100644
index 0000000..c91de02
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/annotation/VciBusinessLog.java
@@ -0,0 +1,31 @@
+package com.vci.ubcs.starter.annotation;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface VciBusinessLog {
+	String modelName() default "";
+
+	String operateName() default "";
+
+	VciLogType logType() default VciBusinessLog.VciLogType.Operate;
+
+	String description() default "";
+
+	boolean notStore() default false;
+
+	public static enum VciLogType {
+		Login,
+		Operate,
+		Audit;
+
+		private VciLogType() {
+		}
+	}
+}
+
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java
index bb25c59..a8e70e9 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java
@@ -7,13 +7,13 @@
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import org.springframework.data.annotation.Transient;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Map;
-
 public class BaseModel implements Serializable {
 	@JsonSerialize(
 		using = ToStringSerializer.class
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java
new file mode 100644
index 0000000..d070f14
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java
@@ -0,0 +1,79 @@
+package com.vci.ubcs.starter.util;
+
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.revision.model.BaseModel;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import org.apache.poi.ss.formula.functions.T;
+import org.springblade.core.secure.utils.AuthUtil;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鏂板鏃堕粯璁ゅ�煎睘鎬ц祴鍊�
+ *
+ * @author ludc
+ * @date 2023/5/6
+ */
+public class DefaultAttrAssimtUtil {
+
+	/**
+	 * 鏂板鏃跺~鍏呴粯璁ゅ��
+	 * @param object 缁ф壙浜咮aseModel鐨勫疄浣撳璞�
+	 * @param <T>   杩斿洖鍊肩殑绫诲瀷
+	 * @param btmName  涓氬姟绫诲瀷
+	 * @return
+	 * @throws VciBaseException
+	 */
+	public static <T extends BaseModel> T addDefaultAttrAssimt(T object,String btmName) throws VciBaseException {
+		BaseModel baseModel = object;
+		try {
+			baseModel.setOid(VciBaseUtil.getPk());
+			baseModel.setCreateTime(new Date());
+			baseModel.setNameOid(VciBaseUtil.getPk());
+			baseModel.setLastModifyTime(new Date());
+			baseModel.setTs(new Date());
+			//鐢ㄦ埛id
+			String userId = AuthUtil.getUserId().toString();
+			baseModel.setBtmname(btmName);
+			baseModel.setCreator(userId);
+			baseModel.setFirstR("1");
+			baseModel.setFirstV("1");
+			baseModel.setLastR("1");
+			baseModel.setLastV("1");
+			baseModel.setRevisionSeq(1);
+			baseModel.setOwner("1");
+			baseModel.setVersionSeq(1);
+			baseModel.setVersionRule("0");
+			baseModel.setVersionValue("1");
+			baseModel.setNameOid(VciBaseUtil.getPk());
+			baseModel.setLastModifier(userId);
+		}catch (VciBaseException e){
+			e.printStackTrace();
+		}
+		return (T)baseModel;
+	}
+
+	/**
+	 * 淇敼鏃跺~鍏呴粯璁ゅ��
+	 * @param object 缁ф壙浜咮aseModel鐨勫疄浣撳璞�
+	 * @param <T>   杩斿洖鍊肩殑绫诲瀷
+	 * @return
+	 * @throws VciBaseException
+	 */
+	public static <T extends BaseModel> T updateDefaultAttrAssimt(T object) throws VciBaseException {
+		BaseModel baseModel = object;
+		try {
+			baseModel.setLastModifyTime(new Date());
+			baseModel.setTs(new Date());
+			//鐢ㄦ埛id
+			String userId = AuthUtil.getUserId().toString();
+			baseModel.setLastModifier(userId);
+		}catch (VciBaseException e){
+			e.printStackTrace();
+		}
+		return (T)baseModel;
+	}
+
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtils.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
similarity index 92%
rename from Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtils.java
rename to Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
index c26997c..457dbdb 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtils.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/MybatisParameterUtil.java
@@ -1,8 +1,6 @@
 package com.vci.ubcs.starter.util;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import org.springframework.util.ObjectUtils;
@@ -16,7 +14,7 @@
  * @author ludc
  * @date 2023/5/5
  */
-public class MybatisParameterUtils {
+public class MybatisParameterUtil {
 
 	public static <T, F> LambdaQueryWrapper<T> cutInParameter(LambdaQueryWrapper<T> wrapper, SFunction<T, ?> column, List<F> coll) throws VciBaseException {
 		List<List<F>> newList = splitList(coll, 900);
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/RegExpConstant.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/RegExpConstant.java
new file mode 100644
index 0000000..739a741
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/RegExpConstant.java
@@ -0,0 +1,23 @@
+package com.vci.ubcs.starter.web.constant;
+
+
+public class RegExpConstant {
+	public static final String INCLUDE_CHINESE = "[螒-锟";
+	public static final String NUMBER = "^[0-9]*$";
+	public static final String INT = "/^-?[1-9]+[0-9]*$/";
+	public static final String LONG = "/^-?[1-9]+[0-9]*$/";
+	public static final String DOUBLE = "[0-9]*(\\.[0-9]*|[eE][+-][0-9]*)$";
+	public static final String LETTER = "^[A-Za-z]+$";
+	public static final String LETTER_AND_NUMBER = "^[A-Za-z0-9]+$";
+	public static final String UP_LETTER = "^[A-Z]+$";
+	public static final String LOW_LETTER = "^[a-z]+$";
+	public static final String SPECIAL_CHARACTER = "^[` ~!@#$%^&*()_\\-+=<>?:\"{}|,.\\/;'\\[\\]路~锛丂#锟�%鈥︹��&*锛堬級鈥斺�擻\-+={}|銆娿�嬶紵锛氣�溾�濄�愩�戙�侊紱鈥樷�欙紝銆傘�乚+$";
+	public static final String HAS_LETTER = ".*[a-z][A-Z]{1,}.*";
+	public static final String HAS_UP_LETTER = ".*[A-Z]{1,}.*";
+	public static final String HAS_LOW_LETTER = ".*[a-z]{1,}.*";
+	public static final String HAS_NUMBER = ".*[0-9]{1,}.*";
+	public static final String HAS_SPECIAL_CHARACTER = ".*[` ~!@#$%^&*()_\\-+=<>?:\"{}|,.\\/;'\\[\\]路~锛丂#锟�%鈥︹��&*锛堬級鈥斺�擻\-+={}|銆娿�嬶紵锛氣�溾�濄�愩�戙�侊紱鈥樷�欙紝銆傘�乚{1,}.*";
+
+	public RegExpConstant() {
+	}
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
index a3d65cc..4cb289a 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
@@ -10,6 +10,7 @@
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
+import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
 import com.vci.ubcs.starter.web.pagemodel.SessionInfo;
 import com.vci.ubcs.starter.web.toolmodel.DateConverter;
 import com.vci.ubcs.starter.web.wrapper.VciQueryWrapperForDO;
@@ -93,6 +94,11 @@
 		}
 	}
 
+	public static Integer getCurrentUserSecret() {
+		SessionInfo currentUserSession = getCurrentUserSessionInfoNotException();
+		return currentUserSession != null ? getInt(currentUserSession.getUserSecret()) : UserSecretEnum.NONE.getValue();
+	}
+
 	public static float getFloat(String s) {
 		float f = 0.0F;
 		if (s == null) {
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciQueryWrapperForDO.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciQueryWrapperForDO.java
new file mode 100644
index 0000000..c8d4854
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciQueryWrapperForDO.java
@@ -0,0 +1,136 @@
+package com.vci.ubcs.starter.web.util;
+
+import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class VciQueryWrapperForDO {
+
+	public static boolean USER_TABLE_COMPATIBILITY = false;
+	public static String DATABASE_PLATFORM;
+	public static Map<String, String> USER_TABLE_COMPATIBILITY_BTM_MAP;
+	public static Map<String, String> USER_TABLE_COMPATIBILITY_FIELD_MAP;
+	public static final String USER_TABLE_COMPATIBILITY_FIELD_SEP = "${vcicomplibitysep}";
+	private Map<String, String> conditionMap;
+	private Map<String, String> customerSqlMap;
+	private String oidFieldName;
+	private static final String SPACE = " ";
+	public static final String QUERY_FIELD_SECRET = "${vciQuerySecret}";
+	public static final Boolean DEFAULT_QUERY_SECRET;
+	public static final Boolean DEFAULT_QUERY_DATARIGHT;
+	public static final String QUERY_FIELD_DATARIGHT = "${vciQueryDataRight}";
+//	private VciQueryWrapperOption queryWrapperOption;
+	private Class<?> doClass;
+//	private PageHelper pageHelper;
+	private Map<String, String> allFieldNameMap;
+	private List<String> xmlTypeFieldList;
+	private boolean distinct;
+	public static final Map<String, String> REVISION_MANAGE_FIELD_MAP;
+	public static final Map<String, String> BASIC_FIELD_MAP;
+	public static final Map<String, String> BASE_MODEL_COMPATIBILITY_MAP;
+	public static final String OID_FIELD = "oid";
+	public static final String ID_FIELD = "id";
+	public static final String LC_STATUS_FIELD = "lcstatus";
+	public static final String LC_STATUS_FIELD_TEXT = "lcStatus_text";
+	public static final Map<String, String> LIFECYCLE_MANAGE_FIELD_MAP;
+	public static final Map<String, String> SECRET_MANAGE_FIELD_MAP;
+	public static final Map<String, String> LINK_TYPE_FIELD_MAP;
+	private Map<String, VciFieldTypeEnum> allFieldTypeMap;
+//	private List<VciReferFieldInfo> referFieldInfoList;
+	private Map<String, String> useReferMap;
+	private Map<String, String> enumFieldMap;
+	private String linkTableSql;
+	private String selectFieldSql;
+	private String selectPrefixForPage;
+	private String whereSql;
+	private String orderSql;
+	private String whereSubfixForPage;
+	private Map<String, String> valuesMap;
+	private String tableNick;
+	private Map<String, String> extendFieldMap;
+	private static final String DATETIME_FORMAT = "yyyy-mm-dd hh24:mi:ss";
+	private static final String DATE_FORMAT = "yyyy-mm-dd";
+
+
+	static {
+//		DATABASE_PLATFORM = DataBaseEnum.ORACLE.getValue();
+		USER_TABLE_COMPATIBILITY_BTM_MAP = new HashMap();
+		USER_TABLE_COMPATIBILITY_FIELD_MAP = new HashMap();
+		DEFAULT_QUERY_SECRET = true;
+		DEFAULT_QUERY_DATARIGHT = false;
+		REVISION_MANAGE_FIELD_MAP = new HashMap() {
+			{
+				this.put("nameoid", "瀵硅薄涓婚敭");
+				this.put("revisionoid", "鐗堟湰涓婚敭");
+				this.put("lastr", "鏄惁鏈�鏂扮増鏈�");
+				this.put("firstr", "鏄惁鏈�鑰佺増鏈�");
+				this.put("lastv", "鏄惁鏈�鏂扮増娆�");
+				this.put("firstv", "鏄惁鏈�鑰佺増娆�");
+				this.put("revisionrule", "鐗堟湰瑙勫垯");
+				this.put("revisionseq", "鐗堟湰鎺掑簭鍙�");
+				this.put("revisionvalue", "鐗堟湰鍊�");
+				this.put("versionrule", "鐗堟瑙勫垯");
+				this.put("versionseq", "鐗堟鎺掑簭鍙�");
+				this.put("versionvalue", "鐗堟鍊�");
+				this.put("checkinby", "绛惧叆浜�");
+				this.put("checkintime", "绛惧叆鏃堕棿");
+				this.put("checkoutby", "绛惧嚭浜�");
+				this.put("checkouttime", "绛惧嚭鏃堕棿");
+				this.put("copyfromversion", "鎷疯礉鐗堟湰鏉ユ簮");
+			}
+		};
+		BASIC_FIELD_MAP = new HashMap() {
+			{
+				this.put("oid", "涓婚敭");
+				this.put("btmname", "涓氬姟绫诲瀷鐨勫悕绉�");
+				this.put("id", "缂栧彿");
+				this.put("name", "鍚嶇О");
+				this.put("description", "鎻忚堪");
+				this.put("creator", "鍒涘缓浜�");
+				this.put("createtime", "鍒涘缓鏃堕棿");
+				this.put("lastmodifier", "鏈�鍚庢椂闂翠汉");
+				this.put("lastmodifytime", "鏈�鍚庝慨鏀规椂闂�");
+				this.put("ts", "鏃堕棿鎴�");
+				this.put("owner", "鎷ユ湁鑰�");
+			}
+		};
+		BASE_MODEL_COMPATIBILITY_MAP = new HashMap() {
+			{
+				this.put("lastr", "islastr");
+				this.put("firstr", "isfirstr");
+				this.put("lastv", "islastv");
+				this.put("firstv", "isfirstv");
+			}
+		};
+		LIFECYCLE_MANAGE_FIELD_MAP = new HashMap() {
+			{
+				this.put("lcstatus", "鐢熷懡鍛ㄦ湡鍊�");
+			}
+		};
+		SECRET_MANAGE_FIELD_MAP = new HashMap() {
+			{
+				this.put("secretgrade", "瀵嗙骇鍊�");
+			}
+		};
+		LINK_TYPE_FIELD_MAP = new HashMap() {
+			{
+				this.put("oid", "涓婚敭");
+				this.put("creator", "鍒涘缓浜�");
+				this.put("createtime", "鍒涘缓鏃堕棿");
+				this.put("lastmodifier", "鏈�鍚庢椂闂翠汉");
+				this.put("lastmodifytime", "鏈�鍚庝慨鏀规椂闂�");
+				this.put("f_oid", "from绔富閿�");
+				this.put("f_revisionoid", "from绔増鏈富閿�");
+				this.put("f_nameoid", "from绔璞′富閿�");
+				this.put("f_btmname", "from绔笟鍔$被鍨�");
+				this.put("t_oid", "to绔富閿�");
+				this.put("t_revisionoid", "to绔増鏈富閿�");
+				this.put("t_nameoid", "to绔璞′富閿�");
+				this.put("t_btmname", "to绔笟鍔$被鍨�");
+				this.put("ts", "鏃堕棿鎴�");
+			}
+		};
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyController.java
index b311f99..44d66a7 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyController.java
@@ -119,6 +119,7 @@
 
 	/**
 	 * 涓婚搴撳畾涔夎〃 鏂板
+	 * @param
 	 */
 	@PostMapping("/save")
 	@ApiOperationSupport(order = 4)
@@ -310,6 +311,16 @@
 	public DataGrid<CodeOsattributeVO> listClassifyLinkAttr(BaseQueryObject baseQueryObject){
 		return codeClassifyService.listClassifyLinkAttr(baseQueryObject);
 	}
+	/**
+	 * 涓婚敭鑾峰彇涓婚搴撳垎绫�
+	 * @param oid 涓婚敭
+	 * @return 涓婚搴撳垎绫绘樉绀哄璞�
+	 */
+	@GetMapping("/getObjectByOid")
+	public R<CodeClassifyVO> getObjectByOid(String oid){
+		CodeClassifyVO codeClassifyVO = codeClassifyService.getObjectByOid(oid);
+		return R.data(codeClassifyVO);
+	}
 
 	/**
 	 * 浣跨敤缂栧彿鐨勮矾寰勮幏鍙栧璞�
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyProcessTempController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyProcessTempController.java
index c19293a..eacd1a2 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyProcessTempController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClassifyProcessTempController.java
@@ -165,4 +165,5 @@
             return R.data(codeClassifyProcessTempVOS.get(0));
         }
     }
+
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodePhaseattrController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodePhaseattrController.java
index 99ca7bb..c1a1c4a 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodePhaseattrController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodePhaseattrController.java
@@ -19,8 +19,8 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import com.vci.ubcs.code.entity.CodePhaseAttr;
-import com.vci.ubcs.code.mapper.CodePhaseAttrMapper;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
+import com.vci.ubcs.code.mapper.CodePhaseattrMapper;
 import com.vci.ubcs.code.service.ICodePhaseattrService;
 import com.vci.ubcs.code.vo.CodePhaseattrVO;
 import com.vci.ubcs.code.wrapper.CodePhaseattrWrapper;
@@ -45,13 +45,13 @@
  */
 @RestController
 @AllArgsConstructor
-@RequestMapping("ubcs-code/CodePhaseattr")
+@RequestMapping("/CodePhaseattr")
 @Api(value = "缂栫爜搴撳畾涔�-妯℃澘闃舵-灞炴��", tags = "缂栫爜搴撳畾涔�-妯℃澘闃舵-灞炴�ф帴鍙�")
 public class CodePhaseattrController extends BladeController {
 
 	private final ICodePhaseattrService CodePhaseattrService;
 
-	private CodePhaseAttrMapper codePhaseAttrMapper;
+	private CodePhaseattrMapper codePhaseAttrMapper;
 
 	/**
 	 * 缂栫爜搴撳畾涔�-妯℃澘闃舵-灞炴�� 璇︽儏
@@ -59,8 +59,8 @@
 	@GetMapping("/detail")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "璇︽儏", notes = "浼犲叆CodePhaseattr")
-	public R<CodePhaseattrVO> detail(CodePhaseAttr CodePhaseattr) {
-		CodePhaseAttr detail = CodePhaseattrService.getOne(Condition.getQueryWrapper(CodePhaseattr));
+	public R<CodePhaseattrVO> detail(CodePhaseattrEntity codePhaseattr) {
+		CodePhaseattrEntity detail = CodePhaseattrService.getOne(Condition.getQueryWrapper(codePhaseattr));
 		return R.data(CodePhaseattrWrapper.build().entityVO(detail));
 	}
 	/**
@@ -69,8 +69,8 @@
 	@GetMapping("/list")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "鍒嗛〉", notes = "浼犲叆CodePhaseattr")
-	public R<IPage<CodePhaseattrVO>> list(CodePhaseAttr CodePhaseattr, Query query) {
-		IPage<CodePhaseAttr> pages = CodePhaseattrService.page(Condition.getPage(query), Condition.getQueryWrapper(CodePhaseattr));
+	public R<IPage<CodePhaseattrVO>> list(CodePhaseattrEntity codePhaseattr, Query query) {
+		IPage<CodePhaseattrEntity> pages = CodePhaseattrService.page(Condition.getPage(query), Condition.getQueryWrapper(codePhaseattr));
 		return R.data(CodePhaseattrWrapper.build().pageVO(pages));
 	}
 
@@ -91,8 +91,8 @@
 	@PostMapping("/save")
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "鏂板", notes = "浼犲叆CodePhaseattr")
-	public R save(@Valid @RequestBody CodePhaseAttr CodePhaseattr) {
-		return R.status(CodePhaseattrService.save(CodePhaseattr));
+	public R save(@Valid @RequestBody CodePhaseattrEntity codePhaseattr) {
+		return R.status(CodePhaseattrService.save(codePhaseattr));
 	}
 
 	/**
@@ -101,8 +101,8 @@
 	@PostMapping("/update")
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "淇敼", notes = "浼犲叆CodePhaseattr")
-	public R update(@Valid @RequestBody CodePhaseAttr CodePhaseattr) {
-		return R.status(CodePhaseattrService.updateById(CodePhaseattr));
+	public R update(@Valid @RequestBody CodePhaseattrEntity codePhaseattr) {
+		return R.status(CodePhaseattrService.updateById(codePhaseattr));
 	}
 
 	/**
@@ -111,8 +111,8 @@
 	@PostMapping("/submit")
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "鏂板鎴栦慨鏀�", notes = "浼犲叆CodePhaseattr")
-	public R submit(@Valid @RequestBody CodePhaseAttr CodePhaseattr) {
-		return R.status(CodePhaseattrService.saveOrUpdate(CodePhaseattr));
+	public R submit(@Valid @RequestBody CodePhaseattrEntity codePhaseattr) {
+		return R.status(CodePhaseattrService.saveOrUpdate(codePhaseattr));
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeTemplatePhaseController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeTemplatePhaseController.java
index 720281f..ffa1900 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeTemplatePhaseController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeTemplatePhaseController.java
@@ -16,32 +16,21 @@
  */
 package com.vci.ubcs.code.controller;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.vci.ubcs.code.dto.CodeTemplatePhaseDTO;
 import com.vci.ubcs.code.service.ICodeTempphaseService;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
-import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseVO;
-import com.vci.ubcs.code.wrapper.CodeTempphaseWrapper;
+import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseEntityVO;
 import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
 import com.vci.ubcs.starter.web.pagemodel.DataGrid;
-import com.vci.ubcs.starter.web.pagemodel.PageHelper;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.core.boot.ctrl.BladeController;
-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.Func;
 import org.springframework.web.bind.annotation.*;
 
-import javax.validation.Valid;
 import java.util.Collection;
-import java.util.Map;
 
 /**
  * 缂栫爜搴撳畾涔�-妯℃澘闃舵 鎺у埗鍣�
@@ -67,7 +56,7 @@
 	 * @return 妯℃澘闃舵鏄剧ず瀵硅薄鍒楄〃
 	 */
 	@GetMapping("/gridCodeTemplatePhase")
-	public DataGrid<CodeTemplatePhaseVO> gridCodeTemplatePhase(CodeTemplatePhaseVO codeTemplatePhaseVO,Query query){
+	public DataGrid<CodeTemplatePhaseEntityVO> gridCodeTemplatePhase(CodeTemplatePhaseEntityVO codeTemplatePhaseVO, Query query){
 		return codeTemplatePhaseService.gridCodeTemplatePhase(codeTemplatePhaseVO,query);
 	}
 
@@ -77,7 +66,7 @@
 	 * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
 	 */
 	@PostMapping( "/addSave")
-	public R<CodeTemplatePhaseVO> addSave(@RequestBody CodeTemplatePhaseDTO codeTemplatePhaseDTO){
+	public R<CodeTemplatePhaseEntityVO> addSave(@RequestBody CodeTemplatePhaseDTO codeTemplatePhaseDTO){
 		return R.data(codeTemplatePhaseService.addSave(codeTemplatePhaseDTO));
 	}
 
@@ -87,8 +76,8 @@
 	 * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
 	 */
 	@PutMapping("/editSave")
-	public R<CodeTemplatePhaseVO> editSave(@RequestBody CodeTemplatePhaseDTO codeTemplatePhaseDTO){
-		CodeTemplatePhaseVO codeTemplatePhaseVO = codeTemplatePhaseService.editSave(codeTemplatePhaseDTO);
+	public R<CodeTemplatePhaseEntityVO> editSave(@RequestBody CodeTemplatePhaseDTO codeTemplatePhaseDTO){
+		CodeTemplatePhaseEntityVO codeTemplatePhaseVO = codeTemplatePhaseService.editSave(codeTemplatePhaseDTO);
 		return R.data(codeTemplatePhaseVO);
 	}
 
@@ -108,8 +97,8 @@
 	 * @return 妯℃澘闃舵鏄剧ず瀵硅薄
 	 */
 	@GetMapping("/getObjectByOid")
-	public R<CodeTemplatePhaseVO> getObjectByOid(String oid){
-		CodeTemplatePhaseVO codeTemplatePhaseVO = codeTemplatePhaseService.getObjectByOid(oid);
+	public R<CodeTemplatePhaseEntityVO> getObjectByOid(String oid){
+		CodeTemplatePhaseEntityVO codeTemplatePhaseVO = codeTemplatePhaseService.getObjectByOid(oid);
 		return R.data(codeTemplatePhaseVO);
 	}
 
@@ -119,8 +108,8 @@
 	 * @return 妯℃澘闃舵鏄剧ず瀵硅薄
 	 */
 	@GetMapping("/listDataByOids")
-	public R<Collection<CodeTemplatePhaseVO>> listCodeTemplatePhaseByOids(String oids){
-		Collection<CodeTemplatePhaseVO> voCollection =  codeTemplatePhaseService.listCodeTemplatePhaseByOids(VciBaseUtil.str2List(oids));
+	public R<Collection<CodeTemplatePhaseEntityVO>> listCodeTemplatePhaseByOids(String oids){
+		Collection<CodeTemplatePhaseEntityVO> voCollection =  codeTemplatePhaseService.listCodeTemplatePhaseByOids(VciBaseUtil.str2List(oids));
 		return R.data(voCollection);
 	}
 
@@ -130,7 +119,7 @@
 	 * @return 妯℃澘闃舵鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
 	 */
 	@GetMapping("/refDataGrid")
-	public DataGrid<CodeTemplatePhaseVO> refDataGridCodeTemplatePhase(BaseQueryObject baseQueryObject){
+	public DataGrid<CodeTemplatePhaseEntityVO> refDataGridCodeTemplatePhase(BaseQueryObject baseQueryObject){
 		if(baseQueryObject == null){
 			baseQueryObject = new BaseQueryObject();
 		}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeWupinController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeWupinController.java
new file mode 100644
index 0000000..8dd1a53
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeWupinController.java
@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.code.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.secure.BladeUser;
+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.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.vo.CodeWupinVO;
+import com.vci.ubcs.code.wrapper.CodeWupinWrapper;
+import com.vci.ubcs.code.service.ICodeWupinService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 缂栫爜淇℃伅 鎺у埗鍣�
+ *
+ * @author yuxc
+ * @since 2023-05-05
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("ubcs-code/codeWupin")
+@Api(value = "缂栫爜淇℃伅", tags = "缂栫爜淇℃伅鎺ュ彛")
+public class CodeWupinController extends BladeController {
+
+	private final ICodeWupinService codeWupinService;
+
+	/**
+	 * 缂栫爜淇℃伅 璇︽儏
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "璇︽儏", notes = "浼犲叆codeWupin")
+	public R<CodeWupinVO> detail(CodeWupinEntity codeWupin) {
+		CodeWupinEntity detail = codeWupinService.getOne(Condition.getQueryWrapper(codeWupin));
+		return R.data(CodeWupinWrapper.build().entityVO(detail));
+	}
+	/**
+	 * 缂栫爜淇℃伅 鍒嗛〉
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "鍒嗛〉", notes = "浼犲叆codeWupin")
+	public R<IPage<CodeWupinVO>> list(CodeWupinEntity codeWupin, Query query) {
+		IPage<CodeWupinEntity> pages = codeWupinService.page(Condition.getPage(query), Condition.getQueryWrapper(codeWupin));
+		return R.data(CodeWupinWrapper.build().pageVO(pages));
+	}
+
+	/**
+	 * 缂栫爜淇℃伅 鑷畾涔夊垎椤�
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "鍒嗛〉", notes = "浼犲叆codeWupin")
+	public R<IPage<CodeWupinVO>> page(CodeWupinVO codeWupin, Query query) {
+		IPage<CodeWupinVO> pages = codeWupinService.selectCodeWupinPage(Condition.getPage(query), codeWupin);
+		return R.data(pages);
+	}
+
+	/**
+	 * 缂栫爜淇℃伅 鏂板
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "鏂板", notes = "浼犲叆codeWupin")
+	public R save(@Valid @RequestBody CodeWupinEntity codeWupin) {
+		return R.status(codeWupinService.save(codeWupin));
+	}
+
+	/**
+	 * 缂栫爜淇℃伅 淇敼
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "淇敼", notes = "浼犲叆codeWupin")
+	public R update(@Valid @RequestBody CodeWupinEntity codeWupin) {
+		return R.status(codeWupinService.updateById(codeWupin));
+	}
+
+	/**
+	 * 缂栫爜淇℃伅 鏂板鎴栦慨鏀�
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "鏂板鎴栦慨鏀�", notes = "浼犲叆codeWupin")
+	public R submit(@Valid @RequestBody CodeWupinEntity codeWupin) {
+		return R.status(codeWupinService.saveOrUpdate(codeWupin));
+	}
+
+	/**
+	 * 缂栫爜淇℃伅 鍒犻櫎
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "閫昏緫鍒犻櫎", notes = "浼犲叆ids")
+	public R remove(@ApiParam(value = "涓婚敭闆嗗悎", required = true) @RequestParam String ids) {
+		return R.status(codeWupinService.removeBatchByIds(Func.toLongList(ids)));
+	}
+
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
new file mode 100644
index 0000000..f185863
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
@@ -0,0 +1,147 @@
+package com.vci.ubcs.code.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.dto.CodeOrderSecDTO;
+import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
+import com.vci.ubcs.code.service.MdmEngineService;
+import com.vci.ubcs.code.service.MdmIOService;
+import com.vci.ubcs.code.vo.pagemodel.CodeImProtRusultVO;
+import com.vci.ubcs.starter.annotation.VciBusinessLog;
+import com.vci.ubcs.starter.util.LocalFileUtil;
+import com.vci.ubcs.starter.web.util.ControllerUtil;
+import com.vci.ubcs.starter.web.util.LangBaseUtil;
+import io.swagger.annotations.Api;
+import lombok.AllArgsConstructor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+@RestController
+//@AllArgsConstructor
+@RequestMapping("/mdmEngineController")
+@Api(value = "缂栫爜鏁版嵁绠$悊", tags = "缂栫爜鏁版嵁绠$悊")
+public class MdmEngineController {
+
+//	/**
+//	 * 鏃ュ織
+//	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+	/**
+	 * 涓绘暟鎹紩鎿庢湇鍔�
+	 */
+	@Autowired
+	private MdmEngineService engineService;
+	/**
+	 * 涓绘暟鎹鍏ュ鍑烘湇鍔�
+	 */
+	@Autowired
+	private MdmIOService mdmIOService;
+
+	/**
+	 * 涓嬭浇鎵归噺鐢宠鐨勫鍏ユā鏉�
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param response 鍝嶅簲瀵硅薄
+	 * @throws IOException 鎶涘嚭寮傚父
+	 */
+	@GetMapping("/downloadImportExcel")
+	@VciBusinessLog(operateName = "涓嬭浇鎵归噺鐢宠缂栫爜鐨勫鍏ユā鏉�")
+	public void downloadImportExcel(String codeClassifyOid, HttpServletResponse response) throws IOException{
+		String excelName = mdmIOService.createImportExcel(codeClassifyOid,false);
+		try {
+			ControllerUtil.writeFileToResponse(response,excelName);
+		} catch (Throwable e) {
+			//濡傛灉鍑洪敊,鎶婇敊璇俊鎭啓鍒皌ext
+			String msg = LangBaseUtil.getErrorMsg(e);
+			if(StringUtils.isBlank(msg)){
+				msg = "鏈煡閿欒";
+			}
+			ControllerUtil.writeDataToResponse(response,msg.getBytes(StandardCharsets.UTF_8),null);
+		}
+	}
+
+
+	/**
+	 * 鎵归噺鐢宠缂栫爜鐨勪俊鎭�
+	 * @param secDTOList 鐢宠缂栫爜鐨勪俊鎭紝蹇呴』鍖呭惈鐮佹鍜屽垎绫讳富閿殑淇℃伅
+	 * @param file 鏂囦欢鐨勫唴瀹�
+	 */
+	@VciBusinessLog(operateName = "鎵归噺鐢宠缂栫爜鐨勪俊鎭�")
+	@PostMapping("/batchImportCode")
+	public R batchImportCode(String secDTOList, String codeClassifyOid, MultipartFile file, HttpServletResponse response) throws Throwable {
+		CodeOrderDTO orderDTO = new CodeOrderDTO();
+		orderDTO.setCodeClassifyOid(codeClassifyOid);
+		if(StringUtils.isNotBlank(secDTOList)){
+			List<CodeOrderSecDTO> secDTOS = JSONObject.parseArray(secDTOList, CodeOrderSecDTO.class);
+			orderDTO.setSecDTOList(secDTOS);
+		}
+		String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
+		File file1 = new File(excelFileName);
+		try {
+			file.transferTo(new File(excelFileName));
+			CodeImProtRusultVO codeImProtRusultVO = mdmIOService.batchImportCode(orderDTO,file1);
+			if(StringUtils.isNotBlank(codeImProtRusultVO.getFilePath())||StringUtils.isNotBlank(codeImProtRusultVO.getRedisUuid())){
+				//鏀惧埌map閲�
+				R result = R.fail("瀵煎叆澶辫触");
+				if(StringUtils.isNotBlank(codeImProtRusultVO.getFilePath())) {
+					String filedUUid = ControllerUtil.putErrorFile(codeImProtRusultVO.getFilePath());
+					codeImProtRusultVO.setFileOid(filedUUid);
+				}
+				result.setData(codeImProtRusultVO);
+				return result;
+			}else {
+				return R.success("鎿嶄綔鎴愬姛锛�");
+			}
+		}catch (Throwable e) {
+			logger.error("瀵煎叆閿欒",e);
+			String errorFile = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒.txt";
+			LocalFileUtil.writeContentToFile( LangBaseUtil.getErrorMsg(e),errorFile);
+			String uuid=ControllerUtil.putErrorFile(errorFile);
+			CodeImProtRusultVO codeImProtRusultVO =new CodeImProtRusultVO();
+			codeImProtRusultVO.setRedisUuid("");
+			codeImProtRusultVO.setFileOid(uuid);
+			codeImProtRusultVO.setFilePath(errorFile);
+			R result = R.fail("瀵煎叆澶辫触");
+			result.setData(codeImProtRusultVO);
+//			result.setObj(codeImProtRusultVO);
+			return result;
+		}finally {
+			file1.delete();
+		}
+	}
+
+
+	/**
+	 * 淇敼鐘舵��
+	 * @param baseModelDTO 鏁版嵁浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉
+	 */
+	@PostMapping("changeStatus")
+	public R changeStatus(BaseModelDTO baseModelDTO) {
+		engineService.changeStatus(baseModelDTO);
+		return R.success("鎿嶄綔鎴愬姛锛�");
+	}
+
+
+	/**
+	 * 鐢宠缂栫爜淇濆瓨
+	 * @param orderDTO 缂栫爜鐢宠鐩稿叧鐨勪俊鎭紝闇�瑕佹湁灞炴�у拰鐮佹鐩稿叧鐨勪俊鎭�
+	 * @return 鎵ц缁撴灉
+	 */
+	@PostMapping("/addSaveCode")
+	@VciBusinessLog(operateName = "鐢宠鍗曚釜缂栫爜")
+	public R addSaveCode(@RequestBody CodeOrderDTO orderDTO){
+		return R.success(engineService.addSaveCode(orderDTO));
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeDefaultLC.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeDefaultLC.java
new file mode 100644
index 0000000..7752cd4
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeDefaultLC.java
@@ -0,0 +1,141 @@
+package com.vci.ubcs.code.enumpack;
+import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
+import com.vci.ubcs.starter.web.enumpck.BaseEnum;
+
+/**
+ * 涓婚搴撴暟鎹殑榛樿鐢熷懡鍛ㄦ湡
+ * @author weidy
+ * @date 2022-3-2
+ */
+public enum CodeDefaultLC implements BaseEnum {
+
+	/**
+	 * 缂栬緫涓�
+	 */
+	EDITING(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_EDITING,"缂栬緫涓�"),
+
+	/**
+	 * 瀹℃壒涓�
+	 */
+	AUDITING(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_AUDITING,"瀹℃壒涓�"),
+
+	/**
+	 * 宸插彂甯�
+	 */
+	RELEASED(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_RELEASED,"宸插彂甯�"),
+
+	/**
+	 * 鐮佸�煎洖鏀�
+	 */
+	TASK_BACK(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_TAKEBACK,"鐮佸�煎洖鏀�"),
+	/**
+	 * 鍋滅敤
+	 */
+	DISABLE(FrameWorkDefaultValueConstant.FRAMEWORK_DATA_DISABLED,"鍋滅敤");
+
+
+	/**
+	 * 鏋氫妇鐨勫��
+	 */
+	private String value;
+
+	/**
+	 * 鏋氫妇鏄剧ず鏂囨湰
+	 */
+	private String text;
+
+	/**
+	 * 鑾峰彇鏋氫妇鍊�
+	 *
+	 * @return 鏋氫妇鍊�
+	 */
+	@Override
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * 璁剧疆鏋氫妇鍊�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 */
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	/**
+	 * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+	 *
+	 * @return 鏄剧ず鏂囨湰
+	 */
+	@Override
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * 璁剧疆鏄剧ず鏂囨湰
+	 *
+	 * @param text 鏄剧ず鏂囨湰
+	 */
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	/**
+	 * 鏋勯�犲嚱鏁�
+	 *
+	 * @param value 鍊�
+	 * @param text  鏄剧ず鏂囨湰
+	 */
+	private CodeDefaultLC(String value, String text) {
+		this.value = value;
+		this.text = text;
+	}
+
+	/**
+	 * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+	 *
+	 * @param text 鍚嶇О
+	 * @return 鏋氫妇鍊�
+	 */
+	public static String getValueByText(String text) {
+		for (CodeDefaultLC wenum : CodeDefaultLC.values()) {
+			if (wenum.getText().equalsIgnoreCase(text)) {
+				return wenum.getValue();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 * @return 鍚嶇О
+	 */
+	public static String getTextByValue(String value) {
+		for (CodeDefaultLC wenum : CodeDefaultLC.values()) {
+			if (wenum.getValue().equalsIgnoreCase(value)) {
+				return wenum.getText();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+	 */
+	public static CodeDefaultLC forValue(String value) {
+		for (CodeDefaultLC wenum : CodeDefaultLC.values()) {
+			if (wenum.getValue().equalsIgnoreCase(value)) {
+				return wenum;
+			}
+		}
+		return null;
+	}
+}
+
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseattrClient.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseattrClient.java
index d89b166..cd35493 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseattrClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodePhaseattrClient.java
@@ -18,13 +18,12 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.vci.ubcs.code.entity.CodePhaseAttr;
-import com.vci.ubcs.code.mapper.CodePhaseAttrMapper;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
+import com.vci.ubcs.code.mapper.CodePhaseattrMapper;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.support.BladePage;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
-import com.vci.ubcs.code.service.ICodePhaseattrService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
@@ -40,15 +39,15 @@
 @AllArgsConstructor
 public class CodePhaseattrClient implements ICodePhaseattrClient {
 
-    private final CodePhaseAttrMapper codePhaseAttrMapper;
+    private final CodePhaseattrMapper codePhaseAttrMapper;
 
     @Override
     @GetMapping(TOP)
-    public BladePage<CodePhaseAttr> top(Integer current, Integer size) {
+    public BladePage<CodePhaseattrEntity> top(Integer current, Integer size) {
         Query query = new Query();
         query.setCurrent(current);
         query.setSize(size);
-        IPage<CodePhaseAttr> page = codePhaseAttrMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
+        IPage<CodePhaseattrEntity> page = codePhaseAttrMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
 		return BladePage.of(page);
     }
 
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempphaseClient.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempphaseClient.java
index 03b4fd3..d39f37d 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempphaseClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeTempphaseClient.java
@@ -18,7 +18,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
+import com.vci.ubcs.code.entity.CodeTempphaseEntity;
 import com.vci.ubcs.code.mapper.CodeTemplatePhaseMapper;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.support.BladePage;
@@ -43,11 +43,11 @@
 
     @Override
     @GetMapping(TOP)
-    public BladePage<CodeTemplatePhase> top(Integer current, Integer size) {
+    public BladePage<CodeTempphaseEntity> top(Integer current, Integer size) {
         Query query = new Query();
         query.setCurrent(current);
         query.setSize(size);
-        IPage<CodeTemplatePhase> page = codeTempphaseMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
+        IPage<CodeTempphaseEntity> page = codeTempphaseMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());
 
 		return BladePage.of(page);
     }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeWupinClient.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeWupinClient.java
new file mode 100644
index 0000000..b786560
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeWupinClient.java
@@ -0,0 +1,55 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.code.feign;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.vci.ubcs.code.mapper.CodeWupinMapper;
+import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.BladePage;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.service.ICodeWupinService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+/**
+ * 缂栫爜淇℃伅 Feign瀹炵幇绫�
+ *
+ * @author yuxc
+ * @since 2023-05-05
+ */
+@ApiIgnore()
+@RestController
+@AllArgsConstructor
+public class CodeWupinClient implements ICodeWupinClient {
+
+    private final CodeWupinMapper codeWupinMapper;
+
+    @Override
+    @GetMapping(TOP)
+    public BladePage<CodeWupinEntity> top(Integer current, Integer size) {
+        Query query = new Query();
+        query.setCurrent(current);
+        query.setSize(size);
+        IPage<CodeWupinEntity> page = codeWupinMapper.selectPage(Condition.getPage(query), Wrappers.emptyWrapper());//service.page(Condition.getPage(query));
+        return BladePage.of(page);
+    }
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseattrClient.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseattrClient.java
index fb43ec3..225d4d5 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseattrClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodePhaseattrClient.java
@@ -16,8 +16,7 @@
  */
 package com.vci.ubcs.code.feign;
 
-import com.vci.ubcs.code.entity.CodePhaseAttr;
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
 import org.springblade.core.mp.support.BladePage;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -45,6 +44,6 @@
      * @return BladePage
      */
     @GetMapping(TOP)
-    BladePage<CodePhaseAttr> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
+    BladePage<CodePhaseattrEntity> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempphaseClient.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempphaseClient.java
index 19b4b37..b964c4e 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempphaseClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeTempphaseClient.java
@@ -16,7 +16,7 @@
  */
 package com.vci.ubcs.code.feign;
 
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
+import com.vci.ubcs.code.entity.CodeTempphaseEntity;
 import org.springblade.core.mp.support.BladePage;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -44,6 +44,6 @@
      * @return BladePage
      */
     @GetMapping(TOP)
-    BladePage<CodeTemplatePhase> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
+    BladePage<CodeTempphaseEntity> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeWupinClient.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeWupinClient.java
new file mode 100644
index 0000000..45d1801
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/ICodeWupinClient.java
@@ -0,0 +1,49 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.code.feign;
+
+import org.springblade.core.mp.support.BladePage;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 缂栫爜淇℃伅 Feign鎺ュ彛绫�
+ *
+ * @author yuxc
+ * @since 2023-05-05
+ */
+@FeignClient(
+    value = "ubcs-code"
+)
+public interface ICodeWupinClient {
+
+    String API_PREFIX = "/wuPinClient";
+    String TOP = API_PREFIX + "/top";
+
+    /**
+     * 鑾峰彇缂栫爜淇℃伅鍒楄〃
+     *
+     * @param current   椤靛彿
+     * @param size      椤垫暟
+     * @return BladePage
+     */
+    @GetMapping(TOP)
+    BladePage<CodeWupinEntity> top(@RequestParam("current") Integer current, @RequestParam("size") Integer size);
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java
index ce03874..49e31bd 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java
@@ -49,7 +49,7 @@
 	 * @param oid
 	 * @return
 	 */
-	@MapKey("oid")
+	@MapKey("OID")
 	Map<String,String> selectAllLevelChildOid(@Param("oid") String oid);
 
 	/**
@@ -78,14 +78,14 @@
 	List<CodeClassify> selectAllLevelChildHasPath(@Param("oid") String oid);
 
 
-	@MapKey("oid")
+	@MapKey("OID")
 	List<Map<String,Object>> selectAllLevelParentByOid(@Param("oid") String oid);
 
-	@MapKey("oid")
+	@MapKey("OID")
 	List<Map<String,Object>> selectAllLevelParents(@Param("oid") String oid);
 
 
-	@MapKey("oid")
+	@MapKey("OID")
 	List<Map<String,Object>> selectByFieldPath(@Param("fieldPath") String fieldPath);
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java
index 10196de..aeb97b7 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java
@@ -65,11 +65,14 @@
 	 * @param nameoid
 	 * @return
 	 */
-	@MapKey("REVISIONSEQ")
+//	@MapKey("REVISIONSEQ")
 	Map<String,Object> getNextRevision(@Param("nameoid") String nameoid);
 
 
 
 	List<CodeClstemplateEntity> selectCodeClassifyTemplateDOByTree(@Param("codeclassifyoid") String codeclassifyoid,
-																   @Param("lcstatus") String lcstatus);
+														  @Param("lcstatus") String lcstatus);
+	List<Map<String,String>> selectChildHasReleaseTemplate(@Param("lcstatus") String lcstatus,
+														      @Param("classifyoid") String classifyoid,
+															  @Param("templatelcstatus") String templatelcstatus);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java
index 187b185..e58fd14 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java
@@ -16,7 +16,7 @@
  */
 package com.vci.ubcs.code.mapper;
 
-import com.vci.ubcs.code.entity.CodePhaseAttr;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
 import com.vci.ubcs.code.vo.CodePhaseattrVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -28,7 +28,7 @@
  * @author yuxc
  * @since 2023-04-20
  */
-public interface CodePhaseAttrMapper extends BaseMapper<CodePhaseAttr> {
+public interface CodePhaseattrMapper extends BaseMapper<CodePhaseattrEntity> {
 
 	/**
 	 * 鑷畾涔夊垎椤�
@@ -39,9 +39,9 @@
 	 */
 	List<CodePhaseattrVO> selectCodePhaseattrPage(IPage page, CodePhaseattrVO CodePhaseattr);
 
-	List<CodePhaseAttr> selectByPhasea(String oid);
+	List<CodePhaseattrEntity> selectByPhasea(String oid);
 
-	List<CodePhaseAttr> selectByPhaseaIds(String oids);
+	List<CodePhaseattrEntity> selectByPhaseaIds(String oids);
 
-	List<CodePhaseAttr> listLinkAttrDOByTemplateAttrDOS(String id,String codeClassifyTemplateOid);
+	List<CodePhaseattrEntity> listLinkAttrDOByTemplateAttrDOS(String id, String codeClassifyTemplateOid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeSerialValueMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeSerialValueMapper.java
index 7d055ae..d885b39 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeSerialValueMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeSerialValueMapper.java
@@ -1,6 +1,8 @@
 package com.vci.ubcs.code.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.vci.ubcs.code.entity.CodeSerialValue;
+import com.vci.ubcs.code.entity.CodeSynonymEntity;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -11,7 +13,7 @@
  * @author ludc
  * @date 2022-03-01
  */
-public interface CodeSerialValueMapper {
+public interface CodeSerialValueMapper  extends BaseMapper<CodeSerialValue> {
 
 
 	List<CodeSerialValue> selectByCodeRoleId(@Param("codeRuleOid") String codeRuleOid);
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeTemplatePhaseMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeTemplatePhaseMapper.java
index fe88200..af90fb6 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeTemplatePhaseMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeTemplatePhaseMapper.java
@@ -16,10 +16,10 @@
  */
 package com.vci.ubcs.code.mapper;
 
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseVO;
+import com.vci.ubcs.code.entity.CodeTempphaseEntity;
+import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseEntityVO;
 
 import java.util.List;
 
@@ -29,7 +29,7 @@
  * @author yuxc
  * @since 2023-04-20
  */
-public interface CodeTemplatePhaseMapper extends BaseMapper<CodeTemplatePhase> {
+public interface CodeTemplatePhaseMapper extends BaseMapper<CodeTempphaseEntity> {
 
 	/**
 	 * 鑷畾涔夊垎椤�
@@ -38,7 +38,7 @@
 	 * @param CodeTempphase
 	 * @return
 	 */
-	List<CodeTemplatePhaseVO> selectCodeTempphasePage(IPage page, CodeTemplatePhaseVO CodeTempphase);
+	List<CodeTemplatePhaseEntityVO> selectCodeTempphasePage(IPage page, CodeTemplatePhaseEntityVO CodeTempphase);
 
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseAttrMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeWupinMapper.java
similarity index 66%
rename from Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseAttrMapper.java
rename to Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeWupinMapper.java
index 187b185..7376138 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseAttrMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeWupinMapper.java
@@ -16,32 +16,28 @@
  */
 package com.vci.ubcs.code.mapper;
 
-import com.vci.ubcs.code.entity.CodePhaseAttr;
-import com.vci.ubcs.code.vo.CodePhaseattrVO;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.vo.CodeWupinVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import java.util.List;
 
 /**
- * 缂栫爜搴撳畾涔�-妯℃澘闃舵-灞炴�� Mapper 鎺ュ彛
+ * 缂栫爜淇℃伅 Mapper 鎺ュ彛
  *
  * @author yuxc
- * @since 2023-04-20
+ * @since 2023-05-05
  */
-public interface CodePhaseAttrMapper extends BaseMapper<CodePhaseAttr> {
+public interface CodeWupinMapper extends BaseMapper<CodeWupinEntity> {
 
 	/**
 	 * 鑷畾涔夊垎椤�
 	 *
 	 * @param page
-	 * @param CodePhaseattr
+	 * @param codeWupin
 	 * @return
 	 */
-	List<CodePhaseattrVO> selectCodePhaseattrPage(IPage page, CodePhaseattrVO CodePhaseattr);
+	List<CodeWupinVO> selectCodeWupinPage(IPage page, CodeWupinVO codeWupin);
 
-	List<CodePhaseAttr> selectByPhasea(String oid);
 
-	List<CodePhaseAttr> selectByPhaseaIds(String oids);
-
-	List<CodePhaseAttr> listLinkAttrDOByTemplateAttrDOS(String id,String codeClassifyTemplateOid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeBasicSecService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeBasicSecService.java
index e8aeda0..6ad2c7f 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeBasicSecService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeBasicSecService.java
@@ -143,5 +143,28 @@
 	 */
 	List<String> getOidByCodeclassifysecOid(String codeClassifySecOid);
 
+	/**
+	 * 浣跨敤瑙勫垯鐨勪富閿幏鍙栧搴旂殑鐮佹鍐呭
+	 * @param oid 瑙勫垯鐨勫唴瀹�
+	 * @return 鐮佹鐨勫唴瀹�
+	 */
+    List<CodeBasicSecVO> listCodeBasicSecByRuleOid(String oid);
 
+	/**
+	 * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param codeBasicSecDOs 鏁版嵁瀵硅薄鍒楄〃
+	 * @param hasFixedValue 鏄惁鏈夊浐瀹氬��
+	 * @return 鏄剧ず瀵硅薄
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	List<CodeBasicSecVO> codeBasicSecDO2VOs(Collection<CodeBasicSec> codeBasicSecDOs, boolean hasFixedValue) throws VciBaseException;
+
+	/**
+	 * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param  codeBasicSecDO 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	CodeBasicSecVO codeBasicSecDO2VO(CodeBasicSec codeBasicSecDO) throws VciBaseException;
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
index 9cd5583..ac972bf 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
@@ -3,9 +3,11 @@
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.entity.CodeClassify;
 import com.vci.ubcs.code.vo.CodeOsattributeVO;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.revision.model.TreeQueryObject;
 import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
 import com.vci.ubcs.starter.web.pagemodel.DataGrid;
@@ -212,4 +214,18 @@
 	 * @return 鏌ヨ缁撴灉
 	 */
 	List<CodeClassify> selectAllLevelParents(String oid);
+
+	/**
+	 * 涓婚敭鑾峰彇涓婚搴撳垎绫�
+	 * @param oid 涓婚敭
+	 * @return 涓婚搴撳垎绫绘樉绀哄璞�
+	 */
+	CodeClassifyVO getObjectByOid(String oid) throws VciBaseException;
+
+	/**
+	 * 浣跨敤鍒嗙被涓婚敭鑾峰彇鍒嗙被鐩稿叧鐨勬墍鏈変俊鎭�
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @return 鍒嗙被涓婄骇锛屼笅绾х殑淇℃伅
+	 */
+	CodeClassifyFullInfoBO getClassifyFullInfo(String codeClassifyOid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyTemplateAttrService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyTemplateAttrService.java
index 0defd89..f68f3db 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyTemplateAttrService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyTemplateAttrService.java
@@ -1,17 +1,13 @@
 package com.vci.ubcs.code.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.vci.ubcs.code.entity.CodeClassifyTemplateAttr;
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.web.pagemodel.DataGrid;
 import com.vci.ubcs.starter.web.pagemodel.PageHelper;
 
-import java.sql.Wrapper;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
index e2c7fc4..5e287d1 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
@@ -183,4 +183,36 @@
 	 * @return 鎵ц缁撴灉
 	 */
 	R<CodeClstemplateVO> editSave(CodeClstemplateDTO codeClassifyTemplateDTO);
+
+	/**
+	 * 鑾峰彇鎵�鏈夊瓙鍒嗙被妯℃澘
+	 * @param codeClassifyOid 鐖跺垎绫荤殑涓婚敭
+	 * @return true琛ㄧず鐩稿悓
+	 */
+	List<CodeClstemplateVO> childTemplates(String codeClassifyOid);
+
+	/**
+	 * 浣跨敤涓婚搴撶殑鍒嗙被涓婚敭锛岃幏鍙栫敓鏁堢殑妯℃澘
+	 * @param codeClassifyOid 涓婚搴撳垎绫讳富閿�
+	 * @param hasAttribute 鏄惁鍖呭惈灞炴��
+	 * @return 妯℃澘鐨勪俊鎭�
+	 */
+	List<CodeClstemplateVO> listReleaseTemplateByClassifyOid(String codeClassifyOid,boolean hasAttribute);
+
+	/**
+	 * 鐢ㄦā鏉跨殑鐗堟湰鏉ユ帓搴�
+	 * @param templateVOList 妯℃澘鐨勬樉绀哄璞�
+	 * @return 鎺掑簭鍚庣殑鍒楄〃
+	 */
+	List<CodeClstemplateVO> sortTemplateByRevision(List<CodeClstemplateVO> templateVOList);
+
+
+	/**
+	 * 涓婚敭鑾峰彇鍒嗙被妯℃澘瀵硅薄(鍖呭惈灞炴�э級
+	 * @param templateOid 涓婚敭
+	 * @return 鍒嗙被妯℃澘瀵硅薄鏄剧ず瀵硅薄
+	 */
+    CodeClstemplateVO getObjectHasAttrByOid(String templateOid);
+
+
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyattrrepeatService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyattrrepeatService.java
index 6587533..4df9740 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyattrrepeatService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeKeyattrrepeatService.java
@@ -16,6 +16,7 @@
  */
 package com.vci.ubcs.code.service;
 
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
 import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
 import com.vci.ubcs.code.vo.pagemodel.CodeKeyAttrRepeatRuleVO;
@@ -62,4 +63,18 @@
 	 * @return 鏄剧ず瀵硅薄
 	 */
 	CodeKeyAttrRepeatRuleVO codeKeyAttrRepeatRuleDO2VO(CodeKeyattrrepeatEntity codeKeyattrrepeatEntity);
+
+	/**
+	 * 浣跨敤鍒嗙被鐨勫叏閮ㄤ俊鎭潵鑾峰彇鍏抽敭灞炴�у垽鏂鍒欑殑鍐呭
+	 * @param classifyFullInfo 涓婚搴撳垎绫荤殑鍏ㄩ儴淇℃伅
+	 * @return 瑙勫垯鐨勬樉绀哄璞�
+	 */
+    CodeKeyattrrepeatVO getRuleByClassifyFullInfo(CodeClassifyFullInfoBO classifyFullInfo);
+
+	/**
+	 * 涓婚敭鑾峰彇鍏抽敭鏁版嵁鏌ラ噸瑙勫垯
+	 * @param oid 涓婚敭
+	 * @return 鍏抽敭鏁版嵁鏌ラ噸瑙勫垯鏄剧ず瀵硅薄
+	 */
+	CodeKeyAttrRepeatRuleVO getObjectByOid(String oid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodePhaseattrService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodePhaseattrService.java
index 167d9b6..bfe5e4f 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodePhaseattrService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodePhaseattrService.java
@@ -18,7 +18,7 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.vci.ubcs.code.entity.CodePhaseAttr;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
 import com.vci.ubcs.code.vo.CodePhaseattrVO;
 
 /**
@@ -27,7 +27,7 @@
  * @author yuxc
  * @since 2023-04-20
  */
-public interface ICodePhaseattrService extends IService<CodePhaseAttr> {
+public interface ICodePhaseattrService extends IService<CodePhaseattrEntity> {
 
 	/**
 	 * 鑷畾涔夊垎椤�
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java
index 3459537..ac9a4ae 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java
@@ -135,4 +135,11 @@
 	 */
 	R clearAllCode(String oid);
 
+
+	/**
+	 * 浣跨敤涓婚敭鑾峰彇缂栫爜瑙勫垯鐨勫唴瀹�
+	 * @param codeRuleOid 涓婚敭
+	 * @return 瑙勫垯鐨勬樉绀哄璞�
+	 */
+	CodeRuleVO getObjectHasSecByOid(String codeRuleOid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java
index 9653220..0038355 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java
@@ -19,9 +19,9 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.vci.ubcs.code.dto.CodeTemplatePhaseDTO;
 import com.vci.ubcs.code.entity.CodeClstempattrEntity;
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
+import com.vci.ubcs.code.entity.CodeTempphaseEntity;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
-import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseEntityVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.web.pagemodel.DataGrid;
 import com.vci.ubcs.starter.web.pagemodel.PageHelper;
@@ -38,7 +38,7 @@
  * @author yuxc
  * @since 2023-04-20
  */
-public interface ICodeTempphaseService extends IService<CodeTemplatePhase> {
+public interface ICodeTempphaseService extends IService<CodeTempphaseEntity> {
 
 	/**
 	 * 鏌ヨ鎵�鏈夌殑妯℃澘闃舵
@@ -47,7 +47,7 @@
 	 * @return 鎵ц缁撴灉
 	 * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
-	DataGrid<CodeTemplatePhaseVO> gridCodeTemplatePhase(CodeTemplatePhaseVO codeTemplatePhaseVO, Query query) throws VciBaseException;
+	DataGrid<CodeTemplatePhaseEntityVO> gridCodeTemplatePhase(CodeTemplatePhaseEntityVO codeTemplatePhaseVO, Query query) throws VciBaseException;
 
 	/**
 	 * 妯℃澘鍒犻櫎鐨勬椂鍊欒Е鍙�
@@ -65,19 +65,19 @@
 
 	/**
 	 * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
-	 * @param codeTemplatePhaseDOs 鏁版嵁瀵硅薄鍒楄〃
+	 * @param codeTemplatePhaseEntityDOS 鏁版嵁瀵硅薄鍒楄〃
 	 * @return 鏄剧ず瀵硅薄
 	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
 	 */
-	List<CodeTemplatePhaseVO> codeTemplatePhaseDO2VOs(Collection<CodeTemplatePhase> codeTemplatePhaseDOs) throws VciBaseException;
+	List<CodeTemplatePhaseEntityVO> codeTemplatePhaseDO2VOs(Collection<CodeTempphaseEntity> codeTemplatePhaseEntityDOS) throws VciBaseException;
 
 	/**
 	 * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
-	 * @param  codeTemplatePhaseDO 鏁版嵁瀵硅薄
+	 * @param  codeTemplatePhaseEntityDO 鏁版嵁瀵硅薄
 	 * @return 鏄剧ず瀵硅薄
 	 * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
-	CodeTemplatePhaseVO codeTemplatePhaseDO2VO(CodeTemplatePhase codeTemplatePhaseDO) throws VciBaseException;
+	CodeTemplatePhaseEntityVO codeTemplatePhaseDO2VO(CodeTempphaseEntity codeTemplatePhaseEntityDO) throws VciBaseException;
 
 	/**
 	 * 澧炲姞妯℃澘闃舵
@@ -85,7 +85,7 @@
 	 * @return 鎵ц缁撴灉
 	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
 	 */
-	CodeTemplatePhaseVO addSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException;
+	CodeTemplatePhaseEntityVO addSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException;
 
 	/**
 	 * 淇敼妯℃澘闃舵
@@ -93,7 +93,7 @@
 	 * @return 鎵ц缁撴灉
 	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
 	 */
-	CodeTemplatePhaseVO editSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException;
+	CodeTemplatePhaseEntityVO editSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException;
 
 	/**
 	 * 鍒犻櫎妯℃澘闃舵
@@ -109,7 +109,7 @@
 	 * @return 妯℃澘闃舵鏄剧ず瀵硅薄
 	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
 	 */
-	CodeTemplatePhaseVO getObjectByOid(String oid) throws VciBaseException;
+	CodeTemplatePhaseEntityVO getObjectByOid(String oid) throws VciBaseException;
 
 	/**
 	 * 涓婚敭鎵归噺鑾峰彇妯℃澘闃舵
@@ -117,7 +117,7 @@
 	 * @return 妯℃澘闃舵鏄剧ず瀵硅薄
 	 * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
 	 */
-	Collection<CodeTemplatePhaseVO> listCodeTemplatePhaseByOids(Collection<String> oidCollections) throws VciBaseException;
+	Collection<CodeTemplatePhaseEntityVO> listCodeTemplatePhaseByOids(Collection<String> oidCollections) throws VciBaseException;
 
 	/**
 	 * 鍙傜収妯℃澘闃舵鍒楄〃
@@ -126,7 +126,7 @@
 	 * @return 妯℃澘闃舵鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
 	 * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
-	DataGrid<CodeTemplatePhaseVO> refDataGridCodeTemplatePhase(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+	DataGrid<CodeTemplatePhaseEntityVO> refDataGridCodeTemplatePhase(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
 
 	/**
 	 * 闃舵涓嶅寘鍚殑灞炴��
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeWupinService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeWupinService.java
new file mode 100644
index 0000000..3eb30ee
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeWupinService.java
@@ -0,0 +1,43 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.code.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.vo.CodeWupinVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 缂栫爜淇℃伅 鏈嶅姟绫�
+ *
+ * @author yuxc
+ * @since 2023-05-05
+ */
+public interface ICodeWupinService extends IService<CodeWupinEntity> {
+
+	/**
+	 * 鑷畾涔夊垎椤�
+	 *
+	 * @param page
+	 * @param codeWupin
+	 * @return
+	 */
+	IPage<CodeWupinVO> selectCodeWupinPage(IPage<CodeWupinVO> page, CodeWupinVO codeWupin);
+
+
+}
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
new file mode 100644
index 0000000..55ce208
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
@@ -0,0 +1,63 @@
+package com.vci.ubcs.code.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
+import com.vci.ubcs.code.entity.CodeAllCode;
+import com.vci.ubcs.code.entity.CodeRule;
+import com.vci.ubcs.code.vo.CodeClstempattrVO;
+import com.vci.ubcs.code.vo.CodeClstemplateVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
+import com.vci.ubcs.starter.web.pagemodel.KeyValue;
+
+import java.util.List;
+
+/**
+ * 涓绘暟鎹紩鎿庢湇鍔�
+ * @author weidy
+ * @date 2022-2-21
+ */
+public interface MdmEngineService extends IService<CodeAllCode> {
+	/**
+	 * 浣跨敤鍒嗙被鐨勪富閿幏鍙栧彲浠ヤ娇鐢ㄧ殑妯℃澘瀵硅薄
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid);
+
+	/**
+	 * 浣跨敤鍒嗙被鐨勪富閿幏鍙栧彲浠ヤ娇鐢ㄧ殑妯℃澘瀵硅薄
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param hasAttr 鍖呭惈灞炴��
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid, boolean hasAttr);
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勪笅鎷夐�夐」
+	 * @param attrVO 妯℃澘灞炴�х殑瀵硅薄
+	 * @return 涓嬫媺閫夐」
+	 */
+	List<KeyValue> listComboboxItems(CodeClstempattrVO attrVO);
+
+	/**
+	 * 淇敼鐘舵��
+	 * @param baseModelDTO 鏁版嵁浼犺緭瀵硅薄
+	 */
+	void changeStatus(BaseModelDTO baseModelDTO);
+
+	/**
+	 * 鐢宠鍗曚竴缂栫爜
+	 * @param orderDTO 鐢宠鐨勪俊鎭紝闇�瑕佸寘鍚睘鎬х殑鍐呭鍜岀爜娈电浉鍏崇殑鍐呭
+	 * @return 杩斿洖缂栫爜鐨勫唴瀹�
+	 */
+	String addSaveCode(CodeOrderDTO orderDTO);
+
+	/**
+	 * 鍒ゆ柇缂栫爜鐨勭爜娈垫槸鍚﹁緭鍏ユ垨鑰呴�夋嫨浜嗙爜鍊�
+	 * @param ruleVO 瑙勫垯鐨勬樉绀哄璞�
+	 * @param orderDTO 缂栫爜鐢宠鐨勫唴瀹�
+	 */
+	void checkSecValueOnOrder(CodeRuleVO ruleVO, CodeOrderDTO orderDTO);
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java
new file mode 100644
index 0000000..784ba90
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java
@@ -0,0 +1,25 @@
+package com.vci.ubcs.code.service;
+
+import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.vo.pagemodel.CodeImProtRusultVO;
+
+import java.io.File;
+
+public interface MdmIOService {
+
+	/**
+	 * 鐢熸垚瀵煎叆鐨勬枃浠�
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param isHistory 鏄惁鍘嗗彶鏁版嵁瀵煎叆
+	 * @return excel鐨勬枃浠跺湴鍧�
+	 */
+	String createImportExcel(String codeClassifyOid,boolean isHistory);
+
+	/**
+	 * 鎵归噺鐢宠缂栫爜鏁版嵁
+	 * @param orderDTO 缂栫爜鐢宠淇℃伅锛屽繀椤诲寘鍚垎绫讳富閿拰鐮佹鐨勪俊鎭�
+	 * @param file excel鏂囦欢鐨勪俊鎭�
+	 * @return 鏈夐敊璇俊鎭殑excel
+	 */
+	CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file);
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java
new file mode 100644
index 0000000..4136658
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java
@@ -0,0 +1,23 @@
+package com.vci.ubcs.code.service;
+
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
+import com.vci.ubcs.code.dto.CodeOrderSecDTO;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.vo.CodeClstemplateVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
+
+import java.util.List;
+
+public interface MdmProductCodeService {
+	/**
+	 * 鐢熸垚缂栫爜--骞朵笖淇濆瓨鏁版嵁-鏂规硶鍔犻攣锛屽洜姝や笉鑳借繑鍥瀊atchCBO
+	 * @param classifyFullInfoBO 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
+	 * @param ruleVO 缂栫爜瑙勫垯鐨勬樉绀哄璞�
+	 * @param secDTOList 鍚勪釜鐮佹鐨勫��
+	 * @param dataCBOList 涓氬姟鏁版嵁
+	 */
+	List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClstemplateVO templateVO,
+										CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<CodeWupinEntity> dataCBOList);
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
index d6584b6..fef2e76 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.alibaba.cloud.commons.lang.StringUtils;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -17,8 +18,10 @@
 import com.vci.ubcs.code.mapper.CodeFixedValueMapper;
 import com.vci.ubcs.code.service.ICodeBasicSecService;
 import com.vci.ubcs.code.service.ICodeClassifyValueService;
+import com.vci.ubcs.code.service.ICodeFixedValueService;
 import com.vci.ubcs.code.service.ICodeRuleService;
 import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeFixedValueVO;
 import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
 import com.vci.ubcs.code.wrapper.CodeBasicSecWrapper;
 import com.vci.ubcs.starter.exception.VciBaseException;
@@ -34,6 +37,7 @@
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -81,6 +85,12 @@
 
 	@Resource
 	private IDictBizClient iDictBizClient;
+
+	/**
+	 * 鍥哄畾鐮佹鐨勭爜鍊肩殑鏈嶅姟
+	 */
+	@Resource
+	private ICodeFixedValueService fixedValueService;
 
 	/**
 	 * 涓婂眰鍒嗙被鐮佹鐨勫睘鎬у悕绉�
@@ -672,4 +682,77 @@
 		return codeBasicSecDO;
 	}
 
+
+	/**
+	 * 浣跨敤瑙勫垯鐨勪富閿幏鍙栧搴旂殑鐮佹鍐呭
+	 *
+	 * @param ruleOid 瑙勫垯鐨勫唴瀹�
+	 * @return 鐮佹鐨勫唴瀹�
+	 */
+	@Override
+	public List<CodeBasicSecVO> listCodeBasicSecByRuleOid(String ruleOid) {
+		if(StringUtils.isBlank(ruleOid)){
+			return new ArrayList<>();
+		}
+		Map<String,String> conditionMap = new HashMap<>();
+		conditionMap.put("pkCodeRule",ruleOid);
+//		PageHelper pageHelper = new PageHelper(-1);
+//		pageHelper.addDefaultAsc("ordernum");
+		QueryWrapper<CodeBasicSec> wrapper = new QueryWrapper<>();
+		wrapper.orderByAsc("ordernum");
+		List<CodeBasicSec> secDOList = codeBasicSecMapper.selectList(wrapper);//.selectByCondition(conditionMap, pageHelper);
+		return codeBasicSecDO2VOs(secDOList,true);
+	}
+
+	/**
+	 * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param codeBasicSecDOs 鏁版嵁瀵硅薄鍒楄〃
+	 * @param hasFixedValue 鏄惁鏈夊浐瀹氬��
+	 * @return 鏄剧ず瀵硅薄
+	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<CodeBasicSecVO> codeBasicSecDO2VOs(Collection<CodeBasicSec> codeBasicSecDOs, boolean hasFixedValue) throws VciBaseException {
+		List<CodeBasicSecVO> voList = new ArrayList<CodeBasicSecVO>();
+		if (!CollectionUtils.isEmpty(codeBasicSecDOs)) {
+			for (CodeBasicSec s : codeBasicSecDOs) {
+				CodeBasicSecVO vo = codeBasicSecDO2VO(s);
+				if (vo != null) {
+					voList.add(vo);
+				}
+			}
+		}
+		if(hasFixedValue && !CollectionUtils.isEmpty(voList)){
+			List<CodeBasicSecVO> fixedSecVOList = voList.stream().filter(s -> CodeSecTypeEnum.CODE_FIXED_SEC.getValue().equalsIgnoreCase(s.getSecType())).collect(Collectors.toList());
+			if(!CollectionUtils.isEmpty(fixedSecVOList)){
+				//鏌ヨ鍥哄畾鐮佺殑鐮佸��
+				Map<String, List<CodeFixedValueVO>> secValueMap = fixedValueService.listCodeFixedValueBySecOids(fixedSecVOList.stream().map(CodeBasicSecVO::getOid).collect(Collectors.toList()));
+				voList.stream().forEach(vo->{
+					vo.setFixedValueVOList(secValueMap.getOrDefault(vo.getOid(),null));
+				});
+			}
+		}
+		return voList;
+	}
+
+	/**
+	 * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param codeBasicSecDO 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public CodeBasicSecVO codeBasicSecDO2VO(CodeBasicSec codeBasicSecDO) throws VciBaseException {
+		CodeBasicSecVO vo = new CodeBasicSecVO();
+		if (codeBasicSecDO != null) {
+			BeanUtilForVCI.copyPropertiesIgnoreCase(codeBasicSecDO, vo);
+			//濡傛灉鏈塴cstatus鐨勭被鐨勮瘽
+			if (true) {
+				//vo.setLcStatusText({lcStatusFullClassName}.getTextByValue(vo.getLcStatus()));
+			}
+		}
+		return vo;
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyProcessTempServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyProcessTempServiceImpl.java
index f8f8a53..dd76b88 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyProcessTempServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyProcessTempServiceImpl.java
@@ -2,29 +2,24 @@
 
 import com.alibaba.cloud.commons.lang.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vci.ubcs.code.dto.CodeClassifyProcessTempDTO;
-import com.vci.ubcs.code.entity.CodeClassify;
 import com.vci.ubcs.code.entity.CodeClassifyProcessTemp;
-import com.vci.ubcs.code.mapper.CodeClassifyMapper;
 import com.vci.ubcs.code.mapper.CodeClassifyProcessTempMapper;
-import com.vci.ubcs.code.mapper.CodeClassifyTemplateAttrMapper;
 import com.vci.ubcs.code.service.ICodeClassifyProcessTempService;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyProcessTempVO;
+import com.vci.ubcs.code.wrapper.CodeClassifyProcessTempWrapper;
 import com.vci.ubcs.common.utils.PageDO2PageVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
-import com.vci.ubcs.starter.web.pagemodel.DataGrid;
+import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
 import com.vci.ubcs.starter.web.pagemodel.PageHelper;
 import com.vci.ubcs.starter.web.util.BeanUtil;
 import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
-import com.vci.ubcs.starter.web.wrapper.VciQueryWrapperForDO;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -86,7 +81,7 @@
 		IPage<CodeClassifyProcessTempVO> pageList = new Page<CodeClassifyProcessTempVO>();
 		//DataGrid<CodeClassifyProcessTempVO> dataGrid=new DataGrid<>();
 		if (!CollectionUtils.isEmpty(doList.getRecords())) {
-			pageList.setRecords(codeClassifyProcessTempDO2VOs(doList.getRecords()));
+			pageList.setRecords(CodeClassifyProcessTempWrapper.build().listVO(doList.getRecords()));
 			//鍒嗛〉鍙傛暟杞埌pageVO瀵硅薄
 			pageList = PageDO2PageVO.pageDO2PageVO(doList,pageList);
 		}
@@ -139,8 +134,8 @@
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	public CodeClassifyProcessTempVO addSave(CodeClassifyProcessTempDTO codeClassifyProcessTempDTO) throws VciBaseException{
-		VciBaseUtil.alertNotNull(codeClassifyProcessTempDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄",codeClassifyProcessTempDTO.getProcessVersion(),"娴佺▼妯℃澘鐨勭増鏈彿",codeClassifyProcessTempDTO.getCodeprocessuse(),"妯℃澘娴佺▼鐨勭敤閫�");
-		if (StringUtils.isBlank(codeClassifyProcessTempDTO.getCodeprocessuse())){
+		VciBaseUtil.alertNotNull(codeClassifyProcessTempDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄",codeClassifyProcessTempDTO.getProcessVersion(),"娴佺▼妯℃澘鐨勭増鏈彿",codeClassifyProcessTempDTO.getCodeProcessUse(),"妯℃澘娴佺▼鐨勭敤閫�");
+		if (StringUtils.isBlank(codeClassifyProcessTempDTO.getCodeProcessUse())){
 			throw new VciBaseException("妯℃澘娴佺▼鐢ㄩ�斾笉鑳戒负绌�");
 		}
 		Long count = countProcessTemplate(codeClassifyProcessTempDTO);
@@ -150,10 +145,11 @@
 		//灏咲TO杞崲涓篋O
 		CodeClassifyProcessTemp codeClassifyProcessTempDO = new CodeClassifyProcessTemp();
 		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyProcessTempDTO,codeClassifyProcessTempDO);
+		codeClassifyProcessTempDO = DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeClassifyProcessTempDO,"codeclsflowtemp");
 		codeClassifyProcessTempMapper.insert(codeClassifyProcessTempDO);
 		//鍥犱负涓氬姟绫诲瀷鏈韩娌℃湁鎺у埗鐗堟湰锛屾墍鏈夊己鍒剁粰鐗堟湰revisionValue璁剧疆鍊硷紝骞冲彴涔熶細鍙樻垚绌恒�傘�傘�傘��
 		//鐗堟湰鍙蜂笉鑳戒娇鐢ㄩ粯璁ょ殑灞炴��
-		return codeClassifyProcessTempDO2VO(codeClassifyProcessTempDO);
+		return CodeClassifyProcessTempWrapper.build().entityVO(codeClassifyProcessTempDO);
 	}
 
 	/**
@@ -169,8 +165,9 @@
 		//灏咲TO杞崲涓篋O
 		CodeClassifyProcessTemp codeClassifyProcessTempDO = selectByOid(codeClassifyProcessTempDTO.getOid());
 		revisionModelUtil.copyFromDTOIgnore(codeClassifyProcessTempDTO,codeClassifyProcessTempDO);
+		codeClassifyProcessTempDO = DefaultAttrAssimtUtil.updateDefaultAttrAssimt(codeClassifyProcessTempDO);
 		codeClassifyProcessTempMapper.updateById(codeClassifyProcessTempDO);
-		return codeClassifyProcessTempDO2VO(codeClassifyProcessTempDO);
+		return CodeClassifyProcessTempWrapper.build().entityVO(codeClassifyProcessTempDO);
 	}
 
 	/**
@@ -185,7 +182,7 @@
 		VciBaseUtil.alertNotNull(codeClassifyProcessTempDTO,"鍒嗙被浣跨敤鐨勬祦绋嬫ā鏉挎暟鎹璞�",codeClassifyProcessTempDTO.getOid(),"鍒嗙被浣跨敤鐨勬祦绋嬫ā鏉跨殑涓婚敭");
 		CodeClassifyProcessTemp codeClassifyProcessTempDO = selectByOid(codeClassifyProcessTempDTO.getOid());
 		R baseResult = checkIsCanDeleteForDO(codeClassifyProcessTempDTO,codeClassifyProcessTempDO);
-		if(!baseResult.isSuccess()) {
+		if(baseResult.isSuccess()) {
 		}else{
 			return baseResult;
 		}
@@ -202,7 +199,7 @@
 	 */
 	@Override
 	public  CodeClassifyProcessTempVO getObjectByOid(String oid) throws VciBaseException{
-		return codeClassifyProcessTempDO2VO(selectByOid(oid));
+		return CodeClassifyProcessTempWrapper.build().entityVO((selectByOid(oid)));
 	}
 
 	/**
@@ -215,7 +212,7 @@
 	public Collection<CodeClassifyProcessTempVO> listCodeClassifyProcessTempByOids(Collection<String> oidCollections) throws VciBaseException{
 		VciBaseUtil.alertNotNull(oidCollections,"鏁版嵁瀵硅薄涓婚敭闆嗗悎");
 		List<CodeClassifyProcessTemp> codeClassifyProcessTempDOList = listCodeClassifyProcessTempDOByOidCollections(oidCollections);
-		return codeClassifyProcessTempDO2VOs(codeClassifyProcessTempDOList);
+		return CodeClassifyProcessTempWrapper.build().listVO(codeClassifyProcessTempDOList);
 	}
 
 	/**
@@ -252,7 +249,7 @@
 		LambdaQueryWrapper<CodeClassifyProcessTemp> wrapper = Wrappers.<CodeClassifyProcessTemp>query()
 			.lambda().eq(CodeClassifyProcessTemp::getClassifyTemplateOid, codeTemplateOid)
 			.eq(CodeClassifyProcessTemp::getCodeProcessUse, processUse);
-		return codeClassifyProcessTempDO2VOs(codeClassifyProcessTempMapper.selectList(wrapper));
+		return CodeClassifyProcessTempWrapper.build().listVO(codeClassifyProcessTempMapper.selectList(wrapper));
 	}
 
 	/**
@@ -263,7 +260,7 @@
 	@Override
 	public List<CodeClassifyProcessTempVO> selectByWrapper(LambdaQueryWrapper<CodeClassifyProcessTemp> queryWrapper) {
 		List<CodeClassifyProcessTemp> codeClassifyProcessTempDOList= codeClassifyProcessTempMapper.selectList(queryWrapper);
-		return codeClassifyProcessTempDO2VOs(codeClassifyProcessTempDOList);
+		return CodeClassifyProcessTempWrapper.build().listVO(codeClassifyProcessTempDOList);
 	}
 
 	/**
@@ -295,7 +292,7 @@
 	private R checkIsCanDeleteForDO(CodeClassifyProcessTempDTO codeClassifyProcessTempDTO, CodeClassifyProcessTemp codeClassifyProcessTempDO) {
 		CodeClassifyProcessTemp tempDO = new CodeClassifyProcessTemp();
 		BeanUtil.convert(codeClassifyProcessTempDTO,tempDO);
-		if (!checkTs(tempDO)) {
+		if (!checkTs(tempDO,codeClassifyProcessTempDO)) {
 			return R.fail(TS_NOT_PROCESS);
 		}
 		if(!checkIsLinked(codeClassifyProcessTempDO.getOid())) {
@@ -310,12 +307,11 @@
 	 * @param tempDO
 	 * @return
 	 */
-	private boolean checkTs(CodeClassifyProcessTemp tempDO){
-		LambdaQueryWrapper<CodeClassifyProcessTemp> wrapper = Wrappers.<CodeClassifyProcessTemp>query()
-			.lambda().eq(CodeClassifyProcessTemp::getOid,tempDO.getOid()).select(CodeClassifyProcessTemp::getTs);
-		long dbTs = codeClassifyProcessTempMapper.selectById(wrapper).getTs().getTime();
-		long currentTs = tempDO.getTs().getTime();
-		if(dbTs == currentTs){
+	private boolean checkTs(CodeClassifyProcessTemp tempDO, CodeClassifyProcessTemp codeClassifyProcessTempDO){
+		Date dbTs = codeClassifyProcessTempDO.getTs();
+		Date currentTs = tempDO.getTs();
+		int i = currentTs.compareTo(dbTs);
+		if(i==0){
 			return true;
 		}
 		return false;
@@ -357,7 +353,7 @@
 			throw new VciBaseException("妯℃澘娴佺▼鍚嶇О涓嶈兘涓虹┖");
 		}
 		LambdaQueryWrapper<CodeClassifyProcessTemp> wrapper = Wrappers.<CodeClassifyProcessTemp>query()
-			.lambda().eq(CodeClassifyProcessTemp::getCodeProcessUse, codeClassifyProcessTempDTO.getCodeprocessuse())
+			.lambda().eq(CodeClassifyProcessTemp::getCodeProcessUse, codeClassifyProcessTempDTO.getCodeProcessUse())
 			.eq(CodeClassifyProcessTemp::getClassifyTemplateOid, codeClassifyProcessTempDTO.getClassifyTemplateOid())
 			.eq(CodeClassifyProcessTemp::getId, codeClassifyProcessTempDTO.getId());
 		Long count = codeClassifyProcessTempMapper.selectCount(wrapper);
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
index 702a980..2a6a165 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.entity.CodeClassify;
 import com.vci.ubcs.code.entity.CodeClstemplateEntity;
 import com.vci.ubcs.code.entity.CodeOsbtmtypeEntity;
@@ -74,6 +75,8 @@
 	private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
 	@Resource
 	CodeOsbtmtypeattributeMapper codeOsbtmtypeattributeMapper;
+	@Resource
+	ICodeRuleService ICodeRuleService;
 
 	/**
 	 * 鏃ュ織
@@ -251,7 +254,7 @@
 		if(StringUtils.isBlank(oid)){
 			throw new ServiceException("oid涓嶈兘涓虹┖锛�");
 		}
-		return codeClassifyMapper.checkHasChild(oid.trim());
+		return !codeClassifyMapper.checkHasChild(oid.trim());
 	}
 
 
@@ -297,7 +300,8 @@
 					//2銆佹煡璇㈣鍒犻櫎鐨勫瓙绫绘暟鎹�
 					List<CodeClassify>  codeClassifyDOList = codeClassifyMapper.selectBatchIds(s);
 					deletes.addAll(codeClassifyDOList);
-					codeClassifyMapper.deleteBatchIds(s);
+//					codeClassifyMapper.deleteBatchIds(s);
+					baseMapper.deleteBatchIds(s);
 				}
 
 			}
@@ -951,6 +955,17 @@
 	}
 
 	/**
+	 * 涓婚敭鑾峰彇涓婚搴撳垎绫�
+	 * @param oid 涓婚敭
+	 * @return 涓婚搴撳垎绫绘樉绀哄璞�
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+	 */
+	@Override
+	public  CodeClassifyVO getObjectByOid(String oid) throws VciBaseException{
+		return codeClassifyDO2VO(selectByOid(oid));
+	}
+
+	/**
 	 * 浣跨敤缂栧彿鐨勮矾寰勮幏鍙栧璞�
 	 *
 	 * @param idPath 缂栧彿鐨勮矾寰勶紝涓�瀹氳浠庢渶椤跺眰鑺傜偣寮�濮嬶紝鏍煎紡涓簒xx/yyy/zz 杩欐牱
@@ -1021,4 +1036,32 @@
 		}
 		return oidList;
 	}
+
+	/**
+	 * 浣跨敤鍒嗙被涓婚敭鑾峰彇鍒嗙被鐩稿叧鐨勬墍鏈変俊鎭�
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @return 鍒嗙被涓婄骇锛屼笅绾х殑淇℃伅
+	 */
+	@Override
+	public CodeClassifyFullInfoBO getClassifyFullInfo(String codeClassifyOid) {
+		VciBaseUtil.alertNotNull(codeClassifyOid,"鍒嗙被鐨勪富閿�");
+		CodeClassifyFullInfoBO fullInfo = new CodeClassifyFullInfoBO();
+		CodeClassify classifyDO = selectByOid(codeClassifyOid);
+		//鏌ヨ涓婄骇
+		fullInfo.setCurrentClassifyVO(codeClassifyDO2VO(classifyDO));
+		List<Map<String, Object>> maps = codeClassifyMapper.selectAllLevelParentByOid(codeClassifyOid);
+		List<CodeClassify> codeClassifyList = new ArrayList<>();
+		for (Map<String, Object> map : maps) {
+			CodeClassify codeClassify = new CodeClassify();
+			codeClassify.setOid(String.valueOf(map.get("OID")));
+			codeClassify.setOid(String.valueOf(map.get("LEVEL")));
+			codeClassifyList.add(codeClassify);
+		}
+		fullInfo.setParentClassifyVOs(codeClassifyDO2VOs(codeClassifyList));
+		if(!CollectionUtils.isEmpty(fullInfo.getParentClassifyVOs())){
+			fullInfo.setTopClassifyVO(fullInfo.getParentClassifyVOs().stream().filter(s->StringUtils.isBlank(s.getParentcodeclassifyoid())).findFirst().orElseGet(()->null));
+		}
+		return fullInfo;
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
index 0a05198..eaf2cf6 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
@@ -1,17 +1,11 @@
 package com.vci.ubcs.code.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vci.ubcs.code.entity.CodeClassifyTemplateAttr;
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
 import com.vci.ubcs.code.mapper.CodeClassifyTemplateAttrMapper;
-import com.vci.ubcs.code.mapper.CodeClassifyTemplateButtonMapper;
-import com.vci.ubcs.code.mapper.CodeTemplatePhaseMapper;
 import com.vci.ubcs.code.service.ICodeClassifyTemplateAttrService;
-import com.vci.ubcs.code.service.ICodeTempphaseService;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
@@ -21,12 +15,10 @@
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
-import org.springframework.cglib.beans.BeanMap;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.sql.Wrapper;
 import java.util.*;
 
 /**
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 ab690db..b863b7f 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
@@ -17,8 +17,10 @@
 package com.vci.ubcs.code.service.impl;
 
 import com.alibaba.nacos.api.utils.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
 import com.vci.ubcs.code.dto.CodeClstemplateDTO;
 import com.vci.ubcs.code.entity.*;
 import com.vci.ubcs.code.enumpack.CodeClassifyTemplateLC;
@@ -91,7 +93,9 @@
 	@Autowired(required = false)
 	private CodeClassifyTemplateButtonMapper codeTempbuttonMapper;
 	@Autowired(required = false)
-	private CodePhaseAttrMapper codePhaseattrMapper;
+	private CodePhaseattrMapper codePhaseattrMapper;
+	@Autowired(required = false)
+	private CodeClassifyMapper codeClassifyMapper;
 	@Autowired(required = false)
 	private ICodeClassifyService codeClassifyService;
 	@Autowired(required = false)
@@ -484,34 +488,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);
@@ -548,15 +552,15 @@
 		//澶嶅埗妯℃澘闃舵锛岄樁娈靛睘鎬�
 		Map phase_attrMap = copyTemplatePhase_attr(templateOldOid,templateNewOid);
 
-		List<CodeTemplatePhase> codeClassifyPhaseDOList = (ArrayList<CodeTemplatePhase>)phase_attrMap.get("phase");//妯℃澘闃舵
-		List<CodePhaseAttr> codePhaseAttrDOList = (ArrayList<CodePhaseAttr>)phase_attrMap.get("phaseAttr");//闃舵灞炴��
+		List<CodeTempphaseEntity> codeClassifyPhaseDOList = (ArrayList<CodeTempphaseEntity>)phase_attrMap.get("phase");//妯℃澘闃舵
+		List<CodePhaseattrEntity> codePhaseAttrDOList = (ArrayList<CodePhaseattrEntity>)phase_attrMap.get("phaseAttr");//闃舵灞炴��
 
 		//澶嶅埗妯℃澘鎸夐挳
 		List<CodeClassifyTemplateButton> codeClassifyTemplateButtonDOList = copyTemplateButton(templateOldOid,templateNewOid);
 
 		//涓�璧蜂繚瀛樻暟鎹�
 //		WebUtil.setPersistence(false);//涓嶆墽琛屼繚瀛�
-		//淇濆瓨妯℃澘
+		//淇濆瓨妯℃澘鈥斺��
 //		BatchCBO batchCBOTemplate = new BatchCBO();
 		//batchCBO淇濆瓨鐨勬椂鍊欐病鏈夎兘澶熻嚜鍔╱pdate婧愭暟鎹殑isLastR
 		//batchCBOTemplate.getCreateCbos().add(clientBusinessObject_template_insert);
@@ -651,8 +655,8 @@
 		//澶嶅埗妯℃澘闃舵锛岄樁娈靛睘鎬�
 		Map  phase_attrMap = copyTemplatePhase_attr(oldOid,newOid);
 
-		List<CodeTemplatePhase> codeClassifyPhaseDOList = (ArrayList<CodeTemplatePhase>)phase_attrMap.get("phase");//妯℃澘闃舵
-		List<CodePhaseAttr> codePhaseAttrDOList = (ArrayList<CodePhaseAttr>)phase_attrMap.get("phaseAttr");//闃舵灞炴��
+		List<CodeTempphaseEntity> codeClassifyPhaseDOList = (ArrayList<CodeTempphaseEntity>)phase_attrMap.get("phase");//妯℃澘闃舵
+		List<CodePhaseattrEntity> codePhaseAttrDOList = (ArrayList<CodePhaseattrEntity>)phase_attrMap.get("phaseAttr");//闃舵灞炴��
 
 		//澶嶅埗妯℃澘鎸夐挳
 		List<CodeClassifyTemplateButton> codeClassifyTemplateButtonDOList = copyTemplateButton(oldOid,newOid);
@@ -754,11 +758,11 @@
 //		phaseWrapper.addQueryMap("codeClassifyTemplateOid",templateOldOid);
 		Map<String,Object> condition = new HashMap<>(1);
 		condition.put("codeclassifyTemplateOid",templateOldOid);
-		List<CodeTemplatePhase> codeTempphaseEntities = codeTempphaseMapper.selectByMap(condition);
+		List<CodeTempphaseEntity> codeTempphaseEntities = codeTempphaseMapper.selectByMap(condition);
 //		List<CodeTemplatePhaseDO>  codeClassifyPhaseDOList = codeTemplatePhaseDaoI.selectByWrapper(phaseWrapper);//瑕佷繚瀛樼殑鏂扮殑妯℃澘娴佺▼
 		Map<String,String> phaseKeyMap = new HashMap<String,String>();//闇�瑕佸鍒剁殑妯℃澘闃舵灞炴��,key:value,妯℃澘闃舵鑰乷id:妯℃澘灞炴�ф柊oid
 		List<String> phaseOidList = new ArrayList<String>();
-		for (CodeTemplatePhase codeTemplatePhaseDO:codeTempphaseEntities){
+		for (CodeTempphaseEntity codeTemplatePhaseDO:codeTempphaseEntities){
 			String oldoid = codeTemplatePhaseDO.getOid();
 			String newOid = VciBaseUtil.getPk();
 			codeTemplatePhaseDO.setOid(newOid);
@@ -768,7 +772,7 @@
 		}
 
 		//妯℃澘闃舵鐨勫睘鎬�
-		List<CodePhaseAttr> codePhaseAttrDOList = new ArrayList<CodePhaseAttr>();
+		List<CodePhaseattrEntity> codePhaseAttrDOList = new ArrayList<CodePhaseattrEntity>();
 
 		if(!CollectionUtils.isEmpty(phaseOidList)){//size()==0涓嬭竟鏂规硶浼氭姤閿�
 //			Map<String,String> conditionMap =  new HashMap<>();
@@ -776,7 +780,7 @@
 //			codePhaseAttrDOList = codePhaseAttrDaoI.selectByCondition(conditionMap,new PageHelper(-1));
 			codePhaseAttrDOList = codePhaseattrMapper.selectByPhaseaIds(VciBaseUtil.toInSql(phaseOidList.toArray(new String[0])));
 		}
-		for (CodePhaseAttr codePhaseAttrDO:codePhaseAttrDOList){
+		for (CodePhaseattrEntity codePhaseAttrDO:codePhaseAttrDOList){
 			String oldPhaseoid = codePhaseAttrDO.getCodePhaseOid();
 //			String newOid = VciBaseUtil.getPk();
 			codePhaseAttrDO.setOid(null);
@@ -817,11 +821,13 @@
 //		VciQueryWrapperForDO codeClassifyTemplateAttrQuery = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
 //		codeClassifyTemplateAttrQuery.addQueryMap("classifyTemplateOid",templateOldOid);
 
-		Map<String,Object> condition = new HashMap<>(1);
-		condition.put("classifyTemplateOid",templateOldOid);
+//		Map<String,Object> condition = new HashMap<>(1);
+//		condition.put("classifyTemplateOid",templateOldOid);
+		QueryWrapper<CodeClstempattrEntity> wrapper=new QueryWrapper<>();
+		wrapper.eq("classifyTemplateOid",templateOldOid);
 
 //		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = codeClassifyTemplateAttrDaoI.selectByWrapper(codeClassifyTemplateAttrQuery);
-		List<CodeClstempattrEntity> codeClstempattrEntities = codeClstempattrMapper.selectByMap(condition);
+		List<CodeClstempattrEntity> codeClstempattrEntities = codeClstempattrMapper.selectList(wrapper);
 
 		for (CodeClstempattrEntity codeClassifyTemplateAttrDO :codeClstempattrEntities){
 //			String attrOid = VciBaseUtil.getPk();
@@ -1003,7 +1009,7 @@
 //			condition.put("ts",codeClassifyTemplateDOCopyFromDTO.getTs());
 			CodeClstemplateEntity 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("褰撳墠鏁版嵁涓嶆槸鏈�鏂帮紝璇峰埛鏂板悗鍐嶄慨鏀癸紒");
 			}
@@ -1029,4 +1035,120 @@
 		return R.data(codeClassifyTemplateDO2VO(codeClassifyTemplateDO));
 	}
 
+	/**
+	 *鏍规嵁鐖跺垎绫籭d鍘绘煡鎵惧彾瀛愯妭鐐圭殑妯℃澘锛屽鏋滄病鏌ュ埌鍒欒涓烘ā鏉垮湪涓婂眰寤虹珛锛屽垯鏍规嵁鍒嗙被鍘绘煡褰撳墠妯℃澘
+	 * @param codeClassifyOid 鐖跺垎绫荤殑涓婚敭
+	 * @return
+	 */
+	@Override
+	public List<CodeClstemplateVO> childTemplates(String codeClassifyOid){
+		List<CodeClstemplateVO> codeClassifyTemplateVOList=new ArrayList<>();
+//		Map<String/**妯℃澘鐨勪富閿�**/,String/**鍒嗙被鐨勪富閿�**/> childHasTemplateMap =baseMapper
+//			.selectChildHasReleaseTemplate(FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED,
+//				codeClassifyOid,CodeClassifyTemplateLC.RELEASED.getValue());
+		List<Map<String,String>> childHasTemplateList =baseMapper
+			.selectChildHasReleaseTemplate(FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED,
+				codeClassifyOid,CodeClassifyTemplateLC.RELEASED.getValue());
+		Map<String/**妯℃澘鐨勪富閿�**/,String/**鍒嗙被鐨勪富閿�**/> childHasTemplateMap = new HashMap<>();
+		if(!CollectionUtils.isEmpty(childHasTemplateList)){
+			childHasTemplateList.stream().forEach(cbo->{
+				childHasTemplateMap.put(cbo.get("OID"),cbo.get("CLSOID"));
+			});
+		}
+
+		Set<String> templateOid = childHasTemplateMap.keySet();
+		List<CodeClstemplateEntity>  classifyTemplateDOS=new ArrayList<>();
+		if(!CollectionUtils.isEmpty(templateOid)) {
+			classifyTemplateDOS= this.listCodeClassifyTemplateDOByOidCollections(templateOid);
+		}else{
+			classifyTemplateDOS=selectOnlyTemplateByClassifyOid(codeClassifyOid);
+		}
+		List<CodeClstemplateVO> templateVOList = codeClassifyTemplateDO2VOs(classifyTemplateDOS, true);
+		if(!CollectionUtils.isEmpty(templateVOList)){
+			codeClassifyTemplateVOList.addAll(templateVOList);
+		}
+		return codeClassifyTemplateVOList;
+	}
+
+
+	/**
+	 * 浣跨敤鍒嗙被涓婚敭閫掑綊鏌ヨ
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @return 妯℃澘鐨勬暟鎹璞�
+	 */
+	private List<CodeClstemplateEntity> selectOnlyTemplateByClassifyOid(String codeClassifyOid){
+		//1.鐩存帴鏌ヨ锛岀湅鐪嬭繖涓垎绫讳笅闈㈡湁娌℃湁鍙戝竷鐘舵�佺殑妯℃澘
+		//2.濡傛灉娌℃湁锛屽垯寰�涓婃壘鍒嗙被鐨勫唴瀹癸紝杩欎釜鍒嗙被灞傜骇涓嶄細澶锛屾墍浠ョ洿鎺ラ�掑綊鍗冲彲
+		//3.濡傛灉鍒嗙被涓嬮潰娣诲姞浜嗘ā鏉匡紝浣嗘槸娌℃湁鍙戝竷锛屽垯璇存槑妯℃澘鍙兘杩樺湪缂栬緫鐨勭姸鎬侊紝渚濈劧浣跨敤涓婄骇鍒嗙被
+
+//		Map<String,String> conditionMap = new HashMap<>();
+//		conditionMap.put("codeClassifyOid",codeClassifyOid);
+//		conditionMap.put("lcstatus",CodeClassifyTemplateLC.RELEASED.getValue());
+		QueryWrapper<CodeClstemplateEntity> wrapper=new QueryWrapper<>();
+		wrapper.eq("codeClassifyOid",codeClassifyOid)
+			.eq("lcstatus",CodeClassifyTemplateLC.RELEASED.getValue());
+
+		List<CodeClstemplateEntity> templateDOS = baseMapper.selectList(wrapper);
+		if(CollectionUtils.isEmpty(templateDOS)){
+			//閫掑綊鎵句笂绾х殑妯℃澘
+			CodeClassify classifyDO = codeClassifyMapper.selectById(codeClassifyOid);
+//				codeClassifyDaoI.selectByPrimaryKey(codeClassifyOid);
+			if(StringUtils.isBlank(classifyDO.getParentCodeClassifyOid())){
+				//璇存槑宸茬粡鏄《浜嗭紝涔熸病鎵惧埌鐨勮瘽锛岄偅灏辫繑鍥炰簡
+				return null;
+			}
+			return selectOnlyTemplateByClassifyOid(classifyDO.getParentCodeClassifyOid());
+		}else{
+			return templateDOS;
+		}
+	}
+
+	/**
+	 * 浣跨敤涓婚搴撶殑鍒嗙被涓婚敭锛岃幏鍙栫敓鏁堢殑妯℃澘
+	 *
+	 * @param codeClassifyOid 涓婚搴撳垎绫讳富閿�
+	 * @param hasAttribute    鏄惁鍖呭惈灞炴��
+	 * @return 妯℃澘鐨勪俊鎭�
+	 */
+	@Override
+	public List<CodeClstemplateVO> listReleaseTemplateByClassifyOid(String codeClassifyOid, boolean hasAttribute) {
+		VciBaseUtil.alertNotNull(codeClassifyOid,"涓婚搴撳垎绫讳富閿�");
+		List<CodeClstemplateEntity> templateDOS = selectOnlyTemplateByClassifyOid(codeClassifyOid);
+		if(CollectionUtils.isEmpty(templateDOS)){
+			throw new VciBaseException("褰撳墠鍒嗙被锛屼互鍙婂叾涓婄骇鍒嗙被閮芥病鏈夎缃ā鏉�");
+		}
+		List<CodeClstemplateVO> templateVOList = codeClassifyTemplateDO2VOs(templateDOS, true);
+		return sortTemplateByRevision(templateVOList);
+	}
+
+	/**
+	 * 鐢ㄦā鏉跨殑鐗堟湰鏉ユ帓搴�
+	 * @param templateVOList 妯℃澘鐨勬樉绀哄璞�
+	 * @return 鎺掑簭鍚庣殑鍒楄〃
+	 */
+	@Override
+	public List<CodeClstemplateVO> sortTemplateByRevision(List<CodeClstemplateVO> templateVOList){
+		if(!CollectionUtils.isEmpty(templateVOList) && templateVOList.size() >1){
+			//鑾峰彇鐗堟湰鍙锋渶澶х殑閭d釜
+			templateVOList = templateVOList.stream().sorted((o1,o2)->
+				Integer.valueOf(o1.getRevisionSeq()).compareTo(Integer.valueOf(o2.getRevisionValue()))
+			).collect(Collectors.toList());
+		}
+		return templateVOList;
+	}
+
+	/**
+	 * 涓婚敭鑾峰彇鍒嗙被妯℃澘瀵硅薄(鍖呭惈灞炴�э級
+	 *
+	 * @param oid 涓婚敭
+	 * @return 鍒嗙被妯℃澘瀵硅薄鏄剧ず瀵硅薄
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+	 */
+	@Override
+	public CodeClstemplateVO getObjectHasAttrByOid(String oid) throws VciBaseException {
+		List<CodeClstemplateEntity> doList = new ArrayList<>();
+		doList.add(selectByOid(oid));
+		List<CodeClstemplateVO> templateVOS = codeClassifyTemplateDO2VOs(doList, true);
+		return CollectionUtils.isEmpty(templateVOS)?null:templateVOS.get(0);
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyattrrepeatServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyattrrepeatServiceImpl.java
index 0d51c52..f9873af 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyattrrepeatServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeKeyattrrepeatServiceImpl.java
@@ -16,14 +16,19 @@
  */
 package com.vci.ubcs.code.service.impl;
 
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.entity.CodeKeyattrrepeatEntity;
 import com.vci.ubcs.code.enumpack.FrameworkDataLCStatus;
 import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
 import com.vci.ubcs.code.mapper.CodeKeyattrrepeatMapper;
 import com.vci.ubcs.code.service.ICodeKeyattrrepeatService;
+import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
 import com.vci.ubcs.code.vo.pagemodel.CodeKeyAttrRepeatRuleVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -32,6 +37,9 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.DATA_OID_NOT_EXIST;
 
 /**
  * 鍏抽敭灞炴�ф煡閲嶈鍒� 鏈嶅姟瀹炵幇绫�
@@ -117,4 +125,68 @@
 		}
 		return vo;
 	}
+
+	/**
+	 * 浣跨敤鍒嗙被鐨勫叏閮ㄤ俊鎭潵鑾峰彇鍏抽敭灞炴�у垽鏂鍒欑殑鍐呭
+	 *
+	 * @param classifyFullInfo 涓婚搴撳垎绫荤殑鍏ㄩ儴淇℃伅
+	 * @return 瑙勫垯鐨勬樉绀哄璞�
+	 */
+	@Override
+	public CodeKeyattrrepeatVO getRuleByClassifyFullInfo(CodeClassifyFullInfoBO classifyFullInfo) {
+		VciBaseUtil.alertNotNull(classifyFullInfo,"涓婚搴撳垎绫荤殑淇℃伅");
+		String keyAttrRuleOid = classifyFullInfo.getCurrentClassifyVO().getCodekeyattrrepeatoid();
+		if(StringUtils.isBlank(keyAttrRuleOid)){
+			//鎴戜滑鏍规嵁涓婄骇鐨勫垎绫伙紝鎸夌収灞傜骇鍊掑簭鎺掑垪
+			if(!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())){
+				//鏈変笂绾у垎绫荤殑鎯呭喌涓嬫墠鍘绘煡璇�
+				List<CodeClassifyVO> sortedClassifyVO = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))).collect(Collectors.toList());
+				for(int i = sortedClassifyVO.size() -1;i>=0;i--){
+					CodeClassifyVO record = sortedClassifyVO.get(i);
+
+					if(StringUtils.isNotBlank(record.getCodekeyattrrepeatoid())){
+						keyAttrRuleOid = record.getCodekeyattrrepeatoid();
+						break;
+					}
+				}
+			}
+		}
+		if(StringUtils.isNotBlank(keyAttrRuleOid)){
+			CodeKeyAttrRepeatRuleVO objectByOid = getObjectByOid(keyAttrRuleOid);
+			CodeKeyattrrepeatVO codeKeyattrrepeatVO = new CodeKeyattrrepeatVO();
+			BeanUtils.copyProperties(objectByOid,codeKeyattrrepeatVO);
+			return codeKeyattrrepeatVO;
+		}
+		//鍏抽敭灞炴�х殑瑙勫垯鍙互涓虹┖锛屼负绌虹殑鏃跺�欏氨浠h〃涓嶆帶鍒讹紝
+		return null;
+	}
+
+	/**
+	 * 涓婚敭鑾峰彇鍏抽敭鏁版嵁鏌ラ噸瑙勫垯
+	 * @param oid 涓婚敭
+	 * @return 鍏抽敭鏁版嵁鏌ラ噸瑙勫垯鏄剧ず瀵硅薄
+	 */
+	@Override
+	public  CodeKeyAttrRepeatRuleVO getObjectByOid(String oid){
+		CodeKeyAttrRepeatRuleVO codeKeyAttrRepeatRuleVO = codeKeyAttrRepeatRuleDO2VO(selectByOid(oid));
+		CodeKeyattrrepeatVO codeKeyattrrepeatVO = new CodeKeyattrrepeatVO();
+		BeanUtils.copyProperties(codeKeyAttrRepeatRuleVO,codeKeyattrrepeatVO);
+		return codeKeyAttrRepeatRuleVO;
+	}
+	/**
+	 * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+	 * @param oid 涓婚敭
+	 * @return  鏁版嵁瀵硅薄
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	private CodeKeyattrrepeatEntity selectByOid(String oid) {
+		VciBaseUtil.alertNotNull(oid,"涓婚敭");
+
+		CodeKeyattrrepeatEntity codeKeyAttrRepeatRuleDO = codeKeyattrrepeatMapper.selectById(oid.trim());
+//			.selectByPrimaryKey(oid.trim());
+		if(codeKeyAttrRepeatRuleDO == null || StringUtils.isBlank(codeKeyAttrRepeatRuleDO.getOid())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		return codeKeyAttrRepeatRuleDO;
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodePhaseattrServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodePhaseattrServiceImpl.java
index 06962aa..742dc51 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodePhaseattrServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodePhaseattrServiceImpl.java
@@ -18,8 +18,8 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.vci.ubcs.code.entity.CodePhaseAttr;
-import com.vci.ubcs.code.mapper.CodePhaseAttrMapper;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
+import com.vci.ubcs.code.mapper.CodePhaseattrMapper;
 import com.vci.ubcs.code.service.ICodePhaseattrService;
 import com.vci.ubcs.code.vo.CodePhaseattrVO;
 import org.springframework.stereotype.Service;
@@ -31,7 +31,7 @@
  * @since 2023-04-20
  */
 @Service
-public class CodePhaseattrServiceImpl extends ServiceImpl<CodePhaseAttrMapper, CodePhaseAttr> implements ICodePhaseattrService {
+public class CodePhaseattrServiceImpl extends ServiceImpl<CodePhaseattrMapper, CodePhaseattrEntity> implements ICodePhaseattrService {
 
 	@Override
 	public IPage<CodePhaseattrVO> selectCodePhaseattrPage(IPage<CodePhaseattrVO> page, CodePhaseattrVO CodePhaseattr) {
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java
index 3049bac..31d235c 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java
@@ -430,4 +430,38 @@
 	}
 
 
+	/**
+	 * 浣跨敤涓婚敭鑾峰彇缂栫爜瑙勫垯鐨勫唴瀹�
+	 *
+	 * @param oid 涓婚敭
+	 * @return 瑙勫垯鐨勬樉绀哄璞�
+	 */
+	@Override
+	public CodeRuleVO getObjectHasSecByOid(String oid) {
+		CodeRule ruleDO = selectByOid(oid);
+		return codeRuleDO2VO(ruleDO, true);
+	}
+
+	/**
+	 * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param codeRuleDO 瑙勫垯鐨勬暟鎹璞�
+	 * @param hasSec     鏄惁鏌ヨ鐮佹
+	 * @return 鏄剧ず瀵硅薄
+	 * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	public CodeRuleVO codeRuleDO2VO(CodeRule codeRuleDO, boolean hasSec) throws VciBaseException {
+		CodeRuleVO vo = new CodeRuleVO();
+		if (codeRuleDO != null) {
+			BeanUtilForVCI.copyPropertiesIgnoreCase(codeRuleDO, vo);
+			//濡傛灉鏈塴cstatus鐨勭被鐨勮瘽
+			vo.setLcStatusText(CodeRuleLC.getTextByValue(vo.getLcStatus()));
+			if (hasSec) {
+				//鏌ヨ鐮佹
+				vo.setSecVOList(codeBasicSecService.listCodeBasicSecByRuleOid(vo.getOid()));
+			}
+		}
+		return vo;
+	}
+
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java
index 9cdaaf5..392e9e1 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java
@@ -18,7 +18,6 @@
 
 import com.alibaba.cloud.commons.lang.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 
@@ -27,24 +26,21 @@
 import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
 import com.vci.ubcs.code.dto.CodeTemplatePhaseDTO;
 import com.vci.ubcs.code.entity.*;
-import com.vci.ubcs.code.mapper.CodePhaseAttrMapper;
+import com.vci.ubcs.code.mapper.CodePhaseattrMapper;
 import com.vci.ubcs.code.mapper.CodeTemplatePhaseMapper;
 import com.vci.ubcs.code.mapper.CommonsMapper;
 import com.vci.ubcs.code.service.ICodeClassifyTemplateAttrService;
 import com.vci.ubcs.code.service.ICodePhaseattrService;
-import com.vci.ubcs.code.service.ICodeTempphaseService;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
-import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseEntityVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
-import com.vci.ubcs.starter.util.MybatisParameterUtils;
-import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
+import com.vci.ubcs.starter.util.MybatisParameterUtil;
 import com.vci.ubcs.starter.web.pagemodel.DataGrid;
 import com.vci.ubcs.starter.web.pagemodel.PageHelper;
 import com.vci.ubcs.starter.web.util.BeanUtil;
 import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
-import com.vci.ubcs.starter.web.util.WebUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
@@ -66,10 +62,10 @@
  * @since 2023-04-20
  */
 @Service
-public class CodeTempphaseServiceImpl extends ServiceImpl<CodeTemplatePhaseMapper, CodeTemplatePhase> implements ICodeTempphaseService {
+public class CodeTempphaseServiceImpl extends ServiceImpl<CodeTemplatePhaseMapper, CodeTempphaseEntity> implements ICodeTempphaseService {
 
 	@Autowired(required = false)
-	private CodePhaseAttrMapper codePhaseAttrMapper;
+	private CodePhaseattrMapper codePhaseAttrMapper;
 
 	@Autowired(required = false)
 	private CodeTemplatePhaseMapper codeTemplatePhaseMapper;
@@ -92,7 +88,6 @@
 	@Autowired
 	private ICodeClassifyTemplateAttrService tempAttrService;
 
-
 	/**
 	 * 鏌ヨ鎵�鏈夌殑妯℃澘闃舵
 	 * @param codeTemplatePhaseVO 鏌ヨ鏉′欢
@@ -101,12 +96,12 @@
 	 * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
 	@Override
-	public DataGrid<CodeTemplatePhaseVO> gridCodeTemplatePhase(CodeTemplatePhaseVO codeTemplatePhaseVO, Query query) throws VciBaseException {
+	public DataGrid<CodeTemplatePhaseEntityVO> gridCodeTemplatePhase(CodeTemplatePhaseEntityVO codeTemplatePhaseVO, Query query) throws VciBaseException {
 		query.setDescs("createTime");
 		query.setSize(-1);
 
-		IPage<CodeTemplatePhase> doList = codeTemplatePhaseMapper.selectPage(Condition.getPage(query), Condition.getQueryWrapper(codeTemplatePhaseVO));
-		DataGrid<CodeTemplatePhaseVO> dataGrid=new DataGrid<CodeTemplatePhaseVO>();
+		IPage<CodeTempphaseEntity> doList = codeTemplatePhaseMapper.selectPage(Condition.getPage(query), Condition.getQueryWrapper(codeTemplatePhaseVO));
+		DataGrid<CodeTemplatePhaseEntityVO> dataGrid=new DataGrid<CodeTemplatePhaseEntityVO>();
 		if (!CollectionUtils.isEmpty(doList.getRecords())) {
 			dataGrid.setData(codeTemplatePhaseDO2VOs(doList.getRecords()));
 			dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(codeTemplatePhaseMapper.selectCount(Condition.getQueryWrapper(codeTemplatePhaseVO)))));
@@ -116,16 +111,16 @@
 
 	/**
 	 * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
-	 * @param codeTemplatePhaseDOs 鏁版嵁瀵硅薄鍒楄〃
+	 * @param codeTemplatePhaseEntityDOS 鏁版嵁瀵硅薄鍒楄〃
 	 * @return 鏄剧ず瀵硅薄
 	 * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
 	 */
 	@Override
-	public List<CodeTemplatePhaseVO> codeTemplatePhaseDO2VOs(Collection<CodeTemplatePhase> codeTemplatePhaseDOs) throws VciBaseException{
-		List<CodeTemplatePhaseVO> voList = new ArrayList<CodeTemplatePhaseVO>();
-		if(!CollectionUtils.isEmpty(codeTemplatePhaseDOs)){
-			for(CodeTemplatePhase s: codeTemplatePhaseDOs){
-				CodeTemplatePhaseVO vo =  codeTemplatePhaseDO2VO(s);
+	public List<CodeTemplatePhaseEntityVO> codeTemplatePhaseDO2VOs(Collection<CodeTempphaseEntity> codeTemplatePhaseEntityDOS) throws VciBaseException{
+		List<CodeTemplatePhaseEntityVO> voList = new ArrayList<CodeTemplatePhaseEntityVO>();
+		if(!CollectionUtils.isEmpty(codeTemplatePhaseEntityDOS)){
+			for(CodeTempphaseEntity s: codeTemplatePhaseEntityDOS){
+				CodeTemplatePhaseEntityVO vo =  codeTemplatePhaseDO2VO(s);
 				if(vo != null){
 					voList.add(vo);
 				}
@@ -136,15 +131,15 @@
 
 	/**
 	 * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
-	 * @param  codeTemplatePhaseDO 鏁版嵁瀵硅薄
+	 * @param  codeTemplatePhaseEntityDO 鏁版嵁瀵硅薄
 	 * @return 鏄剧ず瀵硅薄
 	 * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
 	@Override
-	public  CodeTemplatePhaseVO codeTemplatePhaseDO2VO(CodeTemplatePhase codeTemplatePhaseDO) throws VciBaseException{
-		CodeTemplatePhaseVO vo = new CodeTemplatePhaseVO();
-		if(codeTemplatePhaseDO != null){
-			BeanUtilForVCI.copyPropertiesIgnoreCase(codeTemplatePhaseDO,vo);
+	public CodeTemplatePhaseEntityVO codeTemplatePhaseDO2VO(CodeTempphaseEntity codeTemplatePhaseEntityDO) throws VciBaseException{
+		CodeTemplatePhaseEntityVO vo = new CodeTemplatePhaseEntityVO();
+		if(codeTemplatePhaseEntityDO != null){
+			BeanUtilForVCI.copyPropertiesIgnoreCase(codeTemplatePhaseEntityDO,vo);
 			//濡傛灉鏈塴cstatus鐨勭被鐨勮瘽
 		}
 		return vo;
@@ -161,14 +156,14 @@
 		int updateCount = 0;
 		Map<String,Object> condition = new HashMap<>(1);
 		condition.put("codeclassifytemplateoid",templateOid);
-		List<CodeTemplatePhase> codeTempphaseEntities = baseMapper.selectByMap(condition);
+		List<CodeTempphaseEntity> codeTempphaseEntities = baseMapper.selectByMap(condition);
 		if(!CollectionUtils.isEmpty(codeTempphaseEntities)) {
-			updateCount += baseMapper.deleteBatchIds(codeTempphaseEntities.stream().map(CodeTemplatePhase::getOid).collect(Collectors.toList()));
+			updateCount += baseMapper.deleteBatchIds(codeTempphaseEntities.stream().map(CodeTempphaseEntity::getOid).collect(Collectors.toList()));
 //			batchCBO.copyFromOther(codeTemplatePhaseMapper.batchDeleteByOids(templatePhaseDOS.stream().map(CodeTemplatePhaseDO::getOid).collect(Collectors.toList())));
 //			conditionMap.put("codePhaseOid", QueryOptionConstant.IN + "(select oid from " + getPhaseTable() + " where codeClassifyTemplateOid='" + classifyTemplateOid + "')");
-			List<CodePhaseAttr> phaseAttrDOS = codePhaseAttrMapper.selectByPhasea(templateOid);
+			List<CodePhaseattrEntity> phaseAttrDOS = codePhaseAttrMapper.selectByPhasea(templateOid);
 			if(!CollectionUtils.isEmpty(phaseAttrDOS)){
-				updateCount += codePhaseAttrMapper.deleteBatchIds(phaseAttrDOS.stream().map(CodePhaseAttr::getOid).collect(Collectors.toList()));
+				updateCount += codePhaseAttrMapper.deleteBatchIds(phaseAttrDOS.stream().map(CodePhaseattrEntity::getOid).collect(Collectors.toList()));
 			}
 		}
 		return updateCount;
@@ -184,7 +179,7 @@
 	public List<CodeClstempattrEntity> codeTemplateAttrModifyTrigger(List<CodeClstempattrEntity> attrDOList){
 		//灞炴�т慨鏀圭殑鏃跺�欙紝闇�瑕佸悓姝ヤ慨鏀瑰搴斿睘鎬х殑鍚嶇О
 //		BatchCBO batchCBO = new BatchCBO();
-		List<CodePhaseAttr> phaseAttrDOS =codePhaseAttrMapper.listLinkAttrDOByTemplateAttrDOS(VciBaseUtil.toInSql(attrDOList.stream()
+		List<CodePhaseattrEntity> phaseAttrDOS =codePhaseAttrMapper.listLinkAttrDOByTemplateAttrDOS(VciBaseUtil.toInSql(attrDOList.stream()
 			.map(CodeClstempattrEntity::getId).collect(Collectors.toList()).toArray(new String[0])),attrDOList.get(0).getClassifytemplateoid());
 		if(!CollectionUtils.isEmpty(phaseAttrDOS)){
 			//璇存槑鏈夊睘鎬�,鎴戜滑鍘绘浛鎹竴涓�
@@ -214,25 +209,25 @@
 	 */
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public CodeTemplatePhaseVO addSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException{
+	public CodeTemplatePhaseEntityVO addSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException{
 		VciBaseUtil.alertNotNull(codeTemplatePhaseDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄",codeTemplatePhaseDTO.getAttributes(),"鍖呭惈鐨勫睘鎬�");
 		//灏咲TO杞崲涓篋O
-		CodeTemplatePhase codeTemplatePhaseDO = new CodeTemplatePhase();
-		codeTemplatePhaseDO.setOid(VciBaseUtil.getPk());
-		BeanUtilForVCI.copyPropertiesIgnoreCase(codeTemplatePhaseDTO,codeTemplatePhaseDO);
+		CodeTempphaseEntity codeTemplatePhaseEntityDO = new CodeTempphaseEntity();
+		codeTemplatePhaseEntityDO.setOid(VciBaseUtil.getPk());
+		BeanUtilForVCI.copyPropertiesIgnoreCase(codeTemplatePhaseDTO, codeTemplatePhaseEntityDO);
 		//WebUtil.setPersistence(false);
-		boolean resBoolean = codeTemplatePhaseMapper.insert(codeTemplatePhaseDO) > 0;
-		List<CodePhaseAttr> attrDOList = new ArrayList<>();
+		boolean resBoolean = codeTemplatePhaseMapper.insert(codeTemplatePhaseEntityDO) > 0;
+		List<CodePhaseattrEntity> attrDOList = new ArrayList<>();
 		codeTemplatePhaseDTO.getAttributes().stream().forEach(attrDTO->{
-			CodePhaseAttr attrDO = new CodePhaseAttr();
+			CodePhaseattrEntity attrDO = new CodePhaseattrEntity();
 			BeanUtilForVCI.copyPropertiesIgnoreCase(attrDTO,attrDO);
 			attrDO.setOid(VciBaseUtil.getPk());
-			attrDO.setCodePhaseOid(codeTemplatePhaseDO.getOid());
+			attrDO.setCodePhaseOid(codeTemplatePhaseEntityDO.getOid());
 			attrDOList.add(attrDO);
 		});
 		codePhaseattrService.saveBatch(attrDOList);
 		//WebUtil.setPersistence(true);
-		return codeTemplatePhaseDO2VO(codeTemplatePhaseDO);
+		return codeTemplatePhaseDO2VO(codeTemplatePhaseEntityDO);
 	}
 
 	/**
@@ -243,29 +238,29 @@
 	 */
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public CodeTemplatePhaseVO editSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException{
+	public CodeTemplatePhaseEntityVO editSave(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException{
 		VciBaseUtil.alertNotNull(codeTemplatePhaseDTO,"鏁版嵁瀵硅薄",codeTemplatePhaseDTO.getOid(),"妯℃澘闃舵涓婚敭",codeTemplatePhaseDTO.getAttributes(),"鍖呭惈鐨勫睘鎬�");
 		//灏咲TO杞崲涓篋O
-		CodeTemplatePhase codeTemplatePhaseDO = selectByOid(codeTemplatePhaseDTO.getOid());
-		revisionModelUtil.copyFromDTOIgnore(codeTemplatePhaseDTO,codeTemplatePhaseDO);
+		CodeTempphaseEntity codeTemplatePhaseEntityDO = selectByOid(codeTemplatePhaseDTO.getOid());
+		revisionModelUtil.copyFromDTOIgnore(codeTemplatePhaseDTO, codeTemplatePhaseEntityDO);
 		//WebUtil.setPersistence(false);
-		codeTemplatePhaseMapper.updateById(codeTemplatePhaseDO);
+		codeTemplatePhaseMapper.updateById(codeTemplatePhaseEntityDO);
 		//鎶婁互鍓嶇殑鍒犻櫎
-		List<CodePhaseAttr> phaseAttrDOS = listPhaseAttrDOByPhaseOid(codeTemplatePhaseDO.getOid());
+		List<CodePhaseattrEntity> phaseAttrDOS = listPhaseAttrDOByPhaseOid(codeTemplatePhaseEntityDO.getOid());
 		if(!CollectionUtils.isEmpty(phaseAttrDOS)){
-			codePhaseAttrMapper.deleteBatchIds(phaseAttrDOS.stream().map(CodePhaseAttr::getOid).collect(Collectors.toList()));
+			codePhaseAttrMapper.deleteBatchIds(phaseAttrDOS.stream().map(CodePhaseattrEntity::getOid).collect(Collectors.toList()));
 		}
-		List<CodePhaseAttr> attrDOList = new ArrayList<>();
+		List<CodePhaseattrEntity> attrDOList = new ArrayList<>();
 		codeTemplatePhaseDTO.getAttributes().stream().forEach(attrDTO->{
-			CodePhaseAttr attrDO = new CodePhaseAttr();
+			CodePhaseattrEntity attrDO = new CodePhaseattrEntity();
 			BeanUtilForVCI.copyPropertiesIgnoreCase(attrDTO,attrDO);
 			attrDO.setOid(VciBaseUtil.getPk());
-			attrDO.setCodePhaseOid(codeTemplatePhaseDO.getOid());
+			attrDO.setCodePhaseOid(codeTemplatePhaseEntityDO.getOid());
 			attrDOList.add(attrDO);
 		});
 		codePhaseattrService.saveBatch(attrDOList);
 		//WebUtil.setPersistence(true);
-		return codeTemplatePhaseDO2VO(codeTemplatePhaseDO);
+		return codeTemplatePhaseDO2VO(codeTemplatePhaseEntityDO);
 	}
 
 	/**
@@ -278,20 +273,20 @@
 	@Transactional(rollbackFor = Exception.class)
 	public R deleteCodeTemplatePhase(CodeTemplatePhaseDTO codeTemplatePhaseDTO) throws VciBaseException{
 		VciBaseUtil.alertNotNull(codeTemplatePhaseDTO,"妯℃澘闃舵鏁版嵁瀵硅薄",codeTemplatePhaseDTO.getOid(),"妯℃澘闃舵鐨勪富閿�");
-		CodeTemplatePhase codeTemplatePhaseDO = selectByOid(codeTemplatePhaseDTO.getOid());
-		R baseResult = checkIsCanDeleteForDO(codeTemplatePhaseDTO,codeTemplatePhaseDO);
+		CodeTempphaseEntity codeTemplatePhaseEntityDO = selectByOid(codeTemplatePhaseDTO.getOid());
+		R baseResult = checkIsCanDeleteForDO(codeTemplatePhaseDTO, codeTemplatePhaseEntityDO);
 		if(!baseResult.isSuccess()) {
 		}else{
 			return baseResult;
 		}
 		//鎵ц鍒犻櫎鎿嶄綔
 		//WebUtil.setPersistence(false);
-		boolean batchCBO = codeTemplatePhaseMapper.deleteById(codeTemplatePhaseDO.getOid())>0;
+		boolean batchCBO = codeTemplatePhaseMapper.deleteById(codeTemplatePhaseEntityDO.getOid())>0;
 		//闇�瑕佸垹闄ゅ睘鎬�
-		List<CodePhaseAttr> phaseAttrDOS = listPhaseAttrDOByPhaseOid(codeTemplatePhaseDO.getOid());
+		List<CodePhaseattrEntity> phaseAttrDOS = listPhaseAttrDOByPhaseOid(codeTemplatePhaseEntityDO.getOid());
 		boolean deleteCBO = false;
 		if(!CollectionUtils.isEmpty(phaseAttrDOS)) {
-			deleteCBO = codePhaseAttrMapper.deleteBatchIds(phaseAttrDOS.stream().map(CodePhaseAttr::getOid).collect(Collectors.toList()))>0;
+			deleteCBO = codePhaseAttrMapper.deleteBatchIds(phaseAttrDOS.stream().map(CodePhaseattrEntity::getOid).collect(Collectors.toList()))>0;
 		}
 		//WebUtil.setPersistence(true);
 		return (batchCBO || deleteCBO)?R.success(DELETE_SUCCESS):R.fail(DELETE_FAIL);
@@ -304,7 +299,7 @@
 	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
 	 */
 	@Override
-	public  CodeTemplatePhaseVO getObjectByOid(String oid) throws VciBaseException{
+	public CodeTemplatePhaseEntityVO getObjectByOid(String oid) throws VciBaseException{
 		return codeTemplatePhaseDO2VO(selectByOid(oid));
 	}
 
@@ -315,10 +310,10 @@
 	 * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
 	 */
 	@Override
-	public Collection<CodeTemplatePhaseVO> listCodeTemplatePhaseByOids(Collection<String> oidCollections) throws VciBaseException{
+	public Collection<CodeTemplatePhaseEntityVO> listCodeTemplatePhaseByOids(Collection<String> oidCollections) throws VciBaseException{
 		VciBaseUtil.alertNotNull(oidCollections,"鏁版嵁瀵硅薄涓婚敭闆嗗悎");
-		List<CodeTemplatePhase> codeTemplatePhaseDOList = listCodeTemplatePhaseDOByOidCollections(oidCollections);
-		return codeTemplatePhaseDO2VOs(codeTemplatePhaseDOList);
+		List<CodeTempphaseEntity> codeTemplatePhaseEntityDOList = listCodeTemplatePhaseDOByOidCollections(oidCollections);
+		return codeTemplatePhaseDO2VOs(codeTemplatePhaseEntityDOList);
 	}
 
 	/**
@@ -329,11 +324,11 @@
 	 * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
 	@Override
-	public DataGrid<CodeTemplatePhaseVO> refDataGridCodeTemplatePhase(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+	public DataGrid<CodeTemplatePhaseEntityVO> refDataGridCodeTemplatePhase(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
 		if(conditionMap == null){
 			conditionMap = new HashMap<String, String>();
 		}
-		CodeTemplatePhaseVO codeTemplatePhaseVO = new CodeTemplatePhaseVO();
+		CodeTemplatePhaseEntityVO codeTemplatePhaseVO = new CodeTemplatePhaseEntityVO();
 		BeanMap beanMap = BeanMap.create(codeTemplatePhaseVO);
 		beanMap.putAll(conditionMap);
 		Query query = new Query();
@@ -368,7 +363,7 @@
 			if(ids.size()<=1000){
 				queryWrapper = Wrappers.<CodeClassifyTemplateAttr>query().lambda().notIn(CodeClassifyTemplateAttr::getId, ids);
 			}else {
-				queryWrapper = MybatisParameterUtils.cutNotInParameter(queryWrapper,CodeClassifyTemplateAttr::getId,ids);
+				queryWrapper = MybatisParameterUtil.cutNotInParameter(queryWrapper,CodeClassifyTemplateAttr::getId,ids);
 			}
 			//conditionMap.put("id", QueryOptionConstant.NOTIN + ids);
 		}
@@ -392,7 +387,7 @@
 			return new DataGrid<>();
 		}
 		conditionMap.remove("codePhaseOid");
-		CodeTemplatePhase phaseDO = selectByOid(codePhaseOid);
+		CodeTempphaseEntity phaseDO = selectByOid(codePhaseOid);
 		List<String> ids = commonsMapper.selectById("(select id from " + getPhaseAttrTable() + " where codePhaseOid ='" +codePhaseOid + "')");
 		LambdaQueryWrapper<CodeClassifyTemplateAttr> queryWrapper = null;
 		//			Wrappers.<CodeClassifyTemplateAttrVO>query()
@@ -400,7 +395,7 @@
 		if(ids.size()<=1000){
 			queryWrapper = Wrappers.<CodeClassifyTemplateAttr>query().lambda().in(CodeClassifyTemplateAttr::getId, ids);
 		}else {
-			queryWrapper = MybatisParameterUtils.cutInParameter(queryWrapper,CodeClassifyTemplateAttr::getId,ids);
+			queryWrapper = MybatisParameterUtil.cutInParameter(queryWrapper,CodeClassifyTemplateAttr::getId,ids);
 		}
 		queryWrapper.eq(CodeClassifyTemplateAttr::getClassifyTemplateOid,phaseDO.getCodeClassifyTemplateOid());
 		return tempAttrService.gridCodeClassifyTemplateAttr(queryWrapper,pageHelper);
@@ -419,33 +414,33 @@
 	 * @param oidCollections 涓婚敭鐨勯泦鍚�
 	 * @return 鏁版嵁瀵硅薄鍒楄〃
 	 */
-	private List<CodeTemplatePhase> listCodeTemplatePhaseDOByOidCollections(Collection<String> oidCollections){
-		List<CodeTemplatePhase> codeTemplatePhaseDOList = new ArrayList<CodeTemplatePhase>();
+	private List<CodeTempphaseEntity> listCodeTemplatePhaseDOByOidCollections(Collection<String> oidCollections){
+		List<CodeTempphaseEntity> codeTemplatePhaseEntityDOList = new ArrayList<CodeTempphaseEntity>();
 		if(!CollectionUtils.isEmpty(oidCollections)){
 			Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
 			for(Collection<String> oids: oidCollectionsList){
-				List<CodeTemplatePhase> tempDOList =  codeTemplatePhaseMapper.selectBatchIds(oids);
+				List<CodeTempphaseEntity> tempDOList =  codeTemplatePhaseMapper.selectBatchIds(oids);
 				if(!CollectionUtils.isEmpty(tempDOList)){
-					codeTemplatePhaseDOList.addAll(tempDOList);
+					codeTemplatePhaseEntityDOList.addAll(tempDOList);
 				}
 			}
 		}
-		return  codeTemplatePhaseDOList;
+		return codeTemplatePhaseEntityDOList;
 	}
 
 	/**
 	 * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
 	 * @param codeTemplatePhaseDTO 鏁版嵁浼犺緭瀵硅薄
-	 * @param codeTemplatePhaseDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+	 * @param codeTemplatePhaseEntityDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
 	 * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
 	 */
-	private R checkIsCanDeleteForDO(CodeTemplatePhaseDTO codeTemplatePhaseDTO, CodeTemplatePhase codeTemplatePhaseDO) {
-		CodeTemplatePhase tsDO = new CodeTemplatePhase();
+	private R checkIsCanDeleteForDO(CodeTemplatePhaseDTO codeTemplatePhaseDTO, CodeTempphaseEntity codeTemplatePhaseEntityDO) {
+		CodeTempphaseEntity tsDO = new CodeTempphaseEntity();
 		BeanUtil.convert(codeTemplatePhaseDTO,tsDO);
 		if (checkTs(tsDO)) {
 			return R.fail(TS_NOT_PROCESS);
 		}
-		if(!checkIsLinked(codeTemplatePhaseDO.getOid())) {
+		if(!checkIsLinked(codeTemplatePhaseEntityDO.getOid())) {
 			return R.success("succcess");
 		}else{
 			return R.fail(DATA_LINKED_NOT_DELETE);
@@ -457,9 +452,9 @@
 	 * @param tempDO
 	 * @return
 	 */
-	private boolean checkTs(CodeTemplatePhase tempDO){
-		LambdaQueryWrapper<CodeTemplatePhase> wrapper = Wrappers.<CodeTemplatePhase>query()
-			.lambda().eq(CodeTemplatePhase::getOid,tempDO.getOid()).select(CodeTemplatePhase::getTs);
+	private boolean checkTs(CodeTempphaseEntity tempDO){
+		LambdaQueryWrapper<CodeTempphaseEntity> wrapper = Wrappers.<CodeTempphaseEntity>query()
+			.lambda().eq(CodeTempphaseEntity::getOid,tempDO.getOid()).select(CodeTempphaseEntity::getTs);
 		long dbTs = codePhaseAttrMapper.selectById(wrapper).getTs().getTime();
 		long currentTs = tempDO.getTs().getTime();
 		if(dbTs == currentTs){
@@ -483,11 +478,11 @@
 	 * @param codePhaseOid 闃舵鐨勪富閿�
 	 * @return 鍖呭惈灞炴�х殑鏁版嵁瀵硅薄
 	 */
-	private List<CodePhaseAttr> listPhaseAttrDOByPhaseOid(String codePhaseOid){
+	private List<CodePhaseattrEntity> listPhaseAttrDOByPhaseOid(String codePhaseOid){
 		if(StringUtils.isBlank(codePhaseOid)||StringUtils.isEmpty(codePhaseOid)){
 			return null;
 		}
-		List<CodePhaseAttr> phaseAttrDOS = codePhaseAttrMapper.selectByPhasea(codePhaseOid);
+		List<CodePhaseattrEntity> phaseAttrDOS = codePhaseAttrMapper.selectByPhasea(codePhaseOid);
 		return phaseAttrDOS;
 	}
 
@@ -497,13 +492,13 @@
 	 * @return  鏁版嵁瀵硅薄
 	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
 	 */
-	private CodeTemplatePhase selectByOid(String oid) throws VciBaseException{
+	private CodeTempphaseEntity selectByOid(String oid) throws VciBaseException{
 		VciBaseUtil.alertNotNull(oid,"涓婚敭");
-		CodeTemplatePhase codeTemplatePhaseDO = codeTemplatePhaseMapper.selectById(oid.trim());
-		if(codeTemplatePhaseDO == null || StringUtils.isBlank(codeTemplatePhaseDO.getOid())){
+		CodeTempphaseEntity codeTemplatePhaseEntityDO = codeTemplatePhaseMapper.selectById(oid.trim());
+		if(codeTemplatePhaseEntityDO == null || StringUtils.isBlank(codeTemplatePhaseEntityDO.getOid())){
 			throw new VciBaseException(DATA_OID_NOT_EXIST);
 		}
-		return codeTemplatePhaseDO;
+		return codeTemplatePhaseEntityDO;
 	}
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeWupinServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeWupinServiceImpl.java
new file mode 100644
index 0000000..f192429
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeWupinServiceImpl.java
@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.code.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.vo.CodeWupinVO;
+import com.vci.ubcs.code.mapper.CodeWupinMapper;
+import com.vci.ubcs.code.service.ICodeWupinService;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 缂栫爜淇℃伅 鏈嶅姟瀹炵幇绫�
+ *
+ * @author yuxc
+ * @since 2023-05-05
+ */
+@Service
+public class CodeWupinServiceImpl extends ServiceImpl<CodeWupinMapper, CodeWupinEntity> implements ICodeWupinService {
+
+	@Override
+	public IPage<CodeWupinVO> selectCodeWupinPage(IPage<CodeWupinVO> page, CodeWupinVO codeWupin) {
+		return page.setRecords(baseMapper.selectCodeWupinPage(page, codeWupin));
+	}
+
+
+}
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
new file mode 100644
index 0000000..0f9d00c
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -0,0 +1,779 @@
+package com.vci.ubcs.code.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sun.corba.se.impl.orbutil.ObjectUtility;
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
+import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
+import com.vci.ubcs.code.entity.CodeAllCode;
+import com.vci.ubcs.code.entity.CodeOsbtmtypeEntity;
+import com.vci.ubcs.code.entity.CodeRule;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.enumpack.CodeDefaultLC;
+import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
+import com.vci.ubcs.code.enumpack.CodeSecTypeEnum;
+import com.vci.ubcs.code.mapper.CodeAllCodeMapper;
+import com.vci.ubcs.code.mapper.CodeOsbtmtypeMapper;
+import com.vci.ubcs.code.mapper.CodeRuleMapper;
+import com.vci.ubcs.code.service.*;
+import com.vci.ubcs.code.vo.CodeClstempattrVO;
+import com.vci.ubcs.code.vo.CodeClstemplateVO;
+import com.vci.ubcs.code.vo.CodeKeyattrrepeatVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
+import com.vci.ubcs.omd.entity.Dict;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.revision.model.BaseModel;
+import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
+import com.vci.ubcs.starter.web.pagemodel.KeyValue;
+import com.vci.ubcs.starter.web.toolmodel.DateConverter;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import com.vci.ubcs.starter.web.util.VciDateUtil;
+import com.vci.ubcs.starter.web.util.VciQueryWrapperForDO;
+import com.vci.ubcs.starter.web.util.WebUtil;
+import com.vci.ubcs.system.entity.DictBiz;
+import com.vci.ubcs.system.feign.IDictBizClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.Collectors;
+
+/**
+ * 涓绘暟鎹紩鎿庢湇鍔�
+ *
+ * @author weidy
+ * @date 2022-2-22
+ */
+@Service
+public class MdmEngineServiceImpl extends ServiceImpl<CodeAllCodeMapper, CodeAllCode> implements MdmEngineService {
+
+
+	/**
+	 * 妯℃澘鐨勬湇鍔�
+	 */
+	@Resource
+	private CodeClstemplateServiceImpl templateService;
+	/**
+	 * 妯℃澘鐨勬湇鍔�
+	 */
+	@Resource
+	private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
+	/**
+	 * 鐢熸垚缂栫爜鐨勬湇鍔�
+	 */
+	@Resource
+	private MdmProductCodeService productCodeService;
+	/**
+	 * 瀛楀吀鐨勬湇鍔�
+	 */
+	@Resource
+	IDictBizClient iDictBizClient;
+
+	/**
+	 * 缂栫爜瑙勫垯鐨勬湇鍔�
+	 */
+	@Autowired
+	private ICodeRuleService ruleService;
+
+	/**
+	 * 鍒嗙被鐨勬湇鍔�
+	 */
+	@Resource
+	private ICodeClassifyService classifyService;
+
+	/**
+	 * 鍏抽敭灞炴�х殑閰嶇疆
+	 */
+	@Autowired
+	private ICodeKeyattrrepeatService keyRuleService;
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+//	@Autowired
+//	private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
+
+
+
+	/**
+	 * 浣跨敤鍒嗙被鐨勪富閿幏鍙栧彲浠ヤ娇鐢ㄧ殑妯℃澘瀵硅薄
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	@Override
+	public CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid) {
+		return getUsedTemplateByClassifyOid(codeClassifyOid, true);
+	}
+
+	/**
+	 * 浣跨敤鍒嗙被鐨勪富閿幏鍙栧彲浠ヤ娇鐢ㄧ殑妯℃澘瀵硅薄
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param hasAttr         鍖呭惈灞炴��
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	@Override
+	public CodeClstemplateVO getUsedTemplateByClassifyOid(String codeClassifyOid, boolean hasAttr) {
+		List<CodeClstemplateVO> templateVOs = templateService.listReleaseTemplateByClassifyOid(codeClassifyOid, hasAttr);
+		return templateVOs.get(templateVOs.size() - 1);
+	}
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勪笅鎷夐�夐」
+	 *
+	 * @param attrVO 妯℃澘灞炴�х殑瀵硅薄
+	 * @return 涓嬫媺閫夐」
+	 */
+	@Override
+	public List<KeyValue> listComboboxItems(CodeClstempattrVO attrVO) {
+		List<KeyValue> comboboxKVs = null;
+		if (StringUtils.isNotBlank(attrVO.getEnumstring())) {
+			comboboxKVs = JSONObject.parseArray(attrVO.getEnumstring(), KeyValue.class);
+		} else {
+//			comboboxKVs = enumService.getEnum(attrVO.getEnumid());
+//		 	Dict dict = new Dict();
+//			dict.setParentId(Long.valueOf(attrVO.getEnumid()));
+			R<List<DictBiz>> list = iDictBizClient.getList(attrVO.getEnumid());
+			if(list.isSuccess()){
+				for (DictBiz datum : list.getData()) {
+					KeyValue keyValue = new KeyValue();
+					keyValue.setKey(datum.getDictKey());
+					keyValue.setValue(datum.getDictValue());
+					comboboxKVs.add(keyValue);
+				}
+			}
+		}
+		return comboboxKVs;
+	}
+	/**
+	 * 淇敼鐘舵��
+	 *
+	 * @param baseModelDTO 鏁版嵁浼犺緭瀵硅薄
+	 */
+	@Override
+	public void changeStatus(BaseModelDTO baseModelDTO) {
+		VciBaseUtil.alertNotNull(baseModelDTO, "鏁版嵁淇℃伅", baseModelDTO.getOid(), "涓婚敭", baseModelDTO.getBtmname(), "涓氬姟绫诲瀷", baseModelDTO.getLcStatus(), "鐩爣鐘舵��");
+		List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
+//		List<ClientBusinessObject> cboList = boService.selectCBOByOidCollection(oids, baseModelDTO.getBtmname());
+		//鎻掍釜鐐� 涓氬姟绫诲瀷瀹屾垚鍚庨渶瑕佷慨鏀�
+		QueryWrapper<CodeOsbtmtypeEntity> wrapper = new QueryWrapper<>();
+		wrapper.eq("BTMNAME",baseModelDTO.getBtmname());
+		wrapper.in("OID",oids);
+		List<CodeOsbtmtypeEntity> cboList = codeOsbtmtypeMapper.selectList(wrapper);
+		//杩橀渶瑕佷慨鏀筧llCode鐨勭敓鍛藉懆鏈�
+//		Map<String, String> conditionMap = new HashMap<>();
+		QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
+		allCodeWrapper.eq("createcodebtm",baseModelDTO.getBtmname());
+		allCodeWrapper.in("createcodeoid",oids);
+//		conditionMap.put("createcodeoid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")");
+//		conditionMap.put("createcodebtm", baseModelDTO.getBtmname());
+		List<CodeAllCode> codeCbos = baseMapper.selectList(allCodeWrapper);
+//		List<ClientBusinessObject> codeCbos = boService.queryCBO(MdmBtmTypeConstant.CODE_ALL_CODE, conditionMap);
+		// 鍥炴敹闇�瑕佷笟鍔℃暟鎹垹闄�
+//		if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
+////			BatchCBO batchCBO = new BatchCBO();
+////			batchCBO.getDeleteCbos().addAll(cboList);
+//			codeOsbtmtypeMapper.deleteBatchIds(cboList);
+////			boService.persistenceBatch(batchCBO);
+//		} else {
+//			lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
+//		}
+//		lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
+	}
+
+
+	/**
+	 * 鐢宠鍗曚竴缂栫爜
+	 *
+	 * @param orderDTO 鐢宠鐨勪俊鎭紝闇�瑕佸寘鍚睘鎬х殑鍐呭鍜岀爜娈电浉鍏崇殑鍐呭
+	 * @return 杩斿洖缂栫爜鐨勫唴瀹�
+	 */
+	@Override
+	public String addSaveCode(CodeOrderDTO orderDTO) {
+		VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勫睘鎬у拰鐮佹鐨勫唴瀹归兘涓虹┖", orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭",
+			orderDTO.getTemplateOid(), "妯℃澘鐨勪富閿�", orderDTO.getCodeRuleOid(), "缂栫爜瑙勫垯鐨勪富閿�");
+		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+		CodeClstemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
+		CodeRuleVO ruleVO = ruleService.getObjectHasSecByOid(orderDTO.getCodeRuleOid());
+		//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
+		checkSecValueOnOrder(ruleVO, orderDTO);
+		//2.鍒ゆ柇蹇呰緭椤�
+		checkRequiredAttrOnOrder(templateVO, orderDTO);
+		//3.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
+		switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
+		//4.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
+		switchComponentAttrOnOrder(templateVO, orderDTO);
+		//5.鏍¢獙瑙勫垯
+		checkVerifyOnOrder(templateVO, orderDTO);
+		//6.鍏抽敭灞炴��
+		checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
+		//7.鏋氫妇杞崲
+		checkEnumOnOrder(templateVO, orderDTO);
+		//8.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
+		switchDateAttrOnOrder(templateVO, orderDTO);
+		//9.鐢熸垚缂栫爜鐨勪俊鎭�
+//		ClientBusinessObject cbo = boService.createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
+//		CodeWupinEntity cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
+//		//榛樿鐨勫睘鎬ч兘涓嶇敤浠庡墠绔嫹璐�
+//		//璁剧疆缂栫爜闇�瑕佺殑榛樿灞炴�х殑鍐呭
+//		copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, false);
+//		//TODO:鍥犱负榛樿鐨勫睘鎬ч兘涓嶆嫹璐濓紝鐩墠闆嗗洟鐮佸彨name锛屽苟娌℃湁浠嶥TO鎷疯礉鍒癱bo閲屻�傚鍔犱竴涓崟鐙鐞嗭紝浠ュ悗鍐嶇湅瑕佷笉瑕佽皟鏁�
+//		cbo.setName(orderDTO.getName() == null ? "" : orderDTO.getName());
+//		//end -- modify by lihang @20220407
+//		List<CodeWupinEntity> cboList = new ArrayList<>();
+//
+//		//澶囨敞
+//		cbo.setDescription(orderDTO.getDescription());
+//
+//		cboList.add(cbo);
+//		List<String> codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(),cboList);
+////		batchSaveSelectChar(templateVO, cboList);
+//		return codeList.size() > 0 ? codeList.get(0) : "";
+		return null;
+	}
+
+	/**
+	 * 澶勭悊鍒嗙被娉ㄥ叆鐨勪俊鎭�
+	 *
+	 * @param templateVO         妯℃澘鐨勬樉绀哄璞★紝蹇呴』瑕佸悗妯℃澘鐨勫睘鎬�
+	 * @param classifyFullInfoBO 鍒嗙被鐨勫叏璺緞
+	 * @param orderDTO           缂栫爜鐢宠鐨勪俊鎭�
+	 */
+	private void switchClassifyLevelOnOrder(CodeClstemplateVO templateVO, CodeClassifyFullInfoBO classifyFullInfoBO, CodeOrderDTO orderDTO) {
+		Map<String,CodeClstempattrVO> classifyAttrVOMap = templateVO.getAttributes().stream().filter(
+			s -> StringUtils.isNotBlank(s.getClassifyinvokeattr()) && StringUtils.isNotBlank(s.getClassifyinvokelevel())
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (classifyFullInfoBO.getTopClassifyVO() == null) {
+			//闇�瑕侀噸鏂版煡璇竴涓嬶紝鍥犱负杩欎釜鏄寚瀹氱殑鍒嗙被杩涙潵鐨�
+
+		}
+		if (!CollectionUtils.isEmpty(classifyAttrVOMap)) {
+			classifyAttrVOMap.forEach((attrId, attrVO) -> {
+				//鍒嗙被娉ㄥ叆鐨勭紪鍙锋垨鑰呭悕绉帮紝
+				//灞傜骇鍖呭惈鎸囧畾灞傚拰鏈�灏忓眰
+				CodeClassifyVO classifyVO = null;
+				if (!CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(attrVO.getClassifyinvokelevel()) && !"min".equalsIgnoreCase(attrVO.getClassifyinvokelevel())) {
+					//鎸囧畾浜嗗眰绾х殑
+					//娉ㄦ剰锛屽洜涓烘煡璇笂绾у垎绫诲嚭鏉ョ殑灞傜骇鏄�掑簭鐨勶紝鍗抽《灞傝妭鐐规槸鏈�澶х殑鍊�
+					List<CodeClassifyVO> classifyVOS = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
+					int level = VciBaseUtil.getInt(attrVO.getClassifyinvokelevel());
+					if (classifyVOS.size() >= level && level > 0) {
+						classifyVO = classifyVOS.get(level - 1);
+					}
+				} else {
+					//褰撳墠鐨勫垎绫�
+					classifyVO = classifyFullInfoBO.getCurrentClassifyVO();
+				}
+				if (classifyVO == null) {
+					//璇存槑灞傜骇鏈夎
+					orderDTO.getData().put(attrId, "鍒嗙被鏍戜笂娌℃湁灞傜骇[" + attrVO.getClassifyinvokelevel() + "]");
+					// classifyVO = classifyFullInfoBO.getCurrentClassifyVO();
+				} else {
+					Map<String, String> classifyDataMap = VciBaseUtil.objectToMapString(classifyVO);
+					String value = classifyDataMap.getOrDefault(attrVO.getClassifyinvokeattr(), "");
+					orderDTO.getData().put(attrId, value);
+				}
+			});
+		}
+	}
+
+
+	/**
+	 * 鍒ゆ柇缂栫爜鐨勭爜娈垫槸鍚﹁緭鍏ユ垨鑰呴�夋嫨浜嗙爜鍊�
+	 *
+	 * @param ruleVO   瑙勫垯鐨勬樉绀哄璞�
+	 * @param orderDTO 缂栫爜鐢宠鐨勫唴瀹�
+	 */
+	@Override
+	public void checkSecValueOnOrder(CodeRuleVO ruleVO, CodeOrderDTO orderDTO) {
+		List<String> unSerialSecOidList = ruleVO.getSecVOList().stream().filter(
+			s -> !(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue().equalsIgnoreCase(s.getSecType())
+				|| CodeSecTypeEnum.CODE_ATTR_SEC.getValue().equalsIgnoreCase(s.getSecType())
+				|| CodeSecTypeEnum.CODE_DATE_SEC.getValue().equalsIgnoreCase(s.getSecType())
+				|| CodeSecTypeEnum.CODE_LEVEL_SEC.getValue().equalsIgnoreCase(s.getSecType())
+				|| VciBaseUtil.getBoolean(s.getNullableFlag()))
+		).map(CodeBasicSecVO::getOid).collect(Collectors.toList());
+		if (!CollectionUtils.isEmpty(unSerialSecOidList)) {
+			if (CollectionUtils.isEmpty(orderDTO.getSecDTOList())) {
+				throw new VciBaseException("闈炴祦姘寸爜娈�(鎴栬�呭繀杈撶爜娈碉級蹇呴』瑕佽緭鍏�(鎴栭�夋嫨)鐮佸��");
+			}
+			if (orderDTO.getSecDTOList().stream().anyMatch(s -> !unSerialSecOidList.contains(s.getSecOid())
+				&& StringUtils.isBlank(s.getSecValue()))) {
+				throw new VciBaseException("闈炴祦姘寸爜娈�(鎴栬�呭繀杈撶爜娈碉級蹇呴』瑕佽緭鍏�(鎴栭�夋嫨)鐮佸��");
+			}
+		}
+	}
+
+	/**
+	 * 鏍¢獙灞炴�ф槸鍚︿负蹇呰緭
+	 *
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞★紝闇�瑕佸寘鍚ā鏉垮睘鎬�
+	 * @param orderDTO   缂栫爜鐢宠鐨勪俊鎭�
+	 */
+	private void checkRequiredAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
+		Map<String, CodeClstempattrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(
+				s -> VciBaseUtil.getBoolean(s.getRequireflag()) && StringUtils.isBlank(s.getComponentrule())
+					&& StringUtils.isBlank(s.getClassifyinvokeattr()))
+			.collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (!CollectionUtils.isEmpty(requiredAttrMap)) {
+			requiredAttrMap.forEach((attrId, attrVO) -> {
+				//鍙湁浼佷笟缂栫爜锛岀姸鎬侊紝澶囨敞锛屾ā鏉夸富閿紝鍒嗙被涓婚敭杩欏嚑涓槸鍥哄畾鐨勶紝鍏朵綑閮芥槸鑷閰嶇疆鐨�
+				if (StringUtils.isBlank(getValueFromOrderDTO(orderDTO, attrId))) {
+					throw new VciBaseException("灞炴�с�恵0}銆戝繀椤昏杈撳叆(閫夋嫨)鍐呭", new String[]{attrVO.getName()});
+				}
+			});
+		}
+	}
+
+	/**
+	 * 浠庣紪鐮佺敵璇蜂俊鎭璞′笂鑾峰彇鏌愪釜灞炴�х殑鍊�
+	 *
+	 * @param orderDTO 缂栫爜鐢宠瀵硅薄
+	 * @param attrId   灞炴�х殑缂栧彿
+	 * @return 鍊�
+	 */
+	private String getValueFromOrderDTO(CodeOrderDTO orderDTO, String attrId) {
+		attrId = attrId.toLowerCase(Locale.ROOT);
+		String value = null;
+		if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
+			value = WebUtil.getStringValueFromObject(WebUtil.getValueFromField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO));
+		} else {
+			//璇存槑鏄嚜琛岄厤缃殑
+			//鍓嶇蹇呴』瑕佷紶閫掑皬鍐欑殑灞炴��
+			value = orderDTO.getData().getOrDefault(attrId, "");
+		}
+		return value;
+	}
+
+	/**
+	 * 杞崲缁勫悎瑙勫垯鐨勫��
+	 *
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞★紝闇�瑕佸寘鍚ā鏉垮睘鎬�
+	 * @param orderDTO   缂栫爜鐢宠鐨勪俊鎭�
+	 */
+	private void switchComponentAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
+		Map<String, CodeClstempattrVO> compAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getComponentrule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (!CollectionUtils.isEmpty(compAttrVOMap)) {
+			Map<String, String> dataMap = WebUtil.objectToMapString(orderDTO);
+
+			Map<String, String> dataLowMap = new HashMap<>();
+			if (!CollectionUtils.isEmpty(dataMap)) {
+				dataMap.forEach((key, value) -> {
+					dataLowMap.put(key.toLowerCase(Locale.ROOT), value);
+				});
+			}
+			dataLowMap.putAll(orderDTO.getData());
+			compAttrVOMap.forEach((attrId, attrVO) -> {
+//				dataLowMap.put(attrId, formulaService.getValueByFormula(dataLowMap, attrVO.getComponentrule()));
+			});
+			dataLowMap.forEach((key, value) -> {
+				setValueToOrderDTO(orderDTO, key, value);
+			});
+		}
+	}
+
+
+	/**
+	 * 璁剧疆鏂扮殑鍊煎埌鐢宠瀵硅薄涓�
+	 *
+	 * @param orderDTO 缂栫爜鐢宠瀵硅薄
+	 * @param attrId   灞炴�х殑缂栧彿
+	 * @param value    鍊�
+	 */
+	private void setValueToOrderDTO(CodeOrderDTO orderDTO, String attrId, String value) {
+		attrId = attrId.toLowerCase(Locale.ROOT);
+		if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
+			WebUtil.setValueToField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO, value);
+		} else {
+			orderDTO.getData().put(attrId, value);
+		}
+	}
+
+	/**
+	 * 鏍¢獙姝e垯琛ㄨ揪寮忔槸鍚︽纭�
+	 *
+	 * @param templateVO 妯℃澘鐨勪俊鎭紝蹇呴』鍖呭惈灞炴�х殑鍐呭
+	 * @param orderDTO   缂栫爜鐢宠鐨勭浉鍏崇殑淇℃伅
+	 */
+	private void checkVerifyOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
+		Map<String, CodeClstempattrVO> verifyAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getVerifyrule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (!CollectionUtils.isEmpty(verifyAttrVOMap)) {
+			verifyAttrVOMap.forEach((attrId, attrVO) -> {
+				String value = getValueFromOrderDTO(orderDTO, attrId);
+				if (StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyrule())) {
+					//鏍¢獙姝e垯琛ㄨ揪寮�
+					throw new VciBaseException("灞炴�{0}]鐨勫�间笉绗﹀悎鏍¢獙瑙勫垯鐨勮姹�", new String[]{attrVO.getName()});
+				}
+			});
+		}
+	}
+
+	/**
+	 * 鏍¢獙鍏抽敭灞炴��
+	 *
+	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param templateVO       妯℃澘鐨勫唴瀹癸紝蹇呴』鍖呭惈妯℃澘灞炴��
+	 * @param orderDTO         缂栫爜鐢宠鐨勭浉鍏崇殑淇℃伅
+	 */
+	private void checkKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
+		//鍏堣幏鍙栧叧閿睘鎬х殑瑙勫垯锛屼篃鍒╃敤缁ф壙鐨勬柟寮�
+		CodeKeyattrrepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
+		//娉ㄦ剰鐨勬槸keyRuleVO鍙兘涓虹┖锛岃〃绀轰笉浣跨敤瑙勫垯鎺у埗
+		//鑾峰彇鎵�鏈夌殑鍏抽敭灞炴��
+		Map<String, CodeClstempattrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyattrflag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		Map<String, String> conditionMap = new HashMap<>();
+		boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
+		//鍏ㄩ儴鍘荤┖鐨勪紭鍏堢骇澶т簬鍘荤┖
+		boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
+		boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
+		boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
+		ketAttrMap.forEach((attrId, attrVO) -> {
+			String value = getValueFromOrderDTO(orderDTO, attrId);
+			if (value == null) {
+				value = "";
+			}
+//			wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
+		});
+
+		//娌℃湁闄愬埗鍒嗙被锛屼絾鏄竴涓ā鏉垮彧鍙兘鍦ㄤ竴涓笟鍔$被鍨嬮噷闈紝鎵�浠ョ洿鎺ユ煡璇㈣繖涓笟鍔$被鍨嬪嵆鍙�
+
+//		if (!CollectionUtils.isEmpty(conditionMap)) {
+//			final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
+//			conditionMap.forEach((key, value) -> {
+//				sql[0] += " and " + key + " = " + value;
+//			});
+//			if (StringUtils.isNotBlank(orderDTO.getOid())) {
+//				//淇敼鐨勬椂鍊欙紝闇�瑕佹帓闄よ嚜宸�
+//				sql[0] += " and oid != '" + orderDTO.getOid() + "'";
+//			} else if (StringUtils.isNotBlank(orderDTO.getCopyFromVersion())) {
+//				sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
+//			}
+//			sql[0] += " and islastR = '1' and islastV = '1' ";
+//			if (boService.queryCountBySql(sql[0], new HashMap<>()) > 0) {
+//				String ruleInfoMsg = keyRuleVO == null ? "" : "鏌ヨ瑙勫垯锛氬幓闄ょ┖鏍�--{0},蹇界暐澶у皬鍐�--{1},蹇界暐鍏ㄥ崐瑙�--{2},蹇界暐鍏ㄩ儴绌烘牸--{3}";
+//				String[] objs = new String[]{trim ? "鏄�" : "鍚�", ignoreCase ? "鏄�" : "鍚�", ignoreWidth ? "鏄�" : "鍚�", trimAll ? "鏄�" : "鍚�"};
+//				throw new VciBaseException("鏍规嵁鎮ㄥ~鍐欑殑鍏抽敭灞炴�х殑鍐呭锛岀粨鍚堝叧閿睘鎬ф煡璇㈣鍒欙紝鍙戠幇杩欎釜鏁版嵁宸茬粡鍦ㄧ郴缁熶腑瀛樺湪浜嗐�傝淇!銆�" + ruleInfoMsg, objs);
+//			}
+//		}
+	}
+
+	/**
+	 * 灏佽鍏抽敭灞炴�х殑鏌ヨ璇彞
+	 *
+	 * @param value        褰撳墠鐨勫��
+	 * @param keyRuleVO    鍏抽敭灞炴�х殑鎺у埗瑙勫垯锛屽彲浠ヤ负绌�
+	 * @param attrId       灞炴�х殑缂栧彿
+	 * @param trim         鏄惁鍘婚櫎绌烘牸
+	 * @param ignoreCase   鏄惁涓嶅尯鍒嗗ぇ灏忓啓
+	 * @param ignoreWidth  鏄惁蹇界暐鍏ㄥ崐瑙�
+	 * @param trimAll      鏄惁蹇界暐鍏ㄩ儴绌烘牸
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 */
+//	@Override
+//	public void wrapperKeyAttrConditionMap(String value, CodeKeyattrrepeatVO keyRuleVO, String attrId,
+//										   boolean trim, boolean ignoreCase, boolean ignoreWidth,
+//										   boolean trimAll, Map<String, String> conditionMap) {
+//		boolean ignoreSpace = trim || trimAll;
+//		if (StringUtils.isBlank(value)) {
+//			//涓虹┖鐨勬椂鍊欙紝涓嶈兘鐢≦ueryOperation.ISNULL锛屽钩鍙颁笉鐭ラ亾鍟ユ椂鍊欎笉澶勭悊杩欑浜�
+//			conditionMap.put("t."+attrId, "null");
+//		} else {
+//			if (keyRuleVO != null) {
+//				String queryKey = "";
+//				String queryValue = "";
+//
+//				String temp = "";
+//				if (ignoreCase && ignoreSpace && ignoreWidth) {
+//					//蹇界暐澶у皬鍐欙紝涓斿幓绌猴紝蹇界暐鍏ㄥ崐瑙�
+//					temp = (trimAll ? "REPLACE" : "TRIM") + "(UPPER(to_single_byte(%s)) " + (trimAll ? ",' ','')" : ")");
+//				} else if (ignoreCase && ignoreSpace && !ignoreWidth) {
+//					//蹇界暐澶у皬鍐欍�佸幓绌恒�佷笉蹇界暐鍏ㄥ崐瑙�
+//					temp = (trimAll ? "REPLACE" : "TRIM") + "(UPPER(%s) " + (trimAll ? ",' ','')" : ")");
+//				} else if (ignoreCase && !ignoreSpace && ignoreWidth) {
+//					//蹇界暐澶у皬鍐欍�佷笉鍘荤┖銆佸拷鐣ュ叏鍗婅
+//					temp = "UPPER(to_single_byte(%s))";
+//				} else if (!ignoreCase && ignoreSpace && ignoreWidth) {
+//					//涓嶅拷鐣ュぇ灏忓啓銆佸幓绌恒�佸拷鐣ュ叏鍗婅
+//					temp = (trimAll ? "REPLACE" : "TRIM") + "(to_single_byte(%s) " + (trimAll ? ",' ','')" : ")");
+//				} else if (ignoreCase && !ignoreSpace && !ignoreWidth) {
+//					//蹇界暐澶у皬鍐欍�佷笉鍘荤┖銆佷笉蹇界暐鍏ㄥ崐瑙�
+//					temp = "UPPER(%s)";
+//				} else if (!ignoreCase && !ignoreCase && ignoreWidth) {
+//					//涓嶅拷鐣ュぇ灏忓啓銆佷笉鍘荤┖銆佸拷鐣ュ叏鍗婅
+//					temp = "to_single_byte(%s)";
+//				} else if (!ignoreCase && ignoreSpace && !ignoreWidth) {
+//					//涓嶅拷鐣ュぇ灏忓啓銆佸幓绌恒�佷笉蹇界暐鍏ㄥ崐瑙�
+//					temp = (trimAll ? "REPLACE" : "TRIM") + "(%s " + (trimAll ? ",' ','')" : ")");
+//				} else if (!ignoreCase && !ignoreSpace && !ignoreWidth) {
+//					//涓嶅拷鐣ュぇ灏忓啓銆佷笉鍘荤┖銆佷笉蹇界暐鍏ㄥ崐瑙�
+//					temp = "%s";
+//				}
+//				queryKey = String.format(temp, "t."+attrId);
+//				queryValue = String.format(temp, "'" + (trim ? value.trim() : value) + "'");
+//				conditionMap.put(queryKey, queryValue);
+//			} else {
+//				//涓虹┖鐨勬椂鍊欎笉浠h〃涓嶆牎楠岋紝鍙槸涓嶅幓闄ょ浉鍏崇殑淇℃伅
+//				conditionMap.put("t."+attrId, value);
+//			}
+//		}
+//	}
+
+	/**
+	 * 鏍¢獙鏋氫妇鐨勫唴瀹�
+	 *
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞★紝闇�瑕佸寘鍚睘鎬�
+	 * @param orderDTO   缂栫爜鐢宠鐨勪俊鎭�
+	 */
+	private void checkEnumOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
+		//濡傛灉鏋氫妇鍙互淇敼锛屽垯涓嶉渶瑕佹牎楠屾槸鍚︾鍚堟灇涓剧殑閫夐」
+
+		Map<String, CodeClstempattrVO> enumAttrVOMap = templateVO.getAttributes().stream().filter(s -> (StringUtils.isNotBlank(s.getEnumstring()) || StringUtils.isNotBlank(s.getEnumid())) && !VciBaseUtil.getBoolean(s.getEnumeditflag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (!CollectionUtils.isEmpty(enumAttrVOMap)) {
+			enumAttrVOMap.forEach((attrId, attrVO) -> {
+				String value = getValueFromOrderDTO(orderDTO, attrId);
+				if (StringUtils.isNotBlank(value)) {
+					//鏈夊�兼墠鑳芥牎楠�
+					List<KeyValue> comboboxKVs = listComboboxItems(attrVO);
+					if (!comboboxKVs.stream().anyMatch(s -> value.equalsIgnoreCase(s.getKey()))) {
+						throw new VciBaseException("灞炴�с�恵0}銆戠殑鍊间笉绗﹀悎鏋氫妇鐨勮姹�", new String[]{attrVO.getName()});
+					}
+				}
+			});
+		}
+	}
+
+	/**
+	 * 杞崲鏃堕棿鐨勬牸寮�
+	 *
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞★紝闇�瑕佸寘鍚睘鎬�
+	 * @param orderDTO   缂栫爜鐢宠鐨勪俊鎭�
+	 */
+	private void switchDateAttrOnOrder(CodeClstemplateVO templateVO, CodeOrderDTO orderDTO) {
+		Map<String, CodeClstempattrVO> dateAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getCodedateformat())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
+			dateAttrVOMap.forEach((attrId, attrVO) -> {
+				String value = getValueFromOrderDTO(orderDTO, attrId);
+				if (StringUtils.isNotBlank(value)) {
+					DateConverter dateConverter = new DateConverter();
+					dateConverter.setAsText(value);
+					value = VciDateUtil.date2Str(dateConverter.getValue(), VciDateUtil.DateTimeMillFormat);
+					setValueToOrderDTO(orderDTO, attrId, value);
+				}
+			});
+		}
+	}
+
+	/**
+	 * 鎷疯礉鏁版嵁鍒癱bo瀵硅薄涓�
+	 *
+	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param cbo              涓氬姟鏁版嵁
+	 * @param orderDTO         缂栫爜鐢宠鐨勪俊鎭�
+	 * @param templateVO       妯℃澘鐨勬樉绀哄璞�
+	 * @param edit             鏄惁涓轰慨鏀�
+	 */
+	private void copyValueToCBO(CodeClassifyFullInfoBO classifyFullInfo, CodeWupinEntity cbo,
+								CodeOrderDTO orderDTO, CodeClstemplateVO templateVO,
+								boolean edit) {
+		String fullPath = "";
+		if (!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())) {
+			fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel())))
+				.map(CodeClassifyVO::getOid).collect(Collectors.joining("##"));
+		} else {
+			fullPath = classifyFullInfo.getCurrentClassifyVO().getOid();
+		}
+
+//		BeanUtils.
+		BeanUtils.copyProperties(orderDTO.getData(),cbo);
+		cbo.setMaterialtype(Short.valueOf("1001"));
+//		orderDTO.getData().forEach((key, value) -> {
+//			if (!edit || (!checkUnAttrUnEdit(key) &&
+//				!VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(key))) {
+//				try {
+//					cbo.setAttributeValue(key, value);
+//				} catch (Exception e) {
+//					logger.error("璁剧疆灞炴�х殑鍊奸敊璇�", e);
+//				}
+//			}
+//		});
+		try {
+
+			cbo.setCodeclsfid(classifyFullInfo.getCurrentClassifyVO().getOid());
+			cbo.setCodetemplateoid(templateVO.getOid());
+			cbo.setCodeclsfpath(fullPath);
+//			cbo.setMaterialclassify("model_type");
+//			cbo.setMaterialname(orderDTO.getData().get("materialname"));
+//			cbo.setShifoupihaoguanli("true");
+//			cbo.setKucunwl("true");
+//			cbo.setXiaoshouwl("false");
+			if (!edit && StringUtils.isBlank(orderDTO.getLcStatus())) {
+				//鎵剧敓鍛藉懆鏈熺殑璧峰鐘舵�侊紝鎻掍釜鐐癸紝鐪嬬敓鍛藉懆鏈熸槸鍚﹂渶瑕佸垱寤�
+				if (StringUtils.isNotBlank(cbo.getLctid())) {
+//					OsLifeCycleVO lifeCycleVO = lifeCycleService.getLifeCycleById(cbo.getLctid());
+//					if (lifeCycleVO != null) {
+//						cbo.setLcStatus("Editing");
+////						cbo.setLcStatus(lifeCycleVO.getStartStatus());
+//					} else {
+						cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+//					}
+				} else {
+					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+				}
+
+			}
+
+			int secret = VciBaseUtil.getInt(cbo.getSecretGrade().toString());
+			//鎻掍釜鐐癸紝鍚庣画鐪嬪瘑绾ф湇鍔℃槸鍚﹀彲鐢�
+//			if (secret == 0 || !secretService.checkDataSecret(secret)) {
+			if (secret == 0 ) {
+				Integer userSecret = VciBaseUtil.getCurrentUserSecret();
+//				cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
+				cbo.setSecretGrade(userSecret == null || userSecret == 0 ? UserSecretEnum.NONE.getValue() : userSecret);
+			}
+		} catch (Throwable e) {
+			logger.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�", e);
+		}
+	}
+
+
+	/**
+	 * 鍒濆鍖栦笟鍔$被鍨�
+	 * --鍒涘缓浜洪粯璁や负褰撳墠鐢ㄦ埛锛屽鏋滈渶瑕佷慨鏀癸紝鍙互鍦ㄨ幏鍙栧悗鑷澶勭悊
+	 * @param btmName 涓氬姟绫诲瀷鐨勫悕绉帮紝浼氳嚜鍔ㄥ彉鎴愬皬鍐�
+	 * @return CodeWupinEntity
+	 * @throws VciBaseException 鍒濆鍖栧嚭閿欑殑鏄細鎶涘嚭寮傚父
+	 */
+//	@Override
+//	public CodeWupinEntity createCBOByBtmName(String btmName)
+//		throws VciBaseException {
+//		if(btmName!=null){
+//			btmName = btmName.trim().toLowerCase();
+//		}
+//		String userid = AuthUtil.getUser().getUserName();
+////		if(!hasCreatedCbos.containsKey(btmName)){
+////			if(StringUtils.isEmpty(userid)){
+////				throw new VciBaseException(msgCodePrefix +"noHasUserid");
+////			}
+////			try {
+////				hasCreatedCbos.put(btmName, createBusinessObject(btmName));
+////			} catch (Exception e) {
+////				logger.error("鍒涘缓涓氬姟绫诲瀷瀵硅薄",e);
+////				throw new VciBaseException(msgCodePrefix + "initBoError",new String[]{btmName});
+////			}
+////		}
+////		ClientBusinessObject cbo = cloneClientBusinessObject(hasCreatedCbos.get(btmName));
+//
+//		QueryWrapper<CodeOsbtmtypeEntity> btmWrapper = new QueryWrapper<>();
+//		btmWrapper.eq("ID",btmName);
+//		CodeOsbtmtypeEntity btmTypeVO = codeOsbtmtypeMapper.selectOne(btmWrapper);
+////		OsBtmTypeVO btmTypeVO = btmService.getBtmById(boName);
+//		String userName = AuthUtil.getUser().getUserName();
+//		CodeWupinEntity wupinEntity = new CodeWupinEntity();
+//		wupinEntity.setOid(null);
+////		bo.setRevisionid((new ObjectUtility()).getNewObjectID36());
+////		bo.setNameoid((new ObjectUtility()).getNewObjectID36());
+//		wupinEntity.setBtmname(btmName);
+//		wupinEntity.setLastR(String.valueOf(1));
+//		wupinEntity.setFirstR(String.valueOf(1));
+//		wupinEntity.setFirstV(String.valueOf(1));
+//		wupinEntity.setLastV(String.valueOf(1));
+//		wupinEntity.setCreator(userName);
+//		wupinEntity.setCreateTime(new Date());
+//		wupinEntity.setLastModifier(userName);
+//		wupinEntity.setLastModifyTime(new Date());
+//		wupinEntity.setRevisionRule(btmTypeVO.getRevisionruleid());
+//		wupinEntity.setVersionRule(String.valueOf(btmTypeVO.getVersionRule()));
+//		if(StringUtils.isNotBlank(btmTypeVO.getRevisionruleid())){
+//			//鎻掍釜鐐癸紝闇�瑕侀棶鍕囧摜鐗堟湰闂锛屽睍绀洪粯璁や负1
+////			OsRevisionRuleVO revisionRuleVO = revisionRuleService.getRevisionRuleById(btmTypeVO.getRevisionruleid());
+//			wupinEntity.setRevisionValue("1");
+//		}
+//
+//		wupinEntity.setRevisionSeq(1);
+//		wupinEntity.setVersionSeq(1);
+//		//鎻掍釜鐐癸紝闇�瑕侀棶鍕囧摜鐗堟湰闂锛屽睍绀洪粯璁や负1
+//		wupinEntity.setVersionValue("1");
+//		wupinEntity.setLctid("wupinLC");
+//		wupinEntity.setLcStatus("Editing");
+//		wupinEntity.setId("");
+//		wupinEntity.setName("");
+//		wupinEntity.setDescription("");
+//		wupinEntity.setOwner(userName);
+//		wupinEntity.setCheckinby(userName);
+//		wupinEntity.setCopyFromVersion("");
+//		wupinEntity.setMaterialtype((short) 1001);
+//		wupinEntity.setCaigouwl("true");
+//		wupinEntity.setShifoupihaoguanli("true");
+//		wupinEntity.setKucunwl("true");
+//		wupinEntity.setXiaoshouwl("false");
+//		wupinEntity.setPassing("true");
+//
+////		this.initTypeAttributeValue(wupinEntity,btmTypeVO);
+//		return wupinEntity;
+//
+//
+////		return cbo;
+//	}
+
+	/**
+	 * 鏄惁涓轰慨鏀瑰拷鐣ョ殑灞炴��
+	 * @param attrName 灞炴�х殑鍚嶅瓧
+	 * @return true 琛ㄧず搴旇蹇界暐
+	 */
+	boolean checkUnAttrUnEdit(String attrName){
+		return  (VciQueryWrapperForDO.OID_FIELD.equalsIgnoreCase(attrName)
+			||"ts".equalsIgnoreCase(attrName)
+			|| "lastmodifier".equalsIgnoreCase(attrName)
+			|| "lastmodifytime".equalsIgnoreCase(attrName)
+			|| "createtime".equalsIgnoreCase(attrName)
+			|| "checkintime".equalsIgnoreCase(attrName)
+			||"checkouttime".equalsIgnoreCase(attrName));
+	}
+
+	/**
+	 * 淇濆瓨鍙緭鍙�夌殑淇℃伅
+	 *
+	 * @param templateVO 妯℃澘鐨勫璞�
+	 * @param cboList    鏁版嵁鐨勫唴瀹�
+	 */
+//	@Override
+//	public void batchSaveSelectChar(CodeClstemplateVO templateVO, List<ClientBusinessObject> cboList) {
+//		if (templateVO != null && !CollectionUtils.isEmpty(cboList)) {
+//			//鏄紓姝ョ殑锛屾墍浠ョ洿鎺ュ惊鐜�
+//			List<CodeClstempattrVO> selectAttrVOs = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getLibraryidentification())).collect(Collectors.toList());
+//
+//			if (!CollectionUtils.isEmpty(selectAttrVOs)) {
+////				SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+//				selectAttrVOs.parallelStream().forEach(attrVO -> {
+//					List<String> valuesList = new CopyOnWriteArrayList<>();
+//					cboList.parallelStream().forEach(cbo -> {
+//						String value = cbo.getAttributeValue(attrVO.getId());
+//						if (StringUtils.isNotBlank(value)) {
+//							valuesList.add(value);
+//						}
+//					});
+//					if (!CollectionUtils.isEmpty(valuesList)) {
+//						charService.saveBySameNamespaceAndFlag(templateVO.getBtmTypeId(), attrVO.getLibraryIdentification(), valuesList, sessionInfo);
+//					}
+//				});
+//			}
+//		}
+//	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
new file mode 100644
index 0000000..df1c12d
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -0,0 +1,419 @@
+package com.vci.ubcs.code.service.impl;
+
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
+import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.service.ICodeClassifyService;
+import com.vci.ubcs.code.service.MdmEngineService;
+import com.vci.ubcs.code.service.MdmIOService;
+import com.vci.ubcs.code.vo.CodeClstempattrVO;
+import com.vci.ubcs.code.vo.CodeClstemplateVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeImProtRusultVO;
+import com.vci.ubcs.starter.bo.WriteExcelData;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.poi.bo.ReadExcelOption;
+import com.vci.ubcs.starter.poi.bo.SheetDataSet;
+import com.vci.ubcs.starter.poi.bo.SheetRowData;
+import com.vci.ubcs.starter.poi.bo.WriteExcelOption;
+import com.vci.ubcs.starter.poi.util.ExcelUtil;
+import com.vci.ubcs.starter.util.LocalFileUtil;
+import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.ubcs.starter.web.pagemodel.KeyValue;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import com.vci.ubcs.starter.web.util.VciDateUtil;
+import org.apache.poi.hssf.usermodel.HSSFRichTextString;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.RichTextString;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
+import static com.vci.ubcs.code.constant.MdmEngineConstant.CODE_FIELD;
+import static com.vci.ubcs.code.constant.MdmEngineConstant.DEFAULT_ATTR_LIST;
+import static com.vci.ubcs.starter.poi.util.ExcelUtil.KEY_ATTR_CHAR;
+import static com.vci.ubcs.starter.poi.util.ExcelUtil.REQUIRED_CHAR;
+
+@Service
+public class MdmIOServiceImpl implements MdmIOService {
+
+
+	/**
+	 * 涓婚搴撳垎绫荤殑鏈嶅姟
+	 */
+	@Resource
+	private ICodeClassifyService classifyService;
+
+	/**
+	 * 妯℃澘鐨勬湇鍔�
+	 */
+	@Resource
+	private CodeClstemplateServiceImpl templateService;
+
+	/**
+	 * 涓绘暟鎹紩鎿庣殑鏈嶅姟
+	 */
+	@Resource
+	private MdmEngineService engineService;
+
+	/**
+	 * 鐢熸垚瀵煎叆鐨勬枃浠�
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param isHistory 鏄惁鍘嗗彶鏁版嵁瀵煎叆
+	 * @return excel鐨勬枃浠跺湴鍧�
+	 */
+	@Override
+	public String createImportExcel(String codeClassifyOid, boolean isHistory) {
+		List<CodeClstemplateVO> templateVOList=new ArrayList<>();
+
+		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘","瀵煎嚭鐨勯厤缃�",codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
+
+		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
+
+		if(isHistory){
+			templateVOList= templateService.childTemplates(codeClassifyOid);
+		}else{
+			//鎵炬ā鏉�
+			CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
+			templateVOList.add(templateVO);
+		}
+
+		WriteExcelOption eo = new WriteExcelOption();
+		eo.setAppend(true);
+		//澧炲姞妯℃澘鐨勪俊鎭鍏�
+		LinkedList<WriteExcelData> tempEDList = new LinkedList<>();
+		tempEDList.add(new WriteExcelData(0,0,"妯℃澘涓婚敭"));
+		tempEDList.add(new WriteExcelData(0,1,"妯℃澘浠e彿"));
+		tempEDList.add(new WriteExcelData(0,2,"妯℃澘鍚嶇О"));
+		for(int j=0;j<templateVOList.size();j++){
+			CodeClstemplateVO  templateVO=templateVOList.get(j);
+
+			//缁勫悎鏍煎紡鐨勪笉瀵煎叆锛�
+			// 鏋氫妇鐨勬彁渚涘簭鍒楃殑閫夋嫨
+			//鏃堕棿鍏ㄩ儴缁熶竴涓簓yyy-MM-dd HH:mm:ss
+			//鍙傜収鐨勮嚜琛岃緭鍏ュ悕绉�
+			//鍒嗙被娉ㄥ叆鐨勪笉鐢紝閮芥槸瀵煎叆鍚庤嚜鍔ㄥ鐞嗙殑
+			//缂栫爜锛岀姸鎬佺瓑瀛楁涓嶅鍏�
+			List<CodeClstempattrVO> templateAttrVOS = templateVO.getAttributes().stream().filter(s ->
+				!DEFAULT_ATTR_LIST.contains(s.getId())
+					&& StringUtils.isBlank(s.getComponentrule())
+					&& StringUtils.isBlank(s.getClassifyinvokeattr())
+					&& (isHistory || VciBaseUtil.getBoolean(s.getFormdisplayflag()))
+			).collect(Collectors.toList());
+
+			if(CollectionUtils.isEmpty(templateAttrVOS)){
+				throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
+			}
+			List<CodeClstempattrVO> idAttrVOList = templateVO.getAttributes().stream().filter(s -> s.getId().equalsIgnoreCase(CODE_FIELD)).collect(Collectors.toList());
+			LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
+			Workbook workbook = new HSSFWorkbook();
+			if(isHistory){
+				excelDataList.add(new WriteExcelData(0,0,"鍒嗙被璺緞"));
+				excelDataList.add(new WriteExcelData(0,1,"鐮佹瀹藉害"));
+				excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"浼佷笟缂栫爜"));
+			}
+			for (int i = 0; i < templateAttrVOS.size(); i++) {
+				CodeClstempattrVO attrVO = templateAttrVOS.get(i);
+
+				Object text = attrVO.getName();
+				text = exportKeyAndRequired(workbook,attrVO,text);
+				int colIndex = (isHistory?3:0) + i;
+				WriteExcelData excelData = new WriteExcelData(0, colIndex, text);
+				if(StringUtils.isNotBlank(attrVO.getCodedateformat())
+					|| VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrVO.getAttributedatatype())
+					|| VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrVO.getAttributedatatype())
+					||VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributedatatype())){
+					excelData.setDateFormat(VciDateUtil.DateTimeFormat);
+				}
+				if(text instanceof RichTextString){
+					excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
+				}
+				excelDataList.add(excelData);
+				if(StringUtils.isNotBlank(attrVO.getEnumstring()) || StringUtils.isNotBlank(attrVO.getEnumid())){
+					//娣诲姞鏁版嵁鏈夋晥鎬�
+					List<String> enumValueList = new ArrayList<>();
+					enumValueList.add("");
+					List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
+					if(!CollectionUtils.isEmpty(valueList)){
+						valueList.stream().forEach(kv->{
+							enumValueList.add(kv.getValue());
+						});
+					}
+					//榛樿鍔�1涓囨潯
+					WriteExcelData ed = new WriteExcelData(1,colIndex,"");
+					ed.setRowTo(100);
+					ed.setColTo(colIndex);
+					ed.setValidation(true);
+					ed.setValidationDataList(enumValueList);
+					ed.setValidationErrorMsg("璇峰湪搴忓垪涓�夋嫨姝g‘鐨勫��");
+					excelDataList.add(ed);
+				}
+				if(VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributedatatype())){
+					List<String> booleanList = new ArrayList<>();
+
+					booleanList.add("鏄�");
+					booleanList.add("鍚�");
+					//榛樿鍔�1涓囨潯
+					WriteExcelData ed = new WriteExcelData(1,colIndex,"");
+					ed.setRowTo(100);
+					ed.setColTo(colIndex);
+					ed.setValidation(true);
+					ed.setValidationDataList(booleanList);
+					ed.setValidationErrorMsg("璇峰湪搴忓垪涓�夋嫨姝g‘鐨勫��");
+					excelDataList.add(ed);
+				}
+			}
+			eo.addSheetDataList(j+templateVO.getName(),excelDataList);
+			tempEDList.add(new WriteExcelData(j+1,0,templateVO.getOid()));
+			tempEDList.add(new WriteExcelData(j+1,1,templateVO.getId()));
+			tempEDList.add(new WriteExcelData(j+1,2,templateVO.getName()));
+		}
+		String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + (isHistory?"_鍘嗗彶鏁版嵁瀵煎叆妯℃澘.xls": "_瀵煎叆妯℃澘.xls");
+		eo.addSheetDataList(templateVOList.size()+"妯℃澘淇℃伅銆愯鍕垮垹闄ゆ垨绉诲姩銆�",tempEDList);
+		ExcelUtil.writeDataToFile(excelName,eo);
+		return excelName;
+	}
+
+	/**
+	 * 瀵煎嚭鐨勬椂鍊欏皝瑁呭繀杈撳拰鍏抽敭灞炴��
+	 * @param attrVO 灞炴�х殑鏄剧ず瀵硅薄
+	 * @param text 鍗曞厓鏍肩殑鍊�
+	 */
+	private Object exportKeyAndRequired(Workbook workbook,CodeClstempattrVO attrVO,Object text){
+		//蹇呰緭鍔�*锛屽叧閿睘鎬т负钃濊壊
+		if (VciBaseUtil.getBoolean(attrVO.getRequireflag()) || VciBaseUtil.getBoolean(attrVO.getKeyattrflag())) {
+			String value = text.toString();
+			if(VciBaseUtil.getBoolean(attrVO.getRequireflag())) {
+				value += REQUIRED_CHAR;
+			}
+			if(VciBaseUtil.getBoolean(attrVO.getKeyattrflag())){
+				value += KEY_ATTR_CHAR;
+			}
+			RichTextString ts = new HSSFRichTextString(value);
+			if(VciBaseUtil.getBoolean(attrVO.getRequireflag())){
+				Font font =  workbook.createFont();
+				font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());
+				ts.applyFont(font);
+			}
+
+			if(VciBaseUtil.getBoolean(attrVO.getKeyattrflag())){
+				Font font =  workbook.createFont();
+				font.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex());
+				ts.applyFont(font);
+			}
+			return ts;
+		}
+		return text;
+	}
+
+
+	/**
+	 * 鎵归噺鐢宠缂栫爜鏁版嵁
+	 *
+	 * @param orderDTO 缂栫爜鐢宠淇℃伅锛屽繀椤诲寘鍚垎绫讳富閿拰鐮佹鐨勪俊鎭�
+	 * @param file     excel鏂囦欢鐨勪俊鎭�
+	 * @return  鏈夐敊璇俊鎭殑excel鐨勬枃浠�
+	 */
+	@Override
+	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
+		VciBaseUtil.alertNotNull(orderDTO,"缂栫爜鐢宠鐩稿叧鐨勬暟鎹�",orderDTO.getCodeClassifyOid(),"涓婚搴撳垎绫讳富閿�");
+		ReadExcelOption reo = new ReadExcelOption();
+		reo.setReadAllSheet(true);
+		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
+		if(CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
+			||sheetDataSetList.get(0).getRowData().size()<1){
+			throw new VciBaseException("娌℃湁璇诲彇鍒颁换浣曠殑鏁版嵁");
+		}
+		if(sheetDataSetList.size()>LIMIT+1){
+			throw new VciBaseException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
+		}
+		//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
+		SheetDataSet dataSet = sheetDataSetList.get(0);
+		//鎵剧涓�琛岋紝涓轰簡鎵炬爣棰�
+		CodeClstemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
+
+		//鏍¢獙妯℃澘鏄笉鏄渶鏂扮殑
+		checkTemplateSync(sheetDataSetList,templateVO,0);
+		//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
+		Map<String,String> errorMap = new HashMap<>();
+		String redisUUid=batchImportCodes(orderDTO,templateVO,dataSet,errorMap,true);
+		CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
+		List<String> needRowIndexList = new ArrayList<>();
+//		String filePath = returnErrorToExcel(dataSet.getRowData(), errorMap, needRowIndexList, dataSet.getColName());
+//		if(StringUtils.isNotBlank(filePath)) {
+//			codeImProtRusultVO.setFilePath(filePath);
+//		}
+//		if(StringUtils.isNotBlank(redisUUid)){
+//			codeImProtRusultVO.setRedisUuid(redisUUid);
+//		}
+		return null;
+//		return codeImProtRusultVO;
+	}
+
+	/**
+	 * 鏍¢獙妯℃澘鏄惁涓哄悓姝ョ殑
+	 * @param sheetDataSetList excel閲岀殑鍐呭
+	 * @param templateVO 妯℃澘鐨勪俊鎭�
+	 */
+	private void checkTemplateSync(List<SheetDataSet> sheetDataSetList,CodeClstemplateVO templateVO,int i){
+		String templateOidInExcel = "";
+		String templateName="";
+		if(!CollectionUtils.isEmpty(sheetDataSetList)
+			&& sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
+			List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
+			templateName=rowData.get(i).getData().get(2);
+			templateOidInExcel=rowData.get(i).getData().get(0);
+			//templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
+		}
+       /* if(!CollectionUtils.isEmpty(sheetDataSetList)
+                && sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
+            List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
+            templateOidInExcel=rowData.get(i).getData().get(0);
+           //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
+        }*/
+		if(StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(templateVO.getOid())){
+			throw new VciBaseException("妯℃澘銆�"+templateName+"銆戜腑鐨勬暟鎹幏鍙栫殑妯$増淇℃伅涓庡綋鍓嶆ā鏉夸笉鍖归厤锛岃纭繚excel鏂囦欢閲屾湁銆愭ā鏉夸俊鎭�-璇峰嬁绉诲姩鎴栧垹闄ゃ�戠殑宸ヤ綔琛紝涓旂‘淇濇瘡娆″鍏ラ兘鏄厛涓嬭浇鐨勫鍏ユā鏉垮悗娣诲姞鐨勬暟鎹�");
+		}
+
+	}
+
+
+	/***
+	 * 鎵归噺澶勭悊鐢宠鏁版嵁
+	 * @param orderDTO
+	 * @param templateVO
+	 * @param dataSet
+	 * @return
+	 */
+	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClstemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
+		List<String> codeList=new ArrayList<>();
+//		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+		//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
+//		CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
+//		//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
+//		engineService.checkSecValueOnOrder(ruleVO,orderDTO);
+//		List<SheetRowData> rowDataList = dataSet.getRowData();
+//
+//		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
+//		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
+//			!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormdisplayflag())
+//		).collect(Collectors.toList());
+//		Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
+//		List<String> titleRowData = dataSet.getColName();
+//		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
+//		getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
+//
+//		//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
+//		List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
+//			&& StringUtils.isBlank(s.getComponentrule()) && StringUtils.isBlank(s.getClassifyinvokeattr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
+//		).collect(Collectors.toList());
+//		if(!CollectionUtils.isEmpty(unExistAttrVOs)){
+//			throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
+//		}
+//		List<ClientBusinessObject> cboList = new ArrayList<>();
+//		String fullPath = getFullPath(classifyFullInfo);
+//		excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
+//
+//		//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
+//		//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+//		//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
+//		batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
+//		//3.鍒ゆ柇鍏抽敭灞炴��
+//		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
+//		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
+//		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+//		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
+//			selfRepeatRowIndexList.stream().forEach(rowIndex->{
+//				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
+//			});
+//		}
+//		if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
+//			keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
+//				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+//			});
+//		}
+//		//鍒嗙被娉ㄥ叆
+//		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
+//		//boolean
+//		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
+//		//4.鏍¢獙瑙勫垯
+//		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
+//		if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
+//			//5.鏍¢獙鏋氫妇鏄惁姝g‘
+//			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+//			//7.澶勭悊鍙傜収鐨勬儏鍐�
+//			batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
+//		}
+//		//6.鏃堕棿鏍煎紡鐨勯獙璇�
+//		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+//		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
+//		//鏈�鍚庡紕缁勫悎瑙勫垯
+//		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
+//		String uuid=redisService.getUUIDEveryDay();
+//		Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+//
+//		if(errorMap.size()>0) {
+//			createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
+//		}
+//		boolean isCreateUUid=false;
+//		List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
+//			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+//			return !errorMap.containsKey(rowIndex);
+//		}).collect(Collectors.toList());
+//		//鐩镐技鏍¢獙
+//		Map<String,String>resembleMap=new HashMap<>();
+//		List<DataResembleVO> dataResembleVOS=new ArrayList<>();
+//		String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmtypeid();
+//		bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
+//		if(resembleMap.size()>0) {
+//			isCreateUUid=true;
+//			if(!CollectionUtils.isEmpty(dataResembleVOS)) {
+//				redisService.setCacheList(uuid + "-resemble-data", dataResembleVOS);
+//				createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+//			}
+//		}
+//		//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
+//		Map<String,String> newErrorMap=new HashMap<>();
+//		newErrorMap.putAll(resembleMap);
+//		newErrorMap.putAll(errorMap);
+//		needSaveCboList = cboList.stream().filter(cbo -> {
+//			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+//			return !newErrorMap.containsKey(rowIndex);
+//		}).collect(Collectors.toList());
+//		if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
+//			isCreateUUid=true;
+//		}
+//		createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
+//		if(newErrorMap.size()>0) {
+//			createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
+//		}else {
+//			uuid="";
+//			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+//			needSaveCboList = cboList.stream().filter(cbo -> {
+//				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+//				return !newErrorMap.containsKey(rowIndex);
+//			}).collect(Collectors.toList());
+//			if (!CollectionUtils.isEmpty(needSaveCboList)) {
+//				//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
+//				//鐢熸垚缂栫爜鐨勫唴瀹�
+//				codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), needSaveCboList);
+//				//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
+//				engineService.batchSaveSelectChar(templateVO, needSaveCboList);
+//			}
+//		}
+//		if(!isCreateUUid){
+//			return uuid="";
+//		}
+//		return uuid;
+		return null;
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
new file mode 100644
index 0000000..6e6559a
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -0,0 +1,708 @@
+package com.vci.ubcs.code.service.impl;
+
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
+import com.vci.ubcs.code.dto.CodeOrderSecDTO;
+import com.vci.ubcs.code.entity.CodeAllCode;
+import com.vci.ubcs.code.entity.CodeSerialValue;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.enumpack.CodeCutTypeEnum;
+import com.vci.ubcs.code.enumpack.CodeGetValueTypeEnum;
+import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
+import com.vci.ubcs.code.enumpack.CodeSecTypeEnum;
+import com.vci.ubcs.code.mapper.CodeAllCodeMapper;
+import com.vci.ubcs.code.mapper.CodeSerialValueMapper;
+import com.vci.ubcs.code.service.ICodeWupinService;
+import com.vci.ubcs.code.service.MdmProductCodeService;
+import com.vci.ubcs.code.vo.CodeClstemplateVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
+import com.vci.ubcs.starter.web.constant.RegExpConstant;
+import com.vci.ubcs.starter.web.enumpck.OsCodeFillTypeEnum;
+import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import com.vci.ubcs.starter.web.util.VciDateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
+@Service
+public class MdmProductCodeServiceImpl  implements MdmProductCodeService {
+
+	/**
+	 * 娴佹按鍙风殑鐩稿叧鐨勪俊鎭�
+	 */
+	@Resource
+	private CodeSerialValueMapper serialValueMapper;
+
+	/**
+	 * 鎵�鏈夌殑缂栫爜鐨勫唴瀹�
+	 */
+	@Resource
+	private CodeAllCodeServiceImpl codeAllCodeService;
+
+	/**
+	 * 鎵�鏈夌殑缂栫爜鐨勫唴瀹�
+	 */
+	@Resource
+	private ICodeWupinService iCodeWupinService;
+
+	@Override
+	public List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClstemplateVO templateVO, CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<CodeWupinEntity> dataCBOList) {
+//		BatchCBO batchCBO = new BatchCBO();
+//		WebUtil.setPersistence(false);
+//		dataCBOList = dataCBOList.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList());
+//		batchCBO.getCreateCbos().addAll(dataCBOList);
+		List<String> codeList = new ArrayList<>();
+
+		/*****
+		 * 淇濊瘉骞跺彂鐨勬椂鍊欙紝鏈�澶ф祦姘村彿閮藉鐨勶紝浣嗘槸杩欑鍔犻攣鏈夊紛绔�
+		 *
+		 */
+
+		if(dataCBOList.stream().anyMatch(cbo-> StringUtils.isNotBlank(cbo.getId()))
+//			&& StringUtils.isNotBlank(cbo.getAttributeValue(CODE_SEC_LENGTH_FIELD))
+			){
+			//鏄巻鍙叉暟鎹鍏�
+			//鍘嗗彶鏁版嵁鎵ц鐨勬椂鍊欙紝杩欎釜绯荤粺浼氬緢鍗�
+			//涓昏鏄负浜嗗綍鍏ユ渶澶ф祦姘村彿鍜宎llcode
+//			SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+			List<CodeAllCode> allCodeDOList = new ArrayList<>();
+			Map<String/**娴佹按渚濇嵁**/, Map<String/**鐮佹鐨勪富閿�**/,Double/**鏈�澶ф祦姘村彿**/>> maxSerialMap = new HashMap<>();
+			dataCBOList.parallelStream().forEach(cbo->{
+//				VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+				String code = cbo.getId();
+				List<String> serialUnitList = new ArrayList<>();
+				String[] secLengths = cbo.getCodeSecLengthField().split("#");
+				List<CodeBasicSecVO> secVOList = ruleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
+				Map<String/**鐮佹鐨勪富閿�**/,String/**鐮佹鐨勫��**/> serialValueMap = new HashMap<>();
+				Map<String, CodeBasicSecVO> secVOMap = secVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				for (int i = 0; i < secLengths.length; i++) {
+					CodeBasicSecVO secVO = secVOList.get(i);
+					String thisSecValue  = "";
+					if(i == 0){
+						thisSecValue = code.contains("#")?code.substring(0,code.indexOf("#")):code;
+					} else if(i == secLengths.length-1){
+						//鏈�鍚�
+						thisSecValue =  code.contains("#")?code.substring(code.lastIndexOf("#")):code;
+					}else {
+						int start = 0;
+						for (int j = 0; j < i; j++) {
+							start += VciBaseUtil.getInt(secLengths[j]) + 1;
+						}
+						thisSecValue = code.substring(start,start+VciBaseUtil.getInt(secLengths[1]));
+					}
+					if(VciBaseUtil.getBoolean(secVO.getSerialDependFlag())){
+						serialUnitList.add(thisSecValue);
+					}
+					if(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue().equalsIgnoreCase(secVO.getSecType())){
+						serialValueMap.put(secVO.getOid(),thisSecValue);
+					}
+				}
+				String serialUnitString = serialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : serialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
+				List<String> serialUnFileStringList = new ArrayList<>();
+				if(!CollectionUtils.isEmpty(serialValueMap)){
+					serialValueMap.forEach((secOid,secValue)->{
+						//瑕佺湅鏄笉鏄ˉ浣嶇殑
+						CodeBasicSecVO secVO = secVOMap.get(secOid);
+						Double serialDb = null;
+						if(OsCodeFillTypeEnum.NONE.getValue().equalsIgnoreCase(secVO.getCodeFillType())){
+							//涓嶈ˉ鐮�
+							//鎶婃墍鏈変笉鏄暟瀛楃殑鍘绘帀锛屽洜涓哄彲鑳戒細鏄�佹暟鎹紝鏂拌鍒�
+							serialDb = VciBaseUtil.getDouble(killUnNumberChar(secValue));
+						}else {
+							//宸﹀彸濉厖鐨勶紝鎴戜滑闇�瑕�
+							serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(secValue,secVO.getCodeFillSeparator(),
+								OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()))));
+						}
+						Map<String, Double> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>());
+						thisUnitMaxMap.put(secOid,serialDb);
+						maxSerialMap.put(serialUnitString,thisUnitMaxMap);
+						serialUnFileStringList.add(String.valueOf(serialDb));
+					});
+				}
+				CodeAllCode allCodeDO = new CodeAllCode();
+				allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid());
+				allCodeDO.setCodeRuleOid(ruleVO.getOid());
+				allCodeDO.setId(cbo.getId());
+				allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid());
+				allCodeDO.setCreateCodeBtm(cbo.getBtmname());
+				allCodeDO.setCreateCodeOid(cbo.getOid());
+				allCodeDO.setSerialUnit(serialUnitString);
+				allCodeDO.setUnFillSerial(serialUnFileStringList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE)));
+				allCodeDO.setLcStatus(cbo.getLcStatus());
+				allCodeDOList.add(allCodeDO);
+			});
+			//澶勭悊鏈�澶х殑娴佹按鍙�
+			List<CodeSerialValue> addSerialValueList = new ArrayList<>();
+			List<CodeSerialValue> editSerialValueList = new ArrayList<>();
+			maxSerialMap.forEach((serialUnit,secOidMaxMap)->{
+				secOidMaxMap.forEach((secOid,maxSerial)->{
+//					Map<String, String> conditionMap = new HashMap<>();
+//					conditionMap.put("codeRuleOid", ruleVO.getOid());
+//					conditionMap.put("serialUnit", serialUnit);
+//					//杩欎釜瀛楁鏄负浜嗚В鍐冲涓祦姘寸殑闂
+//					conditionMap.put("codeSecOid", secOid);
+					QueryWrapper<CodeSerialValue> queryWrapper = new QueryWrapper<>();
+					queryWrapper.eq("codeRuleOid", ruleVO.getOid());
+					queryWrapper.eq("serialUnit", serialUnit);
+					queryWrapper.eq("codeSecOid", secOid);
+
+					List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(queryWrapper);
+//					.selectByCondition(conditionMap, new PageHelper(-1));
+					if (!CollectionUtils.isEmpty(serialValueDOS)) {
+						CodeSerialValue serialValueDO = serialValueDOS.get(0);
+						if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<maxSerial){
+							serialValueDO.setMaxSerial(String.valueOf(maxSerial));
+							editSerialValueList.add(serialValueDO);
+						}
+					}else{
+						//娌℃湁
+						CodeSerialValue serialValueDO = new CodeSerialValue();
+						serialValueDO.setCodeRuleOid(ruleVO.getOid());
+						serialValueDO.setSerialUnit(serialUnit);
+						serialValueDO.setCodeSecOid(secOid);
+						serialValueDO.setMaxSerial(maxSerial.toString());
+						addSerialValueList.add(serialValueDO);
+					}
+				});
+			});
+			if(!CollectionUtils.isEmpty(addSerialValueList)){
+//				batchCBO.copyFromOther(serialValueMapper.batchInsert(addSerialValueList));
+				for (CodeSerialValue codeSerialValue : addSerialValueList) {
+					serialValueMapper.insert(codeSerialValue);
+				}
+//				serialValueMapper.ba
+
+			}
+			if(!CollectionUtils.isEmpty(editSerialValueList)){
+				for (CodeSerialValue codeSerialValue : editSerialValueList) {
+					serialValueMapper.updateById(codeSerialValue);
+				}
+
+//				batchCBO.copyFromOther(serialValueMapper.batchUpdate(editSerialValueList));
+			}
+			//澶勭悊allCode
+			if(!CollectionUtils.isEmpty(allCodeDOList)){
+				Map<String, List<CodeAllCode>> ruleGroup = allCodeDOList.stream().collect(Collectors.groupingBy(s -> s.getCodeRuleOid()));
+				Map<String, CodeAllCode> codeDOMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getCodeRuleOid() + "${SEP}" + s.getId(), t -> t));
+				List<CodeAllCode> addCodeDOs = new ArrayList<>();
+				List<CodeAllCode> editCodeDOs = new ArrayList<>();
+				ruleGroup.forEach((ruleOid,allCodeDOS)->{
+					VciBaseUtil.switchCollectionForOracleIn(allCodeDOS).stream().forEach(codeDOs->{
+//						Map<String,String> conditionMap = new HashMap<>();
+//						conditionMap.put("coderuleoid",ruleOid);
+//						conditionMap.put("id",QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(codeDOs.stream().map(s->s.getId()).collect(Collectors.toList()).toArray(new String[0])) + ")");
+						QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
+						allCodeWrapper.eq("coderuleoid",ruleOid);
+						allCodeWrapper.in("id", QueryOptionConstant.IN + "(" +
+							VciBaseUtil.toInSql(codeDOs.stream().map(s->s.getId()).collect(Collectors.toList()).toArray(new String[0])) + ")");
+						List<CodeAllCode> existCodes = codeAllCodeService.selectByWrapper(allCodeWrapper);
+
+
+						if(!CollectionUtils.isEmpty(existCodes)){
+							existCodes.stream().forEach(existCode->{
+								String rule_id = existCode.getCodeRuleOid() + "${SEP}" + existCode.getId();
+								if(codeDOMap.containsKey(rule_id)){
+									CodeAllCode newCodeDO = codeDOMap.get(rule_id);
+									existCode.setCreateCodeOid(newCodeDO.getOid());
+									existCode.setCreateCodeBtm(newCodeDO.getCreateCodeBtm());
+									existCode.setCodeClassifyTemplateOid(newCodeDO.getCodeClassifyTemplateOid());
+									existCode.setCodeClassifyOid(newCodeDO.getCodeClassifyOid());
+									existCode.setLcStatus(newCodeDO.getLcStatus());
+									editCodeDOs.add(existCode);
+								}
+							});
+						}
+					});
+				});
+				if(!CollectionUtils.isEmpty(editCodeDOs)){
+					Set<String> exitIds = editCodeDOs.stream().map(s -> s.getCodeRuleOid() + "${SEP}" + s.getId()).collect(Collectors.toSet());
+					addCodeDOs = allCodeDOList.stream().filter(s -> !exitIds.contains(s.getCodeRuleOid() + "${SEP}" + s.getId())).collect(Collectors.toList());
+				}else{
+					addCodeDOs = allCodeDOList;
+				}
+				if(!CollectionUtils.isEmpty(editCodeDOs)){
+//					batchCBO.copyFromOther(allCodeMapper.batchUpdate(editCodeDOs));
+					codeAllCodeService.updateBatchById(editCodeDOs);
+				}
+				if(!CollectionUtils.isEmpty(addCodeDOs)){
+//					batchCBO.copyFromOther(allCodeMapper.batchInsert(addCodeDOs));
+					Map<String, String> statusMap = addCodeDOs.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus()));
+					addCodeDOs.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> {
+						s.setLcStatus(statusMap.get(s.getOid()));
+					});
+					codeAllCodeService.saveBatch(addCodeDOs);
+				}
+			}
+//			WebUtil.setPersistence(true);
+//			boService.persistenceBatch(batchCBO);
+			return codeList;
+		}else {
+			List<CodeBasicSecVO> secVOList = ruleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
+			List<String> serialUnitList = new LinkedList<>();
+			List<String> secValueList = new ArrayList<>();
+			Map<String, String> secValueMap = secDTOList.stream().collect(Collectors.toMap(s -> s.getSecOid(), s -> s.getSecValue()));
+			List<CodeBasicSecVO> serialSecVOList = new ArrayList<>();
+			List<CodeBasicSecVO> attrSecVOList = new ArrayList<>();
+			for (int i = 0; i < secVOList.size(); i++) {
+				CodeBasicSecVO secVO = secVOList.get(i);
+				switchSecValue(secVO, secValueMap, classifyFullInfoBO, serialSecVOList, attrSecVOList, serialUnitList, secValueList);
+			}
+			//澶勭悊灞炴�х爜娈靛拰娴佹按鐮佹
+			Map<String/**娴佹按鐮佹鐨勪富閿�**/, Map<String/**娴佹按渚濇嵁**/, Double>> lastMaxSerialValueMap = new HashMap<>();
+			List<CodeAllCode> allCodeDOList = new ArrayList<>();
+
+			//宸茬粡瀛樺偍鐨勬渶澶ф祦姘村彿鐨勫唴瀹�
+			Map<String/**鐮佹鐨勪富閿�**/, Map<String, CodeSerialValue>> maxSerialValueMap = new HashMap<>();
+
+			for (int i = 0; i < dataCBOList.size(); i++) {
+				CodeWupinEntity cbo = dataCBOList.get(i);
+				List<String> thisSecValueList = new LinkedList<>();
+				for (int j = 0; j < secValueList.size(); j++) {
+					thisSecValueList.add(secValueList.get(j));
+				}
+				List<String> thisSerialUnitList = new LinkedList<>();
+				//鍥犱负娴佹按渚濇嵁姣忔鍙兘涓嶄竴鏍凤紝鎵�浠ユ瘡娆¢兘鎷疯礉涓�浠�
+				for (int j = 0; j < serialUnitList.size(); j++) {
+					thisSerialUnitList.add(serialUnitList.get(j));
+				}
+				//鍏堢湅鐪嬫湁娌℃湁灞炴�х殑鐮佹
+				boolean attrSevIsSerialDepend = CollectionUtils.isEmpty(attrSecVOList) ? false : (attrSecVOList.stream().anyMatch(s -> VciBaseUtil.getBoolean(s.getSerialDependFlag())));
+				switchAttrSecValue(attrSecVOList, cbo, thisSecValueList, attrSevIsSerialDepend, thisSerialUnitList);
+
+				String serialUnitString = thisSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : thisSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
+				switchSerialSecValue(serialSecVOList, attrSevIsSerialDepend, ruleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
+
+				//缁勮缂栫爜鐨勫��
+				cbo.setId(thisSecValueList.stream().collect(Collectors.joining()));
+				codeList.add(cbo.getId());
+				StringBuilder sb = new StringBuilder();
+				//鎶婄爜娈甸噷闈㈤兘鎵句竴涓嬫祦姘村彿
+				for (int j = 0; j < serialSecVOList.size(); j++) {
+					CodeBasicSecVO secVO = serialSecVOList.get(j);
+					Double serialValue = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()).getOrDefault(serialUnitString, 0d);
+					if (serialValue != null) {
+						sb.append(String.valueOf(serialValue.longValue())).append(SERIAL_VALUE_SPACE);
+					}
+				}
+				//瑕佸瓨鍌ㄦ渶鍚庣殑鍏ㄩ儴allcode
+				wrapperAllCode(classifyFullInfoBO, ruleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString());
+			}
+			saveSerialValue( ruleVO, lastMaxSerialValueMap, maxSerialValueMap);
+
+			Map<String, String> statusMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus()));
+			allCodeDOList.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> {
+				s.setLcStatus(statusMap.get(s.getOid()));
+
+			});
+			codeAllCodeService.saveBatch(allCodeDOList);
+			iCodeWupinService.saveBatch(dataCBOList);
+//			batchCBO.getCreateCbos().stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmName())).forEach(s -> {
+//				s.setLcStatus(statusMap.get(s.getOid()));
+//				try {
+//					s.setAttributeValue("lcstatus",statusMap.get(s.getOid()));
+//				} catch (VCIError e) {
+//					e.printStackTrace();
+//				}
+//			});
+		}
+//		WebUtil.setPersistence(true);
+//		boService.persistenceBatch(batchCBO);
+		return codeList;
+	}
+	/**
+	 * 杞崲灞炴�х爜娈电殑鍊�
+	 * @param attrSecVOList 灞炴�х爜娈电殑鏄剧ず瀵硅薄
+	 * @param cbo 涓氬姟鏁版嵁锛岀敤浜庤幏鍙栫爜娈电殑鍊�
+	 * @param thisSecValueList 鐮佸�肩殑鍒楄〃
+	 * @param attrSevIsSerialDepend 鏄惁鏈変綔涓烘祦姘翠緷鎹�
+	 * @param serialUnitList 娴佹按渚濇嵁鐨勫唴瀹�
+	 *                       杩橀渶瑕佸悗缁殑涓�涓Щ妞嶅皢浼氭秹鍙婂埌鍏朵粬鐨勬湇鍔�
+	 */
+	private void switchAttrSecValue(List<CodeBasicSecVO> attrSecVOList,CodeWupinEntity cbo,
+									List<String> thisSecValueList,boolean attrSevIsSerialDepend,
+									List<String> serialUnitList){
+		if (!CollectionUtils.isEmpty(attrSecVOList)) {
+			attrSecVOList.stream().forEach(attrSevVO -> {
+				String value = "";
+				if (StringUtils.isNotBlank(attrSevVO.getGetValueClass())) {
+					//浣跨敤缁勫悎瑙勫垯鏉ュ鐞嗙殑
+//					value = getValueByFormulaForCBO(cbo, attrSevVO.getGetValueClass());
+				} else {
+//					value = cbo.getAttributeValue(attrSevVO.getReferAttributeId());
+				}
+				if (value == null) {
+					value = "";
+				}
+				//鏇挎崲secValueList閲岄潰鐨勫唴瀹�
+				for (int j = 0; j < thisSecValueList.size(); j++) {
+					String secValue = thisSecValueList.get(j);
+					if (secValue.equalsIgnoreCase("${attr_" + attrSevVO.getOid() + "}")) {
+						thisSecValueList.set(j, value);
+					}
+				}
+				if (attrSevIsSerialDepend) {
+					//鏄祦姘翠緷璧栫殑璇濓紝闇�瑕佸幓鏇挎崲涓�涓�
+					for (int j = 0; j < serialUnitList.size(); j++) {
+						String secValue = serialUnitList.get(j);
+						if (secValue.equalsIgnoreCase("${attr_" + attrSevVO.getOid() + "}")) {
+							serialUnitList.set(j, value);
+						}
+					}
+				}
+			});
+		}
+	}
+
+
+	/**
+	 * 杞崲娴佹按鐮佹鐨勫��
+	 * @param serialSecVOList 娴佹按鐮佹
+	 * @param attrSevIsSerialDepend 鏄惁鏈夊睘鎬х爜娈靛弬涓庢祦姘�
+	 * @param ruleVO 瑙勫垯鐨勫唴瀹�
+	 * @param serialUnitString 娴佹按渚濇嵁
+	 * @param maxSerialValueMap 鏈�澶х殑娴佹按鍙�
+	 * @param thisSecValueList 鏈鐨勭爜鍊�
+	 * @param lastMaxSerialValueMap 灏佽鍚�
+	 * @param firstData 鏄惁涓虹涓�鏉℃暟鎹�
+	 */
+	private void switchSerialSecValue(List<CodeBasicSecVO> serialSecVOList,boolean attrSevIsSerialDepend,
+									  CodeRuleVO ruleVO,String serialUnitString,
+									  Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/,CodeSerialValue>> maxSerialValueMap,List<String> thisSecValueList,
+									  Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/, Double>> lastMaxSerialValueMap,boolean firstData){
+		if (!CollectionUtils.isEmpty(serialSecVOList)) {
+			for (int j = 0; j < serialSecVOList.size(); j++) {
+				CodeBasicSecVO secVO = serialSecVOList.get(j);
+				if (attrSevIsSerialDepend || firstData) {
+					//濡傛灉灞炴�х爜娈典篃鏄緷璧栵紝鍒欐瘡娆¢兘瑕佹煡璇紝濡傛灉灞炴�х爜娈典笉鏄緷璧栵紝鍒欏彧鏌ヨ涓�娆�
+//					Map<String, String> conditionMap = new HashMap<>();
+//					conditionMap.put("codeRuleOid", ruleVO.getOid());
+//					conditionMap.put("serialUnit", serialUnitString);
+//					//杩欎釜瀛楁鏄负浜嗚В鍐冲涓祦姘寸殑闂
+//					conditionMap.put("codeSecOid", secVO.getOid());
+					QueryWrapper<CodeSerialValue> codeSerialWrapper = new QueryWrapper<>();
+					codeSerialWrapper.eq("codeRuleOid", ruleVO.getOid());
+					codeSerialWrapper.eq("serialUnit", serialUnitString);
+					codeSerialWrapper.eq("codeSecOid", secVO.getOid());
+					List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(codeSerialWrapper);
+					if (!CollectionUtils.isEmpty(serialValueDOS)) {
+						Map<String, CodeSerialValue> unitSerialMap = maxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
+						CodeSerialValue serialValueDO = serialValueDOS.get(0);
+						unitSerialMap.put(serialValueDO.getSerialUnit(),serialValueDO);
+						maxSerialValueMap.put(secVO.getOid(), unitSerialMap);
+					}
+				}
+				Double startValue = null;
+				if(maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString)){
+					startValue = VciBaseUtil.getDouble(maxSerialValueMap.get(secVO.getOid()).get(serialUnitString).getMaxSerial());
+				}
+				if(lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString)){
+					//璇存槑澶氫釜鐢宠锛屼箣鍓嶅凡缁忓姞浜嗘祦姘村彿浜�
+					startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(serialUnitString);
+				}
+				Double thisSerialValue = 0d;
+				if (startValue == null) {
+					//绗竴涓紪鐮�
+					thisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
+				} else {
+					//娴佹按鍙疯偗瀹氭槸鏁板瓧
+					thisSerialValue = startValue + (j + 1) * secVO.getSerialStep();
+				}
+				//瑕佺湅鏄惁瓒呰繃鏈�澶х殑娴佹按鍊�
+				if (thisSerialValue >= secVO.getCodeFillLimit()) {
+					throw new VciBaseException("娴佹按鍙峰凡缁忚秴杩囧厑璁哥殑鏈�澶ф祦姘村�納0}",new String[]{secVO.getCodeFillLimit().toString()});
+				}
+				//瑕佺湅琛ヤ綅鐨勫唴瀹�
+				Integer fillLength = VciBaseUtil.getInt(secVO.getCodeFillLength());
+				if (fillLength == 0 || fillLength > VciBaseUtil.getInt(secVO.getCodeSecLength())) {
+					//闃叉鍦ㄦ坊鍔犵殑鍦版柟娌℃湁鎺у埗姝g‘
+					fillLength = VciBaseUtil.getInt(secVO.getCodeSecLength());
+				}
+				String serialString = String.valueOf(thisSerialValue.longValue());
+				serialString = fillString(fillLength, OsCodeFillTypeEnum.forValue(secVO.getCodeFillType()), serialString, secVO.getCodeFillSeparator());
+				for (int z = 0; z < thisSecValueList.size(); z++) {
+					String secValue = thisSecValueList.get(z);
+					if (secValue.equalsIgnoreCase("${" + secVO.getOid() + "}")) {
+						thisSecValueList.set(z, serialString);
+					}
+				}
+				Map<String, Double> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
+				unitSerialMap.put(serialUnitString, thisSerialValue);
+				lastMaxSerialValueMap.put(secVO.getOid(),unitSerialMap);
+			}
+		}
+	}
+
+	/**
+	 * 杞崲鐮佸�肩殑鍐呭
+	 * @param secVO 鐮佹鐨勫唴瀹�
+	 * @param secValueMap 鐮佸�肩殑鍐呭锛宬ey鏄爜娈电殑涓婚敭锛寁alue鏄爜鍊�
+	 * @param classifyFullInfoBO 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param serialSecVOList 娴佹按鐮佹
+	 * @param attrSecVOList 灞炴�х爜娈�
+	 * @param serialUnitList 娴佹按渚濇嵁
+	 * @param secValueList 鐮佸�煎垪琛�
+	 */
+	private void switchSecValue(CodeBasicSecVO secVO,Map<String,String> secValueMap,
+								CodeClassifyFullInfoBO classifyFullInfoBO,List<CodeBasicSecVO> serialSecVOList,
+								List<CodeBasicSecVO> attrSecVOList, List<String> serialUnitList,
+								List<String> secValueList ){
+		CodeSecTypeEnum secType = CodeSecTypeEnum.forValue(secVO.getSecType());
+		String secValue = secValueMap.getOrDefault(secVO.getOid(), "");
+		switch (secType) {
+			case CODE_FIXED_SEC:
+				//鍥哄畾鐮佹鐨勶紝鐩存帴鐢ㄧ爜鍊�,涓嶈鐮佸�肩殑闀垮害鏄灏戯紝鍥犱负鍙彉闀垮害鍜屽浐瀹氶暱搴︽槸鎺у埗鍦ㄧ爜娈电鐞嗛噷闈㈢殑鐮佸�煎畾涔夌殑
+				break;
+			case CODE_DATE_SEC:
+				//鏃堕棿鐮佹锛岄渶瑕佸皢褰撳墠鏃堕棿渚濇嵁鏃堕棿鏍煎紡杩涜杞崲.
+				//鏃堕棿鐮佹涓嶆秹鍙婂埌鏄惁琛ヤ綅
+				secValue = VciDateUtil.date2Str(new Date(), secVO.getCodeDateFormatStr());
+				break;
+			case CODE_CLASSIFY_SEC:
+				//鍒嗙被鐮佹鐨勶紝涔熸槸浠庡墠绔�夋嫨浜嗙爜鍊煎嵆鍙紝涓嶈鐮佸�肩殑闀垮害鏄灏�
+				break;
+			case CODE_LEVEL_SEC:
+				//灞傜骇鐮佹锛岄渶瑕佷粠鍒嗙被涓婅幏鍙栫浉搴旂殑淇℃伅
+				if (CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(secVO.getCodeLevelType())) {
+					//鏈�灏忓眰锛屽洜涓烘垜浠彧鑳藉湪鍙跺瓙鑺傜偣涓婄敵璇风紪鐮侊紝鎵�浠ヨ繖涓氨鏄綋鍓嶅垎绫荤殑
+					if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType()) || CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
+						//灏辨槸褰撳墠鍒嗙被鐨�
+						secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+					} else {
+						//鎴戜滑闇�瑕佷粠椤跺眰寮�濮嬫壘鍒板綋鍓嶅垎绫讳负姝�
+						secValue = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
+					}
+				} else {
+					//鎸囧畾灞傦紝鎴戜滑闇�瑕侀�氳繃涓婄骇鐨勬潵鑾峰彇
+					if (CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
+						//璇存槑褰撳墠宸茬粡鏄渶楂樼殑浜�
+						secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+					} else {
+						//杩欎釜鎴戜滑闇�瑕佺湅鐪�,灞傜骇鏄笉鏄ぇ浜庝簡鏈�澶у眰绾х殑鏁�
+						List<CodeClassifyVO> parentClassifyVOList = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))).collect(Collectors.toList());
+						if (secVO.getCodeLevelValue() > (parentClassifyVOList.size() + 1)) {
+							//鎸囧畾鐨勫眰绾ф瘮褰撳墠鐨勫眰绾ц繕澶т簡锛屾墍浠ュ彧鑳借幏鍙栧綋鍓嶅眰绾т簡
+							if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType())) {
+								secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+							} else {
+								secValue = parentClassifyVOList.stream().map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
+							}
+						} else {
+							//鎴戜滑鑾峰彇鍏朵腑鎸囧畾灞傜殑鍐呭
+							if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType())) {
+								CodeClassifyVO classifyVO = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() == secVO.getCodeLevelValue().intValue()).findFirst().orElseGet(() -> null);
+								if (classifyVO != null) {
+									secValue = classifyVO.getId();
+								}
+							} else {
+								//灏忎簬绛変簬鐨勫叏閮ㄦ嬁鍑烘潵
+								secValue = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() <= secVO.getCodeLevelValue().intValue()).sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining());
+							}
+						}
+					}
+				}
+				//鐪嬬湅闀垮害鏄惁闇�瑕佹埅鏂�
+				if (!CodeCutTypeEnum.NONE.getValue().equalsIgnoreCase(secVO.getValueCutType()) &&
+					secVO.getValueCutLength() != null && secVO.getValueCutLength() > 0 && secValue.length() > secVO.getValueCutLength()) {
+					if (CodeCutTypeEnum.RIGHT.getValue().equalsIgnoreCase(secVO.getValueCutType())) {
+						//宸︽埅鍙栨槸浠庡乏杈瑰壀鎺夛紝鍙虫埅鍙栨槸浠庡彸杈瑰壀鎺�--淇濈暀宸﹁竟
+						secValue = secValue.substring(0, secVO.getValueCutLength());
+					} else {
+						secValue = secValue.substring(secValue.length() - secVO.getValueCutLength());
+					}
+				}
+				break;
+			case CODE_REFER_SEC:
+				//寮曠敤鐨勫湪椤甸潰涓婂凡缁忛�夋嫨浜嗭紝鎵�浠ョ洿鎺ヤ娇鐢ㄥ墠绔笂浼犻�掔殑鍊�
+				//寮曠敤灏辨槸鍙傜収锛屽彲鑳芥槸鍏朵粬鐨勫垎绫伙紙涓氬姟绫诲瀷锛変笅鐨勬暟鎹紝鎵�浠ュ彧鍦ㄩ〉闈笂閫夋嫨
+				break;
+			case CODE_ATTR_SEC:
+				//灞炴�т笌寮曠敤鐨勫尯鍒槸锛屽睘鎬ф槸褰撳墠鏁版嵁閲岀殑灞炴�э紝鑰屽紩鐢ㄥ彲鑳芥槸寮曠敤鍏朵粬鐨勫垎绫荤殑锛堜笟鍔$被鍨嬶級
+				//鍥犱负鍙兘鏄壒閲忕殑鏁版嵁鐨勬搷浣滐紝鎵�浠ユ垜浠繖閲屼笉鑳界洿鎺ュ鐞嗗睘鎬э紝闇�瑕佸悗杈逛竴杈瑰鐞�
+				secValue = "${attr_" + secVO.getOid() + "}";
+				attrSecVOList.add(secVO);
+				break;
+			case CODE_VARIABLE_SEC:
+				//鍙彉鐮佹锛屾槸鍦ㄩ〉闈笂杈撳叆鍐呭
+				if (secValue.length() > VciBaseUtil.getInt(secVO.getCodeSecLength())) {
+					throw new VciBaseException("銆恵0}銆戣繖涓爜娈垫槸鍙彉鐮佹锛屼絾鏄幇鍦ㄨ緭鍏ョ殑鐮佸�肩殑闀垮害({1})瓒呰繃浜嗚瀹氱殑闀垮害{2}", new String[]{secVO.getName(), String.valueOf(secValue.length()), secVO.getCodeSecLength()});
+				}
+				OsCodeFillTypeEnum fillTypeEnum = OsCodeFillTypeEnum.forValue(secVO.getCodeFillType());
+				secValue = fillString(VciBaseUtil.getInt(secVO.getCodeSecLength()), fillTypeEnum, secValue, secVO.getCodeFillSeparator());
+				break;
+			case CODE_SERIAL_SEC:
+				//娴佹按鐮佹
+				serialSecVOList.add(secVO);
+				secValue = "${" + secVO.getOid() + "}";
+			default:
+				break;
+		}
+		if (VciBaseUtil.getBoolean(secVO.getSerialDependFlag())) {
+			serialUnitList.add(secValue);
+		}
+		secValueList.add(secValue);
+	}
+
+	/**
+	 * 琛ヤ綅
+	 * @param totalLength 鎬婚暱搴�
+	 * @param fillTypeEnum 琛ヤ綅鏂瑰紡
+	 * @param text 褰撳墠鐨勫唴瀹�
+	 * @param fillChar 琛ヤ綅鐨勫瓧绗�
+	 * @return 涓嶅~鍏呬綅缃拰闀垮害宸茬粡杈惧埌/瓒呰繃鐨勬椂鍊欎笉浼氬~鍏�
+	 */
+	private String fillString(int totalLength,OsCodeFillTypeEnum fillTypeEnum,String text,String fillChar){
+		if(text.length() >= totalLength || OsCodeFillTypeEnum.NONE.equals(fillTypeEnum)){
+			//涓嶇敤琛ヤ綅浜�
+			return  text;
+		}
+		int balance = totalLength - text.length();
+		StringBuilder sb = new StringBuilder();
+		for (int i = 0; i < balance; i++) {
+			sb.append(fillChar);
+		}
+		if(OsCodeFillTypeEnum.LEFT.equals(fillTypeEnum)) {
+			text = sb.toString() + text;
+		}else {
+			text = text + sb.toString();
+		}
+		return  text;
+	}
+
+	/**
+	 * 灏佽瀛樺偍鐮佸�肩殑瀵硅薄
+	 * @param classifyFullInfoBO 鍒嗙被鍏ㄩ儴鐨勪俊鎭�
+	 * @param ruleVO 瑙勫垯鐨勫唴瀹�
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @param templateVO 妯℃澘鐨勪俊鎭�
+	 * @param allCodeDOList 鎵�鏈夌殑鐮佸�肩殑瀵硅薄鍒楄〃
+	 */
+	private void wrapperAllCode(CodeClassifyFullInfoBO classifyFullInfoBO,CodeRuleVO ruleVO,
+								CodeWupinEntity cbo,CodeClstemplateVO templateVO,
+								List<CodeAllCode> allCodeDOList,String serialUnitString,String serialValueString){
+		CodeAllCode allCodeDO = new CodeAllCode();
+		allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid());
+		allCodeDO.setCodeRuleOid(ruleVO.getOid());
+		allCodeDO.setId(cbo.getId());
+		allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid());
+		allCodeDO.setCreateCodeBtm(cbo.getBtmname());
+		allCodeDO.setCreateCodeOid(cbo.getOid());
+		allCodeDO.setSerialUnit(serialUnitString);
+		allCodeDO.setUnFillSerial(serialValueString);
+		allCodeDO.setLcStatus(cbo.getLcStatus());
+		allCodeDOList.add(allCodeDO);
+	}
+
+
+
+
+	/**
+	 * 淇濆瓨娴佹按鐨勪俊鎭�
+	 * @param ruleVO 瑙勫垯鐨勬樉绀哄璞�
+	 * @param lastMaxSerialValueMap 鏈�澶х殑娴佹按鍊兼槧灏�
+	 * @param maxSerialValueMap 渚濇嵁瀛樺偍鐨勬渶澶ф祦姘寸殑鍐呭
+	 */
+	private void saveSerialValue(CodeRuleVO ruleVO,
+								 Map<String/**鐮佹鐨勪富閿�**/,Map<String, Double>> lastMaxSerialValueMap,
+								 Map<String/**鐮佹鐨勪富閿�**/,Map<String, CodeSerialValue>> maxSerialValueMap){
+		List<CodeSerialValue> editSerialValueDOList = new ArrayList<>();
+		List<CodeSerialValue> addSerialValueDOList = new ArrayList<>();
+		//瀛樺偍鏈�澶ф祦姘村彿
+		lastMaxSerialValueMap.forEach((secOid,maxSerialMap)->{
+			maxSerialMap.forEach((unit,maxSerial)->{
+				CodeSerialValue serialValueDO = null;
+				if(maxSerialValueMap.containsKey(secOid) && maxSerialValueMap.get(secOid).containsKey(unit)){
+					//璇存槑鏈�
+					serialValueDO = maxSerialValueMap.get(secOid).get(unit);
+					serialValueDO.setMaxSerial(maxSerial.toString());
+					editSerialValueDOList.add(serialValueDO);
+				}else{
+					serialValueDO = new CodeSerialValue();
+					serialValueDO.setCodeRuleOid(ruleVO.getOid());
+					serialValueDO.setSerialUnit(unit);
+					serialValueDO.setCodeSecOid(secOid);
+					serialValueDO.setMaxSerial(maxSerial.toString());
+					addSerialValueDOList.add(serialValueDO);
+				}
+			});
+		});
+		if(!CollectionUtils.isEmpty(editSerialValueDOList)){
+//			batchCBO.copyFromOther(serialValueMapper.batchUpdate(editSerialValueDOList));
+			for (CodeSerialValue codeSerialValue : editSerialValueDOList) {
+				serialValueMapper.updateById(codeSerialValue);
+			}
+		}
+		if(!CollectionUtils.isEmpty(addSerialValueDOList)){
+			for (CodeSerialValue codeSerialValue : addSerialValueDOList) {
+				serialValueMapper.insert(codeSerialValue);
+			}
+//			batchCBO.copyFromOther(serialValueMapper.batchInsert(addSerialValueDOList));
+		}
+	}
+
+	/**
+	 * 鍘绘帀涓嶆槸鏁板瓧鐨勫瓧绗�
+	 * @param s 瀛楃
+	 * @return 鏇挎崲鍚庣殑鍊�
+	 */
+	private String killUnNumberChar(String s){
+		Integer lastUnNumberIndex = 0;
+		for (int i = 0; i < s.length(); i++) {
+			char c = s.charAt(i);
+			if(!(new String(new char[]{c})).matches(RegExpConstant.NUMBER)){
+				lastUnNumberIndex = i;
+			}
+		}
+		String value = s;
+		if(lastUnNumberIndex >0){
+			value = value.substring(lastUnNumberIndex);
+		}
+		return value;
+	}
+
+	/**
+	 * 鍘婚櫎琛ヤ綅瀛楃
+	 * @param s 瀛楃
+	 * @param fillString 琛ヤ綅瀛楃
+	 * @param left 鏄惁宸﹁ˉ浣�
+	 * @return 鏇挎崲鍚庣殑鍊�
+	 */
+	private String killFillChar(String s, String fillString,boolean left){
+		Integer index = 0;
+		String value = s;
+		if(left){
+			for (int i = 0; i < s.length(); i++) {
+				char c = s.charAt(i);
+				if((new String(new char[]{c})).equalsIgnoreCase(fillString)){
+					index = i;
+				}
+			}
+			if(index >0){
+				value = value.substring(index);
+			}
+		}else{
+			//浠庡彸寰�宸︽壘
+			for (int i = s.length()-1; i >=0; i++) {
+				char c = s.charAt(i);
+				if((new String(new char[]{c})).equalsIgnoreCase(fillString)){
+					index = i;
+				}
+			}
+			if(index >0){
+				value = value.substring(0,index);
+			}
+		}
+		return value;
+
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyProcessTempWrapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyProcessTempWrapper.java
new file mode 100644
index 0000000..04a9cae
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyProcessTempWrapper.java
@@ -0,0 +1,31 @@
+package com.vci.ubcs.code.wrapper;
+
+import com.vci.ubcs.code.entity.CodeClassifyProcessTemp;
+import com.vci.ubcs.code.entity.CodeClassifyValue;
+import com.vci.ubcs.code.enumpack.CodeClassifyProcessUseEnum;
+import com.vci.ubcs.code.vo.CodeClsflowtempVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeClassifyProcessTempVO;
+import com.vci.ubcs.code.vo.pagemodel.CodeClassifyValueVO;
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+
+import java.util.Objects;
+
+public class CodeClassifyProcessTempWrapper  extends BaseEntityWrapper<CodeClassifyProcessTemp, CodeClassifyProcessTempVO> {
+
+	public static CodeClassifyProcessTempWrapper build() {
+		return new CodeClassifyProcessTempWrapper();
+	}
+
+	@Override
+	public CodeClassifyProcessTempVO entityVO(CodeClassifyProcessTemp codeClassifyProcessTemp) {
+		CodeClassifyProcessTempVO codeClassifyProcessTempVO = Objects.requireNonNull(BeanUtil.copy(codeClassifyProcessTemp, CodeClassifyProcessTempVO.class));
+		codeClassifyProcessTempVO.setCodeProcessUseText(CodeClassifyProcessUseEnum.getTextByValue(codeClassifyProcessTemp.getCodeProcessUse()));
+
+
+		return codeClassifyProcessTempVO;
+	}
+
+
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyValueWrapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyValueWrapper.java
index e4194bf..ed7c25c 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyValueWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyValueWrapper.java
@@ -32,7 +32,7 @@
  * @author ludc
  * @since 2023-04-03
  */
-public class CodeClassifyValueWrapper extends BaseEntityWrapper<CodeClassifyValue, CodeClassifyValueVO>  {
+public class CodeClassifyValueWrapper extends BaseEntityWrapper<CodeClassifyValue, CodeClassifyValueVO> {
 
 	public static CodeClassifyValueWrapper build() {
 		return new CodeClassifyValueWrapper();
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodePhaseattrWrapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodePhaseattrWrapper.java
index ec3fb90..6092870 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodePhaseattrWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodePhaseattrWrapper.java
@@ -16,7 +16,7 @@
  */
 package com.vci.ubcs.code.wrapper;
 
-import com.vci.ubcs.code.entity.CodePhaseAttr;
+import com.vci.ubcs.code.entity.CodePhaseattrEntity;
 import org.springblade.core.mp.support.BaseEntityWrapper;
 import org.springblade.core.tool.utils.BeanUtil;
 import com.vci.ubcs.code.vo.CodePhaseattrVO;
@@ -28,15 +28,15 @@
  * @author yuxc
  * @since 2023-04-20
  */
-public class CodePhaseattrWrapper extends BaseEntityWrapper<CodePhaseAttr, CodePhaseattrVO>  {
+public class CodePhaseattrWrapper extends BaseEntityWrapper<CodePhaseattrEntity, CodePhaseattrVO>  {
 
 	public static CodePhaseattrWrapper build() {
 		return new CodePhaseattrWrapper();
  	}
 
 	@Override
-	public CodePhaseattrVO entityVO(CodePhaseAttr CodePhaseattr) {
-		CodePhaseattrVO CodePhaseattrVO = Objects.requireNonNull(BeanUtil.copy(CodePhaseattr, CodePhaseattrVO.class));
+	public CodePhaseattrVO entityVO(CodePhaseattrEntity codePhaseattr) {
+		CodePhaseattrVO CodePhaseattrVO = Objects.requireNonNull(BeanUtil.copy(codePhaseattr, CodePhaseattrVO.class));
 
 		//User createUser = UserCache.getUser(CodePhaseattr.getCreateUser());
 		//User updateUser = UserCache.getUser(CodePhaseattr.getUpdateUser());
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeTempphaseWrapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeTempphaseWrapper.java
index cad28fa..90dbb5f 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeTempphaseWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeTempphaseWrapper.java
@@ -16,8 +16,8 @@
  */
 package com.vci.ubcs.code.wrapper;
 
-import com.vci.ubcs.code.entity.CodeTemplatePhase;
-import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseVO;
+import com.vci.ubcs.code.entity.CodeTempphaseEntity;
+import com.vci.ubcs.code.vo.pagemodel.CodeTemplatePhaseEntityVO;
 import org.springblade.core.mp.support.BaseEntityWrapper;
 import org.springblade.core.tool.utils.BeanUtil;
 
@@ -29,15 +29,15 @@
  * @author yuxc
  * @since 2023-04-20
  */
-public class CodeTempphaseWrapper extends BaseEntityWrapper<CodeTemplatePhase, CodeTemplatePhaseVO>  {
+public class CodeTempphaseWrapper extends BaseEntityWrapper<CodeTempphaseEntity, CodeTemplatePhaseEntityVO>  {
 
 	public static CodeTempphaseWrapper build() {
 		return new CodeTempphaseWrapper();
  	}
 
 	@Override
-	public CodeTemplatePhaseVO entityVO(CodeTemplatePhase CodeTempphase) {
-		CodeTemplatePhaseVO CodeTemplatePhaseVO = Objects.requireNonNull(BeanUtil.copy(CodeTempphase, CodeTemplatePhaseVO.class));
+	public CodeTemplatePhaseEntityVO entityVO(CodeTempphaseEntity CodeTempphase) {
+		CodeTemplatePhaseEntityVO CodeTemplatePhaseVO = Objects.requireNonNull(BeanUtil.copy(CodeTempphase, CodeTemplatePhaseEntityVO.class));
 
 		//User createUser = UserCache.getUser(CodeTempphase.getCreateUser());
 		//User updateUser = UserCache.getUser(CodeTempphase.getUpdateUser());
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeWupinWrapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeWupinWrapper.java
new file mode 100644
index 0000000..e40a0dc
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeWupinWrapper.java
@@ -0,0 +1,50 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.code.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import com.vci.ubcs.code.entity.CodeWupinEntity;
+import com.vci.ubcs.code.vo.CodeWupinVO;
+import java.util.Objects;
+
+/**
+ * 缂栫爜淇℃伅 鍖呰绫�,杩斿洖瑙嗗浘灞傛墍闇�鐨勫瓧娈�
+ *
+ * @author yuxc
+ * @since 2023-05-05
+ */
+public class CodeWupinWrapper extends BaseEntityWrapper<CodeWupinEntity, CodeWupinVO>  {
+
+	public static CodeWupinWrapper build() {
+		return new CodeWupinWrapper();
+ 	}
+
+	@Override
+	public CodeWupinVO entityVO(CodeWupinEntity codeWupin) {
+		CodeWupinVO codeWupinVO = Objects.requireNonNull(BeanUtil.copy(codeWupin, CodeWupinVO.class));
+
+		//User createUser = UserCache.getUser(codeWupin.getCreateUser());
+		//User updateUser = UserCache.getUser(codeWupin.getUpdateUser());
+		//codeWupinVO.setCreateUserName(createUser.getName());
+		//codeWupinVO.setUpdateUserName(updateUser.getName());
+
+		return codeWupinVO;
+	}
+
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml
index a29bde1..f3c03fa 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml
@@ -100,4 +100,17 @@
 
 
 
+    <select id="selectChildHasReleaseTemplate" resultType="list">
+        select t.oid as oid, cls.oid as clsoid
+        from platformbtm_codeclstemplate t
+                 left join (select oid
+                            from platformbtm_codeclassify
+                            where lcstatus = #{lcstatus}
+                                start with oid = #{classifyoid}
+                            connect by prior oid = parentcodeclassifyoid) cls
+                           on t.codeclassifyoid = cls.oid
+        where t.lcstatus = #{templatelcstatus}
+          and cls.oid is not null
+    </select>
+
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml
index b9945a7..3363b1e 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.vci.ubcs.code.mapper.CodePhaseAttrMapper">
+<mapper namespace="com.vci.ubcs.code.mapper.CodePhaseattrMapper">
 
     <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
-    <resultMap id="CodePhaseattrResultMap" type="com.vci.ubcs.code.entity.CodePhaseAttr">
+    <resultMap id="CodePhaseattrResultMap" type="com.vci.ubcs.code.entity.CodePhaseattrEntity">
         <result column="OID" property="oid"/>
         <result column="REVISIONOID" property="revisionOid"/>
         <result column="NAMEOID" property="nameOid"/>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeTemplatePhaseMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeTemplatePhaseMapper.xml
index db3eb12..5f281e3 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeTemplatePhaseMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeTemplatePhaseMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.vci.ubcs.code.mapper.CodeTemplatePhaseMapper">
 
     <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
-    <resultMap id="CodeTempphaseResultMap" type="com.vci.ubcs.code.entity.CodeTemplatePhase">
+    <resultMap id="CodeTempphaseResultMap" type="com.vci.ubcs.code.entity.CodeTempphaseEntity">
         <result column="CREATETIME" property="createTime"/>
         <result column="LASTMODIFIER" property="lastModifier"/>
         <result column="LASTMODIFYTIME" property="lastModifyTime"/>
@@ -21,7 +21,7 @@
         <result column="DESCRIPTION" property="description"/>
         <result column="OWNER" property="owner"/>
         <result column="COPYFROMVERSION" property="copyFromVersion"/>
-        <result column="CODECLASSIFYTEMPLATEOID" property="codeclassifytemplateoid"/>
+        <result column="CODECLASSIFYTEMPLATEOID" property="codeClassifyTemplateOid"/>
         <result column="OID" property="oid"/>
         <result column="REVISIONOID" property="revisionOid"/>
         <result column="NAMEOID" property="nameOid"/>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeWupinMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeWupinMapper.xml
new file mode 100644
index 0000000..c7e7714
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeWupinMapper.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vci.ubcs.code.mapper.CodeWupinMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="codeWupinResultMap" type="com.vci.ubcs.code.entity.CodeWupinEntity">
+        <result column="OID" property="oid"/>
+        <result column="REVISIONOID" property="revisionOid"/>
+        <result column="NAMEOID" property="nameOid"/>
+        <result column="BTMNAME" property="btmname"/>
+        <result column="ISLASTR" property="lastR"/>
+        <result column="ISFIRSTR" property="firstR"/>
+        <result column="ISLASTV" property="lastV"/>
+        <result column="ISFIRSTV" property="firstV"/>
+        <result column="CREATOR" property="creator"/>
+        <result column="CREATETIME" property="createTime"/>
+        <result column="LASTMODIFIER" property="lastModifier"/>
+        <result column="LASTMODIFYTIME" property="lastModifyTime"/>
+        <result column="REVISIONRULE" property="revisionRule"/>
+        <result column="VERSIONRULE" property="versionRule"/>
+        <result column="REVISIONSEQ" property="revisionSeq"/>
+        <result column="REVISIONVALUE" property="revisionValue"/>
+        <result column="VERSIONSEQ" property="versionSeq"/>
+        <result column="VERSIONVALUE" property="versionValue"/>
+        <result column="LCTID" property="lctid"/>
+        <result column="LCSTATUS" property="lcStatus"/>
+        <result column="TS" property="ts"/>
+        <result column="ID" property="id"/>
+        <result column="NAME" property="name"/>
+        <result column="DESCRIPTION" property="description"/>
+        <result column="OWNER" property="owner"/>
+        <result column="CHECKINBY" property="checkinby"/>
+        <result column="CHECKINTIME" property="checkintime"/>
+        <result column="CHECKOUTBY" property="checkoutby"/>
+        <result column="CHECKOUTTIME" property="checkouttime"/>
+        <result column="COPYFROMVERSION" property="copyFromVersion"/>
+        <result column="CODECLSFID" property="codeclsfid"/>
+        <result column="CODECLSFPATH" property="codeclsfpath"/>
+        <result column="CODETEMPLATEOID" property="codetemplateoid"/>
+        <result column="MATERIALCLASSIFY" property="materialclassify"/>
+        <result column="MATERIALID" property="materialid"/>
+        <result column="TUHAO" property="tuhao"/>
+        <result column="PINPAI" property="pinpai"/>
+        <result column="MORENGONGYS" property="morengongys"/>
+        <result column="XIEYIJIAGE" property="xieyijiage"/>
+        <result column="HESUANPICI" property="hesuanpici"/>
+        <result column="BEIZHUSHUOMING" property="beizhushuoming"/>
+        <result column="MATERIALTYPE" property="materialtype"/>
+        <result column="MATERIALNAME" property="materialname"/>
+        <result column="RUANJIANBANBEN" property="ruanjianbanben"/>
+        <result column="QITACHICUN" property="qitachicun"/>
+        <result column="MORENCAIGOUY" property="morencaigouy"/>
+        <result column="YUMAILEIXING" property="yumaileixing"/>
+        <result column="CHUANGJIANGONGSI" property="chuangjiangongsi"/>
+        <result column="CAIGOUWL" property="caigouwl"/>
+        <result column="WULIAOXINGZHI" property="wuliaoxingzhi"/>
+        <result column="XIEYIBIANHAO" property="xieyibianhao"/>
+        <result column="CAIZHI" property="caizhi"/>
+        <result column="CHUKUFANGSHI" property="chukufangshi"/>
+        <result column="SHIFOUPIHAOGUANLI" property="shifoupihaoguanli"/>
+        <result column="KUCUNWL" property="kucunwl"/>
+        <result column="XINGHAOGUIGE" property="xinghaoguige"/>
+        <result column="DUIWAIGUIGE" property="duiwaiguige"/>
+        <result column="ZHIBAOQI" property="zhibaoqi"/>
+        <result column="CAIGOUTIQIANQI" property="caigoutiqianqi"/>
+        <result column="HESUANFENLEI" property="hesuanfenlei"/>
+        <result column="XIAOSHOUWL" property="xiaoshouwl"/>
+        <result column="CHANGJIAXINGHAO" property="changjiaxinghao"/>
+        <result column="ZUIXIAOQIDING" property="zuixiaoqiding"/>
+        <result column="JILIANGDW" property="jiliangdw"/>
+        <result column="ZHILIANGBZ" property="zhiliangbz"/>
+        <result column="FIRSTFL" property="firstfl"/>
+        <result column="SECONDFL" property="secondfl"/>
+        <result column="THRIFL" property="thrifl"/>
+        <result column="OLDCODE" property="oldcode"/>
+        <result column="SECRETGRADE" property="secretGrade"/>
+        <result column="BAOZHUANGGUIGE" property="baozhuangguige"/>
+        <result column="PASSING" property="passing"/>
+        <result column="XBJ" property="xbj"/>
+        <result column="XBXKXS" property="xbxkxs"/>
+        <result column="XFJJSTJ" property="xfjjstj"/>
+        <result column="XGZCCDGCD" property="xgzccdgcd"/>
+        <result column="XXNDJ" property="xxndj"/>
+        <result column="XZJMC" property="xzjmc"/>
+        <result column="ZJXH" property="zjxh"/>
+        <result column="CLPH" property="clph"/>
+        <result column="BMCL" property="bmcl"/>
+        <result column="CPXS" property="cpxs"/>
+        <result column="XBZJBMC" property="xbzjbmc"/>
+        <result column="XWLWWMC" property="xwlwwmc"/>
+        <result column="JJZYQ" property="jjzyq"/>
+        <result column="JSBMC" property="jsbmc"/>
+        <result column="JSBXH" property="jsbxh"/>
+        <result column="JSCCJ" property="jsccj"/>
+        <result column="JSSXT" property="jssxt"/>
+        <result column="JSZGL" property="jszgl"/>
+        <result column="JZL" property="jzl"/>
+        <result column="JZRXX" property="jzrxx"/>
+        <result column="JZXZB" property="jzxzb"/>
+    </resultMap>
+
+
+    <select id="selectCodeWupinPage" resultMap="codeWupinResultMap">
+        select * from PL_CODE_WUPIN where is_deleted = 0
+    </select>
+
+
+</mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-ddl/pom.xml b/Source/UBCS/ubcs-service/ubcs-ddl/pom.xml
index 498158c..eebc5d4 100644
--- a/Source/UBCS/ubcs-service/ubcs-ddl/pom.xml
+++ b/Source/UBCS/ubcs-service/ubcs-ddl/pom.xml
@@ -15,6 +15,7 @@
         <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.target>8</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.plugin.version>3.8.1</maven.plugin.version>
     </properties>
 
     <dependencies>
@@ -50,5 +51,17 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                    <finalName>${project.name}</finalName>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>
diff --git a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/processor/dll/DllMapperProcessor.java b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/processor/dll/DllMapperProcessor.java
index b211b73..eab3885 100644
--- a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/processor/dll/DllMapperProcessor.java
+++ b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/processor/dll/DllMapperProcessor.java
@@ -153,18 +153,18 @@
 		List<VciFieldTypeEnum> fieldTypes = listFieldInMapByColumnStr(columnStr, map);
 		VciFieldTypeEnum finalField = null;
 		int i = Integer.MAX_VALUE;
-		if (CollectionUtils.isEmpty(fieldTypes)){
-			return null;
-		}
 		if (fieldTypes.size() == 1){
 			return fieldTypes.get(0);
 		}
 		for (VciFieldTypeEnum fieldType : fieldTypes) {
-			DdlFieldMappingAttrBO bo = map.get(fieldType);
-			int i1 = Math.abs(bo.getDataLength() - length);
-			if (i1 < i){
-				finalField = fieldType;
-				i = i1;
+			if (fieldType.equals(VciFieldTypeEnum.VTString)) {
+				finalField = VciFieldTypeEnum.VTString;
+			}
+			if (fieldType.equals(VciFieldTypeEnum.VTDateTime)){
+				finalField = VciFieldTypeEnum.VTDateTime;
+			}
+			if (fieldType.equals(VciFieldTypeEnum.VTInteger) && length <= 26){
+				finalField = VciFieldTypeEnum.VTInteger;
 			}
 		}
 		return finalField;
diff --git a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java
index f493a6b..6bd64b9 100644
--- a/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-ddl/src/main/java/com/vci/ubcs/ddl/service/impl/DdlServiceImpl.java
@@ -1104,13 +1104,13 @@
 			List<BtmTypeVO> btmTypeVOList = new ArrayList<>();
 			allTableBO.forEach(table -> {
 				BtmTypeVO vo = new BtmTypeVO();
-				vo.setTableName(table.getTableName());
+				vo.setTableName(table.getTableName().toLowerCase());
 				vo.setDescription(table.getTableDesc());
 				List<DdlTableInDataBaseBO> columns = selectTableColumnInfo(table.getTableName());
 				List<BtmTypeAttributeVO> attributes = new ArrayList<>();
 				columns.forEach(col -> {
 					BtmTypeAttributeVO attributeVO = new BtmTypeAttributeVO();
-					attributeVO.setId(col.getId());
+					attributeVO.setId(col.getId().toLowerCase());
 					attributeVO.setName(col.getName());
 					attributeVO.setNullableFlag(col.getNullableFlag());
 					attributeVO.setAttributeLength(col.getAttributeLength());
@@ -1120,6 +1120,9 @@
 					if (field != null){
 						attributeVO.setAttrDataType(field.name());
 					}
+					if(col.getPrecisionLength() != null){
+						attributeVO.setAttrDataType(VciFieldTypeEnum.VTDouble.name());
+					}
 					attributes.add(attributeVO);
 				});
 				vo.setAttributes(attributes);
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
index e6200a9..16a5701 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
@@ -37,6 +37,7 @@
 @RequestMapping("/attribute")
 @Api(value = "鍏冩暟鎹帶鍒跺櫒", tags = "鍏冩暟鎹帶鍒跺櫒")
 public class AttributeController extends BladeController {
+
 	/**
 	 * 鍏冩暟鎹湇鍔�
 	 */
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/BtmTypeController.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/BtmTypeController.java
index 698a29a..87a2030 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/BtmTypeController.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/BtmTypeController.java
@@ -1,7 +1,9 @@
 package com.vci.ubcs.omd.controller;
 
+import com.alibaba.cloud.commons.lang.StringUtils;
 import com.alibaba.nacos.api.exception.NacosException;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.vci.ubcs.omd.constant.OmdCacheConstant;
@@ -9,6 +11,7 @@
 import com.vci.ubcs.omd.entity.BtmType;
 import com.vci.ubcs.omd.repeater.DomainRepeater;
 import com.vci.ubcs.omd.service.IBtmTypeService;
+import com.vci.ubcs.omd.vo.BtmTypeTreeVO;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.wrapper.BtmTypeWrapper;
 import io.swagger.annotations.*;
@@ -21,13 +24,13 @@
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringPool;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.Valid;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Description: 涓氬姟绫诲瀷鎺у埗鍣�
@@ -92,7 +95,7 @@
 		@ApiImplicitParam(name = "name", value = "涓氬姟绫诲瀷涓枃鍚嶇О", paramType = "query", dataType = "string"),
 		@ApiImplicitParam(name = "tableName", value = "涓氬姟绫诲瀷鏁版嵁搴撹〃鍚�", paramType = "query", dataType = "string"),
 	})
-	@ApiOperationSupport(order = 2)
+	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "鏌ヨ鍒楄〃", notes = "浼犲叆鏌ヨ")
 	public R<IPage<BtmTypeVO>> parentList(@ApiIgnore @RequestParam Map<String, Object> condition, Query query) {
 		IPage<BtmTypeVO> pageVO = new Page<>();
@@ -110,7 +113,7 @@
 	 * @return 鎵ц缁撴灉
 	 */
 	@PostMapping("/submit/{auto}")
-	@ApiOperationSupport(order = 3)
+	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "鏂板鎴栦慨鏀�", notes = "浼犲叆涓氬姟绫诲瀷瀵硅薄")
 	public R submit(@Valid @RequestBody BtmTypeDTO dto,@PathVariable(value = "auto") boolean auto) {
 		CacheUtil.clear(OmdCacheConstant.BTM_CACHE);
@@ -124,7 +127,7 @@
 	 * @return 鎵ц缁撴灉
 	 */
 	@PostMapping("/remove")
-	@ApiOperationSupport(order = 4)
+	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "鍒犻櫎", notes = "涓婚敭闆嗗悎")
 	public R remove(@ApiParam(value = "涓婚敭闆嗗悎", required = true) @RequestParam String ids) {
 		CacheUtil.clear(OmdCacheConstant.BTM_CACHE);
@@ -141,7 +144,7 @@
 	 * 鑾峰彇棰嗗煙鍊�
 	 */
 	@GetMapping("/domain")
-	@ApiOperationSupport(order = 5)
+	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "鑾峰彇棰嗗煙鍊�")
 	public R<List<String>> getDomain(){
 		try {
@@ -150,4 +153,62 @@
 			return R.fail(e.getErrMsg());
 		}
 	}
+
+	/**
+	 * 鎸塪omain鍒嗙粍锛屾煡璇笟鍔$被鍨嬬殑鏍戝舰缁撴瀯
+	 */
+	@GetMapping("/tree-domain")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "涓氬姟绫诲瀷鏍戝舰缁撴瀯", notes = "涓氬姟绫诲瀷鏍戝舰缁撴瀯")
+	public R<List<BtmTypeTreeVO>> treeDomain(){
+		return R.data(btmTypeService.treeDomain());
+	}
+
+	/**
+	 * 浠庢暟鎹簱琛ㄤ腑鑾峰彇
+	 * @param domain 棰嗗煙鍊�
+	 * @return 璇诲彇缁撴灉
+	 */
+	@GetMapping("/get-from-table")
+	@ApiOperation(value = "浠庢暟鎹簱琛ㄤ腑璇诲彇",notes = "浠庢暟鎹簱琛ㄤ腑璇诲彇")
+	@ApiOperationSupport(order = 8)
+	public R<List<BtmTypeVO>> getFromTable(String domain){
+		return R.data(btmTypeService.getFromTable(domain));
+	}
+
+	/**
+	 * 鏁版嵁搴撻�夋嫨鐨勮〃淇濆瓨涓轰笟鍔$被鍨�
+	 * @param btmTypeDTOList 椤甸潰浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉
+	 */
+	@PostMapping("/save-from-table/{domain}")
+	@ApiOperation(value = "浠庢暟鎹簱涓繚瀛�",notes = "浠庢暟鎹簱涓繚瀛�")
+	@ApiOperationSupport(order = 9)
+	public R saveFromTable(@RequestBody List<BtmTypeDTO> btmTypeDTOList,@PathVariable(value = "domain") String domain){
+		// 鏁版嵁搴撹〃涓嶈兘閲嶅
+		Set<String> tableNames = btmTypeDTOList.stream().map(BtmTypeDTO::getTableName).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
+		long count = btmTypeService.count(Wrappers.<BtmType>query().lambda().in(BtmType::getTableName,tableNames));
+		if (count > 0){
+			return R.fail("鎵�閫夎〃鍦ㄤ笟鍔$被鍨嬩腑宸插瓨鍦�");
+		}
+		// 涓氬姟绫诲瀷涓嶈兘閲嶅
+		btmTypeDTOList = btmTypeDTOList.stream().peek(s -> {
+			String id;
+			String tableName = s.getTableName();
+			if (tableName.contains(StringPool.UNDERSCORE)) {
+				List<String> strList = Arrays.asList(tableName.split(StringPool.UNDERSCORE));
+				id = strList.get(strList.size() - 1);
+			} else {
+				id = tableName;
+			}
+			s.setId(id.toLowerCase());
+		}).collect(Collectors.toList());
+		List<String> btmTypeIdList = btmTypeDTOList.stream().map(BtmTypeDTO::getId).collect(Collectors.toList());
+
+		long countId = btmTypeService.count(Wrappers.<BtmType>query().lambda().in(BtmType::getId, btmTypeIdList));
+		if (countId > 0){
+			return R.fail("鎵�閫夎〃涓庡凡瀛樺湪涓氬姟绫诲瀷鍐茬獊");
+		}
+		return R.data(btmTypeService.saveFromTable(btmTypeDTOList,domain));
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java
index 45f779a..c0084a2 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/AttributeMapper.java
@@ -21,13 +21,6 @@
 	List<Attribute> selectAll();
 
 	/**
-	 * 涓婚敭鏌ヨ
-	 * @param primaryKey 涓婚敭
-	 * @return 鏌ヨ缁撴灉
-	 */
-	Attribute selectByPrimaryKey(Long primaryKey);
-
-	/**
 	 * 涓婚敭鎵归噺鏌ヨ
 	 * @param primaryKeyCollection 涓婚敭闆嗗悎
 	 * @return 鏌ヨ缁撴灉
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeAttributeMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeAttributeMapper.java
index 867a903..23db8b1 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeAttributeMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeAttributeMapper.java
@@ -15,10 +15,10 @@
  */
 public interface BtmTypeAttributeMapper extends BladeMapper<BtmTypeAttribute> {
 
-    int batchDelete(List<String> records);
+    int batchDelete(@Param("records") List<String> records);
 
 
-	int batchUpdate(List<BtmTypeAttribute> btmTypeAttributeDOList);
+	int batchUpdate(@Param("records") List<BtmTypeAttribute> btmTypeAttributeDOList);
 
 	/**
 	 * 鑾峰彇涓氬姟绫诲瀷涓殑鎸囧畾灞炴��
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeMapper.java
index 035e810..7d153eb 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/BtmTypeMapper.java
@@ -1,5 +1,6 @@
 package com.vci.ubcs.omd.mapper;
 
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import com.vci.ubcs.omd.entity.BtmTypeAttribute;
 import com.vci.ubcs.omd.entity.BtmType;
 import org.apache.ibatis.annotations.Param;
@@ -9,21 +10,13 @@
 import java.util.Collection;
 import java.util.List;
 
-@Repository
 public interface BtmTypeMapper extends BladeMapper<BtmType> {
     /**
      * 鏍规嵁涓婚敭鍒犻櫎瀵硅薄
      * @param oid 鐢熷懡鍛ㄦ湡涓婚敭
      * @return 褰卞搷鐨勮鏁�
      */
-    int deleteByPrimaryKey(String oid);
-
-    /**
-     * 鎻掑叆涓氬姟绫诲瀷
-     * @param record 瑕佹坊鍔犵殑涓氬姟绫诲瀷瀵硅薄
-     * @return 褰卞搷鐨勮鏁�
-     */
-    int insert(BtmType record);
+    int deleteByPrimaryKey(@Param("oid") String oid);
 
     /**
      * 鏍规嵁涓婚敭鑾峰彇鏁版嵁瀵硅薄
@@ -113,6 +106,7 @@
      * @param records 鎵归噺鐨勪俊鎭�
      * @return 鎵ц鎬绘暟
      */
-    Long batchInsert(@Param("records") List<BtmTypeAttribute> records);
+	@InterceptorIgnore(tenantLine = "1")
+    Long batchInsert(@Param("records") List<BtmType> records);
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java
index 24e772c..e7ad4cc 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/repeater/DomainRepeater.java
@@ -2,11 +2,13 @@
 
 import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
 import com.alibaba.cloud.nacos.NacosServiceManager;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.api.exception.NacosException;
 import com.alibaba.nacos.api.naming.NamingService;
 import com.alibaba.nacos.api.naming.pojo.Instance;
 import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
+import com.vci.ubcs.common.constant.LauncherConstant;
 import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.vo.LinkTypeVO;
@@ -15,11 +17,9 @@
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.StringPool;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.*;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.client.HttpClientErrorException;
 import org.springframework.web.client.RestTemplate;
 
@@ -68,12 +68,27 @@
 	 * Nacos鏈嶅姟鍒楄〃
 	 */
 	private static NamingService namingService;
-
 	@Autowired
 	private NacosServiceManager manager;
 
 	@Autowired
 	private NacosDiscoveryProperties properties;
+
+
+	/**
+	 * 鎷垮彇鏈嶅姟涓殑鎵�鏈夎〃淇℃伅
+	 * @param serviceName 鏈嶅姟鍚嶇О
+	 * @return 杩斿洖缁撴灉
+	 * @throws NacosException 鎵句笉鍒版湇鍔℃椂鎶涘嚭寮傚父
+	 */
+	public static R getFromTable(String serviceName) throws NacosException{
+		ResponseEntity<R> responseEntity = executeGet(getUrl(serviceName, API_GET_ALL_TABLE_INFO), new HashMap<>());
+		if (responseEntity.getStatusCode().equals(HttpStatus.OK)) {
+			R body = Objects.requireNonNull(responseEntity.getBody());
+			return body;
+		}
+		return R.fail(String.valueOf(responseEntity.getStatusCode().value()));
+	}
 
 	@PostConstruct
 	private void init() {
@@ -198,29 +213,41 @@
 	}
 
 	/**
+	 * 鎵цhttpGet鎺ュ彛
+	 *
+	 * @param url          鍦板潃
+	 * @param extraHeaders 璇锋眰澶村弬鏁�
+	 * @return 鎵ц缁撴灉
+	 */
+	private static ResponseEntity<R> executeGet(String url,Map<String, String> extraHeaders) {
+		RestTemplate restTemplate = new RestTemplate();
+		HttpHeaders httpHeaders = new HttpHeaders();
+		httpHeaders.add("Blade-Auth", AuthUtil.getHeader());
+		HttpEntity<String> request = new HttpEntity<>(httpHeaders);
+		if (!CollectionUtils.isEmpty(extraHeaders)){
+			StringBuilder sb = new StringBuilder().append("?");
+			extraHeaders.forEach( (k,v) -> {
+				sb.append(k).append(StringPool.EQUALS).append(v).append(StringPool.AMPERSAND);
+			});
+			String str = sb.toString();
+			if (str.endsWith(StringPool.AMPERSAND)){
+				str = str.substring(0,str.length()-1);
+			}
+			url = url + str;
+		}
+		return restTemplate.exchange(url, HttpMethod.GET,request,R.class,"");
+	}
+
+	/**
 	 * 鑾峰彇鎵�鏈夊凡娉ㄥ唽鐨勬湇鍔�
 	 * @return 涓嶅寘鍚粯璁ゆ湇鍔$殑鍏朵粬鏈嶅姟
 	 * @throws NacosException
 	 */
 	public static List<String> getDomain() throws NacosException {
-		List<ServiceInfo> services = namingService.getSubscribeServices();
-		Set<String> serviceNames = new HashSet<>();
-		serviceNames.add(AppConstant.APPLICATION_GATEWAY_NAME);
-		serviceNames.add(AppConstant.APPLICATION_ADMIN_NAME);
-		serviceNames.add(AppConstant.APPLICATION_AUTH_NAME);
-		serviceNames.add(AppConstant.APPLICATION_DESK_NAME);
-		serviceNames.add(AppConstant.APPLICATION_DEVELOP_NAME);
-		serviceNames.add(AppConstant.APPLICATION_FLOW_NAME);
-		serviceNames.add(AppConstant.APPLICATION_FLOWDESIGN_NAME);
-		serviceNames.add(AppConstant.APPLICATION_LOG_NAME);
-		serviceNames.add(AppConstant.APPLICATION_REPORT_NAME);
-		serviceNames.add(AppConstant.APPLICATION_SWAGGER_NAME);
-		serviceNames.add(AppConstant.APPLICATION_SYSTEM_NAME);
-		serviceNames.add(AppConstant.APPLICATION_TURBINE_NAME);
-		serviceNames.add(AppConstant.APPLICATION_USER_NAME);
-		serviceNames.add(AppConstant.APPLICATION_WEBSOCKET_NAME);
-		serviceNames.add(AppConstant.APPLICATION_ZIPKIN_NAME);
-		serviceNames.add(AppConstant.APPLICATION_NAME_OMD);
-		return services.stream().map(ServiceInfo::getName).filter(s -> !serviceNames.contains(s)).collect(Collectors.toList());
+		RestTemplate restTemplate = new RestTemplate();
+		String url = "http://" +LauncherConstant.NACOS_DEV_ADDR + "/nacos/v1/ns/service/list?pageNo=1&pageSize=50";
+		String forObject = restTemplate.getForObject(url, String.class);
+		JSONObject jsonObject = JSON.parseObject(forObject);
+		return (List<String>) jsonObject.get("doms");
 	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeAttributeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeAttributeService.java
index 372316a..2e06c1f 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeAttributeService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeAttributeService.java
@@ -27,12 +27,6 @@
 	List<BtmTypeAttributeVO> checkAndInsert(String btmTypeOid, List<BtmTypeLinkAttributesDTO> attributesDTOList, String creator, Date now);
 
 	/**
-	 * 鎵归噺鎻掑叆
-	 * @param records 鏁版嵁瀵硅薄闆嗗悎
-	 */
-	int batchInsert(List<BtmTypeAttribute> records);
-
-	/**
 	 * 涓氬姟绫诲瀷涓婚敭鏌ュ睘鎬�
 	 * @param btmTypeOid 涓氬姟绫诲瀷涓婚敭
 	 * @return 鏌ヨ缁撴灉
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java
index f59367e..d47082a 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IBtmTypeService.java
@@ -5,6 +5,7 @@
 import com.vci.ubcs.omd.entity.BtmType;
 import com.vci.ubcs.omd.entity.BtmTypeAttribute;
 import com.vci.ubcs.omd.entity.ModifyAttributeInfo;
+import com.vci.ubcs.omd.vo.BtmTypeTreeVO;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
 import com.vci.ubcs.omd.vo.LinkTypeVO;
@@ -210,4 +211,25 @@
 	 * @return 鎵ц缁撴灉
 	 */
 	R submit(BtmTypeDTO btmTypeDTO,boolean autoCreateTable);
+
+	/**
+	 * 鎸塪omain鍒嗙粍锛屾煡璇笟鍔$被鍨嬪睘鎬х粨鏋�
+	 * @return 鏌ヨ缁撴灉
+	 */
+    List<BtmTypeTreeVO> treeDomain();
+
+	/**
+	 * 浠庢暟鎹簱琛ㄤ腑鑾峰彇
+	 * @param domain 棰嗗煙鍊�
+	 * @return 璇诲彇缁撴灉
+	 */
+	List<BtmTypeVO> getFromTable(String domain);
+
+	/**
+	 * 閫夋嫨鏁版嵁搴撹〃淇濆瓨涓轰笟鍔$被鍨�
+	 * @param btmTypeDTOList 椤甸潰浼犺緭瀵硅薄
+	 * @param domain 棰嗗煙
+	 * @return 鎵ц缁撴灉
+	 */
+	List<BtmTypeVO> saveFromTable(List<BtmTypeDTO> btmTypeDTOList,String domain);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
index a2deddc..6e02f0d 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
@@ -60,7 +60,7 @@
 	@Override
 	public AttributeVO getAttributeDetail(Long id) {
 		Func.requireNotNull(id,"涓婚敭涓嶈兘涓虹┖");
-		return AttributeWrapper.build().entityVO(baseMapper.selectByPrimaryKey(id));
+		return AttributeWrapper.build().entityVO(baseMapper.selectById(id));
 	}
 
 	/**
@@ -127,7 +127,6 @@
 		}
 		return true;
 	}
-
 
 	/**
 	 * 鏍规嵁鑻辨枃鍚嶇О闆嗗悎鎵归噺鑾峰彇灞炴�у璞�
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmAttributeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmAttributeServiceImpl.java
index 880efbc..a37c01c 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmAttributeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmAttributeServiceImpl.java
@@ -62,7 +62,7 @@
 			if (!exists){
 				return null;
 			}
-			batchInsert(btmTypeAttributeDOList);
+			saveBatch(btmTypeAttributeDOList);
 			return BtmTypeAttributeWrapper.build().listEntityVO(btmTypeAttributeDOList);
 //            btmTypeAttributeDOList.stream().forEachOrdered(s -> {
 //                btmTypeAttributeDOMapper.insert(s);
@@ -116,16 +116,6 @@
 //            });
 		}
 		return null;
-	}
-
-	/**
-	 * 鎵归噺鎻掑叆
-	 *
-	 * @param records 鏁版嵁瀵硅薄闆嗗悎
-	 */
-	@Override
-	public int batchInsert(List<BtmTypeAttribute> records) {
-		return baseMapper.insertBatchSomeColumn(records);
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
index 994199f..8c7215d 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/BtmTypeServiceImpl.java
@@ -1,15 +1,19 @@
 package com.vci.ubcs.omd.service.impl;
 
 import com.alibaba.cloud.commons.lang.StringUtils;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.api.exception.NacosException;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vci.ubcs.omd.constant.BtmTypeFieldConstant;
 import com.vci.ubcs.omd.dto.BtmAndLinkTypeDdlDTO;
+import com.vci.ubcs.omd.entity.Attribute;
 import com.vci.ubcs.omd.repeater.DomainRepeater;
+import com.vci.ubcs.omd.service.IAttributeService;
 import com.vci.ubcs.omd.service.IBtmTypeAttributeService;
 import com.vci.ubcs.omd.service.IModifyAttributeService;
-import com.vci.ubcs.omd.wrapper.BtmTypeAttributeWrapper;
+import com.vci.ubcs.omd.vo.BtmTypeTreeVO;
 import com.vci.ubcs.omd.wrapper.BtmTypeWrapper;
 import com.vci.ubcs.omd.wrapper.ModifyAttributeWrapper;
 import com.vci.ubcs.starter.web.constant.OmdRegExpConstant;
@@ -24,6 +28,7 @@
 import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
 import com.vci.ubcs.omd.vo.LinkTypeVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
 import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import com.vci.ubcs.starter.web.util.VciDateUtil;
@@ -38,6 +43,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.DefaultTransactionDefinition;
 import org.springframework.util.CollectionUtils;
 
@@ -71,6 +77,12 @@
 	 */
 	@Autowired
 	private IModifyAttributeService modifyAttributeService;
+
+	/**
+	 * 灞炴�х殑鏈嶅姟
+	 */
+	@Autowired
+	private IAttributeService attributeService;
 
 	/**
 	 * 琛ㄥ悕鍓嶇紑
@@ -621,4 +633,174 @@
 	public boolean changeStatus(@NotEmpty List<Long> ids, Integer status) {
 		return false;
 	}
+
+	/**
+	 * 鎸塪omain鍒嗙粍锛屾煡璇笟鍔$被鍨嬪睘鎬х粨鏋�
+	 *
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public List<BtmTypeTreeVO> treeDomain() {
+		try {
+			List<String> domain = DomainRepeater.getDomain();
+			List<BtmTypeVO> vos = BtmTypeWrapper.build().listEntityVO(baseMapper.selectAll());
+			Map<String, List<BtmTypeVO>> domainMap = vos.stream().collect(Collectors.groupingBy(BtmTypeVO::getDomain));
+			List<BtmTypeTreeVO> treeList = new ArrayList<>();
+			domainMap.forEach((k,v)-> {
+				if (domain.contains(k)){
+					BtmTypeTreeVO parent = new BtmTypeTreeVO();
+					parent.setOid(k);
+					parent.setName(k);
+					parent.setChildList(v.stream().map(s -> {
+						BtmTypeTreeVO child = new BtmTypeTreeVO();
+						child.setOid(s.getOid());
+						child.setName(s.getId() + " " + (s.getName() == null ? "" : s.getName()));
+						return child;
+					}).collect(Collectors.toList()));
+					treeList.add(parent);
+				}
+			});
+			return treeList;
+		} catch (NacosException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 浠庢暟鎹簱琛ㄤ腑鑾峰彇
+	 *
+	 * @param domain 棰嗗煙鍊�
+	 * @return 璇诲彇缁撴灉
+	 */
+	@Override
+	public List<BtmTypeVO> getFromTable(String domain) {
+		VciBaseUtil.alertNotNull(domain,"棰嗗煙鍊�");
+		try {
+			if (!DomainRepeater.getDomain().contains(domain)){
+				return null;
+			}
+			R result = DomainRepeater.getFromTable(domain);
+			if (result.isSuccess()){
+				List<BtmTypeVO> list = new ArrayList<>();
+				Object dataList = result.getData();
+				if (dataList instanceof  List){
+					((List<?>) dataList).forEach(data -> {
+						JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(data));
+						list.add(BeanUtil.copy(jsonObject,BtmTypeVO.class));
+					});
+				}
+				return list;
+			}else {
+				return new ArrayList<>();
+			}
+		} catch (NacosException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 閫夋嫨鏁版嵁搴撹〃淇濆瓨涓轰笟鍔$被鍨�
+	 *
+	 * @param btmTypeDTOList 椤甸潰浼犺緭瀵硅薄
+	 * @param domain 棰嗗煙
+	 * @return 鎵ц缁撴灉
+	 */
+	@Override
+	@Transactional
+	public List<BtmTypeVO> saveFromTable(List<BtmTypeDTO> btmTypeDTOList,String domain) {
+		// 涔嬪墠宸茬粡鍋氳繃閲嶅鏍¢獙浜嗭紝杩欒竟鐩存帴鎵ц淇濆瓨閫昏緫鍗冲彲
+		List<BtmType> btmList = new ArrayList<>();
+		List<BtmTypeAttribute> btmTypeAttributes = new ArrayList<>();
+		Map<String,Attribute> idAttrMap = new HashMap<>();
+		// 鏍¢獙灞炴�ф槸鍚﹀瓨鍦�
+		Set<String> attributeIds = new HashSet<>();
+		Date now = new Date();
+		String user = AuthUtil.getUserAccount();
+		btmTypeDTOList.stream().forEach(dto -> {
+			BtmType btmType = Objects.requireNonNull(BeanUtil.copy(dto, BtmType.class));
+			btmType.setOid(VciBaseUtil.getPk());
+			btmType.setTs(now);
+			btmType.setCreator(user);
+			btmType.setBtmName("btmType");
+			btmType.setCreateTime(now);
+			btmType.setDomain(domain);
+			btmType.setLastModifyTime(now);
+			btmType.setLastModifier(user);
+			btmType.setName(dto.getDescription());
+			Set<String> ids = dto.getAttributes().stream().filter(s -> {
+				return ! (BtmTypeFieldConstant.BASIC_FIELD_MAP.containsKey(s.getId())
+				|| BtmTypeFieldConstant.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(s.getId())
+				|| BtmTypeFieldConstant.SECRET_MANAGE_FIELD_MAP.containsKey(s.getId())
+				|| BtmTypeFieldConstant.REVISION_MANAGE_FIELD_MAP.containsKey(s.getId())
+				);
+			}).map(attr -> {
+				// 娣诲姞灞炴�э紝1鏄牎楠岋紝2鏄坊鍔�
+				Attribute attribute = new Attribute();
+				attribute.setKey(attr.getId());
+				attribute.setLabel(attr.getName());
+				attribute.setDictKey(attr.getAttrDataType());
+				attribute.setMaxLength(attr.getAttributeLength());
+				attribute.setPrecision(attr.getPrecisionLength());
+				attribute.setDescription(attr.getDescription());
+				attribute.setDefaultValue(attr.getDefaultValue());
+				attribute.setNullable(String.valueOf(attr.isNullableFlag()));
+				attribute.setHashtag(attr.getDescription());
+				attribute.setReferToId(attr.getReferBtmTypeId());
+				attribute.setReferToName(attr.getReferBtmTypeName());
+				attribute.setTs(now);
+				attribute.setCreateTime(now);
+				attribute.setCreateUser(AuthUtil.getUserId());
+				idAttrMap.put(attribute.getKey(),attribute);
+				// 鍦ㄨ繖閲岀粰涓氬姟绫诲瀷璁剧疆鐗堟湰鎺у埗銆佺敓鍛藉懆鏈熸帶鍒躲�佸瘑绾ф帶鍒剁浉鍏崇殑淇℃伅
+
+				// 娣诲姞涓氬姟绫诲瀷鍜屽睘鎬х殑鍏崇郴
+				BtmTypeAttribute btmTypeAttribute = Objects.requireNonNull(BeanUtil.copy(attr, BtmTypeAttribute.class));
+				btmTypeAttribute.setPkBtmType(btmType.getOid());
+				btmTypeAttribute.setCreator(user);
+				btmTypeAttribute.setCreateTime(now);
+				btmTypeAttribute.setLastModifier(user);
+				btmTypeAttribute.setLastModifyTime(now);
+//				btmTypeAttribute.setBtmName("btmTypeAttribute");
+				btmTypeAttribute.setOid(VciBaseUtil.getPk());
+				btmTypeAttribute.setBtmName(btmType.getId());
+				btmTypeAttribute.setOwner(user);
+				btmTypeAttributes.add(btmTypeAttribute);
+				return attr;
+			}).map(BtmTypeLinkAttributesDTO::getId).collect(Collectors.toSet());
+			attributeIds.addAll(ids);
+			btmType.setLifeCycleFlag(String.valueOf(ids.stream().anyMatch(BtmTypeFieldConstant.LIFECYCLE_MANAGE_FIELD_MAP::containsKey)));
+			btmType.setRevisionFlag(String.valueOf(ids.stream().anyMatch(BtmTypeFieldConstant.REVISION_MANAGE_FIELD_MAP::containsKey)));
+			btmType.setSecretFlag(String.valueOf(ids.stream().anyMatch(BtmTypeFieldConstant.SECRET_MANAGE_FIELD_MAP::containsKey)));
+			btmType.setConsistence(BooleanEnum.TRUE.getValue());
+			btmList.add(btmType);
+		});
+		List<Attribute> existAttr = attributeService.list(Wrappers.<Attribute>query().lambda().in(Attribute::getKey, attributeIds));
+		if (!CollectionUtils.isEmpty(btmList)){
+			baseMapper.batchInsert(btmList);
+		}
+		if (!CollectionUtils.isEmpty(btmTypeAttributes)){
+			btmTypeAttributeService.saveBatch(btmTypeAttributes);
+		}
+		BtmTypeFieldConstant.BASIC_FIELD_MAP.forEach((k,v) -> {
+			idAttrMap.remove(k);
+		});
+		BtmTypeFieldConstant.LIFECYCLE_MANAGE_FIELD_MAP.forEach((k,v) -> {
+			idAttrMap.remove(k);
+		});
+		BtmTypeFieldConstant.SECRET_MANAGE_FIELD_MAP.forEach((k,v) -> {
+			idAttrMap.remove(k);
+		});
+		BtmTypeFieldConstant.REVISION_MANAGE_FIELD_MAP.forEach((k,v) -> {
+			idAttrMap.remove(k);
+		});
+		if (CollectionUtils.isEmpty(existAttr)){
+			attributeService.saveBatch(idAttrMap.values());
+		}else {
+			List<Attribute> addList = idAttrMap.values().stream().filter(a -> existAttr.stream().noneMatch(b -> StringUtils.equals(a.getKey(), b.getKey()))).collect(Collectors.toList());
+			if (CollectionUtils.isEmpty(addList)) {
+				attributeService.saveBatch(addList);
+			}
+		}
+		return BtmTypeWrapper.build().listEntityVO(btmList);
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java
index 744366a..4a60ab2 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/wrapper/BtmTypeWrapper.java
@@ -84,7 +84,7 @@
 	 */
 	public BtmType entityBeforeSave(BtmType btmTypeDO) {
 		btmTypeDO.setOid(VciBaseUtil.getPk());
-		btmTypeDO.setBtmname("btmType");
+		btmTypeDO.setBtmName("btmType");
 		Date now  = new Date();
 		String userAccount = AuthUtil.getUserAccount();
 		btmTypeDO.setLastModifier(userAccount);
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml
index 89528cf..7da922c 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/AttributeMapper.xml
@@ -5,46 +5,64 @@
     <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
     <resultMap id="baseResultMap" type="com.vci.ubcs.omd.entity.Attribute">
         <id column="id" property="id"/>
-        <result column="create_user" property="createUser"/>
-        <result column="create_dept" property="createDept"/>
-        <result column="create_time" property="createTime"/>
-        <result column="update_user" property="updateUser"/>
-        <result column="update_time" property="updateTime"/>
-        <result column="status" property="status"/>
-        <result column="is_deleted" property="isDeleted"/>
         <result column="tenant_id" property="tenantId"/>
         <result column="key" property="key"/>
         <result column="label" property="label"/>
-        <result column="create_user" property="createUser" jdbcType="NUMERIC"/>
-        <result column="create_dept" property="createDept" jdbcType="NUMERIC"/>
-        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
-        <result column="update_user" property="updateUser" jdbcType="NUMERIC"/>
-        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
-        <result column="status" property="status" jdbcType="NUMERIC"/>
-        <result column="is_deleted" property="isDeleted" jdbcType="NUMERIC"/>
-        <result column="tenant_id" property="tenantId" jdbcType="NUMERIC"/>
-        <result column="key" property="key" jdbcType="VARCHAR"/>
-        <result column="label" property="label" jdbcType="VARCHAR"/>
+        <result column="type_code" property="typeCode"/>
+        <result column="type_key" property="typeKey"/>
         <result column="hashtag" property="hashtag" jdbcType="VARCHAR"/>
         <result column="description" property="description" jdbcType="VARCHAR"/>
+        <result column="nullable" property="nullable"/>
+        <result column="max_length" property="maxLength"/>
+        <result column="precision" property="precision"/>
+        <result column="refer_type_code" property="referTypeCode"/>
+        <result column="refer_type_key" property="referTypeKey"/>
+        <result column="refer_to_id" property="referToId" jdbcType="VARCHAR"/>
+        <result column="refer_to_name" property="referToName"/>
+        <result column="using_dict" property="usingDict"/>
+        <result column="dict_code" property="dictCode"/>
+        <result column="dict_key" property="dictKey"/>
+        <result column="default_value" property="defaultValue"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="create_user" property="createUser" jdbcType="VARCHAR"/>
+        <result column="create_dept" property="createDept" jdbcType="VARCHAR"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+        <result column="update_user" property="updateUser" jdbcType="VARCHAR"/>
+        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
         <result column="ts" property="ts" jdbcType="TIMESTAMP"/>
     </resultMap>
 
     <resultMap id="extraResultMap" type="com.vci.ubcs.omd.entity.Attribute">
-        <result column="nullable" property="nullable" jdbcType="VARCHAR"/>
-        <result column="max_length" property="maxLength" jdbcType="NUMERIC"/>
-        <result column="precision" property="precision" jdbcType="NUMERIC"/>
-        <result column="refer_to_id" property="referToId" jdbcType="NUMERIC"/>
-        <result column="refer_type_code" property="referTypeCode" jdbcType="VARCHAR"/>
-        <result column="refer_type_key" property="referTypeKey" jdbcType="VARCHAR"/>
-        <result column="refer_to_name" property="referToName" jdbcType="VARCHAR"/>
-<!--        <result column="using_dict" property="usingDict" jdbcType="VARCHAR"/>-->
-<!--        <result column="dict_code" property="dictCode" jdbcType="VARCHAR"/>-->
-<!--        <result column="dict_key" property="dictKey" jdbcType="VARCHAR"/>-->
-        <result column="default_value" property="defaultValue" jdbcType="VARCHAR"/>
+
     </resultMap>
 
-
+    <sql id="base_query_column">
+        id, tenant_id ,key ,label ,type_code , type_key , hashtag , description, nullable , max_length, precision,
+            refer_type_code, refer_type_key, refer_to_id, refer_to_name, using_dict, dict_code, dict_key, default_value,
+            status, is_deleted, create_user, create_dept, create_time, update_user, update_time , ts
+    </sql>
+    <sql id="tableName">
+        pl_omd_attribute
+    </sql>
+    <select id="selectAll" resultMap="baseResultMap">
+        select
+        <include refid="base_query_column"/>
+        from
+        <include refid="tableName"/>
+    </select>
+    <select id="selectByPrimaryKeyCollection" resultMap="baseResultMap">
+        select DISTINCT <include refid="base_query_column" />
+        from <include refid="tableName"/>
+        <where>
+            <foreach collection="oids" item="item" index="arrayindex" open=" OID in ( " close=")" >
+                #{item,jdbcType=VARCHAR}
+                <if test="(arrayindex != oids.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </where>
+    </select>
 
 
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeAttributeMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeAttributeMapper.xml
new file mode 100644
index 0000000..7ea52e2
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeAttributeMapper.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vci.ubcs.omd.mapper.BtmTypeAttributeMapper">
+
+    <resultMap id="base_result_map" type="com.vci.ubcs.omd.entity.BtmTypeAttribute">
+        <id column="oid" jdbcType="VARCHAR" property="oid"/>
+        <result column="id" jdbcType="VARCHAR" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="description" jdbcType="VARCHAR" property="description"/>
+        <result column="pk_btm_type" jdbcType="VARCHAR" property="pkBtmType"/>
+        <result column="attribute_length" jdbcType="DECIMAL" property="attributeLength"/>
+        <result column="attr_data_type" jdbcType="VARCHAR" property="attrDataType"/>
+        <result column="nullable_flag" jdbcType="VARCHAR" property="nullableFlag"/>
+        <result column="default_value" jdbcType="VARCHAR" property="defaultValue"/>
+        <result column="precision_length" jdbcType="DECIMAL" property="precisionLength"/>
+        <result column="scale_length" property="scaleLength" jdbcType="DECIMAL"/>
+        <result column="range" jdbcType="VARCHAR" property="range"/>
+        <result column="refer_btm_type_id" jdbcType="VARCHAR" property="referBtmTypeId"/>
+        <result column="refer_btm_type_name" jdbcType="VARCHAR" property="referBtmTypeName"/>
+        <result column="enum_id" jdbcType="VARCHAR" property="enumId"/>
+        <result column="enum_name" jdbcType="VARCHAR" property="enumName"/>
+        <result column="btm_name" property="btmName" jdbcType="VARCHAR"/>
+        <result column="owner" property="owner" jdbcType="VARCHAR"/>
+        <result column="creator" jdbcType="VARCHAR" property="creator"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="last_modifier" jdbcType="VARCHAR" property="lastModifier"/>
+        <result column="last_modify_time" jdbcType="TIMESTAMP" property="lastModifyTime"/>
+        <result column="ts" jdbcType="TIMESTAMP" property="ts"/>
+    </resultMap>
+
+    <sql id="base_query_column">
+        oid, id, name, description, pk_btm_type, attribute_length, attr_data_type, nullable_flag,
+        default_value, precision_length, scale_length, range, refer_btm_type_id, refer_btm_type_name,
+        enum_id, enum_name, btm_name, owner, creator, create_time, last_modifier, last_modify_time, ts
+    </sql>
+
+    <sql id="tableName">
+        pl_omd_btm_type_attribute
+    </sql>
+    <sql id="btmTypeTableName">
+        pl_omd_btm_type
+    </sql>
+    <update id="batchUpdate" parameterType="java.util.List">
+        <foreach collection="records" item="item" index="index" open="begin" close=";end;" separator=";">
+            update <include refid="tableName"/> set
+                id = #{item.id,jdbcType=VARCHAR},
+                name = #{item.name,jdbcType=VARCHAR},
+                descrption = #{item.decription,jdbcType=VARCHAR},
+                pk_btm_type = #{item.pkBtmType,jdbcType=VARCHAR},
+                attribute_length = #{item.attributeLength,jdbcType=DECIMAL},
+                attr_data_type = #{item.attrDataType,jdbcType=VARCHAR},
+                nullable_flag = #{item.nullableFlag,jdbcType=VARCHAR},
+                default_value = #{item.defaultValue,jdbcType=VARCHAR},
+                precision_length = #{item.precisionLength,jdbcType=DECIMAL},
+                scale_length = #{item.scaleLength,jdbcType=DECIMAL},
+                range = #{item.range,jdbcType=VARCHAR},
+                refer_btm_type_id = #{item.referBtmTypeId,jdbcType=VARCHAR},
+                refer_btm_type_name = #{item.referBtmTypeName,jdbcType=VARCHAR},
+                enum_id = #{item.enumId,jdbcType=VARCHAR},
+                enum_name = #{item.enumName,jdbcType=VARCHAR},
+                btm_name = #{item.btmName,jdbcType=VARCHAR},
+                owner = #{item.owner,jdbcType=VARCHAR},
+                creator = #{item.creator,jdbcType=VARCHAR},
+                create_time = #{item.createTime,jdbcType=TIMESTAMP},
+                last_modifier = #{item.lastModifier,jdbcType=VARCHAR},
+                last_modify_time = #{item.lastModifyTime,jdbcType=TIMESTAMP},
+                ts = #{item.ts,jdbcType=TIMESTAMP}
+        </foreach>
+    </update>
+    <delete id="batchDelete">
+        delete from
+        <include refid="tableName"/>
+        <where>
+            <foreach collection="records" item="item" index="arrayindex" open="oid in (" close=")">
+                #{item,jdbcType=VARCHAR}
+                <if test="(arrayindex != records.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </where>
+    </delete>
+    <select id="selectByBtmTypeIdAndAttributeIds" resultType="com.vci.ubcs.omd.entity.BtmTypeAttribute">
+        select <include refid="base_query_column"/>
+        from <include refid="tableName" />
+        where PKBTMTYPE = (select oid from <include refid="btmTypeTableName"/> where lower(id) = lower(#{btmTypeId,jdbcType=VARCHAR}) )
+        <if test="ids.size() > 0">
+            and
+            <foreach collection="ids" item="item" index="arrayindex" open=" lower(ID) in ( " close=")" >
+                lower(#{item,jdbcType=VARCHAR})
+                <if test="(arrayindex != ids.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </if>
+    </select>
+    <select id="selectByBtmTypeIds" resultType="com.vci.ubcs.omd.entity.BtmTypeAttribute">
+        select DISTINCT <include refid="base_query_column" />
+        from <include refid="tableName" />
+        where PKBTMTYPE IN (
+        select oid from <include refid="btmTypeTableName"/> where
+        <foreach collection="ids" item="item" index="arrayindex" open=" lower(ID) in ( " close=")" >
+            lower(#{item,jdbcType=VARCHAR})
+            <if test="(arrayindex != ids.size() -1)">
+                ,
+            </if>
+        </foreach>
+        )
+        order by id asc
+    </select>
+
+</mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeMapper.xml
new file mode 100644
index 0000000..548cc12
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/BtmTypeMapper.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vci.ubcs.omd.mapper.BtmTypeMapper">
+
+
+    <resultMap id="BaseResultMap" type="com.vci.ubcs.omd.entity.BtmType">
+        <id column="oid" jdbcType="VARCHAR" property="oid" />
+        <result column="id" jdbcType="VARCHAR" property="id" />
+        <result column="name" jdbcType="VARCHAR" property="name" />
+        <result column="description" jdbcType="VARCHAR" property="description" />
+        <result column="table_name" jdbcType="VARCHAR" property="tableName" />
+        <result column="revision_rule_id" jdbcType="VARCHAR" property="revisionRuleId" />
+        <result column="revision_rule_name" jdbcType="VARCHAR" property="revisionRuleName" />
+        <result column="revision_sep" jdbcType="VARCHAR" property="revisionSep" />
+        <result column="revision_flag" jdbcType="VARCHAR" property="revisionFlag" />
+        <result column="input_revision_flag" jdbcType="VARCHAR" property="inputRevisionFlag" />
+        <result column="secret_flag" jdbcType="VARCHAR" property="secretFlag" />
+        <result column="abstract_flag" jdbcType="VARCHAR" property="abstractFlag" />
+        <result column="impl_class" jdbcType="VARCHAR" property="implClass" />
+        <result column="shape" jdbcType="VARCHAR" property="shape" />
+        <result column="life_cycle_flag" jdbcType="VARCHAR" property="lifeCycleFlag" />
+        <result column="life_cycle_id" jdbcType="VARCHAR" property="lifeCycleId" />
+        <result column="life_cycle_name" jdbcType="VARCHAR" property="lifeCycleName" />
+        <result column="version_rule" jdbcType="VARCHAR" property="versionRule" />
+        <result column="sub_life_cycle_id" jdbcType="VARCHAR" property="subLifeCycleId" />
+        <result column="sub_life_cycle_name" jdbcType="VARCHAR" property="subLifeCycleName" />
+        <result column="view_flag" jdbcType="VARCHAR" property="viewFlag" />
+        <result column="view_create_sql" jdbcType="VARCHAR" property="viewCreateSql" />
+        <result column="btm_name" property="btmName" jdbcType="VARCHAR" />
+        <result column="owner" property="owner" jdbcType="VARCHAR" />
+        <result column="creator" jdbcType="VARCHAR" property="creator" />
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+        <result column="last_modifier" jdbcType="VARCHAR" property="lastModifier" />
+        <result column="last_modify_time" jdbcType="TIMESTAMP" property="lastModifyTime" />
+        <result column="ts" jdbcType="TIMESTAMP" property="ts" />
+        <result column="domain" jdbcType="VARCHAR" property="domain" />
+        <result column="consistence" jdbcType="VARCHAR" property="consistence" />
+    </resultMap>
+
+    <sql id="base_query_column">
+        oid, id, name, description, table_name, revision_rule_id, revision_rule_name,revision_flag,
+    revision_sep, input_revision_flag, secret_flag, abstract_flag, impl_class, shape,life_cycle_flag, life_cycle_id,life_cycle_name,
+    version_rule,sub_life_cycle_id,sub_life_cycle_name, view_flag, view_create_sql,btm_name, owner, creator, create_time, last_modifier,
+    last_modify_time, ts,domain,consistence
+    </sql>
+    <sql id="tableName">
+        pl_omd_btm_type
+    </sql>
+    <insert id="batchInsert" useGeneratedKeys="false">
+        insert into <include refid="tableName"/> (
+            <include refid="base_query_column"/>
+        )
+        <foreach collection="records" item="item" separator="union all">
+            (
+            select #{item.oid,jdbcType=VARCHAR},
+                   #{item.id,jdbcType=VARCHAR},
+                   #{item.name,jdbcType=VARCHAR},
+            #{item.description,jdbcType=VARCHAR},
+            #{item.tableName,jdbcType=VARCHAR},
+            #{item.revisionRuleId,jdbcType=VARCHAR},
+            #{item.revisionRuleName,jdbcType=VARCHAR},
+            #{item.revisionFlag,jdbcType=VARCHAR},
+            #{item.revisionSep,jdbcType=VARCHAR},
+            #{item.inputRevisionFlag,jdbcType=VARCHAR},
+            #{item.secretFlag,jdbcType=VARCHAR},
+            #{item.abstractFlag,jdbcType=VARCHAR},
+            #{item.implClass,jdbcType=VARCHAR},
+            #{item.shape,jdbcType=VARCHAR},
+            #{item.lifeCycleFlag,jdbcType=VARCHAR},
+            #{item.lifeCycleId,jdbcType=VARCHAR},
+            #{item.lifeCycleName,jdbcType=VARCHAR},
+            #{item.versionRule,jdbcType=VARCHAR},
+            #{item.subLifeCycleId,jdbcType=VARCHAR},
+            #{item.subLifeCycleName,jdbcType=VARCHAR},
+            #{item.viewFlag,jdbcType=VARCHAR},
+            #{item.viewCreateSql,jdbcType=VARCHAR},
+            #{item.btmName,jdbcType=VARCHAR },
+            #{item.owner,jdbcType=VARCHAR },
+            #{item.creator,jdbcType=VARCHAR},
+            #{item.createTime,jdbcType=TIMESTAMP},
+            #{item.lastModifier,jdbcType=VARCHAR},
+            #{item.lastModifyTime,jdbcType=TIMESTAMP},
+            #{item.ts,jdbcType=TIMESTAMP},
+            #{item.domain,jdbcType=VARCHAR},
+            #{item.consistence,jdbcType=VARCHAR}
+            from dual
+            )
+        </foreach>
+    </insert>
+
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+        delete from <include refid="tableName"/>
+        where OID = #{oid,jdbcType=VARCHAR}
+    </delete>
+
+    <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/>
+        from <include refid="tableName" />
+        where OID = #{oid,jdbcType=VARCHAR}
+    </select>
+
+    <select id="selectByPrimaryKeys" resultMap="BaseResultMap">
+        select <include refid="base_query_column" />
+        from <include refid="tableName" />
+        where OID in ( ${oids,jdbcType=VARCHAR})
+    </select>
+
+    <select id="selectByPrimaryKeyCollection" resultMap="BaseResultMap">
+        select <include refid="base_query_column" />
+        from <include refid="tableName" />
+        <where>
+            <foreach collection="oids" item="item" index="arrayindex" open=" OID in ( " close=")" >
+                #{item,jdbcType=VARCHAR}
+                <if test="(arrayindex != oids.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </where>
+    </select>
+
+    <select id="selectByIdCollection" resultMap="BaseResultMap">
+        select <include refid="base_query_column" />
+        from <include refid="tableName" />
+        <where>
+            <foreach collection="ids" item="item" index="arrayindex" open=" lower(ID) in ( " close=")" >
+                lower(#{item,jdbcType=VARCHAR})
+                <if test="(arrayindex != ids.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </where>
+    </select>
+
+    <select id="selectAll" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/>
+        from <include refid="tableName" />
+    </select>
+
+    <update id="updateByPrimaryKey" parameterType="com.vci.ubcs.omd.entity.BtmType">
+        update <include refid="tableName"/>
+        set id = #{id,jdbcType=VARCHAR},
+            name = #{name,jdbcType=VARCHAR},
+            description = #{description,jdbcType=VARCHAR},
+            table_name = #{tableName,jdbcType=VARCHAR},
+            revision_rule_id = #{revisionRuleId,jdbcType=VARCHAR},
+            revision_flag = #{revisionFlag,jdbcType=VARCHAR},
+            revision_rule_name = #{revisionRuleName,jdbcType=VARCHAR},
+            revision_sep = #{revisionSep,jdbcType=VARCHAR},
+            input_revision_flag = #{inputRevisionFlag,jdbcType=VARCHAR},
+            secret_flag = #{secretFlag,jdbcType=VARCHAR},
+            abstract_flag = #{abstractFlag,jdbcType=VARCHAR},
+            impl_class = #{implClass,jdbcType=VARCHAR},
+            shape = #{shape,jdbcType=VARCHAR},
+            life_cycle_flag = #{lifeCycleFlag,jdbcType=VARCHAR},
+            life_cycle_id = #{lifeCycleId,jdbcType=VARCHAR},
+            life_cycle_name = #{lifeCycleName,jdbcType=VARCHAR},
+            version_rule = #{versionRule,jdbcType=VARCHAR},
+            sub_life_cycle_id = #{subLifeCycleId,jdbcType=VARCHAR},
+            sub_life_cycle_name = #{subLifeCycleName,jdbcType=VARCHAR},
+            view_flag = #{viewFlag,jdbcType=VARCHAR},
+            view_create_sql = #{viewCreateSql,jdbcType=VARCHAR},
+            btm_name =#{btmName,jdbcType=VARCHAR },
+            owner = #{owner,jdbcType=VARCHAR },
+            creator = #{creator,jdbcType=VARCHAR},
+            create_time = #{createTime,jdbcType=TIMESTAMP},
+            last_modifier = #{lastModifier,jdbcType=VARCHAR},
+            last_modify_time = #{lastModifyTime,jdbcType=TIMESTAMP},
+            ts = #{ts,jdbcType=TIMESTAMP},
+            domain = #{domain,jdbcType=VARCHAR},
+            consistence = #{consistence,jdbcType=VARCHAR}
+        where OID = #{oid,jdbcType=VARCHAR}
+    </update>
+
+
+    <select id="selectNameByOid" resultType="java.lang.String">
+        select NAME from <include refid="tableName" />
+        where OID = #{oid,jdbcType=VARCHAR}
+    </select>
+    <select id="selectNameById" resultType="java.lang.String">
+        select NAME from <include refid="tableName" />
+        where ID = #{id,jdbcType=VARCHAR}
+    </select>
+
+
+    <select id="selectByAttributeOid" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/>
+        from <include refid="tableName" /> where oid in (
+        select DISTINCT PKBTMTYPE from <include refid="tableName"/>ATTRIBUTE
+        where lower(ATTRIBUTEID) in (select id from vcibt_ATTRIBUTE where oid = #{pkAttribute,jdbcType=VARCHAR} ) )
+    </select>
+
+
+    <select id="selectByRevisionRuleOid" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/>
+        from <include refid="tableName" /> where REVISIONRULEID in
+        (select DISTINCT  id from  vcibt_REVISIONRULE where oid = #{pkRevisionRule,jdbcType=VARCHAR} )
+    </select>
+
+
+    <select id="selectByLifeCycleOid" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/>
+        from <include refid="tableName" /> where LIFECYCLEID in
+        (select DISTINCT  id from  vcibt_LIFECYCLE where oid = #{pkLifeCycle,jdbcType=VARCHAR} )
+    </select>
+
+    <delete id="batchDeleteByOids" >
+        delete from <include refid="tableName" />
+        <where>
+            <foreach collection="oids" item="item" index="arrayindex" open=" oid in ( " close=")" >
+                #{item,jdbcType=VARCHAR}
+                <if test="(arrayindex != oids.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
+
+
+
+</mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml
new file mode 100644
index 0000000..d7b80ff
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/ModifyAttributeInfoMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.vci.ubcs.omd.mapper.ModifyAttributeInfoMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="baseResultMap" type="com.vci.ubcs.omd.entity.ModifyAttributeInfo">
+        <id column="oid" property="oid" jdbcType="VARCHAR" />
+        <result column="id" property="id" jdbcType="VARCHAR" />
+        <result column="name" property="name" jdbcType="VARCHAR" />
+        <result column="description" property="description" jdbcType="VARCHAR" />
+        <result column="business_type" property="businessType" jdbcType="VARCHAR" />
+        <result column="table_name" property="tableName" jdbcType="VARCHAR" />
+        <result column="task_name" property="taskName" jdbcType="VARCHAR" />
+        <result column="modify_column_reason" property="modifyColumnReason" jdbcType="VARCHAR" />
+        <result column="order_modify_user_name" property="orderModifyUserName" jdbcType="VARCHAR" />
+        <result column="order_modify_date" property="orderModifyDate" jdbcType="TIMESTAMP" />
+        <result column="handle_finish_flag" property="handleFinishFlag" jdbcType="VARCHAR" />
+        <result column="handle_user_name" property="handleUserName" jdbcType="VARCHAR" />
+        <result column="handle_date" property="handleDate" jdbcType="TIMESTAMP" />
+        <result column="handle_result" property="handleResult" jdbcType="VARCHAR" />
+        <result column="btm_name" property="btmname" jdbcType="VARCHAR" />
+        <result column="creator" property="creator" jdbcType="VARCHAR" />
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
+        <result column="TS" property="ts" jdbcType="TIMESTAMP" />
+        <result column="add_attributes" property="addAttributes" jdbcType="CLOB" />
+        <result column="modify_attributes" property="modifyAttributes" jdbcType="CLOB" />
+        <result column="delete_attributes" property="deleteAttributes" jdbcType="CLOB" />
+        <result column="before_modify_attributes" property="beforeModifyAttributes" jdbcType="CLOB" />
+
+    </resultMap>
+
+    <resultMap id="extraResultMap" type="com.vci.ubcs.omd.entity.Attribute">
+
+    </resultMap>
+
+    <sql id="base_query_column">
+        oid, id, name, description, business_type, table_name, task_name, modify_column_reason, order_modify_user_name,
+        order_modify_date, handle_finish_flag, handle_user_name, handle_date, handle_result, btm_name, creator, create_time,
+        ts, add_attributes, modify_attributes, delete_attributes, before_modify_attributes
+    </sql>
+    <sql id="tableName">
+        pl_omd_modify_attribute_info
+    </sql>
+
+
+
+</mapper>

--
Gitblit v1.9.3