From d74e1672af99afd7e6a24327deb22b308dd5fc88 Mon Sep 17 00:00:00 2001
From: yuxc <653031404@qq.com>
Date: 星期一, 04 十二月 2023 08:38:44 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleCharacterVO.java                                       |    4 
 Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java |    3 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleCharacterService.java                                              |    3 
 Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/IDockingPreAttrMappingService.java         |    9 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmIOService.java                                                           |    8 
 Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feign/IMdmInterJtClient.java               |   11 
 Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue                                                                                            |   25 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrRnageDTO.java                                       |   30 
 Source/UBCS-WEB/src/views/monitor/log/operateLog.vue                                                                                                   |    8 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/标准系列修订(跨年).json                                  |    0 
 Source/UBCS-WEB/src/api/code/codeCharcter.js                                                                                                           |   45 +
 Source/UBCS-WEB/src/views/ruleBasic/prefixConfig.vue                                                                                                   |  289 +++++++++
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrMappingDTO.java                                     |   50 +
 Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue                                                                                                |  282 ++++++++
 Source/UBCS-WEB/src/components/Theme/ThemeAttrCrud.vue                                                                                                 |    1 
 Source/UBCS-WEB/src/views/code/code.vue                                                                                                                |   49 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/ExecGroupCodePortDataDTO.java                                           |   32 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java                                                  |  209 ++++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeFixedValueController.java                                            |    2 
 Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue                                                                                           |    8 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/标准修订(跨年).json                                    |    0 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml                                                                    |    6 
 Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java                        |   22 
 Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java                                              |    4 
 Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java                                                     |   72 +-
 Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue                                                                                               |  282 ++++++++
 Source/UBCS-WEB/src/components/FormTemplate/index.vue                                                                                                  |   14 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SpecialCharacterConverter.java                                      |   35 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java                                              |   11 
 Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue                                                                                                |  282 ++++++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleCharacterServiceImpl.java                                      |   70 +
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/标准系列申请.json                                      |    0 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java                                                 |   24 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleCharacterController.java                                         |    6 
 34 files changed, 1,765 insertions(+), 131 deletions(-)

diff --git a/Source/UBCS-WEB/src/api/code/codeCharcter.js b/Source/UBCS-WEB/src/api/code/codeCharcter.js
new file mode 100644
index 0000000..3dd0f56
--- /dev/null
+++ b/Source/UBCS-WEB/src/api/code/codeCharcter.js
@@ -0,0 +1,45 @@
+import request from '@/router/axios';
+
+export const getList = (params) => {
+  return request({
+    url: '/api/ubcs-code/codeRuleCharacterController/list',
+    method: 'get',
+    params: {
+      ...params,
+    }
+  })
+}
+
+export const gridCodeRule = (params) => {
+  return request({
+    url: '/api/ubcs-code/mdmRule/gridCodeRule',
+    method: 'get',
+    params: {
+      ...params,
+    },
+  })
+}
+
+export const addSave = (codeRuleCharacterVO) => {
+  return request({
+    url: '/api/ubcs-code/codeRuleCharacterController/addSave',
+    method: 'post',
+    data:codeRuleCharacterVO
+  })
+}
+
+export const editSave = (codeRuleCharacterVO) => {
+  return request({
+    url: '/api/ubcs-code/codeRuleCharacterController/editSave',
+    method: 'post',
+    data:codeRuleCharacterVO
+  })
+}
+
+export const deleteSave = (codeRuleCharacterVO) => {
+  return request({
+    url: '/api/ubcs-code/codeRuleCharacterController/delete',
+    method: 'post',
+    data:codeRuleCharacterVO
+  })
+}
diff --git a/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue b/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
index bfd0254..e75483c 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
@@ -317,9 +317,10 @@
           valueFormat: formItem.dateFormate || "yyyy-MM-dd HH:mm:ss",
           format: formItem.dateFormate,
           keyAttr: formItem.keyAttr,
-          value: (formItem.dicData && formItem.dicData.length > 0 && formItem.secType == "codefixedsec" ? formItem.dicData[0].id : null) ||
+          value:formItem.defaultValue || (formItem.dicData && formItem.dicData.length > 0 && formItem.secType == "codefixedsec" ? formItem.dicData[0].id : null) ||
             (formItem.secType == "codedatesec" ? formItem.codeDateValue : null) || (TreeValue && formItem.secType == "codelevelsec" ? TreeValue : null) ||
-            (formItem.secType == "codeattrsec" ? this.add : null) || (this.status === "apply" && formItem.field === "codeStandardEditType" ? "1" : null),
+            (formItem.secType == "codeattrsec" ? this.add : null) || (this.status === "apply" && formItem.field === "codeStandardEditType" ? "1" : null) ||
+            (this.status === "amend" && formItem.field === "codeStandardEditType" ? "2" : null),
           placeholder: formItem.inputTip,
           comboxKey: formItem.comboxKey,
           tip: formItem.tooltips,
@@ -427,7 +428,8 @@
           keyAttr: formItem.keyAttr,
           value: (formItem.dicData && formItem.dicData.length > 0 && formItem.secType == "codefixedsec" ? formItem.dicData[0].id : null) ||
             (formItem.secType == "codedatesec" ? formItem.codeDateValue : null) || (TreeValue && formItem.secType == "codelevelsec" ? TreeValue : null) ||
-            (formItem.secType == "codeattrsec" ? this.add : null) || (this.status === "apply" && formItem.field === "codeStandardEditType" ? "1" : null),
+            (formItem.secType == "codeattrsec" ? this.add : null) || (this.status === "apply" && formItem.field === "codeStandardEditType" ? "1" : null)  ||
+            (this.status === "amend" && formItem.field === "codeStandardEditType" ? "2" : null),
           placeholder: formItem.inputTip,
           comboxKey: formItem.comboxKey,
           tip: formItem.tooltips,
diff --git a/Source/UBCS-WEB/src/components/FormTemplate/index.vue b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
index 2567d87..340f056 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/index.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -444,7 +444,18 @@
         );
       }
       // 鎺掗櫎涓�浜涘瓧娈�
