From 1b8098b7f79b66a80e5ca49d8765606cb5fa0408 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期四, 30 十一月 2023 19:11:00 +0800
Subject: [PATCH] 操作日志完善

---
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleCharacterVO.java  |   35 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleCharacterService.java         |   39 +
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java                  |    7 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/字符集.json    |    5 
 Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/vo/UserVO.java                  |   20 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java                      |    2 
 Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java               |    7 
 Source/UBCS-WEB/src/views/monitor/log/operateLog.vue                                                              |   18 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeRuleCharacterEnum.java            |  135 ++++
 Source/UBCS-WEB/vue.config.js                                                                                     |    6 
 Source/UBCS-WEB/src/views/system/user.vue                                                                         |   10 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeOrderDTO.java                  |    1 
 Source/UBCS-WEB/package.json                                                                                      |   54 
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/RoleServiceImpl.java          |   32 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeRuleCharacterWapper.java           |   73 ++
 Source/UBCS-WEB/src/components/Master/MasterTree.vue                                                              |    4 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java    |    2 
 Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue                                                           |   13 
 Source/UBCS-WEB/src/views/code/code.vue                                                                           |    2 
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RoleController.java             |   15 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java             |  869 +++++++++++++------------
 Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue                                                      |   17 
 Source/UBCS-WEB/src/views/MasterData/items.vue                                                                    |    4 
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IRoleService.java                  |   14 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRuleCharacter.java          |   53 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java      |   17 
 Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java                |   17 
 Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java       |   16 
 /dev/null                                                                                                         |   13 
 Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue                                                          |   13 
 Source/UBCS-WEB/src/views/docking/info.vue                                                                        |   18 
 Source/UBCS-WEB/src/components/FormTemplate/index.vue                                                             |    8 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java |    5 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SaveLogUtil.java               |   24 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java         |  104 ++-
 Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue                                                           |   13 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleCharacterServiceImpl.java |  113 +++
 Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java          |   15 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleCharacterMapper.xml                          |   36 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml                                    |   16 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/MdmEnumIdConstant.java |    5 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java            |   29 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeRuleCharacterMapper.java            |    7 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleCharacterController.java    |   59 +
 Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java          |   11 
 45 files changed, 1,408 insertions(+), 568 deletions(-)

diff --git a/Source/UBCS-WEB/package.json b/Source/UBCS-WEB/package.json
index 0b035b2..4e9dfc2 100644
--- a/Source/UBCS-WEB/package.json
+++ b/Source/UBCS-WEB/package.json
@@ -11,44 +11,44 @@
     "test:e2e": "vue-cli-service test:e2e"
   },
   "dependencies": {
-    "avue-plugin-ueditor": "0.1.4",
-    "axios": "0.18.0",
-    "babel-polyfill": "6.26.0",
-    "classlist-polyfill": "1.2.0",
-    "crypto-js": "4.1.1",
+    "avue-plugin-ueditor": "^0.1.4",
+    "axios": "^0.18.0",
+    "babel-polyfill": "^6.26.0",
+    "classlist-polyfill": "^1.2.0",
+    "crypto-js": "^4.1.1",
     "echarts": "4.9.0",
-    "element-ui": "2.15.6",
-    "instead": "1.0.3",
-    "js-base64": "2.5.1",
-    "js-cookie": "2.2.0",
-    "js-md5": "0.7.3",
-    "js-pinyin": "0.2.4",
-    "mockjs": "1.0.1-beta3",
-    "moment": "2.29.4",
-    "node-gyp": "4.0.0",
+    "element-ui": "^2.15.6",
+    "instead": "^1.0.3",
+    "js-base64": "^2.5.1",
+    "js-cookie": "^2.2.0",
+    "js-md5": "^0.7.3",
+    "js-pinyin": "^0.2.4",
+    "mockjs": "^1.0.1-beta3",
+    "moment": "^2.29.4",
+    "node-gyp": "^4.0.0",
     "nprogress": "0.2.0",
     "portfinder": "1.0.23",
     "save": "2.9.0",
     "script-loader": "0.7.2",
     "vue": "2.6.10",
-    "vue-axios": "2.1.2",
-    "vue-clipboard2": "0.3.3",
+    "vue-axios": "^2.1.2",
+    "vue-clipboard2": "^0.3.3",
     "vue-echarts": "5.0.0-beta.0",
     "vue-flowchart-editor": "1.0.2",
-    "vue-i18n": "8.7.0",
-    "vue-router": "3.0.1",
-    "vuex": "3.1.1"
+    "vue-i18n": "^8.7.0",
+    "vue-router": "^3.0.1",
+    "vuex": "^3.1.1"
   },
   "devDependencies": {
-    "@vue/cli-plugin-babel": "3.1.1",
-    "@vue/cli-plugin-eslint": "3.1.5",
-    "@vue/cli-service": "3.1.4",
-    "@vue/composition-api": "1.7.2",
-    "chai": "4.1.2",
+    "@vue/cli-plugin-babel": "^3.5.0",
+    "@vue/cli-plugin-eslint": "^3.5.0",
+    "@vue/cli-service": "^3.5.0",
+    "@vue/composition-api": "^1.7.2",
+    "chai": "^4.1.2",
     "node-sass": "6.0.1",
-    "sass-loader": "10.0.5",
-    "vue-template-compiler": "2.5.17",
-    "webpack-bundle-analyzer": "3.0.3"
+    "sass-loader": "10.3.1",
+    "vue-template-compiler": "2.6.10",
+    "webpack-bundle-analyzer": "^3.0.3"
   },
   "lint-staged": {
     "*.js": [
diff --git a/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue b/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
index 5849e98..bfd0254 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
@@ -278,7 +278,6 @@
 
         let columnItem = {
           change: (val) => {
-            console.log(val)
             if (val.column.field === "drawingno") {
               this.codeattrsecValue = val.value;
               return;
@@ -600,12 +599,16 @@
     // 鑾峰彇琛ㄥ崟璇︽儏鏁版嵁
     getFormDetail() {
       if (this.type === "add") return;
-      getFormDetail({templateOid: this.templateOid, oid: this.rowOid}).then(
-        (res) => {
-          this.form = Object.assign(this.form, res.data.data[0]);
-          this.loading = false;
-        }
-      );
+      if(this.templateOid){
+        getFormDetail({templateOid: this.templateOid, oid: this.rowOid}).then(
+          (res) => {
+            this.form = Object.assign(this.form, res.data.data[0]);
+            this.loading = false;
+          }
+        );
+        return;
+      }
+
     },
     setReferValue(data) {
       if (data.field) {
diff --git a/Source/UBCS-WEB/src/components/FormTemplate/index.vue b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
index 573c4b5..2567d87 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/index.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -250,9 +250,11 @@
   },
   methods: {
     openDialog() {
+      //鏂板鍜屼慨鏀瑰叡鍚岃皟鐢�
       this.getFormTemplate();
-      if (this.type === "add") {
+      if (this.type === "add" || (this.type !== "add" && this.status === "amend")) {
         this.getCodeRule();
+        return;
       }
     },
     close() {
@@ -260,6 +262,7 @@
     },
     // 鎺ュ彛鑾峰彇琛ㄥ崟鏁版嵁
     getFormTemplate() {
+      //鏂板鍜屼慨鏀瑰叡鍚岃皟鐢�
       getFormTemplate({
         templateOid: this.templateOid,
         codeClassifyOid: this.codeClassifyOid,
@@ -277,6 +280,7 @@
             } else {
               this.showResembleQuery = false;
             }
+            //浼犻�掕〃鍗曚笂鏂瑰尯鍩熸暟鎹� 锛堟柊澧炲拰淇敼锛�
             this.$nextTick(() => {
               this.$refs.FormTemplate.templateRender(
                 res.data.formDefineVO.items
@@ -319,7 +323,7 @@
           that.secVOList = (res.data.data.secVOList || []).filter((item) =>
             typeList.includes(item.secType)
           );
-          if (that.secVOList.length > 0 && that.type === "add") {
+          if (that.secVOList.length > 0 && that.type === "add" ||(that.type !== "add" &&  that.status === "amend")) {
             that.showCodeApply = true;
             that.activeName = "codeApply";
 
diff --git a/Source/UBCS-WEB/src/components/Master/MasterTree.vue b/Source/UBCS-WEB/src/components/Master/MasterTree.vue
index 3948716..b34e705 100644
--- a/Source/UBCS-WEB/src/components/Master/MasterTree.vue
+++ b/Source/UBCS-WEB/src/components/Master/MasterTree.vue
@@ -1,12 +1,12 @@
 <template>
-  <div class="app" style="display: flex;">
+  <div class="app" style="position: relative;">
     <avue-tree ref="tree" v-model="CloneTreeAvueform" v-loading="loading" :data="Treedata" :defaultExpandAll="false"
                :option="Treeoption" style="width: fit-content;" @node-click="nodeClick">
       <template slot-scope="{ node }">
         <span v-html="node.label"></span>
       </template>
     </avue-tree>
-    <div style="display: inline-block;">
+    <div style="position: absolute; right: 0px; top: -1px;">
       <el-link class="refresh-icon" icon="el-icon-refresh" @click="getTreeLists"></el-link>
     </div>
   </div>
diff --git a/Source/UBCS-WEB/src/views/MasterData/items.vue b/Source/UBCS-WEB/src/views/MasterData/items.vue
index f84b48b..c0a80c0 100644
--- a/Source/UBCS-WEB/src/views/MasterData/items.vue
+++ b/Source/UBCS-WEB/src/views/MasterData/items.vue
@@ -1,7 +1,7 @@
 <template>
   <el-container>
-    <el-aside>
-      <basic-container style="overflow: hidden;">
+    <el-aside style="width:250px">
+      <basic-container>
         <!--          鏍戠粍浠�-->
         <master-tree
           :currentPage="this.currentPage"
diff --git a/Source/UBCS-WEB/src/views/code/code.vue b/Source/UBCS-WEB/src/views/code/code.vue
index 9668e7d..4b0e705 100644
--- a/Source/UBCS-WEB/src/views/code/code.vue
+++ b/Source/UBCS-WEB/src/views/code/code.vue
@@ -1385,7 +1385,7 @@
             cols: [
               {title: '绠楁硶缂栧彿', field: 'id', width: 200},
               {title: '绠楁硶鍚嶇О', field: 'name', width: 150},
-              {title: '鑷畾涔夋祦姘碆ean', field: 'classFullName', width: 300},
+              {title: '绫诲叏璺緞', field: 'classFullName', width: 300},
               {title: '绫诲瀷', field: 'serialType', width: 300},
               {title: '鎻忚堪', field: 'description'}
             ],
diff --git a/Source/UBCS-WEB/src/views/docking/info.vue b/Source/UBCS-WEB/src/views/docking/info.vue
index 973fcd7..f7cbbc7 100644
--- a/Source/UBCS-WEB/src/views/docking/info.vue
+++ b/Source/UBCS-WEB/src/views/docking/info.vue
@@ -266,15 +266,15 @@
   },
   computed: {
     ...mapGetters(["permission"]),
-    permissionList(){
-      return{
-        sync:this.vaildData(this.permission.info.info_sync,false),
-        add:this.vaildData(this.permission.info.info_add,false),
-        query:this.vaildData(this.permission.info.info_query,false),
-        edit:this.vaildData(this.permission.info.info_edit,false),
-        delete:this.vaildData(this.permission.info.info_delete,false),
-        enable:this.vaildData(this.permission.info.info_enable,false),
-        stop:this.vaildData(this.permission.info.info_stop,false),
+    permissionList() {
+      return {
+        sync: this.vaildData(this.permission.info.info_sync, false),
+        add: this.vaildData(this.permission.info.info_add, false),
+        query: this.vaildData(this.permission.info.info_query, false),
+        edit: this.vaildData(this.permission.info.info_edit, false),
+        delete: this.vaildData(this.permission.info.info_delete, false),
+        enable: this.vaildData(this.permission.info.info_enable, false),
+        stop: this.vaildData(this.permission.info.info_stop, false),
       }
     },
     oids() {
diff --git a/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue b/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
index b797733..0a8653f 100644
--- a/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
+++ b/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
@@ -14,6 +14,11 @@
                @size-change="sizeChange"
                @refresh-change="refreshChange"
                @on-load="onLoad">
+    <template slot="description" slot-scope="scope">
+      <avue-text-ellipsis :text="scope.row.description" :height="50">
+        <small slot="more">...</small>
+      </avue-text-ellipsis>
+    </template>
     </avue-crud>
   </basic-container>
 </template>
@@ -89,7 +94,10 @@
             {
               label: "鎻忚堪",
               prop: "description",
-              width:'300'
+              span: 24,
+              minRows: 20,
+              type: "textarea",
+              slot: true,
             },
           ]
         },
@@ -130,14 +138,6 @@
       },
       underscoreName(key) {
         return key.replace(/([A-Z])/g, "_$1").toLowerCase();
-      },
-      beforeOpen(done, type) {
-        if (["edit", "view"].includes(type)) {
-          getUsualLogs(this.form.id).then(res => {
-            this.form = res.data.data;
-          });
-        }
-        done();
       },
       currentChange(currentPage){
         this.page.currentPage = currentPage;
diff --git a/Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue b/Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue
new file mode 100644
index 0000000..867a34d
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue
@@ -0,0 +1,13 @@
+<template>
+
+</template>
+
+<script>
+export default {
+  name: "delimiterConfig"
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue b/Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue
new file mode 100644
index 0000000..9de161e
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue
@@ -0,0 +1,13 @@
+<template>
+
+</template>
+
+<script>
+export default {
+  name: "paddingCharacter"
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue b/Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue
new file mode 100644
index 0000000..f983576
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue
@@ -0,0 +1,13 @@
+<template>
+
+</template>
+
+<script>
+export default {
+name: "usableCharacter"
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/Source/UBCS-WEB/src/views/system/user.vue b/Source/UBCS-WEB/src/views/system/user.vue
index 8503d84..838ec38 100644
--- a/Source/UBCS-WEB/src/views/system/user.vue
+++ b/Source/UBCS-WEB/src/views/system/user.vue
@@ -186,7 +186,7 @@
 import {exportBlob} from "@/api/common";
 import {getDeptTree, getDeptLazyTree} from "@/api/system/dept";
 import {getRoleTree} from "@/api/system/role";
-import {getPostList} from "@/api/system/post";
+//import {getPostList} from "@/api/system/post";
 import {mapGetters} from "vuex";
 import website from '@/config/website';
 import {getToken} from '@/util/auth';
@@ -894,10 +894,10 @@
         const column = this.findObject(this.option.group, "deptId");
         column.dicData = res.data.data;
       });
-      getPostList(tenantId).then(res => {
-        const column = this.findObject(this.option.group, "postId");
-        column.dicData = res.data.data;
-      });
+      // getPostList(tenantId).then(res => {
+      //   const column = this.findObject(this.option.group, "postId");
+      //   column.dicData = res.data.data;
+      // });
     },
     submitRole() {
       const roleList = this.$refs.treeRole.getCheckedKeys().join(",");
diff --git a/Source/UBCS-WEB/vue.config.js b/Source/UBCS-WEB/vue.config.js
index 264ceae..80aaff2 100644
--- a/Source/UBCS-WEB/vue.config.js
+++ b/Source/UBCS-WEB/vue.config.js
@@ -26,11 +26,11 @@
     proxy: {
       '/api': {
         //鏈湴鏈嶅姟鎺ュ彛鍦板潃
-        target: 'http://127.0.0.1:37000',
+        // target: 'http://127.0.0.1:37000',
         // target: 'http://192.168.1.51:37000',
-        // target: 'http://dev.vci-tech.com:37000',
+        target: 'http://dev.vci-tech.com:37000',
         //yxc
-        // target: 'http:// 192.168.0.104:37000',
+        // target: 'http:// 192.168.0.100:37000',
         // target: 'http://192.168.0.105:37000',
         // target: 'http://192.168.0.103:37000',
         // target: 'http://192.168.1.63:37000',
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeOrderDTO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeOrderDTO.java
index 887df95..50f1e7e 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeOrderDTO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeOrderDTO.java
@@ -25,6 +25,7 @@
      * 妯℃澘鐨勪富閿�
      */
     private String templateOid;
+
     /**
      * 缂栫爜瑙勫垯鐨勪富閿�
      */
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRuleCharacter.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRuleCharacter.java
new file mode 100644
index 0000000..a161963
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRuleCharacter.java
@@ -0,0 +1,53 @@
+package com.vci.ubcs.code.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.vci.ubcs.starter.constant.CodeTableNameConstant;
+import com.vci.ubcs.starter.revision.model.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 鐩镐技鏌ヨ瑙勫垯鏄剧ず瀵硅薄
+ *
+ * @author xj
+ * @date 2023-11-30
+ */
+@TableName(CodeTableNameConstant.PL_CODE_RULE_CHARACTER)
+@ApiModel(value = "CodeRuleCharacter瀵硅薄", description = "缂栫爜瑙勫垯瀛楃闆�")
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class CodeRuleCharacter extends BaseModel{
+	/**
+	 * 绂佹淇敼杩欎釜鍊�
+	 */
+	private static final long serialVersionUID = 4615707119066298941L;
+	/***
+	 * 鍙樿鍒檕id
+	 */
+	@NotBlank(message = "瑙勫垯鐨勪富閿笉鑳戒负绌�")
+	@ApiModelProperty(value = "瑙勫垯鐨勪富閿笉鑳戒负绌�")
+	private String codeRuleId;
+	/**
+	 * 瀛楃闆�
+	 */
+	@ApiModelProperty(value = "瀛楃闆�")
+	private String chartValue;
+	/***
+	 * 瀛楃绫诲瀷
+	 */
+	@ApiModelProperty(value = "瀛楃绫诲瀷")
+	@NotBlank(message = "瀛楃绫诲瀷涓嶈兘涓虹┖")
+	private String chartType;
+
+	/***
+	 * 瀛楃绫诲瀷鏄剧ず鍊�
+	 */
+	@ApiModelProperty(value = "瀛楃绫诲瀷鏄剧ず鍊�")
+	@TableField(exist = false)
+	private String chartTypeText;
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleCharacterVO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleCharacterVO.java
new file mode 100644
index 0000000..74ce347
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleCharacterVO.java
@@ -0,0 +1,35 @@
+package com.vci.ubcs.code.vo.pagemodel;
+
+import com.vci.ubcs.starter.revision.model.BaseModel;
+import lombok.Data;
+
+/**
+ * 鐩镐技鏌ヨ瑙勫垯鏄剧ず瀵硅薄
+ *
+ * @author xj
+ * @date 2023-11-30
+ */
+@Data
+public class CodeRuleCharacterVO extends BaseModel {
+	/**
+	 * 绂佹淇敼杩欎釜鍊�
+	 */
+	private static final long serialVersionUID = 4615707119066298949L;
+	/***
+	 * 瑙勫垯oid
+	 */
+	private String codeRuleId;
+	/**
+	 * 瀛楃闆�
+	 */
+	private String chartValue;
+	/***
+	 * 瀛楃绫诲瀷
+	 */
+	private String chartType;
+	/***
+	 * 瀛楃绫诲瀷鏄剧ず鍊�
+	 */
+	private String chartTypeText;
+
+}
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\345\255\227\347\254\246\351\233\206.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\345\255\227\347\254\246\351\233\206.json"
new file mode 100644
index 0000000..2f0428d
--- /dev/null
+++ "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\345\255\227\347\254\246\351\233\206.json"
@@ -0,0 +1,5 @@
+{
+  "codeRuleId": "1729702446013485056",
+  "chartValue": "abckzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
+  "chartType": "charset"
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java b/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java
index c6600ee..4dc9ca2 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java
@@ -133,4 +133,21 @@
 		this.userStatus = userStatus;
 	}
 
+	@Override
+	public String toString() {
+		return "鍩烘湰淇℃伅:{" +
+			"鐢ㄦ埛缂栧彿='" + code + '\'' +
+			", 鐢ㄦ埛骞冲彴=" + userType +
+			", 璐﹀彿='" + account + '\'' +
+			", 鏄电О='" + name + '\'' +
+			", 鐪熷悕='" + realName + '\'' +
+			", 閭='" + email + '\'' +
+			", 鐢佃瘽='" + phone + '\'' +
+			", 鐢熸棩=" + birthday +
+			", 鎬у埆=" + sex +
+			", 瀵嗙骇='" + secretGrade + '\'' +
+			", 鐢ㄦ埛鐘舵��=" + userStatus +
+			'}';
+	}
+
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/vo/UserVO.java b/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/vo/UserVO.java
index 5e2b2b1..7f3913b 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/vo/UserVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/vo/UserVO.java
@@ -23,13 +23,16 @@
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
 
 /**
  * 瑙嗗浘瀹炰綋绫�
  *
  * @author Chill
  */
-@Data
+@Getter
+@Setter
 @EqualsAndHashCode(callSuper = true)
 @ApiModel(value = "UserVO瀵硅薄", description = "UserVO瀵硅薄")
 public class UserVO extends User {
@@ -96,4 +99,19 @@
 	 * 璐﹀彿鏄惁鍋滅敤 0涓哄惎鐢紝1涓哄惎鐢�
 	 */
 	private String userStatusText;
+
+	@Override
+	public String toString() {
+		return "鐢ㄦ埛淇℃伅{[" +
+			super.toString()+ "]" +
+			", roleName='" + roleName + '\'' +
+			", tenantName='" + tenantName + '\'' +
+			", userTypeName='" + userTypeName + '\'' +
+			", deptName='" + deptName + '\'' +
+			", postName='" + postName + '\'' +
+			", sexName='" + sexName + '\'' +
+			", userStatusText='" + userStatusText + '\'' +
+			'}';
+	}
+
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java
index b227b64..74a8a3f 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java
@@ -78,6 +78,11 @@
 	public static final String PL_CODE_RULE = "PL_CODE_RULE";
 
 	/**
+	 * 缂栫爜瑙勫垯瀛楃闆�
+	 */
+	public static final String PL_CODE_RULE_CHARACTER = "PL_CODE_RULE_CHARACTER";
+
+	/**
 	 * 缂栫爜瑙勫垯鐨勬祦姘村��
 	 */
 	public static final String PL_CODE_SERIALVALUE = "PL_CODE_SERIALVALUE";
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SaveLogUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SaveLogUtil.java
new file mode 100644
index 0000000..1f3877d
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SaveLogUtil.java
@@ -0,0 +1,24 @@
+package com.vci.ubcs.starter.util;
+
+import org.springblade.core.log.annotation.GrantLog;
+import org.springblade.core.log.annotation.OperateLog;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author ludc
+ * @date 2023/11/29 12:39
+ */
+@Configuration
+public class SaveLogUtil {
+
+	/**
+	 * 鎿嶄綔鏃ュ織鎻掑叆鎿嶄綔
+	 * @param res
+	 */
+	@OperateLog
+	public boolean operateLog(String type,boolean isException/*鏄惁瑙﹀彂浜嗗紓甯�*/,String res){
+		return true;
+	}
+
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/MdmEnumIdConstant.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/MdmEnumIdConstant.java
index b6b2664..cb5d649 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/MdmEnumIdConstant.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/MdmEnumIdConstant.java
@@ -80,4 +80,9 @@
 	 * 绯荤粺鎺ュ彛绫诲瀷
 	 */
 	public static  final  String SYS_INTEGRATION_LOG_TYPE="sysIntegrationLogType";
+
+	/***
+	 * 绯荤粺鎺ュ彛绫诲瀷
+	 */
+	public static  final  String CODE_RULE_CHARACTER_TYPE="code_rule_character_type";
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java
deleted file mode 100644
index 8322537..0000000
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.vci.ubcs.code.algorithm;
-
-import java.util.Arrays;
-import java.util.List;
-
-public class Test {
-
-	public static void main(String[] args) {
-		String []res={"5","6","7","8","3"};
-		List<String> newList=Arrays.asList(res);
-		System.out.println(res);
-	}
-}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleCharacterController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleCharacterController.java
new file mode 100644
index 0000000..a7f08a7
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleCharacterController.java
@@ -0,0 +1,59 @@
+package com.vci.ubcs.code.controller;
+
+import com.vci.ubcs.code.service.ICodeRuleCharacterService;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/***
+ * 瑙勫垯瀛楃闆嗛厤缃�
+ * @author xj
+ * @date 2023-11-30
+ */
+@RestController
+@RequestMapping("/codeRuleCharacterController")
+public class CodeRuleCharacterController {
+	@Resource
+	 private ICodeRuleCharacterService iCodeRuleCharacterService;
+	/**
+	 * 浣跨敤缂栫爜瑙勫垯oid鑾峰彇鏁版嵁
+	 * @param codeRuleId 瑙勫垯oid
+	 * @return 鏁版嵁鍐呭
+	 */
+	@GetMapping("/list")
+	public R<List<Map<String,String>>> getDataByOid(@RequestParam("codeRuleId")String codeRuleId,@RequestParam("chartType")String chartType){
+		return R.data(iCodeRuleCharacterService.getDataByRuleId(codeRuleId,chartType));
+	}
+	/**
+	 * 淇濆瓨瑙勫垯瀵硅薄
+	 * @param codeRuleCharacterVO 瑙勫垯瀛楃瀵硅薄
+	 * @return 鏁版嵁鍐呭
+	 */
+	@PostMapping("/addSave")
+	public R addSave(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
+		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
+	}
+	/**
+	 * 淇敼瑙勫垯瀵硅薄
+	 * @param codeRuleCharacterVO 瑙勫垯瀛楃瀵硅薄
+	 * @return 鏁版嵁鍐呭
+	 */
+	@PostMapping("/editSave")
+	public R editSave(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
+		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
+	}
+
+	/**
+	 * 淇敼瑙勫垯瀵硅薄
+	 * @param codeRuleCharacterVO 瑙勫垯瀛楃瀵硅薄
+	 * @return 鏁版嵁鍐呭
+	 */
+	@PostMapping("/delete")
+	public R delete(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
+		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
+	}
+}
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
index 97cb6df..dd8b910 100644
--- 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
@@ -16,6 +16,7 @@
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import com.vci.ubcs.starter.revision.model.TreeQueryObject;
 import com.vci.ubcs.starter.util.LocalFileUtil;
+import com.vci.ubcs.starter.util.SaveLogUtil;
 import com.vci.ubcs.starter.web.pagemodel.*;
 import com.vci.ubcs.starter.web.util.ControllerUtil;
 import com.vci.ubcs.starter.web.util.LangBaseUtil;
@@ -55,7 +56,11 @@
 	 */
 	@Autowired
 	private MdmIOService mdmIOService;
-
+	/**
+	 * 鏃ュ織淇濆瓨宸ュ叿绫�
+	 */
+	@Autowired
+	private SaveLogUtil saveLogUtil;
 
 	/**
 	 * 涓嬭浇鎵归噺鐢宠鐨勫鍏ユā鏉�
@@ -144,7 +149,7 @@
 	}
 
 	/**
-	 * 鎵归噺鐢宠缂栫爜鐨勪俊鎭�
+	 * 鎵归噺鐢宠缂栫爜鐨勪俊鎭紙褰撳墠鍒嗙被涓婃壒閲忕敵璇凤級
 	 * @param secDTOList 鐢宠缂栫爜鐨勪俊鎭紝蹇呴』鍖呭惈鐮佹鍜屽垎绫讳富閿殑淇℃伅
 	 * @param file 鏂囦欢鐨勫唴瀹�
 	 */
@@ -237,7 +242,7 @@
 	}
 
 	/**
-	 * 瀵煎叆鍘嗗彶鏁版嵁
+	 * 瀵煎叆鍘嗗彶鏁版嵁(浠庨《灞傚垎绫诲鐨�)
 	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
 	 * @param classifyAttr 鍒嗙被璺緞浣跨敤鐨勫睘鎬�
 	 * @param file 鏂囦欢鐨勫唴瀹�
@@ -302,7 +307,15 @@
 	@PostMapping("/addSaveCode")
 	@VciBusinessLog(operateName = "鐢宠鍗曚釜缂栫爜")
 	public R addSaveCode(@RequestBody CodeOrderDTO orderDTO) throws Exception {
-		return R.success(engineService.addSaveCode(orderDTO));
+		String s = null;
+		try {
+			s = engineService.addSaveCode(orderDTO);
+			saveLogUtil.operateLog("缂栫爜鐢宠",false,orderDTO.toString());
+		}catch (Exception e){
+			saveLogUtil.operateLog("缂栫爜鐢宠",true,e.getMessage());
+			throw e;
+		}
+		return R.success(s);
 	}
 
 	/**
@@ -429,6 +442,7 @@
 	public DataGrid<Map<String,String>> gridResemble(String codeClassifyOid,String redisOid){
 		return mdmIOService.gridDatas(codeClassifyOid,redisOid);
 	}
+
 	/***
 	 * 瀵煎叆鏁版嵁
 	 * @param codeImprotSaveDatVO//鏁版嵁瀵硅薄
@@ -436,11 +450,11 @@
 	 */
 	@PostMapping("/batchImportData")
 	public R batchImportData(@RequestBody CodeImprotParmaDatVO codeImprotSaveDatVO){
-		return  mdmIOService.batchImportData(codeImprotSaveDatVO.getCodeImprotSaveDatVOList(),codeImprotSaveDatVO.getClassifyAttr(),codeImprotSaveDatVO.getImprot());
+		return mdmIOService.batchImportData(codeImprotSaveDatVO.getCodeImprotSaveDatVOList(),codeImprotSaveDatVO.getClassifyAttr(),codeImprotSaveDatVO.getImprot());
 	}
 
 	/***
-	 *鏍规嵁鏁版嵁oid浠庣紦瀛樹腑绉婚櫎鏁版嵁
+	 * 鏍规嵁鏁版嵁oid浠庣紦瀛樹腑绉婚櫎鏁版嵁
 	 * @param redisOid redisid
 	 * @param codeClassifyOid 瀛樺偍瑙勫垯鐨刼id
 	 * @param dataOids  鎵�闇�鍒犻櫎鐨勬暟鎹�
@@ -450,6 +464,7 @@
 	public  R deleteDatas(String redisOid,String codeClassifyOid,String dataOids){
 		return mdmIOService.deleteDatas(redisOid,codeClassifyOid,dataOids);
 	}
+
 	/**
 	 * 鎵归噺淇濆瓨娴佺▼鎵ц椤甸潰淇敼鐨勫唴瀹�
 	 * @param orderDTOList 缂栫爜鐩稿叧鐨勪俊鎭紝涓嶉渶瑕佺爜娈电殑淇℃伅
@@ -514,7 +529,7 @@
 	@PostMapping("/upSaveCode")
 	public R upSaveCode(@RequestBody CodeOrderDTO orderDTO){
 		engineService.upSaveCode(orderDTO);
-		return  R.success("鎿嶄綔鎴愬姛锛�");
+		return R.success("鎿嶄綔鎴愬姛锛�");
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeRuleCharacterEnum.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeRuleCharacterEnum.java
new file mode 100644
index 0000000..e48ba2b
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeRuleCharacterEnum.java
@@ -0,0 +1,135 @@
+package com.vci.ubcs.code.enumpack;
+
+import com.vci.ubcs.starter.annotation.VciEnum;
+import com.vci.ubcs.starter.web.constant.MdmEnumIdConstant;
+import com.vci.ubcs.starter.web.enumpck.BaseEnum;
+
+/**
+ * 缂栫爜瑙勫垯鐮佹瀛楃鎺у埗绫诲瀷
+ * @author weidy
+ * @date 2022-1-17
+ */
+@VciEnum(name = MdmEnumIdConstant.CODE_RULE_CHARACTER_TYPE,text = "缂栫爜瑙勫垯鐮佹瀛楃鎺у埗绫诲瀷",description = "")
+public enum CodeRuleCharacterEnum implements BaseEnum {
+	/**
+	 * 鍙敤瀛楃闆�
+	 */
+	CODE_RULE_CHARACTER_CHARSET("charset","鍙敤瀛楃闆�"),
+
+	/**
+	 * 鍙敤瀛楃闆�
+	 */
+	CODE_RULE_CHARACTER_FILLERCHAR("fillerChar","鍙敤瀛楃闆�"),
+
+	/**
+	 * 琛ヤ綅瀛楃
+	 */
+	CODE_RULE_CHARACTER_SEPARATOR("separator","琛ヤ綅瀛楃"),
+	/**
+	 *鍓嶅悗缂�瀛楃
+	 */
+	CODE_RULE_CHARACTER_PREFIX("prefix","鍓嶅悗缂�瀛楃");
+	/**
+	 * 鏋氫妇鐨勫��
+	 */
+	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 CodeRuleCharacterEnum(String value, String text) {
+		this.value = value;
+		this.text = text;
+	}
+
+	/**
+	 * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+	 *
+	 * @param text 鍚嶇О
+	 * @return 鏋氫妇鍊�
+	 */
+	public static String getValueByText(String text) {
+		for (CodeRuleCharacterEnum wenum : CodeRuleCharacterEnum.values()) {
+			if (wenum.getText().equalsIgnoreCase(text)) {
+				return wenum.getValue();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 * @return 鍚嶇О
+	 */
+	public static String getTextByValue(String value) {
+		for (CodeRuleCharacterEnum wenum : CodeRuleCharacterEnum.values()) {
+			if (wenum.getValue().equalsIgnoreCase(value)) {
+				return wenum.getText();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+	 */
+	public static CodeRuleCharacterEnum forValue(String value) {
+		for (CodeRuleCharacterEnum wenum : CodeRuleCharacterEnum.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/mapper/CodeRuleCharacterMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeRuleCharacterMapper.java
new file mode 100644
index 0000000..164f486
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeRuleCharacterMapper.java
@@ -0,0 +1,7 @@
+package com.vci.ubcs.code.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.vci.ubcs.code.entity.CodeRuleCharacter;
+
+public interface CodeRuleCharacterMapper extends BaseMapper<CodeRuleCharacter>{
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleCharacterService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleCharacterService.java
new file mode 100644
index 0000000..f96aada
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleCharacterService.java
@@ -0,0 +1,39 @@
+package com.vci.ubcs.code.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.vci.ubcs.code.entity.CodeAllCode;
+import com.vci.ubcs.code.entity.CodeClassify;
+import com.vci.ubcs.code.entity.CodeResembleRule;
+import com.vci.ubcs.code.entity.CodeRuleCharacter;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import org.springblade.core.tool.api.R;
+
+import java.util.List;
+import java.util.Map;
+
+/***
+ * 瑙勫垯瀛楃闆嗛厤缃�
+ * @author xj
+ * @date 2023-11-30
+ */
+public interface ICodeRuleCharacterService  extends IService<CodeRuleCharacter> {
+
+	/**
+	 * 浣跨敤缂栫爜瑙勫垯oid鑾峰彇鏁版嵁
+	 * @param codeRuleId
+	 * @param chartType
+	 * @return
+	 * @throws VciBaseException
+	 */
+	List<Map<String,String>> getDataByRuleId(String codeRuleId,String chartType)throws VciBaseException;
+
+	/***
+	 * 淇濆瓨缂栫爜瑙勫垯瀛楃闆�
+	 * @param codeRuleCharacterVO
+	 * @return
+	 */
+	R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO)throws VciBaseException;
+
+}
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
index e1332d8..d063ec2 100644
--- 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
@@ -40,7 +40,7 @@
 	 * @param file excel鏂囦欢鐨勪俊鎭�
 	 * @return 鏈夐敊璇俊鎭殑excel
 	 */
-	CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file);
+	CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) throws Exception;
 
 	/***
 	 *鎵归噺鐢宠缂栫爜鏁版嵁
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 ae01ddd..7e1a226 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
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -207,12 +208,16 @@
 		// 涓嶄负绌哄氨闇�瑕佽褰撳墠鍒嗙被涓嬫墍鏈夊瓙鍒嗙被鐨刬sParticipateCheck
 		if(!codeClassifies.isEmpty()){
 			List<String> oids = codeClassifies.stream().map(CodeClassify::getOid).collect(Collectors.toList());
-			updateAttr = codeClassifyMapper.update(
-				null,
-				Wrappers.<CodeClassify>update()
-					.lambda().in(CodeClassify::getOid, oids)
-					.set(CodeClassify::getIsParticipateCheck, codeClassifyEntity.getIsParticipateCheck())
-			);
+			LambdaUpdateWrapper<CodeClassify> updateWrapper = Wrappers.<CodeClassify>update()
+				.lambda().in(CodeClassify::getOid, oids)
+				.set(CodeClassify::getIsParticipateCheck, codeClassifyEntity.getIsParticipateCheck());
+			// 鐖跺垎绫荤殑涓氬姟绫诲瀷鍋氫簡鏇存敼锛屾墍鏈夊瓙鍒嗙被鐨勯兘寰楄繘琛屾洿鏀�
+			if(!codeClassifyEntity.getBtmTypeId().equals(detail.getBtmTypeId())){
+				updateWrapper.set(CodeClassify::getBtmTypeId,codeClassifyEntity.getBtmTypeId())
+					.set(CodeClassify::getBtmTypeName,codeClassifyEntity.getBtmTypeName());
+			}
+			updateAttr = codeClassifyMapper.update(null,updateWrapper);
+
 		}
 
 //         //澶勭悊鏁版嵁闆嗘垚閫昏緫,鎴愬姛鍚庢墽琛岄泦鎴愮涓�姝�,鍒嗙被鏁版嵁鐗规畩澶勭悊銆傚彧鏈夊惎鐢ㄧ姸鎬佺殑鍒嗙被鎵嶆帹閫�
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleCharacterServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleCharacterServiceImpl.java
new file mode 100644
index 0000000..aaabd6f
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleCharacterServiceImpl.java
@@ -0,0 +1,113 @@
+package com.vci.ubcs.code.service.impl;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.base.Joiner;
+import com.vci.ubcs.code.entity.CodeRuleCharacter;
+import com.vci.ubcs.code.mapper.CodeRuleCharacterMapper;
+import com.vci.ubcs.code.service.ICodeRuleCharacterService;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/***
+ * 缂栫爜瑙勫垯瀛楃闆嗘湇鍔�
+ * @author xj
+ * @date 2023-11-30
+ */
+@Service
+public class CodeRuleCharacterServiceImpl extends ServiceImpl<CodeRuleCharacterMapper, CodeRuleCharacter> implements ICodeRuleCharacterService {
+
+	@Autowired
+	private CodeRuleCharacterMapper codeRuleCharacterMapper;
+	/***
+	 * 浣跨敤缂栫爜瑙勫垯oid鑾峰彇鏁版嵁
+	 * @param codeRuleId
+	 * @param chartType
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<Map<String, String>> getDataByRuleId(String codeRuleId,String chartType) throws VciBaseException {
+		List<Map<String,String>> charValueList=new ArrayList<>();
+		CodeRuleCharacter codeRuleCharacter=codeRuleCharacterMapper.selectOne(Wrappers.<CodeRuleCharacter>query().lambda().eq(CodeRuleCharacter::getCodeRuleId,codeRuleId).eq(CodeRuleCharacter::getChartType,chartType));
+		List<Character> characterList=codeRuleCharacter.getChartValue().chars().mapToObj(c -> (char) c).collect(Collectors.toList());
+		for (int i = 0; i < characterList.size(); i += 15) {
+			final int startIndex = i;
+			final int endIndex = Math.min(i + 15, characterList.size());
+			List<Character> subList = characterList.subList(startIndex, endIndex);
+			Map<String, String> chartMap=new HashMap<>();
+			// 璋冪敤鎻掑叆鏁版嵁搴撶殑鏂规硶
+			for (int j=1;j<subList.size()+1;j++){
+				String characterValue=subList.get(j-1)==null?"":subList.get(j-1).toString();
+				chartMap.put(String.valueOf(j),String.valueOf(characterValue));
+			}
+			charValueList.add(chartMap);
+		}
+		return charValueList;
+	}
+	/***
+	 * 瀛楃闆嗘暟鎹繚瀛�
+	 * @param codeRuleCharacterVO
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO) throws VciBaseException {
+		VciBaseUtil.alertNotNull(codeRuleCharacterVO.getCodeRuleId(),"缂栫爜瑙勫垯id",codeRuleCharacterVO.getChartType(),"瀛楃闆嗙被鍨�");
+		CodeRuleCharacter codeRuleCharacter=codeRuleCharacterMapper.selectOne(Wrappers.<CodeRuleCharacter>query().lambda().eq(CodeRuleCharacter::getCodeRuleId,codeRuleCharacterVO.getCodeRuleId()).eq(CodeRuleCharacter::getChartType,codeRuleCharacterVO.getChartType()));
+		if(codeRuleCharacter!=null&& StringUtils.isNotBlank(codeRuleCharacter.getOid())) {
+			List<Character> oldCharacterList =  StringUtils.isBlank(codeRuleCharacter.getChartValue())?new ArrayList<>():codeRuleCharacter.getChartValue().chars().mapToObj(c -> (char) c).collect(Collectors.toList());
+			List<Character> newCharacterList = StringUtils.isBlank(codeRuleCharacterVO.getChartValue())?new ArrayList<>():codeRuleCharacterVO.getChartValue().chars().mapToObj(c -> (char) c).collect(Collectors.toList());
+			List<Character> intersectList = intersect(oldCharacterList, newCharacterList);
+			if (intersectList.size() > 0) {
+				String ss = Joiner.on(",").join(intersectList);
+				throw new VciBaseException("绯荤粺涓瓨鍦ㄧ浉搴旂殑瀛楃:銆�" + ss + "銆�");
+			}
+			List<Character> allCharacterList = union(oldCharacterList, newCharacterList);
+			String str = allCharacterList.stream().map(integer -> Func.isNotEmpty(integer)?integer.toString():"").collect(Collectors.joining());
+			codeRuleCharacter.setChartValue(str);
+			codeRuleCharacterMapper.updateById(codeRuleCharacter);
+		}else{
+			codeRuleCharacter=new CodeRuleCharacter();
+			DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeRuleCharacter,"character");
+			codeRuleCharacter.setCodeRuleId(codeRuleCharacterVO.getCodeRuleId());
+			codeRuleCharacter.setChartType(codeRuleCharacterVO.getChartType());
+			codeRuleCharacter.setChartValue(codeRuleCharacterVO.getChartValue());
+			codeRuleCharacterMapper.insert(codeRuleCharacter);
+		}
+		return R.status(true);
+	}
+	/**
+	 * 浜ら泦
+	 * @param list1
+	 * @param list2
+	 * @return
+	 */
+	private static List<Character> intersect(List<Character> list1, List<Character> list2) {
+		List<Character> intersect = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
+		return intersect;
+	}
+
+	/**
+	 * 骞堕泦锛堝幓閲嶏級
+	 * @param list1
+	 * @param list2
+	 * @return
+	 */
+	private static List<Character> union(List<Character> list1, List<Character> list2) {
+		list1.addAll(list2);
+		return list1.stream().distinct().collect(Collectors.toList());
+	}
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
index 749bcb2..2dd56b5 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1,5 +1,6 @@
 package com.vci.ubcs.code.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -42,6 +43,7 @@
 import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
 import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
 import com.vci.ubcs.starter.util.MdmBtmTypeConstant;
+import com.vci.ubcs.starter.util.SaveLogUtil;
 import com.vci.ubcs.starter.util.UBCSSqlKeyword;
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.constant.RegExpConstant;
@@ -62,12 +64,14 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.log.annotation.OperateLog;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cache.Cache;
@@ -346,8 +350,15 @@
 	 */
 	@Autowired
 	private IMDMIFlowAttrClient imdmiFlowAttrClient;
-//	@Autowired
-//	private CodeOsbtmtypeMapper codeOsbtmtypeMapper;----
+
+	//	@Autowired
+	//	private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
+
+	/**
+	 * 鏃ュ織淇濆瓨宸ュ叿绫�
+	 */
+	@Autowired
+	private SaveLogUtil saveLogUtil;
 
 
     /**
@@ -410,39 +421,52 @@
     @Transactional
     @Override
     public void changeStatus(BaseModelDTO baseModelDTO) {
-        VciBaseUtil.alertNotNull(baseModelDTO, "鏁版嵁淇℃伅", baseModelDTO.getOid(), "涓婚敭", baseModelDTO.getBtmname(), "涓氬姟绫诲瀷", baseModelDTO.getLcStatus(), "鐩爣鐘舵��");
-        List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
-        List<BaseModel> baseModels = new ArrayList<>();
-        baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
-        if (baseModels.size() == 0) {
-            throw new VciBaseException("鏈煡璇㈠埌鐩稿叧鏁版嵁銆�");
-        }
-        //杩橀渶瑕佷慨鏀筧llCode鐨勭敓鍛藉懆鏈�
-        QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
-        allCodeWrapper.eq("createcodebtm", baseModelDTO.getBtmname());
-        allCodeWrapper.in("createcodeoid", oids);
-        List<CodeAllCode> codeCbos = codeAllCodeService.selectByWrapper(allCodeWrapper);// 鍥炴敹闇�瑕佷笟鍔℃暟鎹垹闄�
-        if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
-            R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
-            if (!listR.isSuccess() || listR.getData().size() == 0) {
-                throw new VciBaseException("浼犲叆涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿簲琛ㄥ崟锛岃妫�鏌ワ紒");
-            }
-			// 鐩存帴鍒犻櫎锛屼笉缁欑姸鎬�
-			commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()));
-			// commonsMapper.updateByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()),CodeDefaultLC.TASK_BACK.getValue());
-        } else {
-            for (BaseModel baseModel : baseModels) {
-                baseModel.setLcStatus(baseModelDTO.getLcStatus());
-            }
-			R r = updateBatchByBaseModel(baseModelDTO.getBtmname(), baseModels);
-			if(!r.isSuccess()){
-				throw new VciBaseException("鏇存柊鏁版嵁鍑洪敊锛岄噸璇曪紒"+r.getMsg());
+		try {
+			VciBaseUtil.alertNotNull(baseModelDTO, "鏁版嵁淇℃伅", baseModelDTO.getOid(), "涓婚敭", baseModelDTO.getBtmname(), "涓氬姟绫诲瀷", baseModelDTO.getLcStatus(), "鐩爣鐘舵��");
+			List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
+			List<BaseModel> baseModels = new ArrayList<>();
+			baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
+			if (baseModels.size() == 0) {
+				throw new VciBaseException("鏈煡璇㈠埌鐩稿叧鏁版嵁銆�");
 			}
+			//杩橀渶瑕佷慨鏀筧llCode鐨勭敓鍛藉懆鏈�
+			QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
+			allCodeWrapper.eq("createcodebtm", baseModelDTO.getBtmname());
+			allCodeWrapper.in("createcodeoid", oids);
+			List<CodeAllCode> codeCbos = codeAllCodeService.selectByWrapper(allCodeWrapper);// 鍥炴敹闇�瑕佷笟鍔℃暟鎹垹闄�
+			if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
+				R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
+				if (!listR.isSuccess() || listR.getData().size() == 0) {
+					throw new VciBaseException("浼犲叆涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿簲琛ㄥ崟锛岃妫�鏌ワ紒");
+				}
+				// 鐩存帴鍒犻櫎锛屼笉缁欑姸鎬�
+				commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()));
+				// commonsMapper.updateByTaleAndOid(listR.getData().get(0).getTableName(), VciBaseUtil.toInSql(baseModelDTO.getOid()),CodeDefaultLC.TASK_BACK.getValue());
+			} else {
+				for (BaseModel baseModel : baseModels) {
+					baseModel.setLcStatus(baseModelDTO.getLcStatus());
+				}
+				R r = updateBatchByBaseModel(baseModelDTO.getBtmname(), baseModels);
+				if(!r.isSuccess()){
+					throw new VciBaseException("鏇存柊鏁版嵁鍑洪敊锛岄噸璇曪紒"+r.getMsg());
+				}
+			}
+			for (CodeAllCode codeCbo : codeCbos) {
+				codeCbo.setLcStatus(baseModelDTO.getLcStatus());
+			}
+			codeAllCodeService.updateBatchById(codeCbos);
+
+			//璁板綍鏃ュ織淇℃伅
+			saveLogUtil.operateLog(
+				CodeDefaultLC.getTextByValue(baseModelDTO.getLcStatus()),
+				false,
+				JSON.toJSONString(baseModels)
+			);
+		}catch (Exception e){
+			// 鎻掑叆鏇存敼鏃ュ織璁板綍
+			saveLogUtil.operateLog(CodeDefaultLC.getTextByValue(baseModelDTO.getLcStatus()),true,e.getMessage());
+			throw e;
 		}
-        for (CodeAllCode codeCbo : codeCbos) {
-            codeCbo.setLcStatus(baseModelDTO.getLcStatus());
-        }
-        codeAllCodeService.updateBatchById(codeCbos);
     }
 
 	/**
@@ -2705,6 +2729,7 @@
         cbo.setLastModifyTime(new Date());
         cbo.setLastModifier(String.valueOf(AuthUtil.getUser().getAccount()));
 		R r = updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), Collections.singletonList(cbo));
+
 		if(!r.isSuccess()){
 			throw new ServiceException(r.getMsg());
 		}
@@ -3079,11 +3104,18 @@
 		oldCbo.setLastModifier(String.valueOf(AuthUtil.getUser().getAccount()));
 		oldCbo.setLastModifyTime(new Date());
         try {
+			// 淇敼鐗堟鍙�
 			updateBatchByBaseModel(oldCbo.getBtmname(), Collections.singletonList(oldCbo));
+			// 鎻掑叆鏂扮殑鏁版嵁
             insertBatchByType(cbo.getBtmname(), Collections.singletonList(cbo));
-        } catch (Exception vciError) {
-            throw new VciBaseException("鏁版嵁鏇存敼淇濆瓨鍑洪敊浜�", new String[0], vciError);
-        }
+			// 璁板綍鏁版嵁鏇存敼鏃ュ織
+			saveLogUtil.operateLog("鏁版嵁鏇存敼",false, StringUtil.format("{}\n淇敼涓�:\n{}",JSON.toJSONString(Collections.singletonList(oldCbo)),JSON.toJSONString(Collections.singletonList(cbo))));
+		} catch (Exception vciError) {
+			// 璁板綍鏁版嵁鏇存敼鎶ラ敊鏃剁殑鏃ュ織
+			saveLogUtil.operateLog("鏁版嵁鏇存敼",true,vciError.getMessage());
+			throw new VciBaseException("鏁版嵁鏇存敼淇濆瓨鍑洪敊浜�", new String[0], vciError);
+		}
+
         batchSaveSelectChar(templateVO, Collections.singletonList(cbo));
     }
 
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
index 87cfaee..371139a 100644
--- 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
@@ -1,5 +1,6 @@
 package com.vci.ubcs.code.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -37,6 +38,7 @@
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
 import com.vci.ubcs.starter.util.LocalFileUtil;
+import com.vci.ubcs.starter.util.SaveLogUtil;
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
 import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
@@ -56,6 +58,7 @@
 import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -72,6 +75,7 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
@@ -175,6 +179,11 @@
 	 */
 	@Resource
 	private IWebSecretClient secretService;
+	/**
+	 * 鏃ュ織淇濆瓨宸ュ叿绫�
+	 */
+	@Autowired
+	private SaveLogUtil saveLogUtil;
 
 	/**
 	 * 瀵煎嚭鐨勫崄涓囨潯
@@ -538,7 +547,7 @@
 	 * @return  鏈夐敊璇俊鎭殑excel鐨勬枃浠�
 	 */
 	@Override
-	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
+	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) throws Exception {
 		VciBaseUtil.alertNotNull(orderDTO,"缂栫爜鐢宠鐩稿叧鐨勬暟鎹�",orderDTO.getCodeClassifyOid(),"涓婚搴撳垎绫讳富閿�");
 		ReadExcelOption reo = new ReadExcelOption();
 		reo.setReadAllSheet(true);
@@ -810,322 +819,331 @@
 	 */
 	@Override
 	public CodeImProtRusultVO batchImportHistoryData(String codeClassifyOid, String classifyAttr,File file) throws  Throwable{
-		VciBaseUtil.alertNotNull(codeClassifyOid,"鍒嗙被鐨勪富閿�");
-		ReadExcelOption reo = new ReadExcelOption();
-		reo.setReadAllSheet(true);
-		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
-		if (sheetDataSetList.size() > LIMIT + 1) {
-			throw new VciBaseException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
-		}
-		Map<String,List<WriteExcelData>> shetNameMap=new HashMap<>();
-		//鐩镐技椤圭洰鏌ラ噸
-		String uuid=VciBaseUtil.getPk();
-		boolean isCreateUUid=false;
-		boolean isExport=false;
-		//long start = System.currentTimeMillis();
-		for(int i=0;i<sheetDataSetList.size()-1;i++) {
-			if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(i).getRowData())
-				|| sheetDataSetList.get(i).getRowData().size() < 1) {
-				continue;
+		try {
+			VciBaseUtil.alertNotNull(codeClassifyOid,"鍒嗙被鐨勪富閿�");
+			ReadExcelOption reo = new ReadExcelOption();
+			reo.setReadAllSheet(true);
+			List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
+			if (sheetDataSetList.size() > LIMIT + 1) {
+				throw new VciBaseException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
 			}
-			// 鍗曟瀵煎叆鏁伴噺闄愬埗
-			if(sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT){
-				throw new ServiceException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�"+IMPORT_DATA_LIMIT+"鏉$殑鏁版嵁");
-			}
-			//鍘嗗彶瀵煎叆鐨勬椂鍊欎笉澶勭悊缂栫爜
-			//----閫昏緫鍐呭----
-			//1. 鍒嗙被鐨勮矾寰勫彲浠ュ湪椤甸潰涓婇�夋嫨鏄垎绫荤紪鍙疯繕鏄垎绫荤殑鍚嶇О
-			//2. 鍒嗙被鐨勮矾寰勶紝蹇呴』鏄綋鍓嶅鍏ラ�夋嫨鐨勫垎绫荤殑鑺傜偣锛屼互鍙婂叾涓嬬骇鑺傜偣
-			//3. 閫氳繃鏁版嵁瑕佸鍏ョ殑鍒嗙被鍘绘煡鎵惧搴旂殑缂栫爜瑙勫垯
-			//4. 鏁版嵁瀛樺偍鍜屾壒閲忕敵璇蜂竴鏍凤紝
-			//5. 闇�瑕佸崟鐙鐞嗕紒涓氱紪鐮佺殑鍐呭锛�
-			//     5.1 浼佷笟缂栫爜鍦ㄥ綋鍓峞xcel閲屼笉鑳介噸澶�
-			//     5.2 浼佷笟缂栫爜鍦ㄧ郴缁熶腑涓嶈兘閲嶅锛堝彲浠ユ槸宸茬粡鍥炴敹鐨勶級
-			//     5.3 浼佷笟缂栫爜鐨勯暱搴︼紝鍜岀紪鐮佽鍒欑殑闀垮害瑕佸搴斾笂
-			//     5.4 鑾峰彇娴佹按鐮佹鐨勫�硷紝鍘婚櫎濉厖鐨勫瓧绗︼紝鐪嬫祦姘村彿鏄灏戯紝鐒跺悗灏嗘祦姘村彿鍜岀幇鍦ㄧ殑鏈�澶ф祦姘村彿鍒ゆ柇锛屽皬浜庡氨鐩存帴褰曞叆锛屽ぇ浜庡垯淇敼鏈�澶ф祦姘村彿
-			//     5.5 瀛樺偍浼佷笟缂栫爜鍒癮llcode涓�
-			//鏌ヨ鍒嗙被鍜屾ā鏉�
+			Map<String,List<WriteExcelData>> shetNameMap=new HashMap<>();
+			//鐩镐技椤圭洰鏌ラ噸
+			String uuid=VciBaseUtil.getPk();
+			boolean isCreateUUid=false;
+			boolean isExport=false;
+			//long start = System.currentTimeMillis();
+			// 璁板綍瀵煎叆鎴愬姛鐨勬�绘暟
+			List<Integer> importCount = new ArrayList<>();
 			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
-
-			//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
-			SheetDataSet dataSet = sheetDataSetList.get(i);
-			List<SheetRowData> rowDataList = dataSet.getRowData();
-
-			//鎵剧涓�琛岋紝涓轰簡鎵炬爣棰�
-			CodeClassifyTemplateVO templateVO = new CodeClassifyTemplateVO();
-			/**  if (!templateService.checkChildHasSameTemplate(classifyFullInfo.getCurrentClassifyVO().getOid())) {
-			 	throw new VciBaseException("褰撳墠鐨勫垎绫讳互鍙婁笅绾у垎绫荤殑妯℃澘涓嶇浉鍚�");
-			 }***/
-			//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
-			//鎵炬墍鏈夌殑鍒嗙被璺緞,闇�瑕佹牎楠岃矾寰勬槸鍚︽纭紝鏄惁閮藉湪褰撳墠鐨勫垎绫荤殑涓嬬骇
-			List<CodeClassifyVO> childClassifyVOs = classifyService.listChildrenClassify(codeClassifyOid, true, classifyAttr, true);
-			Map<String/**璺緞**/, CodeClassifyVO> pathMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getPath().startsWith("#") ? s.getPath().substring(1) : s.getPath(), t -> t));
-			List<String> titleRowData = dataSet.getColName();
-			Map<String, String> errorMap = new ConcurrentHashMap<>();
-			pathMap.put("#current#",classifyFullInfo.getCurrentClassifyVO());
-
-			try {
-				List<CodeClassifyTemplateVO> templateVOList= checkSamesTemplate(titleRowData,sheetDataSetList,i,pathMap,errorMap);
-				templateVO= templateVOList.get(0);
-			}catch (Throwable e){
-				throw  new VciBaseException(e.getMessage());
-			}
-
-			List<SheetRowData> needowDataList = rowDataList.stream().filter(cbo -> {
-				String rowIndex = cbo.getRowIndex();
-				return !errorMap.containsKey(rowIndex);
-			}).collect(Collectors.toList());
-
-			//checkTemplateSync(sheetDataSetList, templateVO,i);
-			//杩欓噷涓嶉櫎鍘婚粯璁ょ殑灞炴��
-			List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes();
-			Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
-
-			Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
-			String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
-			getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
-			//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
-			List<ClientBusinessObject> cboList = new ArrayList<>();
-			String fullPath = getFullPath(classifyFullInfo);
-			//鎴戜滑闇�瑕佽幏鍙栧埌鎵�鏈夌殑涓嬬骇鍒嗙被鐨刼id鐨勮矾寰勶紝鍥犱负鍚庨潰闇�瑕�
-			Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
-			excelToCbo(classifyFullInfo, fieldIndexMap, needowDataList, templateVO, cboList, fullPath, false);
-
-
-			Map<String/**涓婚敭**/, CodeClassifyVO> classifyVOMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-			classifyVOMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO());
-			pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
-
-			//鍒ゆ柇缂栧彿鍦╡xcel閲屾湰韬氨閲嶅鐨�
-			Map<String, Long> idCountMap = cboList.stream().collect(Collectors.groupingBy(ClientBusinessObject::getId, Collectors.counting()));
-			List<String> repeatIdList = new ArrayList<>();
-			idCountMap.forEach((id, count) -> {
-				if (count > 1) {
-					repeatIdList.add(id);
+			for(int i=0;i<sheetDataSetList.size()-1;i++) {
+				if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(i).getRowData())
+					|| sheetDataSetList.get(i).getRowData().size() < 1) {
+					continue;
 				}
-			});
-			if (!CollectionUtils.isEmpty(repeatIdList)) {
-				cboList.stream().filter(s -> repeatIdList.contains(s.getId())).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).forEach(rowIndex -> {
-					errorMap.put(rowIndex, "缂栧彿鍦ㄥ綋鍓峞xcel涓噸澶�;");
-				});
-			}
-			//鎴戜滑闇�瑕佸垽鏂繖浜涘垎绫荤殑妯℃澘鏄笉鏄竴鏍风殑锛屽彧闇�瑕佹牎楠岋紝涓嶇敤鑾峰彇
-			//妫�鏌ュ垎绫荤殑璺緞
-			checkClassifyPathInHistory(cboList, errorMap, pathMap, childOidPathMap);
+				// 鍗曟瀵煎叆鏁伴噺闄愬埗
+				if(sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT){
+					throw new ServiceException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�"+IMPORT_DATA_LIMIT+"鏉$殑鏁版嵁");
+				}
+				//鍘嗗彶瀵煎叆鐨勬椂鍊欎笉澶勭悊缂栫爜
+				//----閫昏緫鍐呭----
+				//1. 鍒嗙被鐨勮矾寰勫彲浠ュ湪椤甸潰涓婇�夋嫨鏄垎绫荤紪鍙疯繕鏄垎绫荤殑鍚嶇О
+				//2. 鍒嗙被鐨勮矾寰勶紝蹇呴』鏄綋鍓嶅鍏ラ�夋嫨鐨勫垎绫荤殑鑺傜偣锛屼互鍙婂叾涓嬬骇鑺傜偣
+				//3. 閫氳繃鏁版嵁瑕佸鍏ョ殑鍒嗙被鍘绘煡鎵惧搴旂殑缂栫爜瑙勫垯
+				//4. 鏁版嵁瀛樺偍鍜屾壒閲忕敵璇蜂竴鏍凤紝
+				//5. 闇�瑕佸崟鐙鐞嗕紒涓氱紪鐮佺殑鍐呭锛�
+				//     5.1 浼佷笟缂栫爜鍦ㄥ綋鍓峞xcel閲屼笉鑳介噸澶�
+				//     5.2 浼佷笟缂栫爜鍦ㄧ郴缁熶腑涓嶈兘閲嶅锛堝彲浠ユ槸宸茬粡鍥炴敹鐨勶級
+				//     5.3 浼佷笟缂栫爜鐨勯暱搴︼紝鍜岀紪鐮佽鍒欑殑闀垮害瑕佸搴斾笂
+				//     5.4 鑾峰彇娴佹按鐮佹鐨勫�硷紝鍘婚櫎濉厖鐨勫瓧绗︼紝鐪嬫祦姘村彿鏄灏戯紝鐒跺悗灏嗘祦姘村彿鍜岀幇鍦ㄧ殑鏈�澶ф祦姘村彿鍒ゆ柇锛屽皬浜庡氨鐩存帴褰曞叆锛屽ぇ浜庡垯淇敼鏈�澶ф祦姘村彿
+				//     5.5 瀛樺偍浼佷笟缂栫爜鍒癮llcode涓�
+				//鏌ヨ鍒嗙被鍜屾ā鏉�
 
-			//妫�鏌ヨ鍒�
-			Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
-			List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
-			checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
-			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+				//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
+				SheetDataSet dataSet = sheetDataSetList.get(i);
+				List<SheetRowData> rowDataList = dataSet.getRowData();
 
-			//鎴戜滑鏍规嵁鍑洪敊鐨勫垎绫荤殑涓婚敭锛屽幓鎵捐鍙�
-			if (!CollectionUtils.isEmpty(unExistRuleClassifyOidList)) {
-				cboList.stream().forEach(cbo -> {
-					if (unExistRuleClassifyOidList.contains(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
-						String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-						errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";鏍规嵁鍒嗙被璺緞瀵瑰簲鐨勫垎绫伙紝娌℃湁璁剧疆缂栫爜瑙勫垯");
+				//鎵剧涓�琛岋紝涓轰簡鎵炬爣棰�
+				CodeClassifyTemplateVO templateVO = new CodeClassifyTemplateVO();
+				/**  if (!templateService.checkChildHasSameTemplate(classifyFullInfo.getCurrentClassifyVO().getOid())) {
+				 throw new VciBaseException("褰撳墠鐨勫垎绫讳互鍙婁笅绾у垎绫荤殑妯℃澘涓嶇浉鍚�");
+				 }***/
+				//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
+				//鎵炬墍鏈夌殑鍒嗙被璺緞,闇�瑕佹牎楠岃矾寰勬槸鍚︽纭紝鏄惁閮藉湪褰撳墠鐨勫垎绫荤殑涓嬬骇
+				List<CodeClassifyVO> childClassifyVOs = classifyService.listChildrenClassify(codeClassifyOid, true, classifyAttr, true);
+				Map<String/**璺緞**/, CodeClassifyVO> pathMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getPath().startsWith("#") ? s.getPath().substring(1) : s.getPath(), t -> t));
+				List<String> titleRowData = dataSet.getColName();
+				Map<String, String> errorMap = new ConcurrentHashMap<>();
+				pathMap.put("#current#",classifyFullInfo.getCurrentClassifyVO());
+
+				try {
+					List<CodeClassifyTemplateVO> templateVOList= checkSamesTemplate(titleRowData,sheetDataSetList,i,pathMap,errorMap);
+					templateVO= templateVOList.get(0);
+				}catch (Throwable e){
+					throw  new VciBaseException(e.getMessage());
+				}
+
+				List<SheetRowData> needowDataList = rowDataList.stream().filter(cbo -> {
+					String rowIndex = cbo.getRowIndex();
+					return !errorMap.containsKey(rowIndex);
+				}).collect(Collectors.toList());
+
+				//checkTemplateSync(sheetDataSetList, templateVO,i);
+				//杩欓噷涓嶉櫎鍘婚粯璁ょ殑灞炴��
+				List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes();
+				Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
+
+				Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
+				String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
+				getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
+				//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
+				List<ClientBusinessObject> cboList = new ArrayList<>();
+				String fullPath = getFullPath(classifyFullInfo);
+				//鎴戜滑闇�瑕佽幏鍙栧埌鎵�鏈夌殑涓嬬骇鍒嗙被鐨刼id鐨勮矾寰勶紝鍥犱负鍚庨潰闇�瑕�
+				Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
+				excelToCbo(classifyFullInfo, fieldIndexMap, needowDataList, templateVO, cboList, fullPath, false);
+
+
+				Map<String/**涓婚敭**/, CodeClassifyVO> classifyVOMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				classifyVOMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO());
+				pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
+
+				//鍒ゆ柇缂栧彿鍦╡xcel閲屾湰韬氨閲嶅鐨�
+				Map<String, Long> idCountMap = cboList.stream().collect(Collectors.groupingBy(ClientBusinessObject::getId, Collectors.counting()));
+				List<String> repeatIdList = new ArrayList<>();
+				idCountMap.forEach((id, count) -> {
+					if (count > 1) {
+						repeatIdList.add(id);
 					}
 				});
-			}
-
-			//鍒ゆ柇蹇呰緭椤�
-			batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
-
-			//浼樺厛鏍¢獙缂栫爜鏄惁瀛樺湪
-			batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
-
-			//boolean
-			reSwitchBooleanAttrOnOrder(attrVOS, cboList);
-
-			// 鏋氫妇鐨勫唴瀹归渶瑕佹牴鎹悕绉拌浆鎹负鏋氫妇鐨勫��
-			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-
-			batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
-
-			//6.澶勭悊鍒嗙被娉ㄥ叆
-			batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo,true);
-
-			//璁剧疆榛樿鍊�
-			batchSwitchAttrDefault(attrVOS, cboList);
-
-			//7.澶勭悊缁勫悎瑙勫垯
-			batchSwitchComponentAttrOnOrder(attrVOS, cboList);
-
-			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
-			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-			if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
-				selfRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
-				});
-			}
-			if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
-				keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex, ""));
-				});
-			}
-			//4.鏍¢獙瑙勫垯
-			batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
-
-			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-			batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
-			if (CollectionUtils.isEmpty(ruleOidMap.values())) {
-				throw new VciBaseException("瀵煎叆鐨勬暟鎹墍閫夋嫨鐨勫垎绫婚兘娌℃湁璁剧疆缂栫爜瑙勫垯");
-			}
-			// TODO: 璇ョ敤oid鏌ヨ瑙勫垯鐨勶紝鍒敤id
-			Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-			//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
-			Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
-			checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
-			ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
-				List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
-				List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
-				//鎴戜滑闇�瑕佸厛鏌ヨ涓�涓嬶紝鍐呭鏄惁宸茬粡瀛樺湪
-				if(!CollectionUtils.isEmpty(thisCbos)){
-					List<String> existIds = new ArrayList<>();
-					VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
-						List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
-							.notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
-							.notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
-						);
-						existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
-							String id = s.getId();
-							if (StringUtils.isBlank(id)) {
-								id = s.getId();
-							}
-							return id;
-						}).collect(Collectors.toList()));
+				if (!CollectionUtils.isEmpty(repeatIdList)) {
+					cboList.stream().filter(s -> repeatIdList.contains(s.getId())).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).forEach(rowIndex -> {
+						errorMap.put(rowIndex, "缂栧彿鍦ㄥ綋鍓峞xcel涓噸澶�;");
 					});
-					List<String> existIdCbos = thisCbos.stream().filter(s -> {
-						String id = s.getId();
-						if (StringUtils.isBlank(id)) {
-							id = s.getAttributeValue("id");
+				}
+				//鎴戜滑闇�瑕佸垽鏂繖浜涘垎绫荤殑妯℃澘鏄笉鏄竴鏍风殑锛屽彧闇�瑕佹牎楠岋紝涓嶇敤鑾峰彇
+				//妫�鏌ュ垎绫荤殑璺緞
+				checkClassifyPathInHistory(cboList, errorMap, pathMap, childOidPathMap);
+
+				//妫�鏌ヨ鍒�
+				Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
+				List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
+				checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
+				//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+
+				//鎴戜滑鏍规嵁鍑洪敊鐨勫垎绫荤殑涓婚敭锛屽幓鎵捐鍙�
+				if (!CollectionUtils.isEmpty(unExistRuleClassifyOidList)) {
+					cboList.stream().forEach(cbo -> {
+						if (unExistRuleClassifyOidList.contains(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
+							String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+							errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";鏍规嵁鍒嗙被璺緞瀵瑰簲鐨勫垎绫伙紝娌℃湁璁剧疆缂栫爜瑙勫垯");
 						}
-						return existIds.contains(id);
-					}).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
-					if (!CollectionUtils.isEmpty(existIdCbos)) {
-						thisCbos = thisCbos.stream().filter(s -> {
+					});
+				}
+
+				//鍒ゆ柇蹇呰緭椤�
+				batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
+
+				//浼樺厛鏍¢獙缂栫爜鏄惁瀛樺湪
+				batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
+
+				//boolean
+				reSwitchBooleanAttrOnOrder(attrVOS, cboList);
+
+				// 鏋氫妇鐨勫唴瀹归渶瑕佹牴鎹悕绉拌浆鎹负鏋氫妇鐨勫��
+				batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+
+				batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
+
+				//6.澶勭悊鍒嗙被娉ㄥ叆
+				batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo,true);
+
+				//璁剧疆榛樿鍊�
+				batchSwitchAttrDefault(attrVOS, cboList);
+
+				//7.澶勭悊缁勫悎瑙勫垯
+				batchSwitchComponentAttrOnOrder(attrVOS, cboList);
+
+				//3.鍒ゆ柇鍏抽敭灞炴��
+				CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
+				Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
+				Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+				if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
+					selfRepeatRowIndexList.stream().forEach(rowIndex -> {
+						errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
+					});
+				}
+				if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+					keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+						errorMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex, ""));
+					});
+				}
+				//4.鏍¢獙瑙勫垯
+				batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
+
+				//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+				batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
+				if (CollectionUtils.isEmpty(ruleOidMap.values())) {
+					throw new VciBaseException("瀵煎叆鐨勬暟鎹墍閫夋嫨鐨勫垎绫婚兘娌℃湁璁剧疆缂栫爜瑙勫垯");
+				}
+				// TODO: 璇ョ敤oid鏌ヨ瑙勫垯鐨勶紝鍒敤id
+				Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
+				Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
+				checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
+				ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
+					List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
+					List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+					//鎴戜滑闇�瑕佸厛鏌ヨ涓�涓嬶紝鍐呭鏄惁宸茬粡瀛樺湪
+					if(!CollectionUtils.isEmpty(thisCbos)){
+						List<String> existIds = new ArrayList<>();
+						VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
+							List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
+								.notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
+								.notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
+							);
+							existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
+								String id = s.getId();
+								if (StringUtils.isBlank(id)) {
+									id = s.getId();
+								}
+								return id;
+							}).collect(Collectors.toList()));
+						});
+						List<String> existIdCbos = thisCbos.stream().filter(s -> {
 							String id = s.getId();
 							if (StringUtils.isBlank(id)) {
 								id = s.getAttributeValue("id");
 							}
-							return !existIdCbos.contains(id);
-						}).collect(Collectors.toList());
-						existIdCbos.stream().forEach(rowIndex -> {
-							errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";銆�" + idFieldName + "銆戝湪绯荤粺涓凡缁忚鍗犵敤");
-						});
-					}
-				}
-			});
-
-			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) {
-				isExport=true;
-				createRedisDatas(uuid + "-error", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap, false);
-			}
-			createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, templateVO);
-			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(templateVO.getCodeclassifyoid(), templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
-			if (resembleMap.size() > 0) {
-				if (!CollectionUtils.isEmpty(dataResembleVOS)) {
-					bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
-					createRedisDatas(uuid + "-resemble", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
-				}
-			}
-			//鐢熸垚class缂撳瓨
-			Map<String, String> rowIndexClsOidMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t.getAttributeValue(CODE_CLASSIFY_OID_FIELD)));
-			createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,true);
-			//鑾峰彇缂栫爜锛屾煡璇㈠湪绯荤粺涓槸鍚﹁鍏朵粬鐨勫紩鐢ㄤ簡
-			//鎺掗櫎閿欒鐨勶紝鍓╀笅姝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;
-			}
-
-			List<String> needRowIndexList = needSaveCboList.stream().filter(s -> errorMap.containsKey(s.getAttributeValue(IMPORT_ROW_INDEX))).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
-			if (isExport||newErrorMap.size() > 0) {
-				createRedisDatas(uuid + "-ok", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap, true);
-			} else {
-				List<BaseModel> dataCBOIdList=new ArrayList<>();
-				//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
-				List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
-				CodeClassifyTemplateVO finalTemplateVO = templateVO;
-				ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
-					//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
-					List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
-					List<ClientBusinessObject> thisCbos = finalNeedSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
-					List<BaseModel> dataCBOList=new CopyOnWriteArrayList<>();
-					thisCbos.stream().forEach(clientBusinessObject -> {
-						BaseModel baseModel=new BaseModel();
-						BeanUtil.convert(clientBusinessObject,baseModel);
-						//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
-						dataCBOList.add(baseModel);
-						dataCBOIdList.add(baseModel);
-					});
-
-					if (!CollectionUtils.isEmpty(thisCbos)) {
-						try {
-							// TODO 澶氱嚎绋嬫祦闂
-							productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
-						} catch (Throwable e) {
-							log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
-							thisCbos.stream().forEach(cbo -> {
-								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:"+e.getMessage());
+							return existIds.contains(id);
+						}).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
+						if (!CollectionUtils.isEmpty(existIdCbos)) {
+							thisCbos = thisCbos.stream().filter(s -> {
+								String id = s.getId();
+								if (StringUtils.isBlank(id)) {
+									id = s.getAttributeValue("id");
+								}
+								return !existIdCbos.contains(id);
+							}).collect(Collectors.toList());
+							existIdCbos.stream().forEach(rowIndex -> {
+								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";銆�" + idFieldName + "銆戝湪绯荤粺涓凡缁忚鍗犵敤");
 							});
-
 						}
 					}
 				});