-      const noData = [
+      const noData = this.status ? [
+        "jiliangdwname",
+        "materialtypeText",
+        "morengongysname",
+        "$caigouwl",
+        "$xiaoshouwl",
+        "$shifoupihaoguanli",
+        "lcstatus_text",
+        "hesuanfenleiname",
+        "$kucunwl",
+        "lastmodifier"
+      ] : [
         "jiliangdwname",
         "materialtypeText",
         "morengongysname",
@@ -457,6 +468,7 @@
         "oldcode",
         "lastmodifier"
       ];
+
       let resForm = {};
       const {defaultValue, formValue} = this.getDefaultValueAndFormValues(
         this.form
diff --git a/Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue b/Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue
index a8121e9..36ca0b3 100644
--- a/Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue
+++ b/Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue
@@ -40,7 +40,7 @@
                         border class="cus-table"
                         @select="handleSelection" @cell-click="handleCellClick" @row-click="handleRowClick"
                         @select-all="handleSelectionAll" @selection-change="handleSelectionChange"
-                        @sort-change="sortChange">
+                        @sort-change="sortChange"  :header-cell-style="{background:'#FAFAFA',color:'#505050'}">
                 <el-table-column v-if="tableData.length != 0" fixed type="selection" width="55"></el-table-column>
                 <el-table-column v-if="tableData.length != 0" fixed label="搴忓彿" type="index" width="55">
                 </el-table-column>
@@ -108,7 +108,7 @@
           </FormTemplateDialog>
           <!--          淇敼-->
           <FormTemplateDialog :codeClassifyOid="this.codeClassifyOid" :codeRuleOid="this.codeRuleOid"
-                              :disabledProp="disabledProp" :rowOid="rowOid" :templateOid="templateOid" :title="'淇敼缂栫爜淇℃伅'"
+                              :disabledProp="disabledProp" rowOid="rowOid" :templateOid="templateOid" :title="'淇敼缂栫爜淇℃伅'"
                               :visible.sync="editvisible"
                               type="edit" @submit="EditSumbit"></FormTemplateDialog>
           <!--          鎵归噺缂栬緫-->
@@ -584,11 +584,24 @@
     },
     //鏍囧噯淇
     codeAMENDHandler() {
-      if (this.selectRow.length !== 1) {
-        this.$message.warning("璇烽�夋嫨涓�鏉℃暟鎹�");
-      } else {
+      let foundItem = false;
+
+      this.tableHeadFindData.forEach(item => {
+        if (item.field === "oldcode" && Object.keys(item.referConfig).length >= 1) {
+          foundItem = true;
+        }
+      });
+
+      if (foundItem) {
         this.amendvisible = true;
-        this.rowOid = this.selectRow[0].oid;
+        this.rowOid = this.selectRow[0].oid ;
+      } else {
+        if (this.selectRow.length !== 1) {
+          this.$message.warning("璇烽�夋嫨涓�鏉℃暟鎹�");
+        }else {
+          this.amendvisible = true;
+          this.rowOid = this.selectRow[0].oid ;
+        }
       }
     },
     //鎵归噺缂栬緫
diff --git a/Source/UBCS-WEB/src/components/Theme/ThemeAttrCrud.vue b/Source/UBCS-WEB/src/components/Theme/ThemeAttrCrud.vue
index 5e44b6a..3ee51de 100644
--- a/Source/UBCS-WEB/src/components/Theme/ThemeAttrCrud.vue
+++ b/Source/UBCS-WEB/src/components/Theme/ThemeAttrCrud.vue
@@ -326,6 +326,7 @@
                 v-loading="loading"
                 :data="ProData"
                 :height="this.tableHeight"
+                :header-cell-style="{background:'#FAFAFA',color:'#505050'}"
                 border
                 style="width: 100%"
                 @select="selectHandle"
diff --git a/Source/UBCS-WEB/src/views/code/code.vue b/Source/UBCS-WEB/src/views/code/code.vue
index 4b0e705..9455958 100644
--- a/Source/UBCS-WEB/src/views/code/code.vue
+++ b/Source/UBCS-WEB/src/views/code/code.vue
@@ -2779,12 +2779,11 @@
       }
       //console.log(this.form);
       //涓篺orm缁戝畾鍊�
-      this.changeSectypeFormItems(condition == "add" ? null : row);
+      this.changeSectypeFormItems(condition == "add" ? null:row);
       this.addBasicCodeSettingBox = true;
     },
     /** 鏂板鍩虹鐮佹*/
     async saveOrEditBasicCode() {
-      this.isLoadingSecCodeAddBtn = true;
       if (
         this.selectionList[0].oid == null ||
         this.selectionList[0].oid == ""
@@ -2792,26 +2791,28 @@
         this.$message.warning("缂哄け蹇呰鍙傛暟锛岃閲嶆柊閫夋嫨缂栫爜瑙勫垯鍚庡啀璇�!");
         return;
       }
+      if (!this.checkForm()) {
+        return;
+      }
+      this.isLoadingSecCodeAddBtn = true;
       this.form.pkCodeRule = this.selectionList[0].oid;
       if (this.form.oid == "" || this.form.oid == null) {
-        if (this.checkForm()) {
-          await addSave(this.form).then(
-            () => {
-              this.$message({
-                type: "success",
-                message: "鎿嶄綔鎴愬姛!",
-              });
-              console.log(this.form)
-              // 鍏抽棴瀵硅瘽妗�
-              this.addBasicCodeSettingBox = false;
-              // 鐐瑰嚮鏂板鍩虹鐮佹,鍏抽棴绐楀彛涔嬪悗瑙﹀彂閲嶆柊鍔犺浇
-              this.loadBasic(this.selectionList[0]);
-            },
-            (error) => {
-              window.console.log(error);
-            }
-          );
-        }
+        await addSave(this.form).then(
+          () => {
+            this.$message({
+              type: "success",
+              message: "鎿嶄綔鎴愬姛!",
+            });
+            console.log(this.form)
+            // 鍏抽棴瀵硅瘽妗�
+            this.addBasicCodeSettingBox = false;
+            // 鐐瑰嚮鏂板鍩虹鐮佹,鍏抽棴绐楀彛涔嬪悗瑙﹀彂閲嶆柊鍔犺浇
+            this.loadBasic(this.selectionList[0]);
+          },
+          (error) => {
+            window.console.log(error);
+          }
+        );
       } else {
         // 鍙兘鍙傜収寮曠敤鐨勪笟鍔$被鍨嬩細鍙戠敓鏀瑰彉鎵�浠ヨ繖鍎跨洿鎺ュreferConfig鐨刯son杩涜鏀瑰彉
         if (
@@ -2825,7 +2826,7 @@
           // let referValueInfo = JSON.parse(this.form.referValueInfo);
           // referValueInfo.referType = this.form.referBtmId;
         }
-        let oldBasicSec = this.selectionBasicList.at(-1);
+        let oldBasicSec = this.selectionBasicList.slice(-1)[0];
         let secType = this.form.secType;
         Vue.set(this.form, 'isClearValue', false);
         if ((oldBasicSec.secType == "codefixedsec" || oldBasicSec.secType === "codeclassifysec") && oldBasicSec.secType != secType) {
@@ -3066,7 +3067,7 @@
       if (!this.tipsMessage(this.selectionBasicList)) {
         return;
       }
-      if (this.selectionList.at(-1).lcStatus != "Editing") {
+      if (this.selectionList.slice(-1)[0].lcStatus != "Editing") {
         this.$message.warning('缂栫爜瑙勫垯鐘舵�佷笉鏄�"缂栬緫涓�"锛屼笉鍏佽鍒犻櫎鐮佹!');
         return;
       }
@@ -3212,7 +3213,7 @@
     },
     /** 鍩虹鐮佹鍒锋柊鏃舵煡璇�*/
     refreshChangeBasicSec() {
-      this.loadBasic(this.selectionList.at(-1));
+      this.loadBasic(this.selectionList.slice(-1)[0]);
     },
     /** 鎿嶄綔鍩虹鐮佹涓悳绱㈡竻绌虹瓑鎸夐挳鐨勬樉绀�/闅愯棌*/
     hideBasicTable(hideBoolean) {
@@ -3288,7 +3289,7 @@
     },
     /** 鐮佹绫诲瀷鏀瑰彉鏃讹紝澧炲姞瀵瑰簲鐨刦orm琛ㄥ崟涓殑灞炴��*/
     changeSectypeFormItems(row) {
-      console.log(row)
+      //console.log(row)
       if (
         func.isEmpty(this.enumParam.secTypeList) ||
         this.enumParam.secTypeList.length == 0
diff --git a/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue b/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
index 0a8653f..f8aee43 100644
--- a/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
+++ b/Source/UBCS-WEB/src/views/monitor/log/operateLog.vue
@@ -63,18 +63,18 @@
               label: "鐢ㄦ埛鍚�",
               prop: "userName",
               search: true,
-              width:'100'
+              width:'120'
             },
             {
               label: "濮撳悕",
               prop: "realName",
               search: true,
-              width:'100'
+              width:'120'
             },
             {
               label: "鐢ㄦ埛ip",
               prop: "ip",
-              width:'100'
+              width:'130'
             },
             {
               label: "妯″潡",
@@ -89,7 +89,7 @@
             {
               label: "鎿嶄綔缁撴灉",
               prop: "operateResult",
-              width:'100'
+              width:'110'
             },
             {
               label: "鎻忚堪",
diff --git a/Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue b/Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue
index 867a34d..a78ad01 100644
--- a/Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue
+++ b/Source/UBCS-WEB/src/views/ruleBasic/delimiterConfig.vue
@@ -1,13 +1,289 @@
 <template>
+  <basic-container>
 
+    <el-header>
+      <div style="margin-bottom: 15px">
+        缂栫爜瑙勫垯锛�
+        <el-select v-model="select" :filter-method="filterValue" filterable placeholder="璇烽�夋嫨" size="small"
+                   @change="selectHandler">
+          <el-option v-for="(item,index) in queryReleasedList"
+                     :key="item.oid"
+                     :label="item.name"
+                     :value="item.oid"></el-option>
+        </el-select>
+      </div>
+    </el-header>
+    <el-main>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        :header-cell-style="{background:'#FAFAFA',color:'#505050'}"
+        border
+        style="width: 100%;height:  calc(100vh - 320px)"
+        @cell-click="cellClickHandler">
+        <el-table-column
+          align="center"
+          label="1"
+          prop="1"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="2"
+          prop="2"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="3"
+          prop="3">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="4"
+          prop="4">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="5"
+          prop="5">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="6"
+          prop="6">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="7"
+          prop="7">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="8"
+          prop="8">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="9"
+          prop="9">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="10"
+          prop="10">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="11"
+          prop="11">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="12"
+          prop="12">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="13"
+          prop="13">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="14"
+          prop="14">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="15"
+          prop="15">
+        </el-table-column>
+      </el-table>
+    </el-main>
+    <el-footer>
+      <div style="width: 260px; display: flex; align-items: center;margin-top: 5px">
+        <p>鍊硷細</p>
+        <el-input v-model="characterValue" size="small" style="flex: 1;"></el-input>
+      </div>
+    </el-footer>
+    <div style="margin-bottom: 10px;text-align: center">
+      <el-button icon="el-icon-plus" plain size="small" type="success" @click="addSaveHandler">娣诲姞</el-button>
+      <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editSaveHandler">淇敼</el-button>
+      <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delSaveHandler">鍒犻櫎</el-button>
+    </div>
+  </basic-container>
 </template>
 
 <script>
+import {getList, addSave, editSave, deleteSave} from "@/api/code/codeCharcter"
+import {gridCodeRule} from "@/api/code/codeCharcter"
+
 export default {
-  name: "delimiterConfig"
+  name: "delimiterConfig",
+  data() {
+    return {
+      loading: false,
+      //涓嬫媺妗嗘暟缁�
+      queryReleasedList: [],
+      //涓嬫媺妗嗗垵濮嬫暟鎹暟缁�
+      characterReleasedList: [],
+      characterValue: "",
+      characterEditOldValue: "",
+      tableData: [],
+      select: "",
+      selectValue: ""
+    }
+  },
+  watch: {
+    select: {
+      handler(newV) {
+        // console.log(newV)
+      }
+    }
+  },
+  created() {
+    this.getCodeRule();
+  },
+  methods: {
+    cellClickHandler(row, column) {
+      this.characterValue = row[column.property];
+      this.characterEditOldValue = row[column.property]
+    },
+    async getCodeRule() {
+      try {
+        // 缂栫爜瑙勫垯宸插彂甯冩暟鎹簮
+        const res = await gridCodeRule({["conditionMap" + "[lcStatus_like]"]: "Released"});
+        this.characterReleasedList = res.data.data.records;
+        this.queryReleasedList = this.characterReleasedList;
+        this.select = this.characterReleasedList[0].oid;
+        this.loading = true;
+        const res2 = await getList({codeRuleId: this.select, chartType: "separator", chartValue: this.characterValue});
+        this.tableData = res2.data.data;
+        this.loading = false;
+        // console.log("this.tableData", this.tableData);
+      } catch (error) {
+        this.$message.warning(error)
+      }
+    },
+    //缂栫爜瑙勫垯涓嬫媺妗嗘悳绱�
+    filterValue(query) {
+      console.log(query)
+      if (query !== "") {
+        this.queryReleasedList = this.characterReleasedList.filter(item => {
+          return item.name.includes(query.toString());
+        });
+      } else {
+        this.queryReleasedList = this.characterReleasedList;
+      }
+    },
+    selectHandler(val) {
+      this.selectValue = val;
+      this.characterValue = ""
+      this.getTableData()
+    },
+    getTableData() {
+      this.loading = true;
+      // const targetObject = this.characterReleasedList.find(obj => obj.oid === this.selectValue);
+      // const chartValue = targetObject.name;
+      getList({codeRuleId: this.select, chartType: "separator", chartValue: this.characterValue}).then(res => {
+        console.log(res.data.data);
+        this.tableData = res.data.data;
+        this.loading = false;
+      });
+    },
+    addSaveHandler() {
+      if (!this.characterValue) {
+        this.$message.warning('璇峰~鍐欒娣诲姞鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "separator",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      addSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('娣诲姞澶辫触');
+      });
+    },
+    editSaveHandler() {
+      if (this.characterEditOldValue === "") {
+        this.$message.warning('璇烽�夋嫨淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇閫夋嫨鍊�
+      }
+
+      if (this.characterValue === "") {
+        this.$message.warning('璇峰~鍐欒淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "separator",
+        chartValue: this.characterValue,
+        oldChartValue: this.characterEditOldValue,
+        chartTypeText: targetObject.name
+      };
+
+      editSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('淇敼澶辫触');
+      });
+    },
+    delSaveHandler() {
+      //鍒ゆ柇閫夋嫨鏁版嵁characterEditOldValue
+      if (this.characterEditOldValue === "" || this.characterValue === "") {
+        this.$message.warning('璇烽�夋嫨瑕佸垹闄ょ殑鍊�');
+        return;
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "separator",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      deleteSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('鍒犻櫎澶辫触');
+      });
+    }
+  }
 }
 </script>
 
-<style scoped>
-
+<style lang="scss" scoped>
+.el-header {
+  padding: 0;
+}
 </style>
diff --git a/Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue b/Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue
index 9de161e..a1a9026 100644
--- a/Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue
+++ b/Source/UBCS-WEB/src/views/ruleBasic/paddingCharacter.vue
@@ -1,13 +1,289 @@
 <template>
+  <basic-container>
 
+    <el-header>
+      <div style="margin-bottom: 15px">
+        缂栫爜瑙勫垯锛�
+        <el-select v-model="select" :filter-method="filterValue" filterable placeholder="璇烽�夋嫨" size="small"
+                   @change="selectHandler">
+          <el-option v-for="(item,index) in queryReleasedList"
+                     :key="item.oid"
+                     :label="item.name"
+                     :value="item.oid"></el-option>
+        </el-select>
+      </div>
+    </el-header>
+    <el-main>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        :header-cell-style="{background:'#FAFAFA',color:'#505050'}"
+        border
+        style="width: 100%;height:  calc(100vh - 320px)"
+        @cell-click="cellClickHandler">
+        <el-table-column
+          align="center"
+          label="1"
+          prop="1"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="2"
+          prop="2"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="3"
+          prop="3">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="4"
+          prop="4">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="5"
+          prop="5">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="6"
+          prop="6">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="7"
+          prop="7">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="8"
+          prop="8">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="9"
+          prop="9">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="10"
+          prop="10">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="11"
+          prop="11">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="12"
+          prop="12">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="13"
+          prop="13">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="14"
+          prop="14">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="15"
+          prop="15">
+        </el-table-column>
+      </el-table>
+    </el-main>
+    <el-footer>
+      <div style="width: 260px; display: flex; align-items: center;margin-top: 5px">
+        <p>鍊硷細</p>
+        <el-input v-model="characterValue" size="small" style="flex: 1;"></el-input>
+      </div>
+    </el-footer>
+    <div style="margin-bottom: 10px;text-align: center">
+      <el-button icon="el-icon-plus" plain size="small" type="success" @click="addSaveHandler">娣诲姞</el-button>
+      <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editSaveHandler">淇敼</el-button>
+      <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delSaveHandler">鍒犻櫎</el-button>
+    </div>
+  </basic-container>
 </template>
 
 <script>
+import {getList, addSave, editSave, deleteSave} from "@/api/code/codeCharcter"
+import {gridCodeRule} from "@/api/code/codeCharcter"
+
 export default {
-  name: "paddingCharacter"
+  name: "paddingCharacter",
+  data() {
+    return {
+      loading: false,
+      //涓嬫媺妗嗘暟缁�
+      queryReleasedList: [],
+      //涓嬫媺妗嗗垵濮嬫暟鎹暟缁�
+      characterReleasedList: [],
+      characterValue: "",
+      characterEditOldValue: "",
+      tableData: [],
+      select: "",
+      selectValue: ""
+    }
+  },
+  watch: {
+    select: {
+      handler(newV) {
+        // console.log(newV)
+      }
+    }
+  },
+  created() {
+    this.getCodeRule();
+  },
+  methods: {
+    cellClickHandler(row, column) {
+      this.characterValue = row[column.property];
+      this.characterEditOldValue = row[column.property]
+    },
+    async getCodeRule() {
+      try {
+        // 缂栫爜瑙勫垯宸插彂甯冩暟鎹簮
+        const res = await gridCodeRule({["conditionMap" + "[lcStatus_like]"]: "Released"});
+        this.characterReleasedList = res.data.data.records;
+        this.queryReleasedList = this.characterReleasedList;
+        this.select = this.characterReleasedList[0].oid;
+        this.loading = true;
+        const res2 = await getList({codeRuleId: this.select, chartType: "fillerChar", chartValue: this.characterValue});
+        this.tableData = res2.data.data;
+        this.loading = false;
+        // console.log("this.tableData", this.tableData);
+      } catch (error) {
+        this.$message.warning(error)
+      }
+    },
+    //缂栫爜瑙勫垯涓嬫媺妗嗘悳绱�
+    filterValue(query) {
+      console.log(query)
+      if (query !== "") {
+        this.queryReleasedList = this.characterReleasedList.filter(item => {
+          return item.name.includes(query.toString());
+        });
+      } else {
+        this.queryReleasedList = this.characterReleasedList;
+      }
+    },
+    selectHandler(val) {
+      this.selectValue = val;
+      this.characterValue = ""
+      this.getTableData()
+    },
+    getTableData() {
+      this.loading = true;
+      // const targetObject = this.characterReleasedList.find(obj => obj.oid === this.selectValue);
+      // const chartValue = targetObject.name;
+      getList({codeRuleId: this.select, chartType: "fillerChar", chartValue: this.characterValue}).then(res => {
+        console.log(res.data.data);
+        this.tableData = res.data.data;
+        this.loading = false;
+      });
+    },
+    addSaveHandler() {
+      if (!this.characterValue) {
+        this.$message.warning('璇峰~鍐欒娣诲姞鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "fillerChar",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      addSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('娣诲姞澶辫触');
+      });
+    },
+    editSaveHandler() {
+      if (this.characterEditOldValue === "") {
+        this.$message.warning('璇烽�夋嫨淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇閫夋嫨鍊�
+      }
+
+      if (this.characterValue === "") {
+        this.$message.warning('璇峰~鍐欒淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "fillerChar",
+        chartValue: this.characterValue,
+        oldChartValue: this.characterEditOldValue,
+        chartTypeText: targetObject.name
+      };
+
+      editSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('淇敼澶辫触');
+      });
+    },
+    delSaveHandler() {
+      //鍒ゆ柇閫夋嫨鏁版嵁characterEditOldValue
+      if (this.characterEditOldValue === "" || this.characterValue === "") {
+        this.$message.warning('璇烽�夋嫨瑕佸垹闄ょ殑鍊�');
+        return;
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "fillerChar",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      deleteSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('鍒犻櫎澶辫触');
+      });
+    }
+  }
 }
 </script>
 
-<style scoped>
-
+<style lang="scss" scoped>
+.el-header {
+  padding: 0;
+}
 </style>
diff --git a/Source/UBCS-WEB/src/views/ruleBasic/prefixConfig.vue b/Source/UBCS-WEB/src/views/ruleBasic/prefixConfig.vue
new file mode 100644
index 0000000..fe196c6
--- /dev/null
+++ b/Source/UBCS-WEB/src/views/ruleBasic/prefixConfig.vue
@@ -0,0 +1,289 @@
+<template>
+  <basic-container>
+
+    <el-header>
+      <div style="margin-bottom: 15px">
+        缂栫爜瑙勫垯锛�
+        <el-select v-model="select" :filter-method="filterValue" filterable placeholder="璇烽�夋嫨" size="small"
+                   @change="selectHandler">
+          <el-option v-for="(item,index) in queryReleasedList"
+                     :key="item.oid"
+                     :label="item.name"
+                     :value="item.oid"></el-option>
+        </el-select>
+      </div>
+    </el-header>
+    <el-main>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        :header-cell-style="{background:'#FAFAFA',color:'#505050'}"
+        border
+        style="width: 100%;height:  calc(100vh - 320px)"
+        @cell-click="cellClickHandler">
+        <el-table-column
+          align="center"
+          label="1"
+          prop="1"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="2"
+          prop="2"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="3"
+          prop="3">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="4"
+          prop="4">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="5"
+          prop="5">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="6"
+          prop="6">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="7"
+          prop="7">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="8"
+          prop="8">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="9"
+          prop="9">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="10"
+          prop="10">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="11"
+          prop="11">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="12"
+          prop="12">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="13"
+          prop="13">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="14"
+          prop="14">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="15"
+          prop="15">
+        </el-table-column>
+      </el-table>
+    </el-main>
+    <el-footer>
+      <div style="width: 260px; display: flex; align-items: center;margin-top: 5px">
+        <p>鍊硷細</p>
+        <el-input v-model="characterValue" size="small" style="flex: 1;"></el-input>
+      </div>
+    </el-footer>
+    <div style="margin-bottom: 10px;text-align: center">
+      <el-button icon="el-icon-plus" plain size="small" type="success" @click="addSaveHandler">娣诲姞</el-button>
+      <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editSaveHandler">淇敼</el-button>
+      <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delSaveHandler">鍒犻櫎</el-button>
+    </div>
+  </basic-container>
+</template>
+
+<script>
+import {getList, addSave, editSave, deleteSave} from "@/api/code/codeCharcter"
+import {gridCodeRule} from "@/api/code/codeCharcter"
+
+export default {
+  name: "prefixConfig",
+  data() {
+    return {
+      loading: false,
+      //涓嬫媺妗嗘暟缁�
+      queryReleasedList: [],
+      //涓嬫媺妗嗗垵濮嬫暟鎹暟缁�
+      characterReleasedList: [],
+      characterValue: "",
+      characterEditOldValue: "",
+      tableData: [],
+      select: "",
+      selectValue: ""
+    }
+  },
+  watch: {
+    select: {
+      handler(newV) {
+        // console.log(newV)
+      }
+    }
+  },
+  created() {
+    this.getCodeRule();
+  },
+  methods: {
+    cellClickHandler(row, column) {
+      this.characterValue = row[column.property];
+      this.characterEditOldValue = row[column.property]
+    },
+    async getCodeRule() {
+      try {
+        // 缂栫爜瑙勫垯宸插彂甯冩暟鎹簮
+        const res = await gridCodeRule({["conditionMap" + "[lcStatus_like]"]: "Released"});
+        this.characterReleasedList = res.data.data.records;
+        this.queryReleasedList = this.characterReleasedList;
+        this.select = this.characterReleasedList[0].oid;
+        this.loading = true;
+        const res2 = await getList({codeRuleId: this.select, chartType: "prefix", chartValue: this.characterValue});
+        this.tableData = res2.data.data;
+        this.loading = false;
+        // console.log("this.tableData", this.tableData);
+      } catch (error) {
+        this.$message.warning(error)
+      }
+    },
+    //缂栫爜瑙勫垯涓嬫媺妗嗘悳绱�
+    filterValue(query) {
+      console.log(query)
+      if (query !== "") {
+        this.queryReleasedList = this.characterReleasedList.filter(item => {
+          return item.name.includes(query.toString());
+        });
+      } else {
+        this.queryReleasedList = this.characterReleasedList;
+      }
+    },
+    selectHandler(val) {
+      this.selectValue = val;
+      this.characterValue = ""
+      this.getTableData()
+    },
+    getTableData() {
+      this.loading = true;
+      // const targetObject = this.characterReleasedList.find(obj => obj.oid === this.selectValue);
+      // const chartValue = targetObject.name;
+      getList({codeRuleId: this.select, chartType: "prefix", chartValue: this.characterValue}).then(res => {
+        console.log(res.data.data);
+        this.tableData = res.data.data;
+        this.loading = false;
+      });
+    },
+    addSaveHandler() {
+      if (!this.characterValue) {
+        this.$message.warning('璇峰~鍐欒娣诲姞鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "prefix",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      addSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('娣诲姞澶辫触');
+      });
+    },
+    editSaveHandler() {
+      if (this.characterEditOldValue === "") {
+        this.$message.warning('璇烽�夋嫨淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇閫夋嫨鍊�
+      }
+
+      if (this.characterValue === "") {
+        this.$message.warning('璇峰~鍐欒淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "prefix",
+        chartValue: this.characterValue,
+        oldChartValue: this.characterEditOldValue,
+        chartTypeText: targetObject.name
+      };
+
+      editSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('淇敼澶辫触');
+      });
+    },
+    delSaveHandler() {
+      //鍒ゆ柇閫夋嫨鏁版嵁characterEditOldValue
+      if (this.characterEditOldValue === "" || this.characterValue === "") {
+        this.$message.warning('璇烽�夋嫨瑕佸垹闄ょ殑鍊�');
+        return;
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "prefix",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      deleteSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('鍒犻櫎澶辫触');
+      });
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.el-header {
+  padding: 0;
+}
+</style>
diff --git a/Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue b/Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue
index f983576..fc533eb 100644
--- a/Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue
+++ b/Source/UBCS-WEB/src/views/ruleBasic/usableCharacter.vue
@@ -1,13 +1,289 @@
 <template>
+  <basic-container>
 
+    <el-header>
+      <div style="margin-bottom: 15px">
+        缂栫爜瑙勫垯锛�
+        <el-select v-model="select" :filter-method="filterValue" filterable placeholder="璇烽�夋嫨" size="small"
+                   @change="selectHandler">
+          <el-option v-for="(item,index) in queryReleasedList"
+                     :key="item.oid"
+                     :label="item.name"
+                     :value="item.oid"></el-option>
+        </el-select>
+      </div>
+    </el-header>
+    <el-main>
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        :header-cell-style="{background:'#FAFAFA',color:'#505050'}"
+        border
+        style="width: 100%;height:  calc(100vh - 320px)"
+        @cell-click="cellClickHandler">
+        <el-table-column
+          align="center"
+          label="1"
+          prop="1"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="2"
+          prop="2"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="3"
+          prop="3">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="4"
+          prop="4">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="5"
+          prop="5">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="6"
+          prop="6">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="7"
+          prop="7">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="8"
+          prop="8">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="9"
+          prop="9">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="10"
+          prop="10">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="11"
+          prop="11">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="12"
+          prop="12">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="13"
+          prop="13">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="14"
+          prop="14">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="15"
+          prop="15">
+        </el-table-column>
+      </el-table>
+    </el-main>
+    <el-footer>
+      <div style="width: 260px; display: flex; align-items: center;margin-top: 5px">
+        <p>鍊硷細</p>
+        <el-input v-model="characterValue" size="small" style="flex: 1;"></el-input>
+      </div>
+    </el-footer>
+    <div style="margin-bottom: 10px;text-align: center">
+      <el-button icon="el-icon-plus" plain size="small" type="success" @click="addSaveHandler">娣诲姞</el-button>
+      <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editSaveHandler">淇敼</el-button>
+      <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delSaveHandler">鍒犻櫎</el-button>
+    </div>
+  </basic-container>
 </template>
 
 <script>
+import {getList, addSave, editSave, deleteSave} from "@/api/code/codeCharcter"
+import {gridCodeRule} from "@/api/code/codeCharcter"
+
 export default {
-name: "usableCharacter"
+  name: "usableCharacter",
+  data() {
+    return {
+      loading: false,
+      //涓嬫媺妗嗘暟缁�
+      queryReleasedList: [],
+      //涓嬫媺妗嗗垵濮嬫暟鎹暟缁�
+      characterReleasedList: [],
+      characterValue: "",
+      characterEditOldValue: "",
+      tableData: [],
+      select: "",
+      selectValue: ""
+    }
+  },
+  watch: {
+    select: {
+      handler(newV) {
+        // console.log(newV)
+      }
+    }
+  },
+  created() {
+    this.getCodeRule();
+  },
+  methods: {
+    cellClickHandler(row, column) {
+      this.characterValue = row[column.property];
+      this.characterEditOldValue = row[column.property]
+    },
+    async getCodeRule() {
+      try {
+        // 缂栫爜瑙勫垯宸插彂甯冩暟鎹簮
+        const res = await gridCodeRule({["conditionMap" + "[lcStatus_like]"]: "Released"});
+        this.characterReleasedList = res.data.data.records;
+        this.queryReleasedList = this.characterReleasedList;
+        this.select = this.characterReleasedList[0].oid;
+        this.loading = true;
+        const res2 = await getList({codeRuleId: this.select, chartType: "charset", chartValue: this.characterValue});
+        this.tableData = res2.data.data;
+        this.loading = false;
+        // console.log("this.tableData", this.tableData);
+      } catch (error) {
+        this.$message.warning(error)
+      }
+    },
+    //缂栫爜瑙勫垯涓嬫媺妗嗘悳绱�
+    filterValue(query) {
+      console.log(query)
+      if (query !== "") {
+        this.queryReleasedList = this.characterReleasedList.filter(item => {
+          return item.name.includes(query.toString());
+        });
+      } else {
+        this.queryReleasedList = this.characterReleasedList;
+      }
+    },
+    selectHandler(val) {
+      this.selectValue = val;
+      this.characterValue = ""
+      this.getTableData()
+    },
+    getTableData() {
+      this.loading = true;
+      // const targetObject = this.characterReleasedList.find(obj => obj.oid === this.selectValue);
+      // const chartValue = targetObject.name;
+      getList({codeRuleId: this.select, chartType: "charset", chartValue: this.characterValue}).then(res => {
+        console.log(res.data.data);
+        this.tableData = res.data.data;
+        this.loading = false;
+      });
+    },
+    addSaveHandler() {
+      if (!this.characterValue) {
+        this.$message.warning('璇峰~鍐欒娣诲姞鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "charset",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      addSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('娣诲姞澶辫触');
+      });
+    },
+    editSaveHandler() {
+      if (this.characterEditOldValue === "") {
+        this.$message.warning('璇烽�夋嫨淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇閫夋嫨鍊�
+      }
+
+      if (this.characterValue === "") {
+        this.$message.warning('璇峰~鍐欒淇敼鐨勫�硷紒');
+        return; // 鍒ゆ柇杈撳叆鍊�
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "charset",
+        chartValue: this.characterValue,
+        oldChartValue: this.characterEditOldValue,
+        chartTypeText: targetObject.name
+      };
+
+      editSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('淇敼澶辫触');
+      });
+    },
+    delSaveHandler() {
+      //鍒ゆ柇閫夋嫨鏁版嵁characterEditOldValue
+      if (this.characterEditOldValue === "" || this.characterValue === "") {
+        this.$message.warning('璇烽�夋嫨瑕佸垹闄ょ殑鍊�');
+        return;
+      }
+
+      const targetObject = this.characterReleasedList.find(obj => obj.oid === this.select);
+      if (!targetObject) {
+        return; // 鏌ユ壘瀵瑰簲typeText
+      }
+      const codeRuleCharacterVO = {
+        codeRuleId: this.select,
+        chartType: "charset",
+        chartValue: this.characterValue,
+        chartTypeText: targetObject.name
+      };
+
+      deleteSave(codeRuleCharacterVO)
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.characterValue = "";
+          this.getTableData();
+        }).catch(error => {
+        this.$message.error('鍒犻櫎澶辫触');
+      });
+    }
+  }
 }
 </script>
 
-<style scoped>
-
+<style lang="scss" scoped>
+.el-header {
+  padding: 0;
+}
 </style>
diff --git a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java
index 2070d62..1f416c8 100644
--- a/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java
+++ b/Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java
@@ -18,19 +18,15 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import com.vci.ubcs.flow.core.utils.TaskUtil;
 import com.vci.ubcs.flow.engine.entity.FlowModel;
 import com.vci.ubcs.flow.engine.service.FlowEngineService;
-import com.vci.ubcs.flow.engine.service.FlowTaskUserService;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
-import org.springblade.core.launch.constant.FlowConstant;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
-import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
diff --git a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java
index fe14f86..0a2e420 100644
--- a/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java
+++ b/Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogLocalServiceImpl.java
@@ -82,7 +82,7 @@
 	 * @param logParentPath
 	 * @return
 	 */
-	//@Override
+	@Override
 	public List<LocalLogVO> getSystemLogList(String logParentPath) {
 		List<LocalLogVO> localLogsVO = new ArrayList<>();
 		// 涓嶄负绌鸿鏄庢槸鍔犺浇褰撳墠杩欎釜鏈嶅姟璺緞涓嬬殑鏃ュ織鏂囦欢
@@ -90,44 +90,48 @@
 			File file = new File(logParentPath);
 			if (file.isDirectory()) {
 				File[] files = file.listFiles();
-				Arrays.stream(files).forEach(item->{
-					// 缁勫缓鏃ュ織鏂囦欢瀵硅薄
-					LocalLogVO localLog = new LocalLogVO();
-					localLog.setLogName(item.getName());
-					localLog.setLogType(getLogType(item.getName()));
-					localLog.setCreateTime(getLastModifiedOrCreatTime(false,logParentPath));
-					localLog.setLastModifier(getLastModifiedOrCreatTime(true,logParentPath));
-					localLog.setLogPath(logParentPath);
-					String serviceId = getServiceId(logParentPath);
-					localLog.setServiceId(serviceId);
-					localLog.setServiceName(getServiceName(serviceId));
-					localLog.setHasChildren(false);
-					localLogsVO.add(localLog);
-				});
+				if(Func.isNotEmpty(files) && files.length>0){
+					Arrays.stream(files).forEach(item->{
+						// 缁勫缓鏃ュ織鏂囦欢瀵硅薄
+						LocalLogVO localLog = new LocalLogVO();
+						localLog.setLogName(item.getName());
+						localLog.setLogType(getLogType(item.getName()));
+						localLog.setCreateTime(getLastModifiedOrCreatTime(false,logParentPath));
+						localLog.setLastModifier(getLastModifiedOrCreatTime(true,logParentPath));
+						localLog.setLogPath(logParentPath);
+						String serviceId = getServiceId(logParentPath);
+						localLog.setServiceId(serviceId);
+						localLog.setServiceName(getServiceName(serviceId));
+						localLog.setHasChildren(false);
+						localLogsVO.add(localLog);
+					});
+				}
 			}
 		}else {
 			File fileDir = new File(PARENTPATH);
 			File[] childDir = fileDir.listFiles();
-			Arrays.stream(childDir).forEach(dir->{
-				if(dir.getName().contains("ubcs_")){
-					String fullPath = dir.getPath() + LOGPATH;
-					File file = new File(fullPath);
-					if(file.exists()){
-						LocalLogVO localLogVO = new LocalLogVO();
-						localLogVO.setLastModifier(getLastModifiedOrCreatTime(true,fullPath));
-						localLogVO.setCreateTime(getLastModifiedOrCreatTime(false,fullPath));
-						localLogVO.setLogPath(fullPath);
-						String serviceId = getServiceId(file.getPath());
-						localLogVO.setServiceId(serviceId);
-						String serviceName = getServiceName(serviceId);
-						localLogVO.setServiceName(serviceName);
-						localLogVO.setLogType(serviceName+"鏃ュ織鐖剁洰褰�");
-						localLogVO.setLogName(serviceName+"鏃ュ織鐖剁洰褰�");
-						localLogVO.setHasChildren(true);
-						localLogsVO.add(localLogVO);
+			if(Func.isNotEmpty(childDir) && childDir.length > 0){
+				Arrays.stream(childDir).forEach(dir->{
+					if(dir.getName().contains("ubcs_")){
+						String fullPath = dir.getPath() + LOGPATH;
+						File file = new File(fullPath);
+						if(file.exists()){
+							LocalLogVO localLogVO = new LocalLogVO();
+							localLogVO.setLastModifier(getLastModifiedOrCreatTime(true,fullPath));
+							localLogVO.setCreateTime(getLastModifiedOrCreatTime(false,fullPath));
+							localLogVO.setLogPath(fullPath);
+							String serviceId = getServiceId(file.getPath());
+							localLogVO.setServiceId(serviceId);
+							String serviceName = getServiceName(serviceId);
+							localLogVO.setServiceName(serviceName);
+							localLogVO.setLogType(serviceName+"鏃ュ織鐖剁洰褰�");
+							localLogVO.setLogName(serviceName+"鏃ュ織鐖剁洰褰�");
+							localLogVO.setHasChildren(true);
+							localLogsVO.add(localLogVO);
+						}
 					}
-				}
-			});
+				});
+			}
 		}
 		return localLogsVO;
 	}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feign/IMdmInterJtClient.java b/Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feign/IMdmInterJtClient.java
index 42920c9..ddf5d0c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feign/IMdmInterJtClient.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feign/IMdmInterJtClient.java
@@ -2,12 +2,15 @@
 
 
 import com.vci.ubcs.code.applyjtcodeservice.vo.DockingClassifyModelAttrVO;
+import com.vci.ubcs.code.applyjtcodeservice.vo.DockingPreAttrMappingVO;
 import com.vci.ubcs.code.applyjtcodeservice.vo.DockingReturnStoreVO;
 import org.springblade.core.tool.api.R;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
 
 
 /****
@@ -24,6 +27,7 @@
 	String RETURNGROUPCODE = API_PREFIX + "/getApplyGroupCode";
 	String PUBMDMMODEL = API_PREFIX + "/pubMdmModel";
 	String RECEIVE_EDITAPPLY =API_PREFIX + "/receiveEditApply";
+	String LIST_MAPPING=API_PREFIX + "/listMapping";
 
 	/***
 	 * 灏嗛泦鍥㈢敵璇锋垚鍔熺殑缂栫爜瀛樺叆鐩稿叧鏁版嵁涔嬩腑
@@ -34,6 +38,13 @@
 	@GetMapping(APPLYGROUPCODE)
 	public R applyGroupCode(@RequestParam("oids")String oids,@RequestParam("btmName")String btmName);
 
+	/***
+	 *
+	 * @param codeClassifyOid
+	 * @return
+	 */
+	@GetMapping(LIST_MAPPING)
+	public R<List<DockingPreAttrMappingVO>> list_mapping(@RequestParam("codeClassifyOid")String codeClassifyOid);
 
 	/***
 	 * 闆嗗洟缂栫爜鏁版嵁淇敼
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrMappingDTO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrMappingDTO.java
new file mode 100644
index 0000000..cc86306
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrMappingDTO.java
@@ -0,0 +1,50 @@
+package com.vci.ubcs.code.dto;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/***
+ * 闆嗗洟鍩熷睘鎬ф槧灏勫叧绯�
+ */
+@Data
+public class CodeAndGroupCodeAttrMappingDTO {
+
+	/***
+	 * 榛樿鍊�
+	 */
+	private String defaultValue;
+	/***
+	 *灞炴�d
+	 */
+	private String metaListId;
+
+	/***
+	 * 婧愬睘鎬у唴閮ㄥ悕绉�
+	 */
+	private String sourceAttrKey;
+
+	/***
+	 * 婧愬睘鎬у悕绉�
+	 */
+	private String sourceAttrName;
+
+	/**
+	 * 鐩爣灞炴�id
+	 */
+	private String targetAttrId;
+
+	/***
+	 * 鐩爣灞炴�у唴閮ㄥ悕绉�
+	 */
+	private String targetAttrKey;
+
+	/***
+	 * 鐩爣灞炴�у悕绉�
+	 */
+	private String targetAttrName;
+
+	List<CodeAndGroupCodeAttrRnageDTO> codeAndGroupCodeAttrRnageDTOList;
+
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrRnageDTO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrRnageDTO.java
new file mode 100644
index 0000000..f1818c2
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeAndGroupCodeAttrRnageDTO.java
@@ -0,0 +1,30 @@
+package com.vci.ubcs.code.dto;
+
+import lombok.Data;
+
+@Data
+public class CodeAndGroupCodeAttrRnageDTO {
+
+	/***
+	 *灞炴�d
+	 */
+	private String metaListId;
+
+	/**
+	 * 灞炴�ф灇涓炬樉绀哄悕绉�
+	 */
+	private  String numText;
+	/**
+	 * 灞炴�ф灇涓惧唴閮ㄥ悕绉�
+	 */
+	private String numTextValue;
+
+	/**
+	 * 婧愬睘鎬ф灇涓炬樉绀哄悕绉�
+	 */
+	private  String targetNumText;
+	/**
+	 * 婧愬睘鎬ф灇涓惧唴閮ㄥ悕绉�
+	 */
+	private String targetNumTextValue;
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/ExecGroupCodePortDataDTO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/ExecGroupCodePortDataDTO.java
new file mode 100644
index 0000000..451b70f
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/ExecGroupCodePortDataDTO.java
@@ -0,0 +1,32 @@
+package com.vci.ubcs.code.dto;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class ExecGroupCodePortDataDTO {
+	/***
+     * sheet鍚嶇О
+	 */
+	private String sheetName;
+	/***
+     * 鍘熷瀛楁
+	 */
+	private LinkedList<String> fieldList=new LinkedList<>();
+	/**
+	 * 鏁版嵁闆嗘垚
+	 */
+	private List<Map<String,String>> dataList=new ArrayList<>();
+	/***
+     * 鍒楀悕
+	 */
+	private LinkedList<String> colName=new LinkedList<>();
+	/***
+	 * 闆嗗洟灞炴�т笌缂栫爜灞炴�ф槧灏勫叧绯�
+	 */
+	private List<CodeAndGroupCodeAttrMappingDTO> codeAttrMapGroupAttrDTOS=new ArrayList<>();
+}
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
index 74ce347..bad7da2 100644
--- 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
@@ -23,6 +23,10 @@
 	 * 瀛楃闆�
 	 */
 	private String chartValue;
+	/**
+	 * 闇�鏇挎崲鐨勫瓧绗�
+	 */
+	private String oldChartValue;
 	/***
 	 * 瀛楃绫诲瀷
 	 */
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\244\247\344\272\2161\347\232\204.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\050\350\267\250\345\271\264\051.json"
similarity index 100%
rename from "Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\244\247\344\272\2161\347\232\204.json"
rename to "Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\050\350\267\250\345\271\264\051.json"
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\347\263\273\345\210\227\346\265\201\346\260\264\347\224\263\350\257\267\345\244\247\344\272\2161.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\347\263\273\345\210\227\344\277\256\350\256\242\357\274\210\350\267\250\345\271\264\357\274\211.json"
similarity index 100%
rename from "Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\347\263\273\345\210\227\346\265\201\346\260\264\347\224\263\350\257\267\345\244\247\344\272\2161.json"
rename to "Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\347\263\273\345\210\227\344\277\256\350\256\242\357\274\210\350\267\250\345\271\264\357\274\211.json"
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\347\263\273\345\210\227\346\265\201\346\260\264.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\347\263\273\345\210\227\347\224\263\350\257\267.json"
similarity index 100%
rename from "Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\347\263\273\345\210\227\346\265\201\346\260\264.json"
rename to "Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\347\263\273\345\210\227\347\224\263\350\257\267.json"
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SpecialCharacterConverter.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SpecialCharacterConverter.java
new file mode 100644
index 0000000..f5e9c38
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/SpecialCharacterConverter.java
@@ -0,0 +1,35 @@
+package com.vci.ubcs.starter.util;
+
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringEscapeUtils;
+
+/**
+ *
+ * @author ludc
+ * @date 2023/12/1 9:16
+ */
+public class SpecialCharacterConverter {
+
+	/**
+	 * 鐗规畩瀛楃杞箟
+	 * @param input
+	 * @return
+	 */
+	public static String escapeSpecialCharacters(String input) {
+		input = input.replace("'", "''"); // 杞箟鍗曞紩鍙�
+		input = input.replace("\"", "\\\""); // 杞箟鍙屽紩鍙�
+		input = input.replace("%", "\\%"); // 杞箟鐧惧垎鍙�
+		input = input.replace("_", "\\_"); // 杞箟涓嬪垝绾�
+		input = input.replace("\\", "\\\\"); // 杞箟鍙嶆枩鏉�
+		return input;
+	}
+
+	public static String unescapeSpecialCharacters(String input) {
+		input = input.replace("''", "'"); // 鍙嶈浆涔夊崟寮曞彿
+		input = input.replace("\\\"", "\""); // 鍙嶈浆涔夊弻寮曞彿
+		input = input.replace("\\%", "%"); // 鍙嶈浆涔夌櫨鍒嗗彿
+		input = input.replace("\\_", "_"); // 鍙嶈浆涔変笅鍒掔嚎
+		input = input.replace("\\\\", "\\"); // 鍙嶈浆涔夊弽鏂滄潬
+		return input;
+	}
+
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java
index 0924909..42e4177 100644
--- a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java
@@ -56,8 +56,10 @@
 	 * 闆嗗洟鍒嗙被鐢宠鍗曟湇鍔�
 	 */
 	private final IDockingPreClassifyService dockingPreClassifyService;
-
-
+	/***
+	 * 灞炴�ф槧灏勬湇鍔�
+	 */
+	private final IDockingPreAttrMappingService dockingPreAttrMappingService;
 	/**
 	 * 闆嗗洟鍙栧�艰寖鍥寸敵璇峰崟鏈嶅姟
 	 */
@@ -81,6 +83,22 @@
 			return R.fail("闆嗗洟鐮佺敵璇峰け璐ワ細"+e.getMessage());
 		}
 	}
+
+	/***
+	 * 鏌ヨ闆嗗洟灞炴�ф槧灏�
+	 * @param codeClassifyOid:缂栫爜鍒嗙被oid
+	 * @return
+	 */
+	@Override
+	public R<List<DockingPreAttrMappingVO>> list_mapping(String codeClassifyOid) {
+		List<DockingPreAttrMapping> dockingPreAttrMappings=	dockingPreAttrMappingService.selectByWrapper(Wrappers.<DockingPreAttrMapping>query().lambda().eq(DockingPreAttrMapping::getTargetClassifyId,codeClassifyOid));
+		List<DockingPreAttrMappingVO> dockingPreAttrMappingVOList=new ArrayList<>();
+		if(!CollectionUtils.isEmpty(dockingPreAttrMappings)){
+			dockingPreAttrMappingVOList=dockingPreAttrMappingService.dockingPreAttrMappingDO2VOS(dockingPreAttrMappings,true);
+		}
+		return R.data(dockingPreAttrMappingVOList);
+	}
+
 	/***
 	 * 鐢宠闆嗗洟缂栫爜鏁版嵁缁存姢
 	 * @return
diff --git a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/IDockingPreAttrMappingService.java b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/IDockingPreAttrMappingService.java
index 28a6f73..b28d66d 100644
--- a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/IDockingPreAttrMappingService.java
+++ b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/IDockingPreAttrMappingService.java
@@ -8,6 +8,7 @@
 import com.vci.ubcs.starter.exception.VciBaseException;
 import org.springblade.core.tool.api.R;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -51,4 +52,12 @@
 	 * @return
 	 */
 	public R search(DokingAttributeSerchVO dokingAttributeSerchVO);
+
+	/***
+	 * 杞崲闆嗗洟灞炴�ф槧灏勯厤缃�
+	 * @param dockingPreAttrMappings
+	 * @param contain 鏄惁鏌ュ巻鍙叉暟鎹�
+	 * @return
+	 */
+	List<DockingPreAttrMappingVO> dockingPreAttrMappingDO2VOS(Collection<DockingPreAttrMapping> dockingPreAttrMappings, boolean contain);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java
index 86a2b9b..0711970 100644
--- a/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/DockingPreAttrMappingServiceImpl.java
@@ -242,7 +242,8 @@
 	 * @param dockingPreAttrMappings
 	 * @return
 	 */
-	private List<DockingPreAttrMappingVO> dockingPreAttrMappingDO2VOS(Collection<DockingPreAttrMapping> dockingPreAttrMappings,boolean contain) {
+	@Override
+	public List<DockingPreAttrMappingVO> dockingPreAttrMappingDO2VOS(Collection<DockingPreAttrMapping> dockingPreAttrMappings,boolean contain) {
 		List<DockingPreAttrMappingVO> dockingPreAttrMappingVOList=new ArrayList<>();
 			dockingPreAttrMappingVOList=DockingPreAttrMappingWrapper.build().entityVOs(dockingPreAttrMappings);
 			if(CollectionUtils.isEmpty(dockingPreAttrMappingVOList)){
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeFixedValueController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeFixedValueController.java
index 7dec639..9b44d22 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeFixedValueController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeFixedValueController.java
@@ -132,7 +132,7 @@
             dtoList.add(codeFixedValueDTO);
         }
         String codefixedsecoid = (String) param.get("codeFixedSecOid");
-        VciBaseUtil.alertNotNull(dtoList,"鐮佸�煎璞¢泦鍚�",codefixedsecoid,"鍥哄畾鐮佹鐨勪富閿�");
+        VciBaseUtil.alertNotNull(codefixedsecoid,"鍥哄畾鐮佹鐨勪富閿�");
         if (CollectionUtils.isEmpty(dtoList)){
             return R.status(codeFixedValueService.batchDeleteBySecOid(codefixedsecoid));
         }
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
index a7f08a7..5d6b29a 100644
--- 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
@@ -35,7 +35,7 @@
 	 */
 	@PostMapping("/addSave")
 	public R addSave(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
-		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
+		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO,1);
 	}
 	/**
 	 * 淇敼瑙勫垯瀵硅薄
@@ -44,7 +44,7 @@
 	 */
 	@PostMapping("/editSave")
 	public R editSave(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
-		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
+		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO,2);
 	}
 
 	/**
@@ -54,6 +54,6 @@
 	 */
 	@PostMapping("/delete")
 	public R delete(@RequestBody CodeRuleCharacterVO codeRuleCharacterVO){
-		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO);
+		return iCodeRuleCharacterService.saveOrUpdate(codeRuleCharacterVO,3);
 	}
 }
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 dd8b910..e4e3328 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
@@ -312,7 +312,7 @@
 			s = engineService.addSaveCode(orderDTO);
 			saveLogUtil.operateLog("缂栫爜鐢宠",false,orderDTO.toString());
 		}catch (Exception e){
-			saveLogUtil.operateLog("缂栫爜鐢宠",true,e.getMessage());
+			saveLogUtil.operateLog("缂栫爜鐢宠",true,e.toString());
 			throw e;
 		}
 		return R.success(s);
@@ -769,4 +769,26 @@
 	public R addSaveBZ (@RequestBody CodeBZApplyDTO codeBZApplyDTO) throws Exception {
 		return R.success(engineService.addSaveBZ(codeBZApplyDTO));
 	}
+
+	/**
+	 * 涓嬭浇鎵归噺鐢宠鐨勫鍏ユā鏉�
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param response 鍝嶅簲瀵硅薄
+	 * @throws IOException 鎶涘嚭寮傚父
+	 */
+	@GetMapping("/exportGroupCodeExcel")
+	@VciBusinessLog(operateName = "瀵煎嚭闆嗗洟鐮�")
+	public void exportGroupCodeExcel(String codeClassifyOid, HttpServletResponse response) throws IOException{
+
+		try {
+			String excelName = mdmIOService.exportGroupCodeExcel(codeClassifyOid);
+		} catch (Throwable e) {
+			//濡傛灉鍑洪敊,鎶婇敊璇俊鎭啓鍒皌ext
+			String msg = LangBaseUtil.getErrorMsg(e);
+			if(StringUtils.isBlank(msg)){
+				msg = "鏈煡閿欒";
+			}
+			ControllerUtil.writeDataToResponse(response,msg.getBytes(StandardCharsets.UTF_8),null);
+		}
+	}
 }
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
index f96aada..f91c7cd 100644
--- 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
@@ -32,8 +32,9 @@
 	/***
 	 * 淇濆瓨缂栫爜瑙勫垯瀛楃闆�
 	 * @param codeRuleCharacterVO
+	 * @param operationType
 	 * @return
 	 */