-				if (errorMap.size() > 0) {
-					isExport = true;
-				}
-				createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
-				engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
-			}
-		}
-		//long end = System.currentTimeMillis();
-		//log.info("=============for鎵ц鏃堕棿================="+String.valueOf((end-start)/1000));
-		String excelFileName="";
-		if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
-			excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
-			WriteExcelOption eo = new WriteExcelOption();
-			shetNameMap.forEach((shetName, errorDataList) -> {
-				eo.addSheetDataList(shetName, errorDataList);
-			});
-			try {
-				new File(excelFileName).createNewFile();
-			} catch (IOException e) {
-				throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
-			}
-			ExcelUtil.writeDataToFile(excelFileName, eo);
-		}
-		CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
-		if(StringUtils.isNotBlank(excelFileName)) {
-			codeImProtRusultVO.setFilePath(excelFileName);
-			codeImProtRusultVO.setFileOid("");
-		}
-		if(isCreateUUid){
-			codeImProtRusultVO.setRedisUuid(uuid);
-		}
 
-		return codeImProtRusultVO;
+				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) {
+					isExport=true;
+					createRedisDatas(uuid + "-error", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap, false);
+				}
+				createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, templateVO);
+				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(templateVO.getCodeclassifyoid(), templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
+				if (resembleMap.size() > 0) {
+					if (!CollectionUtils.isEmpty(dataResembleVOS)) {
+						bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
+						createRedisDatas(uuid + "-resemble", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+					}
+				}
+				//鐢熸垚class缂撳瓨
+				Map<String, String> rowIndexClsOidMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t.getAttributeValue(CODE_CLASSIFY_OID_FIELD)));
+				createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,true);
+				//鑾峰彇缂栫爜锛屾煡璇㈠湪绯荤粺涓槸鍚﹁鍏朵粬鐨勫紩鐢ㄤ簡
+				//鎺掗櫎閿欒鐨勶紝鍓╀笅姝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;
+				}
+
+				List<String> needRowIndexList = needSaveCboList.stream().filter(s -> errorMap.containsKey(s.getAttributeValue(IMPORT_ROW_INDEX))).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
+				if (isExport||newErrorMap.size() > 0) {
+					createRedisDatas(uuid + "-ok", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap, true);
+				} else {
+					List<BaseModel> dataCBOIdList=new ArrayList<>();
+					//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+					List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
+					CodeClassifyTemplateVO finalTemplateVO = templateVO;
+					ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
+						//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+						List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
+						List<ClientBusinessObject> thisCbos = finalNeedSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+						List<BaseModel> dataCBOList=new CopyOnWriteArrayList<>();
+						thisCbos.stream().forEach(clientBusinessObject -> {
+							BaseModel baseModel=new BaseModel();
+							BeanUtil.convert(clientBusinessObject,baseModel);
+							//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
+							dataCBOList.add(baseModel);
+							dataCBOIdList.add(baseModel);
+						});
+
+						if (!CollectionUtils.isEmpty(thisCbos)) {
+							try {
+								// TODO 澶氱嚎绋嬫祦闂
+								productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
+								importCount.add(dataCBOList.size());
+							} catch (Throwable e) {
+								log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
+								thisCbos.stream().forEach(cbo -> {
+									String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+									errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:"+e.getMessage());
+								});
+							}
+						}
+					});
+					if (errorMap.size() > 0) {
+						isExport = true;
+					}
+					createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
+					engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
+				}
+			}
+			//long end = System.currentTimeMillis();
+			//log.info("=============for鎵ц鏃堕棿================="+String.valueOf((end-start)/1000));
+			String excelFileName="";
+			if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
+				excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
+				WriteExcelOption eo = new WriteExcelOption();
+				shetNameMap.forEach((shetName, errorDataList) -> {
+					eo.addSheetDataList(shetName, errorDataList);
+				});
+				try {
+					new File(excelFileName).createNewFile();
+				} catch (IOException e) {
+					throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
+				}
+				ExcelUtil.writeDataToFile(excelFileName, eo);
+			}
+			CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
+			if(StringUtils.isNotBlank(excelFileName)) {
+				codeImProtRusultVO.setFilePath(excelFileName);
+				codeImProtRusultVO.setFileOid("");
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true, StringUtil.format("閿欒淇℃伅锛歿}",JSON.toJSONString(shetNameMap)) );
+			}else{
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",false, StringUtil.format("瀵煎叆鍒板垎绫粄}涓紝瀵煎叆鎴愬姛鎬绘暟涓猴細{}", JSON.toJSONString(classifyFullInfo),importCount.get(0)));
+			}
+			if(isCreateUUid){
+				codeImProtRusultVO.setRedisUuid(uuid);
+			}
+			return codeImProtRusultVO;
+		}catch (Exception e){
+			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true,e.getMessage());
+			throw e;
+		}
 	}
 
 	/*private void converBaseModels(List<ClientBusinessObject> clientBusinessObjects,List<BaseModel>dataCBOList){
@@ -1291,7 +1309,6 @@
 
 	}
 
-
 	/***
 	 * 鎵归噺澶勭悊鐢宠鏁版嵁
 	 * @param orderDTO
@@ -1299,140 +1316,148 @@
 	 * @param dataSet
 	 * @return
 	 */
-	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
+	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType) throws Exception {
 		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();
+		String uuid = "";
+		try {
+			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> 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,errorMap);
-		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=VciBaseUtil.getPk();
-		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)) {
-				bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
-				createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+			//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
+			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) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
 			}
-		}
-		//鎺掗櫎閿欒鐨勶紝鍓╀笅姝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="";
+			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,errorMap);
+			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);
+			uuid=VciBaseUtil.getPk();
+			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)) {
+					bladeRedis.set(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="";
 
-			if (!CollectionUtils.isEmpty(needSaveCboList)) {
-				//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
-				//鐢熸垚缂栫爜鐨勫唴瀹�
-				List<String> dataCBOIdList=new ArrayList<>();
-				List<BaseModel> dataCBOList=new ArrayList<>();
-				cboList.stream().forEach(clientBusinessObject -> {
-					BaseModel baseModel=new BaseModel();
-					BeanUtil.convert(clientBusinessObject,baseModel);
-					//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
-					dataCBOList.add(baseModel);
-					dataCBOIdList.add(baseModel.getOid());
-				});
-				try {
-					codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
-					//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
-					engineService.batchSaveSelectChar(templateVO, dataCBOList);
-				} catch (Exception e) {
-					e.printStackTrace();
-					log.error("鎵逛簡鐢宠鏃跺け璐�");
+				//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+				needSaveCboList = cboList.stream().filter(cbo -> {
+					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					return !newErrorMap.containsKey(rowIndex);
+				}).collect(Collectors.toList());
+
+				if (!CollectionUtils.isEmpty(needSaveCboList)) {
+					//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
+					//鐢熸垚缂栫爜鐨勫唴瀹�
+					List<String> dataCBOIdList=new ArrayList<>();
+					List<BaseModel> dataCBOList=new ArrayList<>();
+					cboList.stream().forEach(clientBusinessObject -> {
+						BaseModel baseModel=new BaseModel();
+						BeanUtil.convert(clientBusinessObject,baseModel);
+						//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
+						dataCBOList.add(baseModel);
+						dataCBOIdList.add(baseModel.getOid());
+					});
+					try {
+						codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
+						//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
+						engineService.batchSaveSelectChar(templateVO, dataCBOList);
+					} catch (Exception e) {
+						e.printStackTrace();
+						log.error("鎵归噺鐢宠鏃跺け璐�");
+						throw e;
+					}
 				}
 			}
-		}
-		if(!isCreateUUid){
-			return uuid="";
+			if(!isCreateUUid){
+				return uuid="";
+			}
+			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜",false, StringUtil.format("鎵归噺瀵煎叆鐢宠鎴愬姛鍏眥}鏉℃暟鎹紝鐢熸垚鐨勭爜鍊煎涓嬨�恵}銆�",codeList.size(),codeList));
+		}catch (Exception e){
+			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜",true,e.getMessage());
+			throw e;
 		}
 		return uuid;
 	}
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
index 5220c0c..42fab2c 100644
--- 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
@@ -183,7 +183,7 @@
 							serialDb = killFillChar(subSecValue,secVO.getCodeFillSeparator(),
 								OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()));
 						}