-	R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO)throws VciBaseException;
+	R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO,int operationType)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 d063ec2..4b2e394 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
@@ -1,5 +1,6 @@
 package com.vci.ubcs.code.service;
 
+import com.google.protobuf.ServiceException;
 import com.vci.ubcs.code.dto.CodeExportAttrDTO;
 import com.vci.ubcs.code.dto.CodeOrderDTO;
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
@@ -119,4 +120,11 @@
 	 * @param operationType
 	 */
 	void sendApplyGroupcode(List<String> idList,String btmName,String operationType);
+
+	/***
+	 * 瀵煎嚭闆嗗洟鐮佹ā鏉�
+	 * @param classOid
+	 * @return
+	 */
+	String exportGroupCodeExcel(String classOid) throws ServiceException;
 }
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
index aaabd6f..edff3be 100644
--- 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
@@ -10,6 +10,7 @@
 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.poi.bo.SheetRowData;
 import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import org.springblade.core.tool.api.R;
@@ -41,19 +42,22 @@
 	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));
+		if(codeRuleCharacter!=null&&StringUtils.isNotBlank(codeRuleCharacter.getOid())){
+			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);
 			}
-			charValueList.add(chartMap);
 		}
+
 		return charValueList;
 	}
 	/***
@@ -63,20 +67,48 @@
 	 * @throws VciBaseException
 	 */
 	@Override