-						Double newSerialDb= CustomSerialEnum.getDoubleCustomSerialValue(secValue,secVO.getCustomCodeSerialType());
+						Double newSerialDb= CustomSerialEnum.getDoubleCustomSerialValue(serialDb,secVO.getCustomCodeSerialType());
 						HashMap<String, String> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>());
 						Double maxValue=newSerialDb;
 						if(thisUnitMaxMap.containsKey(secOid)){
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeRuleCharacterWapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeRuleCharacterWapper.java
new file mode 100644
index 0000000..70acd48
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeRuleCharacterWapper.java
@@ -0,0 +1,73 @@
+package com.vci.ubcs.code.wrapper;
+
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.vci.ubcs.code.entity.CodeRuleCharacter;
+import com.vci.ubcs.code.enumpack.CodeRuleCharacterEnum;
+import com.vci.ubcs.code.vo.pagemodel.CodeRuleCharacterVO;
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 缂栫爜瀛楃鍖呰绫�,杩斿洖瑙嗗浘灞傛墍闇�鐨勫瓧娈�
+ * @author xj
+ * @date 2023-11-30
+ */
+public class CodeRuleCharacterWapper extends BaseEntityWrapper<CodeRuleCharacter, CodeRuleCharacterVO> {
+	public static CodeRuleCharacterWapper build() {
+		return new CodeRuleCharacterWapper();
+	}
+	@Override
+	public CodeRuleCharacterVO entityVO(CodeRuleCharacter entity) {
+		entity.setChartTypeText(CodeRuleCharacterEnum.getTextByValue(entity.getChartType()));
+		CodeRuleCharacterVO VO = Objects.requireNonNull(BeanUtil.copy(entity, CodeRuleCharacterVO.class));
+		return VO;
+	}
+
+	/***
+	 * 鏁扮粍瀵硅薄杞崲
+	 * @param entitys
+	 * @return
+	 */
+	public List<CodeRuleCharacterVO> entityVOs(Collection<CodeRuleCharacter> entitys) {
+		if(CollectionUtils.isEmpty(entitys)) {return new ArrayList<>();}
+		List<CodeRuleCharacterVO> vos=new ArrayList<>();
+		if(!CollectionUtils.isEmpty(entitys)) {
+			entitys.stream().forEach(vo -> {
+				vos.add(entityVO(vo));
+			});
+		}
+		return vos;
+	}
+
+
+	/***
+	 * 鏁扮粍瀵硅薄杞崲
+	 * @param vos
+	 * @return
+	 */
+	public List<CodeRuleCharacter> voentitys(Collection<CodeRuleCharacterVO> vos) {
+		if(CollectionUtils.isEmpty(vos)) {return new ArrayList<>();}
+		List<CodeRuleCharacter>entitys =new ArrayList<>();
+		if(!CollectionUtils.isEmpty(vos)) {
+			vos.stream().forEach(vo -> {
+				entitys.add(voentity(vo));
+			});
+		}
+		return entitys;
+	}
+
+	/***
+	 * 鏁扮粍瀵硅薄杞崲
+	 * @param vo
+	 * @return
+	 */
+	public CodeRuleCharacter voentity( CodeRuleCharacterVO vo) {
+		CodeRuleCharacter entity = Objects.requireNonNull(BeanUtil.copy(vo, CodeRuleCharacter.class));
+		return entity;
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleCharacterMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleCharacterMapper.xml
new file mode 100644
index 0000000..014cd51
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleCharacterMapper.xml
@@ -0,0 +1,36 @@
+<?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.CodeRuleCharacterMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="CodeResembleRuleResultMap" type="com.vci.ubcs.code.entity.CodeRuleCharacter">
+        <id property="oid" column="OID"/>
+        <result property="btmname" column="BTMNAME"/>
+        <result property="revisionOid" column="REVISIONOID"/>
+        <result property="nameOid" column="NAMEOID"/>
+        <result property="lastR" column="LASTR"/>
+        <result property="firstR" column="FIRSTR"/>
+        <result property="lastV" column="LASTV"/>
+        <result property="firstV" column="FIRSTV"/>
+        <result property="creator" column="CREATOR"/>
+        <result property="createTime" column="CREATETIME"/>
+        <result property="lastModifier" column="LASTMODIFIER"/>
+        <result property="lastModifyTime" column="LASTMODIFYTIME"/>
+        <result property="revisionRule" column="REVISIONVALUE"/>
+        <result property="versionRule" column="VISIONRULE"/>
+        <result property="revisionValue" column="REVISIONRULE"/>
+        <result property="versionValue" column="VERSIONVALUE"/>
+        <result property="revisionSeq" column="REVISIONSEQ"/>
+        <result property="versionSeq" column="VERSIONSEQ"/>
+        <result property="lctid" column="LCTID"/>
+        <result property="lcStatus" column="LCSTATUS"/>
+        <result property="ts" column="TS"/>
+        <result property="id" column="ID"/>
+        <result property="name" column="NAME"/>
+        <result property="description" column="DESCRIPTION"/>
+        <result property="owner" column="OWNER"/>
+        <result property="copyFromVersion" column="COPYFROMVERSION"/>
+        <result property="codeRuleId" column="CODERULEID"/>
+        <result property="chartValue" column="CHARTVALUE"/>
+        <result property="chartType" column="CHARTTYPE"/>
+    </resultMap>
+</mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
index 6d2babb..2f65641 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
@@ -98,19 +98,19 @@
     </update >
 
     <select id="getNextRevision" resultType="map" >
-        select max(revisionSeq) + 1 revisionSeq,
-               max(RevisionValue) + 1 revisionVal,
-               max(VersionSeq) + 1 VersionSeq,
-               max(VersionValue) + 1 VersionVal
+        select max(revisionSeq) + 1 REVISIONSEQ,
+               max(RevisionValue) + 1 REVISIONVAL,
+               max(VersionSeq) + 1 VERSIONSEQ,
+               max(VersionValue) + 1 VERSIONVAL
         from ${tableName}
         where nameoid = #{nameoid}
     </select>
 
     <select id="getCurrentRevision" resultType="map" >
-        select max(revisionSeq) revisionSeq,
-               max(RevisionValue) revisionVal,
-               max(VersionSeq) VersionSeq,
-               max(VersionValue) VersionVal
+        select max(revisionSeq) REVISIONSEQ,
+               max(RevisionValue) REVISIONVAL,
+               max(VersionSeq) VERSIONSEQ,
+               max(VersionValue) VERSIONVAL
         from ${tableName}
         where nameoid = #{nameoid}
     </select>
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RoleController.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RoleController.java
index 6709c7e..508ea8d 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RoleController.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/RoleController.java
@@ -46,6 +46,9 @@
 import javax.validation.Valid;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
 
 import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 
@@ -128,7 +131,6 @@
 		return R.status(roleService.submit(role));
 	}
 
-
 	/**
 	 * 鍒犻櫎
 	 */
@@ -150,7 +152,16 @@
 	public R grant(@RequestBody GrantVO grantVO) {
 		CacheUtil.clear(SYS_CACHE);
 		CacheUtil.clear(SYS_CACHE, Boolean.FALSE);
-		boolean temp = roleService.grant(grantVO.getRoleIds(), grantVO.getMenuIds(), grantVO.getDataScopeIds(), grantVO.getApiScopeIds());
+		boolean temp = false;
+		try {
+			temp = roleService.grant(grantVO.getRoleIds(), grantVO.getMenuIds(), grantVO.getDataScopeIds(), grantVO.getApiScopeIds());
+			// 鎻掑叆鎺堟潈鏃ュ織
+			roleService.grantLog(roleService.getGrantRoleResString(grantVO.getRoleIds()),false);
+		}catch (Exception e){
+			// 澶辫触鏃舵彃鍏ュ紓甯镐俊鎭埌鏃ュ織涓�
+			roleService.grantLog(e.getMessage(),true);
+			throw e;
+		}
 		return R.status(temp);
 	}
 
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
index 1f8a2cd..1a01e58 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
@@ -87,6 +87,13 @@
 	List<TreeNode> grantTree(BladeUser user);
 
 	/**
+	 * 鏍规嵁瑙掕壊id鑾峰彇鑿滃崟鏍戝舰缁撴瀯
+	 * @param roleId
+	 * @return
+	 */
+	List<TreeNode> grantTreeByRoleIds(List<Long> roleId);
+
+	/**
 	 * 椤堕儴鑿滃崟鏍戝舰缁撴瀯
 	 *
 	 * @param user
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IRoleService.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IRoleService.java
index 879d3aa..140a760 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IRoleService.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IRoleService.java
@@ -68,6 +68,20 @@
 	boolean grant(@NotEmpty List<Long> roleIds, List<Long> menuIds, List<Long> dataScopeIds, List<Long> apiScopeIds);
 
 	/**
+	 * 瑙掕壊鏉冮檺閰嶇疆鏃ュ織璁板綍
+	 * @param roleRes
+	 * @return
+	 */
+	boolean grantLog(String roleRes, boolean isException);
+
+	/**
+	 * 鑾峰彇瑙掕壊鎺堟潈鏃ュ織鐨勪俊鎭�
+	 * @param roleId
+	 * @return
+	 */
+	String getGrantRoleResString(List<Long> roleId);
+
+	/**
 	 * 鑾峰彇瑙掕壊ID
 	 *
 	 * @param tenantId
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
index e06b155..8e3fd78 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
@@ -162,6 +162,17 @@
 		return ForestNodeMerger.merge(tenantPackageTree(menuTree, user.getTenantId()));
 	}
 
+	/**
+	 * 鏍规嵁瑙掕壊id鑾峰彇鑿滃崟鏍戝舰缁撴瀯
+	 * @param roleId
+	 * @return
+	 */
+	@Override
+	public List<TreeNode> grantTreeByRoleIds(List<Long> roleId) {
+		List<TreeNode> menuTree = baseMapper.grantTreeByRole(roleId);
+		return ForestNodeMerger.merge(menuTree);
+	}
+
 	@Override
 	public List<TreeNode> grantTopTree(BladeUser user) {
 		List<TreeNode> menuTree = user.getTenantId().equals(NacosConfigCache.getAdminUserInfo().getTenantId()) ? baseMapper.grantTopTree() : baseMapper.grantTopTreeByRole(Func.toLongList(user.getRoleId()));
diff --git a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/RoleServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/RoleServiceImpl.java
index d90ff86..77a94c9 100644
--- a/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/RoleServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/RoleServiceImpl.java
@@ -16,29 +16,34 @@
  */
 package com.vci.ubcs.system.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.system.mapper.RoleMapper;
+import com.vci.ubcs.system.service.IMenuService;
 import com.vci.ubcs.system.service.IRoleMenuService;
 import com.vci.ubcs.system.service.IRoleScopeService;
 import com.vci.ubcs.system.service.IRoleService;
 import com.vci.ubcs.system.vo.DeptVO;
 import com.vci.ubcs.system.wrapper.RoleWrapper;
 import lombok.AllArgsConstructor;
+import org.springblade.core.log.annotation.GrantLog;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.constant.RoleConstant;
 import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.node.TreeNode;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
 import com.vci.ubcs.system.entity.Role;
 import com.vci.ubcs.system.entity.RoleMenu;
 import com.vci.ubcs.system.entity.RoleScope;
 import com.vci.ubcs.system.vo.RoleVO;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -64,6 +69,7 @@
 
 	private final IRoleMenuService roleMenuService;
 	private final IRoleScopeService roleScopeService;
+	private final IMenuService menuService;
 
 	@Override
 	public IPage<RoleVO> selectRolePage(IPage<RoleVO> page, RoleVO role) {
@@ -93,6 +99,32 @@
 		return grantRoleMenu(roleIds, menuIds) && grantDataScope(roleIds, dataScopeIds) && grantApiScope(roleIds, apiScopeIds);
 	}
 
+	/**
+	 * 瑙掕壊鏉冮檺閰嶇疆鏃ュ織璁板綍
+	 * @param roleRes
+	 * @return
+	 */
+	@Override
+	@GrantLog("grantRole")
+	public boolean grantLog(String roleRes, boolean isException) {
+
+		return false;
+	}
+
+	/**
+	 * 鑾峰彇瑙掕壊鎺堟潈鏃ュ織鐨勪俊鎭�
+	 * @param roleId
+	 * @return
+	 */
+	@Override
+	public String getGrantRoleResString(List<Long> roleId) {
+		// 鑾峰彇鍒拌彍鍗曚俊鎭紝鍐嶈幏鍙栧埌瑙掕壊淇℃伅锛岃繘琛屾嫾鎺�
+		List<TreeNode> menuTree = menuService.grantTreeByRoleIds(roleId);
+		List<String> roleNames = this.baseMapper.getRoleNames(new Long[]{roleId.get(0)});
+		String res = roleNames.get(0) + "鎺堟潈涓�:{" + JSON.toJSONString(menuTree)+"}";
+		return res;
+	}
+
 	private boolean grantRoleMenu(List<Long> roleIds, List<Long> menuIds) {
 		// 闃叉瓒婃潈閰嶇疆瓒呯瑙掕壊
 		Long administratorCount = baseMapper.selectCount(Wrappers.<Role>query().lambda().eq(Role::getRoleAlias, RoleConstant.ADMINISTRATOR).in(Role::getId, roleIds));
diff --git a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java
index 6c6c537..9bfdd3c 100644
--- a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java
+++ b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java
@@ -191,11 +191,20 @@
 	 */
 	@PostMapping("/grant")
 	@ApiOperationSupport(order = 7)
-	@ApiOperation(value = "鏉冮檺璁剧疆", notes = "浼犲叆roleId闆嗗悎浠ュ強menuId闆嗗悎")
+	@ApiOperation(value = "鏉冮檺璁剧疆", notes = "浼犲叆userIds闆嗗悎浠ュ強roleIds闆嗗悎")
 	//@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
 	public R grant(@ApiParam(value = "userId闆嗗悎", required = true) @RequestParam String userIds,
 				   @ApiParam(value = "roleId闆嗗悎", required = true) @RequestParam String roleIds) {
-		boolean temp = userService.grant(userIds, roleIds);
+		boolean temp = false;
+		try {
+			 temp = userService.grant(userIds, roleIds);
+			// 鎻掑叆鎺堟潈鏃ュ織
+			userService.grantLog(UserWrapper.build().entityVO(userService.getById(userIds)).toString(),false);
+		}catch (Exception e){
+			// 鎻掑叆鎺堟潈鏃ュ織
+			userService.grantLog(e.getMessage(),true);
+			throw e;
+		}
 		return R.status(temp);
 	}
 
@@ -286,7 +295,6 @@
 		ExcelUtil.export(response, "鐢ㄦ埛鏁版嵁妯℃澘", "鐢ㄦ埛鏁版嵁琛�", list, UserExcel.class);
 	}
 
-
 	/**
 	 * 绗笁鏂规敞鍐岀敤鎴�
 	 */
@@ -296,7 +304,6 @@
 	public R registerGuest(User user, Long oauthId) {
 		return R.status(userService.registerGuest(user, oauthId));
 	}
-
 
 	/**
 	 * 閰嶇疆鐢ㄦ埛骞冲彴淇℃伅
diff --git a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java
index ea01d96..2a233e5 100644
--- a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java
+++ b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/IUserService.java
@@ -186,6 +186,13 @@
 	boolean grant(String userIds, String roleIds);
 
 	/**
+	 * 璁板綍鎺堟潈鏃ュ織
+	 * @param res
+	 * @return
+	 */
+	boolean grantLog(String res, boolean isException);
+
+	/**
 	 * 鍒濆鍖栧瘑鐮�
 	 *
 	 * @param userIds
diff --git a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java
index 7fbd48d..ff717d9 100644
--- a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java
@@ -45,6 +45,7 @@
 import com.vci.ubcs.system.user.vo.UserVO;
 import com.vci.ubcs.system.user.wrapper.UserWrapper;
 import lombok.RequiredArgsConstructor;
+import org.springblade.core.log.annotation.GrantLog;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
@@ -127,6 +128,7 @@
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
+	@GrantLog("grantUser")
 	public boolean updateUser(User user) {
 		String tenantId = user.getTenantId();
 		Long userCount = baseMapper.selectCount(
@@ -135,6 +137,7 @@
 				.eq(User::getAccount, user.getAccount())
 				.notIn(User::getId, user.getId())
 		);
+		// 鍒ゆ柇鏄惁琚慨鏀逛负宸插瓨鍦ㄧ殑鐢ㄦ埛鍚�
 		if (userCount > 0L) {
 			throw new ServiceException(StringUtil.format("褰撳墠鐢ㄦ埛 [{}] 宸插瓨鍦�!", user.getAccount()));
 		}
@@ -179,6 +182,9 @@
 
 	private boolean submitUserDept(User user) {
 		List<Long> deptIdList = Func.toLongList(user.getDeptId());
+		if(deptIdList.isEmpty()){
+			return true;
+		}
 		List<UserDept> userDeptList = new ArrayList<>();
 		deptIdList.forEach(deptId -> {
 			UserDept userDept = new UserDept();
@@ -348,6 +354,16 @@
 		return this.update(user, Wrappers.<User>update().lambda().in(User::getId, Func.toLongList(userIds)));
 	}
 
+	/**
+	 * 鎺堟潈鏃ュ織鎻掑叆鎿嶄綔
+	 * @param res
+	 */
+	@Override
+	@GrantLog("grantUser")
+	public boolean grantLog(String res, boolean isException){
+		return true;
+	}
+
 	@Override
 	public boolean resetPassword(String userIds) {
 		User user = new User();

--
Gitblit v1.9.3