-	public R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO) throws VciBaseException {
+	public R saveOrUpdate(CodeRuleCharacterVO codeRuleCharacterVO,int operation) 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 + "銆�");
+			if(operation==1) {//鏂板鏃跺��
+				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);
+			}else if(operation==2){//淇敼
+				String oldChartValue= codeRuleCharacterVO.getOldChartValue();
+				String chartValue= codeRuleCharacterVO.getChartValue();
+				Map<String,String> oldChartNewChartMap=new HashMap<>();
+				List<Character> chartValueList = StringUtils.isBlank(chartValue)?new ArrayList<>():chartValue.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
+				List<Character> oldChartValueList = StringUtils.isBlank(oldChartValue)?new ArrayList<>():oldChartValue.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
+
+			    if(chartValueList.size()!=oldChartValueList.size()){
+					throw new VciBaseException("鏇挎崲鐨勫�间釜鏁颁笌閫変腑鍊肩殑涓暟涓嶇浉绛�");
+				}
+				/***
+				 * id
+				 */
+				for (int i=0;i<oldChartValueList.size();i++){
+					Character oldValue=oldChartValueList.get(i);
+					if(oldCharacterList.contains(oldValue)){
+						int index =oldCharacterList.indexOf(oldValue);
+						oldCharacterList.set(index,chartValueList.get(i));
+					}
+				}
+				String str = oldCharacterList.stream().map(integer -> Func.isNotEmpty(integer) ? integer.toString() : "").collect(Collectors.joining());
+				codeRuleCharacter.setChartValue(str);
+			}else{//鍒犻櫎
+				oldCharacterList.removeAll(newCharacterList);
+				String str = oldCharacterList.stream().map(integer -> Func.isNotEmpty(integer) ? integer.toString() : "").collect(Collectors.joining());
+				codeRuleCharacter.setChartValue(str);
 			}
-			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();
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 2dd56b5..2ddc23a 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
@@ -44,6 +44,7 @@
 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.SpecialCharacterConverter;
 import com.vci.ubcs.starter.util.UBCSSqlKeyword;
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.constant.RegExpConstant;
@@ -464,7 +465,7 @@
 			);
 		}catch (Exception e){
 			// 鎻掑叆鏇存敼鏃ュ織璁板綍
-			saveLogUtil.operateLog(CodeDefaultLC.getTextByValue(baseModelDTO.getLcStatus()),true,e.getMessage());
+			saveLogUtil.operateLog(CodeDefaultLC.getTextByValue(baseModelDTO.getLcStatus()),true,e.toString());
 			throw e;
 		}
     }
@@ -791,6 +792,7 @@
                 sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
             }
             sql[0] += " and lastR = '1' and lastV = '1' ";
+			// 鑾峰彇涓嶅弬涓庢牎楠岀殑鍒嗙被oid
 			String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
 			if(Func.isNotEmpty(isParticipateCheckOids)){
 				sql[0] += " and codeclsfid not in(" + isParticipateCheckOids + ")";
@@ -1193,12 +1195,12 @@
                     temp = "%s";
                 }
                 queryKey = String.format(temp, "nvl("+ "t." + attrId +",'/')");
-                queryValue = String.format(temp, "'" + (trim ? value.trim() : value) + "'");
+                queryValue = String.format(temp, "'" + (trim ? SpecialCharacterConverter.escapeSpecialCharacters(value.trim()):SpecialCharacterConverter.escapeSpecialCharacters(value)) + "'");
                 conditionMap.put(queryKey, queryValue);
             } else {
 				if(StringUtils.isNotBlank(value)) {
 					//涓虹┖鐨勬椂鍊欎笉浠h〃涓嶆牎楠岋紝鍙槸涓嶅幓闄ょ浉鍏崇殑淇℃伅
-					conditionMap.put("nvl("+ "t." + attrId+",'/')", "'" + value + "'");
+					conditionMap.put("nvl("+ "t." + attrId+",'/')", "'" + SpecialCharacterConverter.escapeSpecialCharacters(value) + "'");
 				}else{
 					conditionMap.put("t." + attrId, QueryOptionConstant.ISNULL);
 				}
@@ -2472,7 +2474,6 @@
 				return getSqlByValue(key, value, attrVOMap,btmType);
 			}
 		}*/
-
     }
 
     /**
@@ -3112,7 +3113,7 @@
 			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());
+			saveLogUtil.operateLog("鏁版嵁鏇存敼",true,vciError.toString());
 			throw new VciBaseException("鏁版嵁鏇存敼淇濆瓨鍑洪敊浜�", new String[0], vciError);
 		}
 
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 371139a..dfc6153 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
@@ -5,12 +5,14 @@
 import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.protobuf.ServiceException;
+import com.vci.ubcs.code.applyjtcodeservice.entity.DockingPreAttrMapping;
 import com.vci.ubcs.code.applyjtcodeservice.feign.IMdmInterJtClient;
+import com.vci.ubcs.code.applyjtcodeservice.vo.DockingPreAttrMappingVO;
 import com.vci.ubcs.code.bo.AttributeValue;
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
-import com.vci.ubcs.code.dto.CodeExportAttrDTO;
-import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.constant.MdmEngineConstant;
+import com.vci.ubcs.code.dto.*;
 import com.vci.ubcs.code.entity.CodeAllCode;
 import com.vci.ubcs.code.enumpack.CodeDefaultLC;
 import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
@@ -843,7 +845,7 @@
 				}
 				// 鍗曟瀵煎叆鏁伴噺闄愬埗
 				if(sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT){
-					throw new ServiceException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�"+IMPORT_DATA_LIMIT+"鏉$殑鏁版嵁");
+					throw new ServiceException(StringUtil.format("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩噞}鏉$殑鏁版嵁",IMPORT_DATA_LIMIT));
 				}
 				//鍘嗗彶瀵煎叆鐨勬椂鍊欎笉澶勭悊缂栫爜
 				//----閫昏緫鍐呭----
@@ -1132,7 +1134,7 @@
 			if(StringUtils.isNotBlank(excelFileName)) {
 				codeImProtRusultVO.setFilePath(excelFileName);
 				codeImProtRusultVO.setFileOid("");
-				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true, StringUtil.format("閿欒淇℃伅锛歿}",JSON.toJSONString(shetNameMap)) );
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true, StringUtil.format("閿欒淇℃伅锛歿}",JSON.toJSONString(shetNameMap)));
 			}else{
 				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",false, StringUtil.format("瀵煎叆鍒板垎绫粄}涓紝瀵煎叆鎴愬姛鎬绘暟涓猴細{}", JSON.toJSONString(classifyFullInfo),importCount.get(0)));
 			}
@@ -1141,7 +1143,7 @@
 			}
 			return codeImProtRusultVO;
 		}catch (Exception e){
-			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true,e.getMessage());
+			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true,e.toString());
 			throw e;
 		}
 	}
@@ -1456,7 +1458,7 @@
 			}
 			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜",false, StringUtil.format("鎵归噺瀵煎叆鐢宠鎴愬姛鍏眥}鏉℃暟鎹紝鐢熸垚鐨勭爜鍊煎涓嬨�恵}銆�",codeList.size(),codeList));
 		}catch (Exception e){
-			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜",true,e.getMessage());
+			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜",true,e.toString());
 			throw e;
 		}
 		return uuid;
@@ -3824,7 +3826,7 @@
 	private void batchSwitchClassifyAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,
 												CodeClassifyFullInfoBO classifyFullInfo,boolean isImPort) {
 		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(
-			s -> StringUtils.isNotBlank(s.getClassifyInvokeAttr()) && StringUtils.isNotBlank(s.getClassifyInvokeAttr())
+			s -> StringUtils.isNotBlank(s.getClassifyInvokeAttr())
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 		Map<String,CodeClassifyFullInfoBO> classifyFullInfoMap=new HashMap<>();
 		classifyFullInfoMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(),classifyFullInfo);
@@ -3861,6 +3863,7 @@
 						} else {
 							Map<String, String> classifyDataMap = VciBaseUtil.objectToMapString(classifyVO);
 							String value = classifyDataMap.getOrDefault(attrVO.getClassifyInvokeAttr(), "");
+							log.error("================================褰撳墠鍒嗙被娉ㄥ叆鐨剉alue鍊间负锛�==========================",value);
 							cbo.setAttributeValue(attrId, value);
 						}
 					} catch (Throwable e) {
@@ -4605,4 +4608,196 @@
 		}
 	}
 
+	/***
+	 * @param codeClassifyOid
+	 * @return
+	 */
+	@Override
+	public String exportGroupCodeExcel(String codeClassifyOid) throws ServiceException {
+		VciBaseUtil.alertNotNull(codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
+		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
+		CodeClassifyVO codeClassifyVO= classifyFullInfo.getCurrentClassifyVO();
+		//鑾峰彇鏈�鏂扮殑妯℃澘
+		CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
+		LinkedList<String> colName=new LinkedList<>();//鍒楀ご
+		LinkedList<String> fieldList=new LinkedList<>();//鍒楀瓧娈�
+
+		ExecGroupCodePortDataDTO execGroupCodePortDataDTO=new ExecGroupCodePortDataDTO();
+		createExportGroupCodeMapConfig(templateVO,execGroupCodePortDataDTO);//缁勭粐鏁版嵁
+		if(!CollectionUtils.isEmpty(execGroupCodePortDataDTO.getCodeAttrMapGroupAttrDTOS())){
+			throw new ServiceException("闆嗗洟灞炴�ф槧灏勬湭閰嶇疆");
+		}
+		fieldList=execGroupCodePortDataDTO.getFieldList();
+		List<Map<String,String>>dataList=new ArrayList<>();
+		getDatas(classifyFullInfo,templateVO,fieldList,dataList);
+		execGroupCodePortDataDTO.setDataList(dataList);//鏀炬暟鎹�
+		execGroupCodePortDataDTO.setSheetName(codeClassifyVO.getName()+"闆嗗洟鐮佸鍏ユā鏉�");
+		String tempFolder = LocalFileUtil.getDefaultTempFolder();
+		String excelName = tempFolder + File.separator +
+			classifyFullInfo.getCurrentClassifyVO().getId() + "_" + classifyFullInfo.getCurrentClassifyVO().getName() + "_闆嗗洟鐮佸鍑烘ā鏉�.xls";
+		try {
+			new File(excelName).createNewFile();
+		} catch (Throwable e) {
+			throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[]{excelName}, e);
+		}
+		LinkedList<String> finalFieldList = fieldList;
+		Map<String, CodeClassifyTemplateAttrVO> attrVOMap = templateVO.getAttributes().stream().filter(s-> finalFieldList.contains(s.getId().toLowerCase(Locale.ROOT))).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		List<WriteExcelData> excelDataList = new ArrayList<>();
+		Workbook workbook = new HSSFWorkbook();
+		List<CodeAndGroupCodeAttrMappingDTO>  codeAndGroupCodeAttrMappingDTOList=	execGroupCodePortDataDTO.getCodeAttrMapGroupAttrDTOS();
+
+		Map<String, CodeAndGroupCodeAttrMappingDTO> jAttrVOMap = codeAndGroupCodeAttrMappingDTOList.stream().filter(s-> finalFieldList.contains(s.getTargetAttrKey().toLowerCase(Locale.ROOT))).collect(Collectors.toMap(s -> s.getTargetAttrKey().toLowerCase(Locale.ROOT), t -> t));
+
+		WriteExcelData codeExcelData = new WriteExcelData(0, 0, "浼佷笟缂栫爜");
+		WriteExcelData groupExcelData = new WriteExcelData(0, 1, "闆嗗洟鐮�");
+		excelDataList.add(codeExcelData);
+		excelDataList.add(groupExcelData);
+		for (int i = 0; i < fieldList.size(); i++) {
+			String attrId=fieldList.get(i);
+			if(attrId.equals(CODE_FIELD)||attrId.equals(CODE_GROUP_FIELD)){
+				continue;
+			}
+			if (attrVOMap.containsKey(attrId)) {
+				CodeClassifyTemplateAttrVO attrVO = attrVOMap.get(attrId);
+				//Object text = attrVO.getName();
+				CodeAndGroupCodeAttrMappingDTO codeAttrMappingDTO = jAttrVOMap.get(attrId);
+				Object text = codeAttrMappingDTO.getSourceAttrName();
+				text = exportKeyAndRequired(workbook, attrVO, text);
+				WriteExcelData excelData = new WriteExcelData(0, i, text);
+				if (text instanceof RichTextString) {
+					excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
+				}
+				excelDataList.add(excelData);
+			}
+		}
+		final Integer[] rowIndex = {0};
+		dataList.stream().forEach(data -> {
+			rowIndex[0]++;
+			String id=data.getOrDefault("id", "");
+			excelDataList.add(new WriteExcelData(rowIndex[0], 0, id));
+			String groupCode=data.getOrDefault("groupcode", "");
+			excelDataList.add(new WriteExcelData(rowIndex[0], 1, groupCode));
+			List<String> newFieldList = finalFieldList.stream().filter(e -> !e.equals("id") &&!e.equals("groupcode")).collect(Collectors.toList());
+
+			for (int i = 0; i < newFieldList.size(); i++) {
+				String attrId = newFieldList.get(i).toLowerCase(Locale.ROOT);
+				if(attrId.equals("id")){
+
+				}else if(attrId.equals("groupcode")){
+
+				}else{
+					if (attrVOMap.containsKey(attrId)) {
+						CodeClassifyTemplateAttrVO attrVO = attrVOMap.get(attrId);
+						if (StringUtils.isNotBlank(attrVO.getEnumId()) || StringUtils.isNotBlank(attrVO.getEnumString())) {
+							attrId = attrId + "Text";
+						}
+						if (StringUtils.isNotBlank(attrVO.getReferBtmId()) || StringUtils.isNotBlank(attrVO.getReferConfig())) {
+							attrId = attrId + "name";
+						}
+						if (VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(attrId)) {
+							attrId = VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT);
+						}
+						excelDataList.add(new WriteExcelData(rowIndex[0], i+2, data.getOrDefault(attrId, "")));
+					}
+				}
+			}
+		});
+		WriteExcelOption excelOption = new WriteExcelOption();
+		excelOption.addSheetDataList(execGroupCodePortDataDTO.getSheetName(),excelDataList);
+
+		//澧炲姞妯℃澘鐨勪俊鎭鍏�
+		LinkedList<WriteExcelData> tempEDList = new LinkedList<>();
+		tempEDList.add(new WriteExcelData(0,0,"妯℃澘涓婚敭"));
+		tempEDList.add(new WriteExcelData(0,1,"妯℃澘浠e彿"));
+		tempEDList.add(new WriteExcelData(0,2,"妯℃澘鍚嶇О"));
+		tempEDList.add(new WriteExcelData(1,0,templateVO.getOid()));
+		tempEDList.add(new WriteExcelData(1,1,templateVO.getId()));
+		tempEDList.add(new WriteExcelData(1,2,templateVO.getName()));
+		excelOption.addSheetDataList("妯℃澘淇℃伅銆愯鍕垮垹闄ゆ垨绉诲姩銆�",tempEDList);
+		ExcelUtil.writeDataToFile(excelName, excelOption);
+		log.info("鏂囦欢璺緞"+excelName);
+		return excelName;
+	}
+
+	/***
+	 * 闆嗗洟瀵煎嚭妯℃澘灞炴�ф槧灏勪俊鎭幏鍙�
+	 * @param templateVO
+	 * @param execGroupCodePortDataDTO
+	 */
+	private void createExportGroupCodeMapConfig(CodeClassifyTemplateVO templateVO,ExecGroupCodePortDataDTO execGroupCodePortDataDTO){
+		String classOid=templateVO.getCodeclassifyoid();
+		String templateOid=templateVO.getOid();
+		R r=mdmInterJtClient.list_mapping(classOid);
+		if(r.isSuccess()){
+			List<DockingPreAttrMappingVO>dockingPreAttrMappingVOList= (List<DockingPreAttrMappingVO>) r.getData();
+			List<CodeAndGroupCodeAttrMappingDTO> codeAttrMapGroupAttrDTOS=new ArrayList<>();
+			LinkedList<String> fieldList=new LinkedList<>();
+			LinkedList<String> colNameList=new LinkedList<>();
+			dockingPreAttrMappingVOList.stream().forEach(dockingPreAttrMappingVO -> {
+				CodeAndGroupCodeAttrMappingDTO codeAndGroupCodeAttrMappingDTO=new CodeAndGroupCodeAttrMappingDTO();
+				if(StringUtils.isNotBlank(dockingPreAttrMappingVO.getTargetAttrId())){
+					codeAndGroupCodeAttrMappingDTO.setDefaultValue(dockingPreAttrMappingVO.getDefaultValue());
+					codeAndGroupCodeAttrMappingDTO.setMetaListId(dockingPreAttrMappingVO.getMetaListId());
+					codeAndGroupCodeAttrMappingDTO.setSourceAttrKey(dockingPreAttrMappingVO.getSourceAttrKey());
+					codeAndGroupCodeAttrMappingDTO.setSourceAttrName(dockingPreAttrMappingVO.getSourceAttrName());
+					codeAndGroupCodeAttrMappingDTO.setTargetAttrId(dockingPreAttrMappingVO.getTargetAttrId());
+					codeAndGroupCodeAttrMappingDTO.setTargetAttrKey(dockingPreAttrMappingVO.getTargetAttrKey());
+					codeAndGroupCodeAttrMappingDTO.setTargetAttrName(dockingPreAttrMappingVO.getTargetAttrName());
+					fieldList.add(dockingPreAttrMappingVO.getTargetAttrKey());
+					colNameList.add(dockingPreAttrMappingVO.getSourceAttrName());
+				}
+				codeAttrMapGroupAttrDTOS.add(codeAndGroupCodeAttrMappingDTO);
+			});
+			execGroupCodePortDataDTO.setCodeAttrMapGroupAttrDTOS(codeAttrMapGroupAttrDTOS);
+			execGroupCodePortDataDTO.setFieldList(fieldList);
+			execGroupCodePortDataDTO.setColName(colNameList);
+		}
+	}
+
+	/***
+	 * 鏌ヨ鏈湁闆嗗洟鐮佺殑鏁版嵁
+	 * @param classifyFullInfo
+	 * @param templateVO
+	 * @param selectFieldList
+	 * @param dataList
+	 */
+	private void getDatas(CodeClassifyFullInfoBO classifyFullInfo,CodeClassifyTemplateVO templateVO,LinkedList<String> selectFieldList,List<Map<String,String>>dataList){
+		//鍏堟煡璇㈡暟鎹�
+		String btmTypeId = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
+		String codeClassifyOid=classifyFullInfo.getCurrentClassifyVO().getOid();
+		Map<String, String> conditionMap = new HashMap<>();
+		if(conditionMap == null){
+			conditionMap = new HashMap<>();
+		}
+		if(conditionMap.containsKey(VciQueryWrapperForDO.OID_FIELD)){
+			conditionMap.put(VciQueryWrapperForDO.OID_FIELD,QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(conditionMap.get(VciQueryWrapperForDO.OID_FIELD)) + ")");
+		}
+		conditionMap.put("codeclsfpath","*" + codeClassifyOid + "*");
+		conditionMap.put("groupcode_null", "null");
+		conditionMap.put("lastr", "1");
+		conditionMap.put("lastv", "1");
+
+		R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Arrays.asList(btmTypeId));
+		String tableName = "";
+		if(listR.isSuccess() && !listR.getData().isEmpty()){
+			tableName = Func.isNotBlank(listR.getData().get(0).getTableName()) ? listR.getData().get(0).getTableName():VciBaseUtil.getTableName(btmTypeId);
+		}else{
+			tableName = VciBaseUtil.getTableName(btmTypeId);
+		}
+		PageHelper pageHelper = new PageHelper();
+		pageHelper.setLimit(1000000);
+		pageHelper.setPage(1);
+		pageHelper.addDefaultDesc("createTime");
+		DataGrid<Map<String, String>> dataGrid = engineService.queryGrid(btmTypeId, templateVO, conditionMap, pageHelper);
+		//杞崲鏁版嵁
+		if(!CollectionUtils.isEmpty(dataGrid.getData())){
+			dataList.addAll(dataGrid.getData());
+		}
+		//灏佽鏌ヨ鍑烘潵鐨勬暟鎹�
+		engineService.wrapperData(dataList, templateVO, selectFieldList,false);
+		//modify by weidy@2022-09-27
+		//鍥犱负鍦ㄥ垪琛ㄥ拰琛ㄥ崟鐨勬樉绀虹殑鏃跺�欙紝鎴戜滑鐨勫紑鍏崇被鍨嬮〉闈細澶勭悊锛屼絾鏄湪瀵煎嚭鐨勬椂鍊欙紝鎴戜滑闇�瑕佸皢true鍜宖alse閮芥浛鎹㈡垚涓枃
+		engineService.wrapperBoolean(dataList,templateVO);
+		log.info("瀵煎嚭妯℃澘鐨勬暟鎹潯鐩暟:"+dataList.size());
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml
index dd22b32..049f925 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml
@@ -559,12 +559,6 @@
             connect by prior codeclassify0.PARENTCODECLASSIFYOID = codeclassify0.oid
     </select>
 
-    <select id="selectStartWithCurrentOid" resultMap="plCodeClassifyResultMap">
-        select * from <include refid="tableName"/>
-                          start with oid = #{oid}
-        connect by prior oid = parentcodeclassifyoid;
-    </select>
-
     <update id="batchUpdateLcStatus" parameterType="java.util.List">
         BEGIN
         <foreach collection="records" item="item" index="index" separator=";">

--
Gitblit v1.9.3