From d9183aa80ae17d36b79dda48c6b1d7fa22a80ee3 Mon Sep 17 00:00:00 2001
From: xiejun <xiejun@vci-tech.com>
Date: 星期三, 22 一月 2025 11:20:41 +0800
Subject: [PATCH] 现场型号代号/人员/组织接口调试

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java | 4570 +++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 2,921 insertions(+), 1,649 deletions(-)

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 6ac3b6e..364dedf 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -1,18 +1,20 @@
 package com.vci.ubcs.code.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.protobuf.ServiceException;
 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.dto.*;
 import com.vci.ubcs.code.entity.CodeAllCode;
-import com.vci.ubcs.code.enumpack.CodeDefaultLC;
-import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
-import com.vci.ubcs.code.enumpack.sysIntegrationPushTypeEnum;
+import com.vci.ubcs.code.entity.CodeSynonym;
+import com.vci.ubcs.code.enumpack.*;
 import com.vci.ubcs.code.lifecycle.CodeAllCodeLC;
 import com.vci.ubcs.code.mapper.CommonsMapper;
 import com.vci.ubcs.code.service.*;
@@ -36,6 +38,7 @@
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
 import com.vci.ubcs.starter.util.LocalFileUtil;
+import com.vci.ubcs.starter.util.SaveLogUtil;
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
 import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
@@ -45,6 +48,7 @@
 import com.vci.ubcs.starter.web.util.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import oracle.sql.TIMESTAMP;
 import org.apache.commons.collections4.map.HashedMap;
 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -53,23 +57,39 @@
 import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+
 import javax.annotation.Resource;
+import javax.xml.bind.ValidationEvent;
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
 import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
@@ -80,7 +100,6 @@
 @Service
 @Slf4j
 public class MdmIOServiceImpl implements MdmIOService {
-
 
 	/**
 	 * 瀛楁
@@ -97,18 +116,25 @@
 
 	@Value("${batchadd.redis.time:6000000}")
 	public int BATCHADD_REDIS_TIME;
+
+	@Value("${batchadd.import_data_limit:5001}")
+	private Integer IMPORT_DATA_LIMIT;
+
 	/**
 	 * 涓婚搴撳垎绫荤殑鏈嶅姟
 	 */
 	@Resource
 	private ICodeClassifyService classifyService;
 
+	@Resource
+	private MdmEngineService mdmEngineService;
 
 	/**
 	 * 閫氱敤鏌ヨ
 	 */
 	@Resource
 	private CommonsMapper commonsMapper;
+
 	/****
 	 * 鐮佸�兼湇鍔�
 	 */
@@ -119,7 +145,7 @@
 	 * 妯℃澘鐨勬湇鍔�
 	 */
 	@Resource
-	private CodeClstemplateServiceImpl templateService;
+	private ICodeClstemplateService templateService;
 
 	/**
 	 * 涓绘暟鎹紩鎿庣殑鏈嶅姟
@@ -142,25 +168,35 @@
 	private ICodeKeyAttrRepeatService keyRuleService;
 
 	/**
+	 * 杩戜箟璇嶈鍒欐煡璇㈡湇鍔�
+	 */
+	@Autowired
+	ICodeSynonymService codeSynonymService;
+
+	/**
 	 * 鍏紡鐨勬湇鍔�
 	 */
 	@Autowired
 	private FormulaServiceImpl formulaService;
+
 	/**
 	 * 瑙勫垯鐨勬湇鍔�
 	 */
 	@Autowired
 	private ICodeRuleService ruleService;
+
 	/**
 	 * 涓氬姟绫诲瀷鐨勬湇鍔�
 	 */
 	@Autowired
 	private IBtmTypeClient btmTypeClient;
+
 	/***
 	 * 鐢宠闆嗗洟缂栫爜鏈嶅姟
 	 */
 	@Resource
 	private IMdmInterJtClient mdmInterJtClient;
+
 	/***
 	 * 瀵嗙骇鏈嶅姟
 	 */
@@ -168,9 +204,20 @@
 	private IWebSecretClient secretService;
 
 	/**
-	 * 瀵煎嚭鐨勫崄涓囨潯
+	 * 鏃ュ織淇濆瓨宸ュ叿绫�
 	 */
-	public static final int EXPORT_LIMIT = 100000;
+	@Autowired
+	private SaveLogUtil saveLogUtil;
+
+	/**
+	 * 瀹㈡埛鐜板満excel涓鸿�佺増鏈紝瀵煎嚭鐨勬�绘暟闄愬埗涓�65535
+	 */
+	public static final int EXPORT_LIMIT = 65535;
+
+	/**
+	 * 鑷畾涔夊苟鍙慒orkJoinPool
+	 */
+	private static final ForkJoinPool customForkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() - 1);
 
 	/**
 	 * 鎵归噺鐢宠锛氶�夊彇閫変腑鍒嗙被涓嬬殑鎵�鏈夋ā鏉垮叧閿睘鎬э紝鐩镐技灞炴�э紝蹇呭~灞炴�э紝鍐欏叆execl涓�
@@ -179,14 +226,14 @@
 	 * @return excel鐨勬枃浠跺湴鍧�
 	 */
 	@Override
-	public  String downloadTopImportExcel(String codeClassifyOid){
-		List<CodeClassifyTemplateVO> templateVOList=new ArrayList<>();
-		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘","瀵煎嚭鐨勯厤缃�",codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
+	public String downloadTopImportExcel(String codeClassifyOid) {
+		List<CodeClassifyTemplateVO> templateVOList = new ArrayList<>();
+		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘", "瀵煎嚭鐨勯厤缃�", codeClassifyOid, "涓婚搴撳垎绫荤殑涓婚敭");
 		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
-		templateVOList= templateService.childTemplates(codeClassifyOid);
-		List<CodeClassifyVO>  codeClassifyVOS=classifyService.getIdPathToNamePathByParentId(codeClassifyOid,true);
+		templateVOList = templateService.childTemplates(codeClassifyOid);
+		List<CodeClassifyVO> codeClassifyVOS = classifyService.getIdPathToNamePathByParentId(codeClassifyOid, true);
 		WriteExcelOption eo = new WriteExcelOption();
-		LinkedHashMap<String,CodeClassifyTemplateAttrVO> allFieldToOutNameMap=new LinkedHashMap<>();
+		LinkedHashMap<String, CodeClassifyTemplateAttrVO> allFieldToOutNameMap = new LinkedHashMap<>();
 		templateVOList.stream().forEach(templateVO -> {
 			//缁勫悎鏍煎紡鐨勪笉瀵煎叆锛�
 			// 鏋氫妇鐨勬彁渚涘簭鍒楃殑閫夋嫨
@@ -194,14 +241,14 @@
 			//鍙傜収鐨勮嚜琛岃緭鍏ュ悕绉�
 			//鍒嗙被娉ㄥ叆鐨勪笉鐢紝閮芥槸瀵煎叆鍚庤嚜鍔ㄥ鐞嗙殑
 			//缂栫爜锛岀姸鎬佺瓑瀛楁涓嶅鍏�
-			if(!CollectionUtils.isEmpty(templateVO.getAttributes())) {
+			if (!CollectionUtils.isEmpty(templateVO.getAttributes())) {
 				List<CodeClassifyTemplateAttrVO> templateAttrVOS = templateVO.getAttributes().stream().filter(s ->
 					!DEFAULT_ATTR_LIST.contains(s.getId())
 						&& StringUtils.isBlank(s.getComponentRule())
 						&& StringUtils.isBlank(s.getClassifyInvokeAttr())
 						&& (VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 				).collect(Collectors.toList());
-				if(CollectionUtils.isEmpty(templateAttrVOS)){
+				if (CollectionUtils.isEmpty(templateAttrVOS)) {
 					throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
 				}
 				templateAttrVOS.stream().forEach(codetemplateAttr -> {
@@ -232,36 +279,36 @@
 		//鏁寸悊濂芥墍鏈夋ā鏉块渶瑕佸啓鍏xecl鐨勫睘鎬т俊鎭�
 		Workbook workbook = new HSSFWorkbook();
 		LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
-		if(!CollectionUtils.isEmpty(allFieldToOutNameMap)){
-			excelDataList.add(new WriteExcelData(0,0,"鍒嗙被璺緞"));
+		if (!CollectionUtils.isEmpty(allFieldToOutNameMap)) {
+			excelDataList.add(new WriteExcelData(0, 0, "鍒嗙被璺緞"));
 			final int[] index = {0};
 			allFieldToOutNameMap.values().stream().forEach(attrVO -> {
 				Object text = attrVO.getName();
-				text = exportKeyAndRequired(workbook,attrVO,text);
+				text = exportKeyAndRequired(workbook, attrVO, text);
 				int colIndex = 1 + index[0]++;
 				WriteExcelData excelData = new WriteExcelData(0, colIndex, text);
-				if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())
+				if (StringUtils.isNotBlank(attrVO.getCodeDateFormat())
 					|| VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())
 					|| VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrVO.getAttributeDataType())
-					||VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
+					|| VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())) {
 					excelData.setDateFormat(VciDateUtil.DateTimeFormat);
 				}
-				if(text instanceof RichTextString){
+				if (text instanceof RichTextString) {
 					excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
 				}
 				excelDataList.add(excelData);
-				if(StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())){
+				if (StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())) {
 					//娣诲姞鏁版嵁鏈夋晥鎬�
 					List<String> enumValueList = new ArrayList<>();
 					enumValueList.add("");
 					List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
-					if(!CollectionUtils.isEmpty(valueList)){
-						valueList.stream().forEach(kv->{
+					if (!CollectionUtils.isEmpty(valueList)) {
+						valueList.stream().forEach(kv -> {
 							enumValueList.add(kv.getValue());
 						});
 					}
 					//榛樿鍔�1涓囨潯
-					WriteExcelData ed = new WriteExcelData(1,colIndex,"");
+					WriteExcelData ed = new WriteExcelData(1, colIndex, "");
 					ed.setRowTo(100);
 					ed.setColTo(colIndex);
 					ed.setValidation(true);
@@ -269,12 +316,12 @@
 					ed.setValidationErrorMsg("璇峰湪搴忓垪涓�夋嫨姝g‘鐨勫��");
 					excelDataList.add(ed);
 				}
-				if(VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
+				if (VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())) {
 					List<String> booleanList = new ArrayList<>();
 					booleanList.add("鏄�");
 					booleanList.add("鍚�");
 					//榛樿鍔�1涓囨潯
-					WriteExcelData ed = new WriteExcelData(1,colIndex,"");
+					WriteExcelData ed = new WriteExcelData(1, colIndex, "");
 					ed.setRowTo(100);
 					ed.setColTo(colIndex);
 					ed.setValidation(true);
@@ -283,16 +330,16 @@
 					excelDataList.add(ed);
 				}
 			});
-			eo.addSheetDataList(codeClassifyVO.getName()+"瀵煎叆妯℃澘",excelDataList);
+			eo.addSheetDataList(codeClassifyVO.getName() + "瀵煎叆妯℃澘", excelDataList);
 		}
 		LinkedList<WriteExcelData> classPathList = new LinkedList<>();
-		classPathList.add(new WriteExcelData(0,0,"鍒嗙被灞傜骇"));
+		classPathList.add(new WriteExcelData(0, 0, "鍒嗙被灞傜骇"));
 
-		WriteExcelData idPathWriteExcelTitle=new WriteExcelData(0,1,"鍒嗙被ID璺緞");
+		WriteExcelData idPathWriteExcelTitle = new WriteExcelData(0, 1, "鍒嗙被ID璺緞");
 		idPathWriteExcelTitle.setWidth(20);
 		idPathWriteExcelTitle.setCenter(false);
 		classPathList.add(idPathWriteExcelTitle);
-		WriteExcelData namePathWriteExcelTitle=new WriteExcelData(0,2,"鍒嗙被鍚嶇О璺緞");
+		WriteExcelData namePathWriteExcelTitle = new WriteExcelData(0, 2, "鍒嗙被鍚嶇О璺緞");
 		namePathWriteExcelTitle.setWidth(20);
 		namePathWriteExcelTitle.setCenter(false);
 		classPathList.add(namePathWriteExcelTitle);
@@ -300,23 +347,23 @@
 
 		final int[] rowIndex = {1};
 		codeClassifyVOS.stream().forEach(codeClassifyVO1 -> {
-			classPathList.add(new WriteExcelData(rowIndex[0],0,codeClassifyVO1.getDataLevel()));
+			classPathList.add(new WriteExcelData(rowIndex[0], 0, codeClassifyVO1.getDataLevel()));
 
-			String idPath=codeClassifyVO1.getIdPath().startsWith("#")?codeClassifyVO1.getIdPath().substring(1):codeClassifyVO1.getIdPath();
-			WriteExcelData idPathWriteExcelData=new WriteExcelData(rowIndex[0],1,idPath);
+			String idPath = codeClassifyVO1.getIdPath().startsWith("#") ? codeClassifyVO1.getIdPath().substring(1) : codeClassifyVO1.getIdPath();
+			WriteExcelData idPathWriteExcelData = new WriteExcelData(rowIndex[0], 1, idPath);
 			idPathWriteExcelData.setWidth(30);
 			idPathWriteExcelData.setCenter(false);
 			classPathList.add(idPathWriteExcelData);
 
-			String namePath=codeClassifyVO1.getNamePath().startsWith("#")?codeClassifyVO1.getNamePath().substring(1):codeClassifyVO1.getNamePath();
-			WriteExcelData  namePathWriteExcelData=  new WriteExcelData(rowIndex[0],2,namePath);
+			String namePath = codeClassifyVO1.getNamePath().startsWith("#") ? codeClassifyVO1.getNamePath().substring(1) : codeClassifyVO1.getNamePath();
+			WriteExcelData namePathWriteExcelData = new WriteExcelData(rowIndex[0], 2, namePath);
 			namePathWriteExcelData.setWidth(40);
 			namePathWriteExcelData.setCenter(false);
 			classPathList.add(namePathWriteExcelData);
 			rowIndex[0]++;
 		});
 
-		WriteExcelData  excelData=new WriteExcelData();
+		WriteExcelData excelData = new WriteExcelData();
 		excelData.setMerged(true);
 		excelData.setRow(1);
 		excelData.setRowTo(2);
@@ -328,11 +375,11 @@
 		excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
 		classPathList.add(excelData);
 
-		eo.addSheetDataList(codeClassifyVO.getName()+"鍒嗙被瀵圭収琛�",classPathList);
+		eo.addSheetDataList(codeClassifyVO.getName() + "鍒嗙被瀵圭収琛�", classPathList);
 
 		String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + "_瀵煎叆妯℃澘.xls";
 		// eo.addSheetDataList(templateVOList.size()+"妯℃澘淇℃伅銆愯鍕垮垹闄ゆ垨绉诲姩銆�",tempEDList);
-		ExcelUtil.writeDataToFile(excelName,eo);
+		ExcelUtil.writeDataToFile(excelName, eo);
 		return excelName;
 	}
 
@@ -340,20 +387,22 @@
 	 * 鐢熸垚瀵煎叆鐨勬枃浠�
 	 *
 	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
-	 * @param isHistory 鏄惁鍘嗗彶鏁版嵁瀵煎叆
+	 * @param isHistory       鏄惁鍘嗗彶鏁版嵁瀵煎叆
 	 * @return excel鐨勬枃浠跺湴鍧�
 	 */
 	@Override
 	public String createImportExcel(String codeClassifyOid, boolean isHistory) {
-		List<CodeClassifyTemplateVO> templateVOList=new ArrayList<>();
-
-		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘","瀵煎嚭鐨勯厤缃�",codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
+		List<CodeClassifyTemplateVO> templateVOList = new ArrayList<>();
+		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘", "瀵煎嚭鐨勯厤缃�", codeClassifyOid, "涓婚搴撳垎绫荤殑涓婚敭");
 
 		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
 
-		if(isHistory){
-			templateVOList= templateService.childTemplates(codeClassifyOid);
-		}else{
+		//鑾峰彇鐮佹瀹藉害
+		String secWidth = getCodeSegmentWidth(codeClassifyVO.getOid());
+
+		if (isHistory) {
+			templateVOList = templateService.childTemplates(codeClassifyOid);
+		} else {
 			//鎵炬ā鏉�
 			CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
 			templateVOList.add(templateVO);
@@ -363,25 +412,26 @@
 		eo.setAppend(true);
 		//澧炲姞妯℃澘鐨勪俊鎭鍏�
 		LinkedList<WriteExcelData> tempEDList = new LinkedList<>();
-		tempEDList.add(new WriteExcelData(0,0,"妯℃澘涓婚敭"));
-		tempEDList.add(new WriteExcelData(0,1,"妯℃澘浠e彿"));
-		tempEDList.add(new WriteExcelData(0,2,"妯℃澘鍚嶇О"));
-		for(int j=0;j<templateVOList.size();j++){
-			CodeClassifyTemplateVO  templateVO=templateVOList.get(j);
+		tempEDList.add(new WriteExcelData(0, 0, "妯℃澘涓婚敭"));
+		tempEDList.add(new WriteExcelData(0, 1, "妯℃澘浠e彿"));
+		tempEDList.add(new WriteExcelData(0, 2, "妯℃澘鍚嶇О"));
+		for (int j = 0; j < templateVOList.size(); j++) {
+			CodeClassifyTemplateVO templateVO = templateVOList.get(j);
 			CodeClassifyTemplateVO codeClassifyTemplateVO = new CodeClassifyTemplateVO();
-			BeanUtils.copyProperties(templateVO,codeClassifyTemplateVO);
+			BeanUtils.copyProperties(templateVO, codeClassifyTemplateVO);
 			//缁勫悎鏍煎紡鐨勪笉瀵煎叆锛�
 			// 鏋氫妇鐨勬彁渚涘簭鍒楃殑閫夋嫨
 			//鏃堕棿鍏ㄩ儴缁熶竴涓簓yyy-MM-dd HH:mm:ss
 			//鍙傜収鐨勮嚜琛岃緭鍏ュ悕绉�
 			//鍒嗙被娉ㄥ叆鐨勪笉鐢紝閮芥槸瀵煎叆鍚庤嚜鍔ㄥ鐞嗙殑
 			//缂栫爜锛岀姸鎬佺瓑瀛楁涓嶅鍏�
-			List<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrVOList=codeClassifyTemplateVO.getAttributes();
-			if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrVOList)) {
+			List<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrVOList = codeClassifyTemplateVO.getAttributes();
+			if (!CollectionUtils.isEmpty(codeClassifyTemplateAttrVOList)) {
 				if (CollectionUtils.isEmpty(codeClassifyTemplateAttrVOList)) {
 					throw new VciBaseException("妯℃澘娌℃湁閰嶇疆灞炴��");
 				}
 			}
+			//鍓旈櫎鎺夐粯璁ょ殑灞炴�э紝浠ュ強琛ㄥ崟涓嶆樉绀虹殑灞炴��
 			List<CodeClassifyTemplateAttrVO> templateAttrVOS = codeClassifyTemplateAttrVOList.stream().filter(s ->
 				!DEFAULT_ATTR_LIST.contains(s.getId())
 					&& StringUtils.isBlank(s.getComponentRule())
@@ -389,47 +439,49 @@
 					&& (isHistory || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 			).collect(Collectors.toList());
 
-				if (CollectionUtils.isEmpty(templateAttrVOS)) {
-					throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
-				}
+			if (CollectionUtils.isEmpty(templateAttrVOS)) {
+				throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
+			}
 
 			List<CodeClassifyTemplateAttrVO> idAttrVOList = codeClassifyTemplateVO.getAttributes().stream().filter(s -> s.getId().equalsIgnoreCase(CODE_FIELD)).collect(Collectors.toList());
 			LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
 			Workbook workbook = new HSSFWorkbook();
-			if(isHistory){
-				excelDataList.add(new WriteExcelData(0,0,"鍒嗙被璺緞"));
-				excelDataList.add(new WriteExcelData(0,1,"鐮佹瀹藉害"));
-				excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"浼佷笟缂栫爜"));
+			if (isHistory) {
+				excelDataList.add(new WriteExcelData(0, 0, "鍒嗙被璺緞", ""));
+				excelDataList.add(new WriteExcelData(0, 1, "鐮佹瀹藉害", ""));
+				excelDataList.add(new WriteExcelData(0, 2, !CollectionUtils.isEmpty(idAttrVOList) ? idAttrVOList.get(0).getName() : "浼佷笟缂栫爜", idAttrVOList.get(0).getId()));
+				// 濉厖鐮佹
+				excelDataList.add(new WriteExcelData(1, 1, secWidth));
 			}
 			for (int i = 0; i < templateAttrVOS.size(); i++) {
 				CodeClassifyTemplateAttrVO attrVO = templateAttrVOS.get(i);
 
 				Object text = attrVO.getName();
-				text = exportKeyAndRequired(workbook,attrVO,text);
-				int colIndex = (isHistory?3:0) + i;
-				WriteExcelData excelData = new WriteExcelData(0, colIndex, text);
-				if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())
+				text = exportKeyAndRequired(workbook, attrVO, text);
+				int colIndex = (isHistory ? 3 : 0) + i;
+				WriteExcelData excelData = new WriteExcelData(0, colIndex, text, attrVO.getId());
+				if (StringUtils.isNotBlank(attrVO.getCodeDateFormat())
 					|| VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())
 					|| VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrVO.getAttributeDataType())
-					||VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
+					|| VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())) {
 					excelData.setDateFormat(VciDateUtil.DateTimeFormat);
 				}
-				if(text instanceof RichTextString){
+				if (text instanceof RichTextString) {
 					excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
 				}
 				excelDataList.add(excelData);
-				if(StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())){
+				if (StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())) {
 					//娣诲姞鏁版嵁鏈夋晥鎬�
 					List<String> enumValueList = new ArrayList<>();
 					enumValueList.add("");
 					List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
-					if(!CollectionUtils.isEmpty(valueList)){
-						valueList.stream().forEach(kv->{
+					if (!CollectionUtils.isEmpty(valueList)) {
+						valueList.stream().forEach(kv -> {
 							enumValueList.add(kv.getValue());
 						});
 					}
 					//榛樿鍔�1涓囨潯
-					WriteExcelData ed = new WriteExcelData(1,colIndex,"");
+					WriteExcelData ed = new WriteExcelData(1, colIndex, "");
 					ed.setRowTo(100);
 					ed.setColTo(colIndex);
 					ed.setValidation(true);
@@ -437,13 +489,13 @@
 					ed.setValidationErrorMsg("璇峰湪搴忓垪涓�夋嫨姝g‘鐨勫��");
 					excelDataList.add(ed);
 				}
-				if(VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())){
+				if (VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())) {
 					List<String> booleanList = new ArrayList<>();
 
 					booleanList.add("鏄�");
 					booleanList.add("鍚�");
 					//榛樿鍔�1涓囨潯
-					WriteExcelData ed = new WriteExcelData(1,colIndex,"");
+					WriteExcelData ed = new WriteExcelData(1, colIndex, "");
 					ed.setRowTo(100);
 					ed.setColTo(colIndex);
 					ed.setValidation(true);
@@ -452,41 +504,284 @@
 					excelDataList.add(ed);
 				}
 			}
-			eo.addSheetDataList(j+templateVO.getName(),excelDataList);
-			tempEDList.add(new WriteExcelData(j+1,0,templateVO.getOid()));
-			tempEDList.add(new WriteExcelData(j+1,1,templateVO.getId()));
-			tempEDList.add(new WriteExcelData(j+1,2,templateVO.getName()));
+			eo.addSheetDataList(j + templateVO.getName(), excelDataList);
+			tempEDList.add(new WriteExcelData(j + 1, 0, templateVO.getOid()));
+			tempEDList.add(new WriteExcelData(j + 1, 1, templateVO.getId()));
+			tempEDList.add(new WriteExcelData(j + 1, 2, templateVO.getName()));
 		}
-		String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + (isHistory?"_鍘嗗彶鏁版嵁瀵煎叆妯℃澘.xls": "_瀵煎叆妯℃澘.xls");
-		eo.addSheetDataList(templateVOList.size()+"妯℃澘淇℃伅銆愯鍕垮垹闄ゆ垨绉诲姩銆�",tempEDList);
-		ExcelUtil.writeDataToFile(excelName,eo);
+		String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + (isHistory ? "_鍘嗗彶鏁版嵁瀵煎叆妯℃澘.xls" : "_瀵煎叆妯℃澘.xls");
+		eo.addSheetDataList(templateVOList.size() + "妯℃澘淇℃伅銆愯鍕垮垹闄ゆ垨绉诲姩銆�", tempEDList);
+		ExcelUtil.writeDataToFile(excelName, eo);
 		return excelName;
 	}
 
 	/**
-	 * 瀵煎嚭鐨勬椂鍊欏皝瑁呭繀杈撳拰鍏抽敭灞炴��
-	 * @param attrVO 灞炴�х殑鏄剧ず瀵硅薄
-	 * @param text 鍗曞厓鏍肩殑鍊�
+	 * 鐢熸垚鎵归噺淇敼瀵煎叆鐨勬枃浠�
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @return excel鐨勬枃浠跺湴鍧�
 	 */
-	private Object exportKeyAndRequired(Workbook workbook,CodeClassifyTemplateAttrVO attrVO,Object text){
+	@Override
+	public String downloadImportExcelBatchEdit(String codeClassifyOid) {
+		List<CodeClassifyTemplateVO> templateVOList = new ArrayList<>();
+		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘", "瀵煎嚭鐨勯厤缃�", codeClassifyOid, "涓婚搴撳垎绫荤殑涓婚敭");
+
+		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
+
+		templateVOList = templateService.childTemplates(codeClassifyOid);
+
+		WriteExcelOption eo = new WriteExcelOption();
+		eo.setAppend(true);
+		//澧炲姞妯℃澘鐨勪俊鎭鍏�
+		LinkedList<WriteExcelData> tempEDList = new LinkedList<>();
+		tempEDList.add(new WriteExcelData(0, 0, "缂栧彿"));
+		for (int j = 0; j < templateVOList.size(); j++) {
+			CodeClassifyTemplateVO templateVO = templateVOList.get(j);
+			CodeClassifyTemplateVO codeClassifyTemplateVO = new CodeClassifyTemplateVO();
+			BeanUtils.copyProperties(templateVO, codeClassifyTemplateVO);
+			//缁勫悎鏍煎紡鐨勪笉瀵煎叆锛�
+			// 鏋氫妇鐨勬彁渚涘簭鍒楃殑閫夋嫨
+			//鏃堕棿鍏ㄩ儴缁熶竴涓簓yyy-MM-dd HH:mm:ss
+			//鍙傜収鐨勮嚜琛岃緭鍏ュ悕绉�
+			//鍒嗙被娉ㄥ叆鐨勪笉鐢紝閮芥槸瀵煎叆鍚庤嚜鍔ㄥ鐞嗙殑
+			//缂栫爜锛岀姸鎬佺瓑瀛楁涓嶅鍏�
+			List<CodeClassifyTemplateAttrVO> codeClassifyTemplateAttrVOList = codeClassifyTemplateVO.getAttributes();
+			if (!CollectionUtils.isEmpty(codeClassifyTemplateAttrVOList)) {
+				if (CollectionUtils.isEmpty(codeClassifyTemplateAttrVOList)) {
+					throw new VciBaseException("妯℃澘娌℃湁閰嶇疆灞炴��");
+				}
+			}
+			List<CodeClassifyTemplateAttrVO> templateAttrVOS = codeClassifyTemplateAttrVOList.stream().filter(s ->
+				!DEFAULT_ATTR_LIST.contains(s.getId())
+					&& StringUtils.isBlank(s.getComponentRule())
+					&& StringUtils.isBlank(s.getClassifyInvokeAttr())
+					&& (VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
+			).collect(Collectors.toList());
+
+			if (CollectionUtils.isEmpty(templateAttrVOS)) {
+				throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
+			}
+
+//			List<CodeClassifyTemplateAttrVO> idAttrVOList = codeClassifyTemplateVO.getAttributes().stream().filter(s -> s.getId().equalsIgnoreCase(CODE_FIELD)).collect(Collectors.toList());
+			LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
+			Workbook workbook = new HSSFWorkbook();
+//			if(isHistory){
+			excelDataList.add(new WriteExcelData(0, 0, "缂栫爜(id)", ""));
+//				excelDataList.add(new WriteExcelData(0,1,"鐮佹瀹藉害",""));
+//			excelDataList.add(new WriteExcelData(0,1,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"浼佷笟缂栫爜",idAttrVOList.get(0).getId()));
+//			}
+			for (int i = 0; i < templateAttrVOS.size(); i++) {
+				CodeClassifyTemplateAttrVO attrVO = templateAttrVOS.get(i);
+
+				Object text = attrVO.getName();
+				text = exportKeyAndRequired(workbook, attrVO, text);
+				int colIndex = 1 + i;
+				WriteExcelData excelData = new WriteExcelData(0, colIndex, text, attrVO.getId());
+				if (StringUtils.isNotBlank(attrVO.getCodeDateFormat())
+					|| VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())
+					|| VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrVO.getAttributeDataType())
+					|| VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrVO.getAttributeDataType())) {
+					excelData.setDateFormat(VciDateUtil.DateTimeFormat);
+				}
+				if (text instanceof RichTextString) {
+					excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
+				}
+				excelDataList.add(excelData);
+				if (StringUtils.isNotBlank(attrVO.getEnumString()) || StringUtils.isNotBlank(attrVO.getEnumId())) {
+					//娣诲姞鏁版嵁鏈夋晥鎬�
+					List<String> enumValueList = new ArrayList<>();
+					enumValueList.add("");
+					List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
+					if (!CollectionUtils.isEmpty(valueList)) {
+						valueList.stream().forEach(kv -> {
+							enumValueList.add(kv.getValue());
+						});
+					}
+					//榛樿鍔�1涓囨潯
+					WriteExcelData ed = new WriteExcelData(1, colIndex, "");
+					ed.setRowTo(100);
+					ed.setColTo(colIndex);
+					ed.setValidation(true);
+					ed.setValidationDataList(enumValueList);
+					ed.setValidationErrorMsg("璇峰湪搴忓垪涓�夋嫨姝g‘鐨勫��");
+					excelDataList.add(ed);
+				}
+				if (VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attrVO.getAttributeDataType())) {
+					List<String> booleanList = new ArrayList<>();
+
+					booleanList.add("鏄�");
+					booleanList.add("鍚�");
+					//榛樿鍔�1涓囨潯
+					WriteExcelData ed = new WriteExcelData(1, colIndex, "");
+					ed.setRowTo(100);
+					ed.setColTo(colIndex);
+					ed.setValidation(true);
+					ed.setValidationDataList(booleanList);
+					ed.setValidationErrorMsg("璇峰湪搴忓垪涓�夋嫨姝g‘鐨勫��");
+					excelDataList.add(ed);
+				}
+			}
+			eo.addSheetDataList(j + templateVO.getName(), excelDataList);
+			tempEDList.add(new WriteExcelData(j + 1, 0, templateVO.getOid()));
+			tempEDList.add(new WriteExcelData(j + 1, 1, templateVO.getId()));
+			tempEDList.add(new WriteExcelData(j + 1, 2, templateVO.getName()));
+		}
+		String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeClassifyVO.getName() + ("_灞炴�ф壒閲忎慨鏀规ā鏉�.xls");
+		eo.addSheetDataList(templateVOList.size() + "妯℃澘淇℃伅銆愯鍕垮垹闄ゆ垨绉诲姩銆�", tempEDList);
+		ExcelUtil.writeDataToFile(excelName, eo);
+		return excelName;
+	}
+
+	/**
+	 * 鑾峰彇鐮佹瀹藉害
+	 *
+	 * @param codeClassifyOid
+	 * @return
+	 */
+	private String getCodeSegmentWidth(String codeClassifyOid) {
+		CodeClassifyFullInfoBO classifyFullInfoBO = classifyService.getClassifyFullInfo(codeClassifyOid);
+		// 瑕佽幏鍙栫爜娈靛搴︼紝鍏堣鑾峰彇瑙勫垯锛屽綋鍓嶆病鏈夊線涓婃壘
+		CodeRuleVO codeRuleByClassifyFullInfo = mdmEngineService.getCodeRuleByClassifyFullInfo(classifyService.getClassifyFullInfo(codeClassifyOid));
+		List<CodeBasicSecVO> secVOList = codeRuleByClassifyFullInfo.getSecVOList();
+		if (secVOList.isEmpty()) {
+			return "";
+		}
+		StringBuffer secWidth = new StringBuffer("");
+		secVOList.stream().forEach(item -> {
+			switch (item.getSecType().toLowerCase(Locale.ROOT)) {
+				case "codeclassifysec":
+				case "codevariablesec":
+				case "coderefersec":
+				case "codefixedsec":
+				case "codeattrsec":
+				case "codeserialsec":
+					countSecWith(item, secWidth);
+					break;
+				case "codelevelsec":
+					//灞傜骇鐮佹锛岄渶瑕佷粠鍒嗙被涓婅幏鍙栫浉搴旂殑淇℃伅
+					String secValue = "";
+					if (CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(item.getCodeLevelType())) {
+						//鏈�灏忓眰锛屽洜涓烘垜浠彧鑳藉湪鍙跺瓙鑺傜偣涓婄敵璇风紪鐮侊紝鎵�浠ヨ繖涓氨鏄綋鍓嶅垎绫荤殑
+						if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(item.getCodeGetValueType()) || CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
+							//灏辨槸褰撳墠鍒嗙被鐨�
+							secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+						} else {
+							//鎴戜滑闇�瑕佷粠椤跺眰寮�濮嬫壘鍒板綋鍓嶅垎绫讳负姝�
+							secValue = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
+						}
+					} else {
+						//鎸囧畾灞傦紝鎴戜滑闇�瑕侀�氳繃涓婄骇鐨勬潵鑾峰彇
+						if (CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
+							//璇存槑褰撳墠宸茬粡鏄渶楂樼殑浜�
+							secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+						} else {
+							//杩欎釜鎴戜滑闇�瑕佺湅鐪�,灞傜骇鏄笉鏄ぇ浜庝簡鏈�澶у眰绾х殑鏁�
+							List<CodeClassifyVO> parentClassifyVOList = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).collect(Collectors.toList());
+							if (item.getCodeLevelValue() > (parentClassifyVOList.size() + 1)) {
+								//鎸囧畾鐨勫眰绾ф瘮褰撳墠鐨勫眰绾ц繕澶т簡锛屾墍浠ュ彧鑳借幏鍙栧綋鍓嶅眰绾т簡
+								if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(item.getCodeGetValueType())) {
+									secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+								} else {
+									secValue = parentClassifyVOList.stream().map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
+								}
+							} else {
+								//鎴戜滑鑾峰彇鍏朵腑鎸囧畾灞傜殑鍐呭
+								if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(item.getCodeGetValueType())) {
+									CodeClassifyVO classifyVO = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() == item.getCodeLevelValue().intValue()).findFirst().orElseGet(() -> null);
+									if (classifyVO != null) {
+										secValue = classifyVO.getId();
+									}
+								} else {
+									//灏忎簬绛変簬鐨勫叏閮ㄦ嬁鍑烘潵
+									secValue = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() <= item.getCodeLevelValue().intValue()).sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining());
+								}
+							}
+						}
+					}
+					//鐪嬬湅闀垮害鏄惁闇�瑕佹埅鏂�
+					if (!CodeCutTypeEnum.NONE.getValue().equalsIgnoreCase(item.getValueCutType()) &&
+						item.getValueCutLength() != null && item.getValueCutLength() > 0 && secValue.length() > item.getValueCutLength()) {
+						if (CodeCutTypeEnum.RIGHT.getValue().equalsIgnoreCase(item.getValueCutType())) {
+							//宸︽埅鍙栨槸浠庡乏杈瑰壀鎺夛紝鍙虫埅鍙栨槸浠庡彸杈瑰壀鎺�--淇濈暀宸﹁竟
+							secValue = secValue.substring(0, item.getValueCutLength());
+						} else {
+							secValue = secValue.substring(secValue.length() - item.getValueCutLength());
+						}
+					}
+					secValue = productCodeService.joinPreffixAndSuffix(item, secValue);
+					secWidth.append(secValue.length()).append("#");
+					break;
+				case "codedatesec":
+					String dateFormatStr = item.getCodeDateFormatStr();
+					if (Func.isNotEmpty(dateFormatStr)) {
+						// 鑾峰彇褰撳墠鏃堕棿
+						Date currentDate = new Date();
+						// 鎸囧畾鏃ユ湡鏍煎紡
+						SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatStr);
+						// 灏嗗綋鍓嶆椂闂磋浆鎹负鎸囧畾鏃ユ湡鏍煎紡
+						// 浣跨敤姝e垯琛ㄨ揪寮忓幓鎺夐櫎鏁板瓧浠ュ鐨勬墍鏈夊瓧绗︿覆
+						String cleanedDate = dateFormat.format(currentDate).replaceAll("[^0-9]", "");
+						int width = cleanedDate.length();
+						if (Func.isNotEmpty(item.getPrefixCode())) {
+							width += item.getPrefixCode().length();
+						}
+						if (Func.isNotEmpty(item.getSuffixCode())) {
+							width += item.getSuffixCode().length();
+						}
+						secWidth.append(width).append("#");
+					}
+					break;
+			}
+		});
+		return secWidth.toString().substring(0, secWidth.length() - 1);
+	}
+
+	/**
+	 * 璁$畻鐮佹闀垮害鍔犲墠鍚庣紑鐨勯暱搴�
+	 *
+	 * @param codeBasicSecVO
+	 * @param secWidth
+	 */
+	private void countSecWith(CodeBasicSecVO codeBasicSecVO, StringBuffer secWidth) {
+		if (Func.isNotEmpty(codeBasicSecVO.getCodeSecLength())) {
+			int width = VciBaseUtil.getInt(codeBasicSecVO.getCodeSecLength());
+			if (Func.isNotEmpty(codeBasicSecVO.getPrefixCode())) {
+				width += codeBasicSecVO.getPrefixCode().length();
+			}
+			if (Func.isNotEmpty(codeBasicSecVO.getSuffixCode())) {
+				width += codeBasicSecVO.getSuffixCode().length();
+			}
+			secWidth.append(width).append("#");
+		} else {
+			secWidth.append(0).append("#");
+		}
+	}
+
+	/**
+	 * 瀵煎嚭鐨勬椂鍊欏皝瑁呭繀杈撳拰鍏抽敭灞炴��
+	 *
+	 * @param attrVO 灞炴�х殑鏄剧ず瀵硅薄
+	 * @param text   鍗曞厓鏍肩殑鍊�
+	 */
+	private Object exportKeyAndRequired(Workbook workbook, CodeClassifyTemplateAttrVO attrVO, Object text) {
 		//蹇呰緭鍔�*锛屽叧閿睘鎬т负钃濊壊
 		if (VciBaseUtil.getBoolean(attrVO.getRequireFlag()) || VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())) {
 			String value = text.toString();
-			if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())) {
+			if (VciBaseUtil.getBoolean(attrVO.getRequireFlag())) {
 				value += REQUIRED_CHAR;
 			}
-			if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
+			if (VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())) {
 				value += KEY_ATTR_CHAR;
 			}
 			RichTextString ts = new HSSFRichTextString(value);
-			if(VciBaseUtil.getBoolean(attrVO.getRequireFlag())){
-				Font font =  workbook.createFont();
+			if (VciBaseUtil.getBoolean(attrVO.getRequireFlag())) {
+				Font font = workbook.createFont();
 				font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());
 				ts.applyFont(font);
 			}
 
-			if(VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())){
-				Font font =  workbook.createFont();
+			if (VciBaseUtil.getBoolean(attrVO.getKeyAttrFlag())) {
+				Font font = workbook.createFont();
 				font.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex());
 				ts.applyFont(font);
 			}
@@ -495,25 +790,24 @@
 		return text;
 	}
 
-
 	/**
 	 * 鎵归噺鐢宠缂栫爜鏁版嵁
 	 *
 	 * @param orderDTO 缂栫爜鐢宠淇℃伅锛屽繀椤诲寘鍚垎绫讳富閿拰鐮佹鐨勪俊鎭�
 	 * @param file     excel鏂囦欢鐨勪俊鎭�
-	 * @return  鏈夐敊璇俊鎭殑excel鐨勬枃浠�
+	 * @return 鏈夐敊璇俊鎭殑excel鐨勬枃浠�
 	 */
 	@Override
-	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
-		VciBaseUtil.alertNotNull(orderDTO,"缂栫爜鐢宠鐩稿叧鐨勬暟鎹�",orderDTO.getCodeClassifyOid(),"涓婚搴撳垎绫讳富閿�");
+	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) throws Exception {
+		VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勬暟鎹�", orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫讳富閿�");
 		ReadExcelOption reo = new ReadExcelOption();
 		reo.setReadAllSheet(true);
-		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
-		if(CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
-			||sheetDataSetList.get(0).getRowData().size()<1){
+		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file, null, reo);
+		if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
+			|| sheetDataSetList.get(0).getRowData().size() < 1) {
 			throw new VciBaseException("娌℃湁璇诲彇鍒颁换浣曠殑鏁版嵁");
 		}
-		if(sheetDataSetList.size()>LIMIT+1){
+		if (sheetDataSetList.size() > LIMIT + 1) {
 			throw new VciBaseException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
 		}
 		//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
@@ -522,23 +816,22 @@
 		CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
 
 		//鏍¢獙妯℃澘鏄笉鏄渶鏂扮殑
-		checkTemplateSync(sheetDataSetList,templateVO,0);
+		checkTemplateSync(sheetDataSetList, templateVO, 0);
 		//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
-		Map<String,String> errorMap = new HashMap<>();
-		String redisUUid=batchImportCodes(orderDTO,templateVO,dataSet,errorMap,true);
+		Map<String, String> errorMap = new ConcurrentHashMap<>();
+		String redisUUid = batchImportCodes(orderDTO, templateVO, dataSet, errorMap, true);
 		CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
 		List<String> needRowIndexList = new ArrayList<>();
 		String filePath = returnErrorToExcel(dataSet.getRowData(), errorMap, needRowIndexList, dataSet.getColName());
-		if(StringUtils.isNotBlank(filePath)) {
+		if (StringUtils.isNotBlank(filePath)) {
 			codeImProtRusultVO.setFilePath(filePath);
 		}
-		if(StringUtils.isNotBlank(redisUUid)){
+		if (StringUtils.isNotBlank(redisUUid)) {
 			codeImProtRusultVO.setRedisUuid(redisUUid);
 		}
 //		return null;
 		return codeImProtRusultVO;
 	}
-
 
 	/***
 	 * 浠庨《灞傛壒閲忕敵璇峰鍏ユ柟娉�
@@ -549,24 +842,24 @@
 	 */
 	@Override
 	public CodeImProtRusultVO batchTopImportCode(String codeClassifyOid, String classifyAttr, File file) {
-		VciBaseUtil.alertNotNull(codeClassifyOid,"鍒嗙被鐨勪富閿�");
+		VciBaseUtil.alertNotNull(codeClassifyOid, "鍒嗙被鐨勪富閿�");
 		ReadExcelOption reo = new ReadExcelOption();
 		reo.setReadAllSheet(true);
-		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
-		if(CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
-			||sheetDataSetList.get(0).getRowData().size()<1){
+		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file, null, reo);
+		if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(0).getRowData())
+			|| sheetDataSetList.get(0).getRowData().size() < 1) {
 			throw new VciBaseException("娌℃湁璇诲彇鍒颁换浣曠殑鏁版嵁");
 		}
-		if(sheetDataSetList.size()>LIMIT+1){
+		if (sheetDataSetList.size() > LIMIT + 1) {
 			throw new VciBaseException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
 		}
 		//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
 		SheetDataSet dataSet = sheetDataSetList.get(0);
 		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
 		//鑾峰彇褰撳墠妯℃澘
-		CodeClassifyTemplateVO selectCodeClassifyTemplateVO =engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
-		Map<String,List<ColumnVO>> templateColumnVOMap=new HashMap<>();
-		createTemplate(selectCodeClassifyTemplateVO,templateColumnVOMap);
+		CodeClassifyTemplateVO selectCodeClassifyTemplateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
+		Map<String, List<ColumnVO>> templateColumnVOMap = new HashMap<>();
+		createTemplate(selectCodeClassifyTemplateVO, templateColumnVOMap);
 
 		List<CodeClassifyVO> childClassifyVOs = classifyService.listChildrenClassify(codeClassifyOid, true, classifyAttr, true);
 		Map<String/**璺緞**/, CodeClassifyVO> pathMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getPath().startsWith("#") ? s.getPath().substring(1) : s.getPath(), t -> t));
@@ -574,65 +867,66 @@
 		List<String> titleRowData = dataSet.getColName();
 		Map<String, String> errorMap = new ConcurrentHashMap<>();
 		//棣栧厛灏嗘暟鎹互妯℃澘鐨勫舰寮忓垎寮�
-		LinkedHashMap<String,List<CodeImprotDataVO>> codeclassifyDataMap=new LinkedHashMap<>();
-		List<CodeImprotDataVO> codeClassifyDatas=new ArrayList<>();
-		createExeclClassData(dataSet,pathMap,errorMap,codeClassifyDatas);
+		LinkedHashMap<String, List<CodeImprotDataVO>> codeclassifyDataMap = new LinkedHashMap<>();
+		List<CodeImprotDataVO> codeClassifyDatas = new ArrayList<>();
+		createExeclClassData(dataSet, pathMap, errorMap, codeClassifyDatas);
 
 		//鏍规嵁妯℃澘灏嗘暟鎹暣鍚堝湪涓�璧凤紝鍘绘牎楠�
-		Map<String/**妯℃澘oid**/, List<CodeImprotDataVO>/**鏁版嵁瀵硅薄**/> templateDatasMap =codeClassifyDatas.stream().collect(Collectors.toMap(CodeImprotDataVO::getTemplateOid,s->{
-			List<CodeImprotDataVO> l=new ArrayList<>();
+		Map<String/**妯℃澘oid**/, List<CodeImprotDataVO>/**鏁版嵁瀵硅薄**/> templateDatasMap = codeClassifyDatas.stream().collect(Collectors.toMap(CodeImprotDataVO::getTemplateOid, s -> {
+			List<CodeImprotDataVO> l = new ArrayList<>();
 			l.add(s);
 			return l;
-		},(List<CodeImprotDataVO> s1,List<CodeImprotDataVO> s2)->{
+		}, (List<CodeImprotDataVO> s1, List<CodeImprotDataVO> s2) -> {
 			s1.addAll(s2);
 			return s1;
 		}));
-		String uuid=VciBaseUtil.getPk();
-		List<CodeImportTemplateVO> codeImportTemplateVOS=new ArrayList<>();
-		Map<String,CodeImportTemplateVO> codeRuleMap=new HashMap<>();
+		String uuid = VciBaseUtil.getPk();
+		List<CodeImportTemplateVO> codeImportTemplateVOS = new ArrayList<>();
+		Map<String, CodeImportTemplateVO> codeRuleMap = new HashMap<>();
 
 		//鐩镐技鏁版嵁
 		// Map<String,String>wpResembleMap=new HashMap<>();
 		// List<CodeImprotDataVO> wpCodeImprotDataVOList=new ArrayList<>();
 		//鎸夌収妯℃澘鍘绘暣鐞嗘暟鎹�
-		templateDatasMap.keySet().stream().forEach(templateVOOid->{
-			List<CodeImprotDataVO> codeImprotDataVOS= templateDatasMap.get(templateVOOid);
-			CodeClassifyTemplateVO templateVO= templateService.getObjectHasAttrByOid(templateVOOid);
+		templateDatasMap.keySet().stream().forEach(templateVOOid -> {
+			List<CodeImprotDataVO> codeImprotDataVOS = templateDatasMap.get(templateVOOid);
+			CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(templateVOOid);
 
 			//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
 			List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
-				!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
+				!DEFAULT_ATTR_LIST.contains(s.getId()) &&
+					((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 			).collect(Collectors.toList());
 
-			Map<String/**妯℃澘灞炴�у瓧娈祇id**/, String /**妯℃澘灞炴�у閮ㄥ悕绉�**/> fieldNameMap =attrVOS.stream().collect(Collectors.toMap(CodeClassifyTemplateAttrVO::getId,s->s.getName()));
+			Map<String/**妯℃澘灞炴�у瓧娈祇id**/, String /**妯℃澘灞炴�у閮ㄥ悕绉�**/> fieldNameMap = attrVOS.stream().collect(Collectors.toMap(CodeClassifyTemplateAttrVO::getId, s -> s.getName()));
 
-			List<ClientBusinessObject> allCboList=new ArrayList<>();
+			List<ClientBusinessObject> allCboList = new ArrayList<>();
 			codeImprotDataVOS.stream().forEach(codeImprotDataVO -> {
-				List<ColumnVO>columnVOList =new ArrayList();
-				String templateOid=selectCodeClassifyTemplateVO.getOid();
-				if(templateColumnVOMap.containsKey(templateOid)){
-					columnVOList= columnVOList=templateColumnVOMap.get(templateOid);
-				}else{
-					createTemplate(templateVO,templateColumnVOMap);
-					columnVOList= columnVOList=templateColumnVOMap.get(templateOid);
+				List<ColumnVO> columnVOList = new ArrayList();
+				String templateOid = selectCodeClassifyTemplateVO.getOid();
+				if (templateColumnVOMap.containsKey(templateOid)) {
+					columnVOList = columnVOList = templateColumnVOMap.get(templateOid);
+				} else {
+					createTemplate(templateVO, templateColumnVOMap);
+					columnVOList = columnVOList = templateColumnVOMap.get(templateOid);
 				}
-				String codeRuleOid=codeImprotDataVO.getCodeRuleOid();
-				if(!codeRuleMap.containsKey(codeRuleOid)){
-					CodeImportTemplateVO codeImportTemplateVO=new CodeImportTemplateVO();
+				String codeRuleOid = codeImprotDataVO.getCodeRuleOid();
+				if (!codeRuleMap.containsKey(codeRuleOid)) {
+					CodeImportTemplateVO codeImportTemplateVO = new CodeImportTemplateVO();
 					codeImportTemplateVO.setRoot(false);
 					codeImportTemplateVO.setCodeClassifyOid(codeImprotDataVO.getCodeClassifyOid());
 					codeImportTemplateVO.setCodeRuleOid(codeImprotDataVO.getCodeRuleOid());
-					codeImportTemplateVO.setCodeTemplateOid (codeImprotDataVO.getTemplateOid());
-					codeImportTemplateVO.setCodeClassifyVO( codeImprotDataVO.getCodeClassifyVO());
-					codeImportTemplateVO.setCodeClassifyTemplateVO( codeImprotDataVO.getCodeClassifyTemplateVO());
+					codeImportTemplateVO.setCodeTemplateOid(codeImprotDataVO.getTemplateOid());
+					codeImportTemplateVO.setCodeClassifyVO(codeImprotDataVO.getCodeClassifyVO());
+					codeImportTemplateVO.setCodeClassifyTemplateVO(codeImprotDataVO.getCodeClassifyTemplateVO());
 					codeImportTemplateVO.setCodeRuleVO(codeImprotDataVO.getCodeRuleVO());
-					List<String> colNames=codeImprotDataVO.getColNames();
+					List<String> colNames = codeImprotDataVO.getColNames();
 					codeImportTemplateVO.setCloNamesList(columnVOList);
 					codeImportTemplateVOS.add(codeImportTemplateVO);
-					codeRuleMap.put(codeRuleOid,codeImportTemplateVO);
+					codeRuleMap.put(codeRuleOid, codeImportTemplateVO);
 				}
-				List<ClientBusinessObject> cboList=new ArrayList<>();
-				excelToCbo(classifyFullInfo,codeImprotDataVO,cboList,true);
+				List<ClientBusinessObject> cboList = new ArrayList<>();
+				excelToCbo(classifyFullInfo, codeImprotDataVO, cboList, true);
 				allCboList.addAll(cboList);
 				//寰�閫夋嫨鐨勮妭鐐归噷闈㈠姞鏁版嵁
 				// CodeImprotDataVO wpcodeImprotDataVO=new CodeImprotDataVO();
@@ -645,93 +939,89 @@
 
 			});
 
-
 			//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
 			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
 			//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
-			batchCheckRequiredAttrOnOrder(templateVO,allCboList,errorMap);
+			batchCheckRequiredAttrOnOrder(templateVO, allCboList, errorMap);
 			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, allCboList);
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, allCboList, false, errorMap);
 			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-			if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
-				selfRepeatRowIndexList.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
+			if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
+				selfRepeatRowIndexList.stream().forEach(rowIndex -> {
+					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format(";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶峓%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
 				});
 			}
-			if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
-				keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+			if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+				keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format("鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅[%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
 				});
 			}
 			//鍒嗙被娉ㄥ叆
 			// batchSwitchClassifyAttrOnOrder(attrVOS,allCboList,classifyFullInfo,false);
 			//boolean
-			reSwitchBooleanAttrOnOrder(attrVOS,allCboList);
+			reSwitchBooleanAttrOnOrder(attrVOS, allCboList);
 			//4.鏍¢獙瑙勫垯
-			batchCheckVerifyOnOrder(attrVOS, allCboList,errorMap);
+			batchCheckVerifyOnOrder(attrVOS, allCboList, errorMap);
 			//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
 			//5.鏍¢獙鏋氫妇鏄惁姝g‘
 			batchSwitchEnumAttrOnOrder(attrVOS, allCboList, errorMap);
 			//7.澶勭悊鍙傜収鐨勬儏鍐�
-			batchSwitchReferAttrOnOrder(attrVOS,allCboList,errorMap);
+			batchSwitchReferAttrOnOrder(attrVOS, allCboList, errorMap);
 
 			//6.鏃堕棿鏍煎紡鐨勯獙璇�
 			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-			batchSwitchDateAttrOnOrder(attrVOS,allCboList,errorMap);
+			batchSwitchDateAttrOnOrder(attrVOS, allCboList, errorMap);
 			//璁剧疆榛樿鍊�
 			batchSwitchAttrDefault(attrVOS, allCboList);
 			//鏈�鍚庡紕缁勫悎瑙勫垯
-			batchSwitchComponentAttrOnOrder(attrVOS,allCboList);
-
+			batchSwitchComponentAttrOnOrder(attrVOS, allCboList);
 
 			Map<String, ClientBusinessObject> rowIndexCboMap = allCboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
-
 
 			List<ClientBusinessObject> needSaveCboList = allCboList.stream().filter(cbo -> {
 				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 				return !errorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
 			//鐩镐技鏍¢獙
-			Map<String,String>resembleMap=new HashMap<>();
-			List<DataResembleVO> dataResembleVOS=new ArrayList<>();
-			String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
-			bathcResembleQuery(codeClassifyOid,templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
-			if(resembleMap.size()>0) {
-				if(!CollectionUtils.isEmpty(dataResembleVOS)) {
+			Map<String, String> resembleMap = new HashMap<>();
+			List<DataResembleVO> dataResembleVOS = new ArrayList<>();
+			String btmtypeid = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
+			//鐩镐技椤规煡璇㈣鍒�
+			bathcResembleQuery(codeClassifyOid, templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
+			if (resembleMap.size() > 0) {
+				if (!CollectionUtils.isEmpty(dataResembleVOS)) {
 					bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
-					bladeRedis.expire(uuid + "-resemble-data",BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
+					bladeRedis.expire(uuid + "-resemble-data", BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
 					// createRedisDatas(uuid + "-resemble", codeImprotDataVOS, resembleMap, false);
 					//  wpResembleMap.putAll(resembleMap);
 				}
 			}
 			//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
-			Map<String,String> newErrorMap=new HashMap<>();
+			Map<String, String> newErrorMap = new HashMap<>();
 			newErrorMap.putAll(resembleMap);
 			newErrorMap.putAll(errorMap);
 			needSaveCboList = allCboList.stream().filter(cbo -> {
 				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 				return !newErrorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
-			if(newErrorMap.size()>0) {
-				createRedisDatas(uuid + "-resemble",codeImprotDataVOS, newErrorMap,false);
+			if (newErrorMap.size() > 0) {
+				createRedisDatas(uuid + "-resemble", codeImprotDataVOS, newErrorMap, false);
 			}
-			createRedisDatas(uuid + "-ok",codeImprotDataVOS, newErrorMap,true);
+			createRedisDatas(uuid + "-ok", codeImprotDataVOS, newErrorMap, true);
 
 		});
+
 		//寰�鐗╁搧鑺傜偣涓婂姞妯℃澘
-
-
-
-		List<String> needRowIndexList=new ArrayList<>();
+		List<String> needRowIndexList = new ArrayList<>();
 		CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
-		if(errorMap.size()>0) {
+		if (errorMap.size() > 0) {
 			String filePath = returnErrorToExcel(dataSet.getRowData(), errorMap, needRowIndexList, dataSet.getColName());
 			if (StringUtils.isNotBlank(filePath)) {
 				codeImProtRusultVO.setFilePath(filePath);
 			}
 		}
-		if(StringUtils.isNotBlank(uuid)){
+		if (StringUtils.isNotBlank(uuid)) {
 			//灏嗘墍鏈夌殑鍒嗙被瀛樺叆缂撳瓨涔嬩腑
 			codeImProtRusultVO.setRedisUuid(uuid);
 			/**  List<ColumnVO>columnVOList=new ArrayList<>();
@@ -762,9 +1052,9 @@
 			 return !newErrorMap.containsKey(rowIndex);
 			 }).collect(Collectors.toList());
 			 createRedisDatas(uuid + "-ok",selectCodeClassifyTemplateVO,wpCodeImprotDataVOList, newErrorMap,true,codeClassifyOid);****/
-			if(codeImportTemplateVOS.size()>0){
-				bladeRedis.set(uuid + "-class",codeImportTemplateVOS);
-				bladeRedis.expire(uuid + "-class",BATCHADD_REDIS_TIME);
+			if (codeImportTemplateVOS.size() > 0) {
+				bladeRedis.set(uuid + "-class", codeImportTemplateVOS);
+				bladeRedis.expire(uuid + "-class", BATCHADD_REDIS_TIME);
 			}
 		}
 		return codeImProtRusultVO;
@@ -774,42 +1064,377 @@
 	 * 瀵煎叆鍘嗗彶鏁版嵁
 	 *
 	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
-	 * @param classifyAttr 鍒嗙被璺緞浣跨敤鐨勫睘鎬�
+	 * @param classifyAttr    鍒嗙被璺緞浣跨敤鐨勫睘鎬�
 	 * @param file            excel鏂囦欢鐨勪俊鎭�
 	 * @return 鏈夐敊璇俊鎭殑excel
 	 */
 	@Override
-	public CodeImProtRusultVO batchImportHistoryData(String codeClassifyOid, String classifyAttr,File file) throws  Throwable{
-		VciBaseUtil.alertNotNull(codeClassifyOid,"鍒嗙被鐨勪富閿�");
+	public CodeImProtRusultVO batchImportHistoryData(String codeClassifyOid, String classifyAttr, File file) throws Throwable {
+		try {
+			VciBaseUtil.alertNotNull(codeClassifyOid, "鍒嗙被鐨勪富閿�");
+			ReadExcelOption reo = new ReadExcelOption();
+			reo.setReadAllSheet(true);
+			List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file, null, reo);
+			if (sheetDataSetList.size() > LIMIT + 1) {
+				throw new VciBaseException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
+			}
+			Map<String, List<WriteExcelData>> shetNameMap = new HashMap<>();
+			//鐩镐技椤圭洰鏌ラ噸
+			String uuid = VciBaseUtil.getPk();
+			boolean isCreateUUid = false;
+			boolean isExport = false;
+			//long start = System.currentTimeMillis();
+			// 璁板綍瀵煎叆鎴愬姛鐨勬�绘暟
+			List<Integer> importCount = new ArrayList<>();
+			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
+			for (int i = 0; i < sheetDataSetList.size() - 1; i++) {
+				if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(i).getRowData())
+					|| sheetDataSetList.get(i).getRowData().size() < 1) {
+					continue;
+				}
+				// 鍗曟瀵煎叆鏁伴噺闄愬埗
+				if (sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT) {
+					throw new ServiceException(StringUtil.format("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩噞}鏉$殑鏁版嵁", IMPORT_DATA_LIMIT));
+				}
+				//鍘嗗彶瀵煎叆鐨勬椂鍊欎笉澶勭悊缂栫爜
+				//----閫昏緫鍐呭----
+				//1. 鍒嗙被鐨勮矾寰勫彲浠ュ湪椤甸潰涓婇�夋嫨鏄垎绫荤紪鍙疯繕鏄垎绫荤殑鍚嶇О
+				//2. 鍒嗙被鐨勮矾寰勶紝蹇呴』鏄綋鍓嶅鍏ラ�夋嫨鐨勫垎绫荤殑鑺傜偣锛屼互鍙婂叾涓嬬骇鑺傜偣
+				//3. 閫氳繃鏁版嵁瑕佸鍏ョ殑鍒嗙被鍘绘煡鎵惧搴旂殑缂栫爜瑙勫垯
+				//4. 鏁版嵁瀛樺偍鍜屾壒閲忕敵璇蜂竴鏍凤紝
+				//5. 闇�瑕佸崟鐙鐞嗕紒涓氱紪鐮佺殑鍐呭锛�
+				//     5.1 浼佷笟缂栫爜鍦ㄥ綋鍓峞xcel閲屼笉鑳介噸澶�
+				//     5.2 浼佷笟缂栫爜鍦ㄧ郴缁熶腑涓嶈兘閲嶅锛堝彲浠ユ槸宸茬粡鍥炴敹鐨勶級
+				//     5.3 浼佷笟缂栫爜鐨勯暱搴︼紝鍜岀紪鐮佽鍒欑殑闀垮害瑕佸搴斾笂
+				//     5.4 鑾峰彇娴佹按鐮佹鐨勫�硷紝鍘婚櫎濉厖鐨勫瓧绗︼紝鐪嬫祦姘村彿鏄灏戯紝鐒跺悗灏嗘祦姘村彿鍜岀幇鍦ㄧ殑鏈�澶ф祦姘村彿鍒ゆ柇锛屽皬浜庡氨鐩存帴褰曞叆锛屽ぇ浜庡垯淇敼鏈�澶ф祦姘村彿
+				//     5.5 瀛樺偍浼佷笟缂栫爜鍒癮llcode涓�
+				//鏌ヨ鍒嗙被鍜屾ā鏉�
+
+				//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
+				SheetDataSet dataSet = sheetDataSetList.get(i);
+				List<SheetRowData> rowDataList = dataSet.getRowData();
+
+				//鎵剧涓�琛岋紝涓轰簡鎵炬爣棰�
+				CodeClassifyTemplateVO templateVO = new CodeClassifyTemplateVO();
+				/**  if (!templateService.checkChildHasSameTemplate(classifyFullInfo.getCurrentClassifyVO().getOid())) {
+				 throw new VciBaseException("褰撳墠鐨勫垎绫讳互鍙婁笅绾у垎绫荤殑妯℃澘涓嶇浉鍚�");
+				 }***/
+				//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
+				//鎵炬墍鏈夌殑鍒嗙被璺緞,闇�瑕佹牎楠岃矾寰勬槸鍚︽纭紝鏄惁閮藉湪褰撳墠鐨勫垎绫荤殑涓嬬骇
+				List<CodeClassifyVO> childClassifyVOs = classifyService.listChildrenClassify(codeClassifyOid, true, classifyAttr, true);
+				Map<String/**璺緞**/, CodeClassifyVO> pathMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getPath().startsWith("#") ? s.getPath().substring(1) : s.getPath(), t -> t));
+				List<String> titleRowData = dataSet.getColName();
+				Map<String, String> errorMap = new ConcurrentHashMap<>();
+				pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
+
+				try {
+					List<CodeClassifyTemplateVO> templateVOList = checkSamesTemplate(titleRowData, sheetDataSetList, i, pathMap, errorMap);
+					templateVO = templateVOList.get(0);
+				} catch (Throwable e) {
+					throw new VciBaseException(e.getMessage());
+				}
+
+				List<SheetRowData> needowDataList = rowDataList.stream().filter(cbo -> {
+					String rowIndex = cbo.getRowIndex();
+					return !errorMap.containsKey(rowIndex);
+				}).collect(Collectors.toList());
+
+				//checkTemplateSync(sheetDataSetList, templateVO,i);
+				//杩欓噷涓嶉櫎鍘婚粯璁ょ殑灞炴��
+				List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes();
+				Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
+
+				Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
+				String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
+				getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
+				//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
+				List<ClientBusinessObject> cboList = new ArrayList<>();
+				String fullPath = getFullPath(classifyFullInfo);
+				//鎴戜滑闇�瑕佽幏鍙栧埌鎵�鏈夌殑涓嬬骇鍒嗙被鐨刼id鐨勮矾寰勶紝鍥犱负鍚庨潰闇�瑕�
+				Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
+				excelToCbo(classifyFullInfo, fieldIndexMap, needowDataList, templateVO, cboList, fullPath, false);
+
+
+				Map<String/**涓婚敭**/, CodeClassifyVO> classifyVOMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				classifyVOMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO());
+				pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
+
+				//鍒ゆ柇缂栧彿鍦╡xcel閲屾湰韬氨閲嶅鐨�
+				Map<String, Long> idCountMap = cboList.stream().collect(Collectors.groupingBy(ClientBusinessObject::getId, Collectors.counting()));
+				List<String> repeatIdList = new ArrayList<>();
+				idCountMap.forEach((id, count) -> {
+					if (count > 1) {
+						repeatIdList.add(id);
+					}
+				});
+				if (!CollectionUtils.isEmpty(repeatIdList)) {
+					cboList.stream().filter(s -> repeatIdList.contains(s.getId())).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).forEach(rowIndex -> {
+						errorMap.put(rowIndex, "缂栧彿鍦ㄥ綋鍓峞xcel涓噸澶�;");
+					});
+				}
+				//鎴戜滑闇�瑕佸垽鏂繖浜涘垎绫荤殑妯℃澘鏄笉鏄竴鏍风殑锛屽彧闇�瑕佹牎楠岋紝涓嶇敤鑾峰彇
+				//妫�鏌ュ垎绫荤殑璺緞
+				checkClassifyPathInHistory(cboList, errorMap, pathMap, childOidPathMap);
+
+				//妫�鏌ヨ鍒�
+				Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
+				List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
+				checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
+				//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+
+				//鎴戜滑鏍规嵁鍑洪敊鐨勫垎绫荤殑涓婚敭锛屽幓鎵捐鍙�
+				if (!CollectionUtils.isEmpty(unExistRuleClassifyOidList)) {
+					cboList.stream().forEach(cbo -> {
+						if (unExistRuleClassifyOidList.contains(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
+							String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+							errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";鏍规嵁鍒嗙被璺緞瀵瑰簲鐨勫垎绫伙紝娌℃湁璁剧疆缂栫爜瑙勫垯");
+						}
+					});
+				}
+
+				//鍒ゆ柇蹇呰緭椤�
+				batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
+
+				//浼樺厛鏍¢獙缂栫爜鏄惁瀛樺湪
+				batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
+
+				//boolean
+				reSwitchBooleanAttrOnOrder(attrVOS, cboList);
+
+				// 鏋氫妇鐨勫唴瀹归渶瑕佹牴鎹悕绉拌浆鎹负鏋氫妇鐨勫��
+				batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+
+				batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
+
+				//6.澶勭悊鍒嗙被娉ㄥ叆
+				batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo, true);
+
+				//璁剧疆榛樿鍊�
+				batchSwitchAttrDefault(attrVOS, cboList);
+
+				//7.澶勭悊缁勫悎瑙勫垯
+				batchSwitchComponentAttrOnOrder(attrVOS, cboList);
+
+				//3.鍒ゆ柇鍏抽敭灞炴��
+				CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList, false, errorMap);
+				Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
+				Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+				if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
+					selfRepeatRowIndexList.stream().forEach(rowIndex -> {
+						errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format(";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶峓%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
+					});
+				}
+				if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+					keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+						errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format("鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅[%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
+					});
+				}
+				//4.鏍¢獙瑙勫垯
+				batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
+
+				//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+				batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
+				if (CollectionUtils.isEmpty(ruleOidMap.values())) {
+					throw new VciBaseException("瀵煎叆鐨勬暟鎹墍閫夋嫨鐨勫垎绫婚兘娌℃湁璁剧疆缂栫爜瑙勫垯");
+				}
+				// TODO: 璇ョ敤oid鏌ヨ瑙勫垯鐨勶紝鍒敤id
+				Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
+				Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
+				checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
+				ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
+					List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
+					List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+					//鎴戜滑闇�瑕佸厛鏌ヨ涓�涓嬶紝鍐呭鏄惁宸茬粡瀛樺湪
+					if (!CollectionUtils.isEmpty(thisCbos)) {
+						List<String> existIds = new ArrayList<>();
+						// TODO: 2024/12/3 Ludc 杩欏効鏌ヨ鍋氫簡淇敼鏀规垚缁勬垚涓�鍙ql鏌ヨ锛岃�屼笉鏄垎鎵规鏌ヨ
+						LambdaQueryWrapper<CodeAllCode> wrapper =  Wrappers.<CodeAllCode>query().lambda()
+							.eq(CodeAllCode::getCodeRuleOid, ruleOid);
+						VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
+							wrapper.notIn(CodeAllCode::getId, cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]));
+						});
+						wrapper.notIn(CodeAllCode::getLcStatus, CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue());
+						List<CodeAllCode> codeAllCodeList = codeAllCodeService.selectByWrapper(wrapper);
+						existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
+							String id = s.getId();
+							if (StringUtils.isBlank(id)) {
+								id = s.getId();
+							}
+							return id;
+						}).collect(Collectors.toList()));
+						List<String> existIdCbos = thisCbos.stream().filter(s -> {
+							String id = s.getId();
+							if (StringUtils.isBlank(id)) {
+								id = s.getAttributeValue("id");
+							}
+							return existIds.contains(id);
+						}).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
+						if (!CollectionUtils.isEmpty(existIdCbos)) {
+							thisCbos = thisCbos.stream().filter(s -> {
+								String id = s.getId();
+								if (StringUtils.isBlank(id)) {
+									id = s.getAttributeValue("id");
+								}
+								return !existIdCbos.contains(id);
+							}).collect(Collectors.toList());
+							existIdCbos.stream().forEach(rowIndex -> {
+								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";銆�" + idFieldName + "銆戝湪绯荤粺涓凡缁忚鍗犵敤");
+							});
+						}
+					}
+				});
+
+				Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+				if (errorMap.size() > 0) {
+					isExport = true;
+					createRedisDatas(uuid + "-error", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap, false);
+				}
+				createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, templateVO);
+				List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
+					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					return !errorMap.containsKey(rowIndex);
+				}).collect(Collectors.toList());
+				//鐩镐技鏍¢獙
+				Map<String, String> resembleMap = new HashMap<>();
+				List<DataResembleVO> dataResembleVOS = new ArrayList<>();
+				String btmtypeid = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
+				// 鐩镐技椤规煡璇�
+				bathcResembleQuery(templateVO.getCodeclassifyoid(), templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
+				if (resembleMap.size() > 0) {
+					if (!CollectionUtils.isEmpty(dataResembleVOS)) {
+						bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
+						createRedisDatas(uuid + "-resemble", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+					}
+				}
+
+				//鐢熸垚class缂撳瓨
+				Map<String, String> rowIndexClsOidMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t.getAttributeValue(CODE_CLASSIFY_OID_FIELD)));
+				createRedisByCodeClassify(uuid + "-class", templateVO, dataSet, fieldIndexMap, true);
+				//鑾峰彇缂栫爜锛屾煡璇㈠湪绯荤粺涓槸鍚﹁鍏朵粬鐨勫紩鐢ㄤ簡
+				//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
+				Map<String, String> newErrorMap = new HashMap<>();
+				newErrorMap.putAll(resembleMap);
+				newErrorMap.putAll(errorMap);
+				//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+				needSaveCboList = cboList.stream().filter(cbo -> {
+					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					return !newErrorMap.containsKey(rowIndex);
+				}).collect(Collectors.toList());
+				if ((errorMap.size() > 0 && needSaveCboList.size() > 0) || resembleMap.size() > 0) {
+					isCreateUUid = true;
+				}
+
+				List<String> needRowIndexList = needSaveCboList.stream().filter(s -> errorMap.containsKey(s.getAttributeValue(IMPORT_ROW_INDEX))).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
+				if (isExport || newErrorMap.size() > 0) {
+					createRedisDatas(uuid + "-ok", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap, true);
+				} else {
+					List<BaseModel> dataCBOIdList = new ArrayList<>();
+					//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+					List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
+					CodeClassifyTemplateVO finalTemplateVO = templateVO;
+					final BladeUser user = AuthUtil.getUser();
+					ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
+						//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+						List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
+						List<ClientBusinessObject> thisCbos = finalNeedSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+						List<BaseModel> dataCBOList = new CopyOnWriteArrayList<>();
+						thisCbos.stream().forEach(clientBusinessObject -> {
+							BaseModel baseModel = new BaseModel();
+							BeanUtil.convert(clientBusinessObject, baseModel);
+							//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
+							dataCBOList.add(baseModel);
+							dataCBOIdList.add(baseModel);
+						});
+
+						if (!CollectionUtils.isEmpty(thisCbos)) {
+							try {
+								// TODO 澶氱嚎绋嬫祦闂
+								productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList, user);
+								importCount.add(dataCBOList.size());
+							} catch (Throwable e) {
+								log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
+								thisCbos.stream().forEach(cbo -> {
+									String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+									errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:" + e.getMessage());
+								});
+							}
+						}
+					});
+					if (errorMap.size() > 0) {
+						isExport = true;
+					}
+					createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
+					engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
+				}
+			}
+			String excelFileName = "";
+			if (isExport && !CollectionUtils.isEmpty(shetNameMap)) {
+				excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
+				WriteExcelOption eo = new WriteExcelOption();
+				shetNameMap.forEach((shetName, errorDataList) -> {
+					eo.addSheetDataList(shetName, errorDataList);
+				});
+				try {
+					new File(excelFileName).createNewFile();
+				} catch (IOException e) {
+					throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
+				}
+				ExcelUtil.writeDataToFile(excelFileName, eo);
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆", true, StringUtil.format("閿欒淇℃伅锛歿}", JSON.toJSONString(shetNameMap)));
+			} else {
+				// 鍘嗗彶鏁版嵁瀵煎叆鏃跺嚭鐜颁簡鐩镐技椤硅繑鍥炵粨鏋滄椂涓嶇畻瀵煎叆鎴愬姛
+				if (shetNameMap.isEmpty() || !isCreateUUid) {
+					saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆", false, StringUtil.format("瀵煎叆鍒板垎绫粄}涓紝瀵煎叆鎴愬姛鎬绘暟涓猴細{}", JSON.toJSONString(classifyFullInfo), Func.isEmpty(importCount) ? 0 : importCount.get(0)));
+				}
+			}
+			CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
+			if (StringUtils.isNotBlank(excelFileName)) {
+				codeImProtRusultVO.setFilePath(excelFileName);
+				codeImProtRusultVO.setFileOid("");
+			}
+			if (isCreateUUid) {
+				codeImProtRusultVO.setRedisUuid(uuid);
+			}
+			return codeImProtRusultVO;
+		} catch (Exception e) {
+			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆", true, e.toString());
+			throw e;
+		}
+	}
+
+	/**
+	 * 瀵煎叆鎵归噺缂栬緫鏁版嵁
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param classifyAttr    鍒嗙被璺緞浣跨敤鐨勫睘鎬�
+	 * @param file            excel鏂囦欢鐨勪俊鎭�
+	 * @return 鏈夐敊璇俊鎭殑excel
+	 */
+	@Transactional
+	@Override
+	public CodeImProtRusultVO batchImportEdit(String codeClassifyOid, String classifyAttr, File file) throws Throwable {
+		VciBaseUtil.alertNotNull(codeClassifyOid, "鍒嗙被鐨勪富閿�");
 		ReadExcelOption reo = new ReadExcelOption();
 		reo.setReadAllSheet(true);
-		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file,null,reo);
-		if (sheetDataSetList.size() > LIMIT + 1) {
-			throw new VciBaseException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
+		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file, null, reo);
+		if (sheetDataSetList.get(0).getRowData().size() > LIMIT + 1) {
+			throw new ServiceException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
 		}
-		Map<String,List<WriteExcelData>> shetNameMap=new HashMap<>();
-		//鐩镐技椤圭洰鏌ラ噸
-		String uuid=VciBaseUtil.getPk();
-		boolean isCreateUUid=false;
-		boolean isExport=false;
-		for(int i=0;i<sheetDataSetList.size()-1;i++) {
+		if (sheetDataSetList.get(0).getRowData().size() == 0) {
+			throw new ServiceException("鏈鍙栧埌excle鐩稿叧鏁版嵁锛岃纭锛侊紒锛�");
+		}
+		boolean isExport = false;
+		Map<String, List<WriteExcelData>> shetNameMap = new HashMap<>();
+		for (int i = 0; i < sheetDataSetList.size() - 1; i++) {
 			if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(i).getRowData())
 				|| sheetDataSetList.get(i).getRowData().size() < 1) {
 				continue;
 			}
-			//鍘嗗彶瀵煎叆鐨勬椂鍊欎笉澶勭悊缂栫爜
-			//----閫昏緫鍐呭----
-			//1. 鍒嗙被鐨勮矾寰勫彲浠ュ湪椤甸潰涓婇�夋嫨鏄垎绫荤紪鍙疯繕鏄垎绫荤殑鍚嶇О
-			//2. 鍒嗙被鐨勮矾寰勶紝蹇呴』鏄綋鍓嶅鍏ラ�夋嫨鐨勫垎绫荤殑鑺傜偣锛屼互鍙婂叾涓嬬骇鑺傜偣
-			//3. 閫氳繃鏁版嵁瑕佸鍏ョ殑鍒嗙被鍘绘煡鎵惧搴旂殑缂栫爜瑙勫垯
-			//4. 鏁版嵁瀛樺偍鍜屾壒閲忕敵璇蜂竴鏍凤紝
-			//5. 闇�瑕佸崟鐙鐞嗕紒涓氱紪鐮佺殑鍐呭锛�
-			//     5.1 浼佷笟缂栫爜鍦ㄥ綋鍓峞xcel閲屼笉鑳介噸澶�
-			//     5.2 浼佷笟缂栫爜鍦ㄧ郴缁熶腑涓嶈兘閲嶅锛堝彲浠ユ槸宸茬粡鍥炴敹鐨勶級
-			//     5.3 浼佷笟缂栫爜鐨勯暱搴︼紝鍜岀紪鐮佽鍒欑殑闀垮害瑕佸搴斾笂
-			//     5.4 鑾峰彇娴佹按鐮佹鐨勫�硷紝鍘婚櫎濉厖鐨勫瓧绗︼紝鐪嬫祦姘村彿鏄灏戯紝鐒跺悗灏嗘祦姘村彿鍜岀幇鍦ㄧ殑鏈�澶ф祦姘村彿鍒ゆ柇锛屽皬浜庡氨鐩存帴褰曞叆锛屽ぇ浜庡垯淇敼鏈�澶ф祦姘村彿
-			//     5.5 瀛樺偍浼佷笟缂栫爜鍒癮llcode涓�
-
+			// 鍗曟瀵煎叆鏁伴噺闄愬埗
+			if (sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT) {
+				throw new ServiceException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�" + IMPORT_DATA_LIMIT + "鏉$殑鏁版嵁");
+			}
 			//鏌ヨ鍒嗙被鍜屾ā鏉�
 			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
 
@@ -818,251 +1443,68 @@
 			List<SheetRowData> rowDataList = dataSet.getRowData();
 
 			//鎵剧涓�琛岋紝涓轰簡鎵炬爣棰�
-			CodeClassifyTemplateVO templateVO = new CodeClassifyTemplateVO();
-			/**  if (!templateService.checkChildHasSameTemplate(classifyFullInfo.getCurrentClassifyVO().getOid())) {
-			 throw new VciBaseException("褰撳墠鐨勫垎绫讳互鍙婁笅绾у垎绫荤殑妯℃澘涓嶇浉鍚�");
-			 }***/
+			CodeClassifyTemplateVO templateVO;
 			//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
 			//鎵炬墍鏈夌殑鍒嗙被璺緞,闇�瑕佹牎楠岃矾寰勬槸鍚︽纭紝鏄惁閮藉湪褰撳墠鐨勫垎绫荤殑涓嬬骇
 			List<CodeClassifyVO> childClassifyVOs = classifyService.listChildrenClassify(codeClassifyOid, true, classifyAttr, true);
 			Map<String/**璺緞**/, CodeClassifyVO> pathMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getPath().startsWith("#") ? s.getPath().substring(1) : s.getPath(), t -> t));
 			List<String> titleRowData = dataSet.getColName();
 			Map<String, String> errorMap = new ConcurrentHashMap<>();
-			pathMap.put("#current#",classifyFullInfo.getCurrentClassifyVO());
+			pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
 
 			try {
-				List<CodeClassifyTemplateVO> templateVOList= checkSamesTemplate(titleRowData,sheetDataSetList,i,pathMap,errorMap);
-				templateVO= templateVOList.get(0);
-			}catch (Throwable e){
-				throw  new VciBaseException(e.getMessage());
+				titleRowData.add("鍒嗙被璺緞");
+				List<CodeClassifyTemplateVO> templateVOList = checkSamesTemplate(titleRowData, sheetDataSetList, i, pathMap, errorMap);
+				titleRowData.remove(titleRowData.size() - 1);
+				templateVO = templateVOList.get(0);
+			} catch (Throwable e) {
+				throw new ServiceException(e.getMessage());
 			}
+
+			CodeClassifyTemplateVO finalTemplateVO = templateVO;
 
 			List<SheetRowData> needowDataList = rowDataList.stream().filter(cbo -> {
 				String rowIndex = cbo.getRowIndex();
 				return !errorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
-
-			//checkTemplateSync(sheetDataSetList, templateVO,i);
 			//杩欓噷涓嶉櫎鍘婚粯璁ょ殑灞炴��
 			List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes();
 			Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
 
 			Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
-			String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
+			fieldIndexMap.put(0, "id");
 			getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
 			//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
-			List<ClientBusinessObject> cboList = new ArrayList<>();
-			String fullPath = getFullPath(classifyFullInfo);
-			//鎴戜滑闇�瑕佽幏鍙栧埌鎵�鏈夌殑涓嬬骇鍒嗙被鐨刼id鐨勮矾寰勶紝鍥犱负鍚庨潰闇�瑕�
-			Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
-			excelToCbo(classifyFullInfo, fieldIndexMap, needowDataList, templateVO, cboList, fullPath, false);
-
-
-			Map<String/**涓婚敭**/, CodeClassifyVO> classifyVOMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-			classifyVOMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO());
-			pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
-
-			//鍒ゆ柇缂栧彿鍦╡xcel閲屾湰韬氨閲嶅鐨�
-			Map<String, Long> idCountMap = cboList.stream().collect(Collectors.groupingBy(ClientBusinessObject::getId, Collectors.counting()));
-			List<String> repeatIdList = new ArrayList<>();
-			idCountMap.forEach((id, count) -> {
-				if (count > 1) {
-					repeatIdList.add(id);
+			CodeOrderDTO orderDTO = new CodeOrderDTO();
+			for (SheetRowData sheetRowData : needowDataList) {
+				//鏌ヨ鏁版嵁
+				Map<String, String> conditionMap = new HashMap<>();
+				conditionMap.put("t.id", sheetRowData.getData().get(0));
+				conditionMap.put("t.lastv", "1");
+				CodeTemplateAttrSqlBO sqlBO = mdmEngineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), templateVO, conditionMap, new PageHelper(-1));
+				//鎴戜滑浣跨敤鍜屼笟鍔$被鍨嬬殑鏉ユ煡璇�
+				List<Map> cbosB = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
+				if (cbosB.size() == 0) {
+					throw new ServiceException("缂栫爜锛�" + sheetRowData.getData().get(0) + ",鏈兘鏌ヨ鍒扮浉鍏虫暟鎹��");
 				}
-			});
-			if (!CollectionUtils.isEmpty(repeatIdList)) {
-				cboList.stream().filter(s -> repeatIdList.contains(s.getId())).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).forEach(rowIndex -> {
-					errorMap.put(rowIndex, "缂栧彿鍦ㄥ綋鍓峞xcel涓噸澶�;");
-				});
-			}
-			//鎴戜滑闇�瑕佸垽鏂繖浜涘垎绫荤殑妯℃澘鏄笉鏄竴鏍风殑锛屽彧闇�瑕佹牎楠岋紝涓嶇敤鑾峰彇
-			//妫�鏌ュ垎绫荤殑璺緞
-			checkClassifyPathInHistory(cboList, errorMap, pathMap, childOidPathMap);
-
-			//妫�鏌ヨ鍒�
-			Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
-			List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
-			checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
-			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
-
-			//鎴戜滑鏍规嵁鍑洪敊鐨勫垎绫荤殑涓婚敭锛屽幓鎵捐鍙�
-			if (!CollectionUtils.isEmpty(unExistRuleClassifyOidList)) {
-				cboList.stream().forEach(cbo -> {
-					if (unExistRuleClassifyOidList.contains(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
-						String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-						errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";鏍规嵁鍒嗙被璺緞瀵瑰簲鐨勫垎绫伙紝娌℃湁璁剧疆缂栫爜瑙勫垯");
-					}
-				});
-			}
-
-			//鍒ゆ柇蹇呰緭椤�
-			batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
-
-			//鏈夐檺鏍¢獙缂栫爜鏄惁瀛樺湪
-			batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
-
-			//boolean
-			reSwitchBooleanAttrOnOrder(attrVOS, cboList);
-
-			// 鏋氫妇鐨勫唴瀹归渶瑕佹牴鎹悕绉拌浆鎹负鏋氫妇鐨勫��
-			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-
-			batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
-			//6.澶勭悊鍒嗙被娉ㄥ叆
-			batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo,true);
-
-			//璁剧疆榛樿鍊�
-			batchSwitchAttrDefault(attrVOS, cboList);
-			//7.澶勭悊缁勫悎瑙勫垯
-			batchSwitchComponentAttrOnOrder(attrVOS, cboList);
-			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
-			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-			if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
-				selfRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
-				});
-			}
-			if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
-				keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅");
-				});
-			}
-			//4.鏍¢獙瑙勫垯
-			batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
-
-			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-			batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
-			if (CollectionUtils.isEmpty(ruleOidMap.values())) {
-				throw new VciBaseException("瀵煎叆鐨勬暟鎹墍閫夋嫨鐨勫垎绫婚兘娌℃湁璁剧疆缂栫爜瑙勫垯");
-			}
-			Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByIds(ruleOidMap.values(), true).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-			//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
-			Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
-			checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
-			ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
-				List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
-				List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
-//鎴戜滑闇�瑕佸厛鏌ヨ涓�涓嬶紝鍐呭鏄惁宸茬粡瀛樺湪
-				if(!CollectionUtils.isEmpty(thisCbos)){
-					List<String> existIds = new ArrayList<>();
-					VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
-						List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
-							.notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
-							.notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
-						);
-						existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
-							String id = s.getId();
-							if (StringUtils.isBlank(id)) {
-								id = s.getId();
-							}
-							return id;
-						}).collect(Collectors.toList()));
-					});
-					List<String> existIdCbos = thisCbos.stream().filter(s -> {
-						String id = s.getId();
-						if (StringUtils.isBlank(id)) {
-							id = s.getAttributeValue("id");
-						}
-						return existIds.contains(id);
-					}).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
-					if (!CollectionUtils.isEmpty(existIdCbos)) {
-						thisCbos = thisCbos.stream().filter(s -> {
-							String id = s.getId();
-							if (StringUtils.isBlank(id)) {
-								id = s.getAttributeValue("id");
-							}
-							return !existIdCbos.contains(id);
-						}).collect(Collectors.toList());
-						existIdCbos.stream().forEach(rowIndex -> {
-							errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";銆�" + idFieldName + "銆戝湪绯荤粺涓凡缁忚鍗犵敤");
-						});
-					}
+				excelToCboEdit(fieldIndexMap, sheetRowData, orderDTO, cbosB.get(0));
+				orderDTO.setCopyFromVersion(orderDTO.getOid());
+				orderDTO.setOid(null);
+				try {
+					mdmEngineService.upSaveCode(orderDTO);
+				} catch (Throwable e) {
+					log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
+					errorMap.put(sheetRowData.getRowIndex(), ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:" + e.getMessage());
 				}
-			});
-
-			Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+			}
 			if (errorMap.size() > 0) {
-				isExport=true;
-				createRedisDatas(uuid + "-error", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap, false);
+				isExport = true;
 			}
-			createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, templateVO);
-			List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
-				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-				return !errorMap.containsKey(rowIndex);
-			}).collect(Collectors.toList());
-			//鐩镐技鏍¢獙
-			Map<String, String> resembleMap = new HashMap<>();
-			List<DataResembleVO> dataResembleVOS = new ArrayList<>();
-			String btmtypeid = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
-			bathcResembleQuery(templateVO.getCodeclassifyoid(), templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
-			if (resembleMap.size() > 0) {
-				if (!CollectionUtils.isEmpty(dataResembleVOS)) {
-					bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
-					createRedisDatas(uuid + "-resemble", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
-				}
-			}
-			//鐢熸垚class缂撳瓨
-			Map<String, String> rowIndexClsOidMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t.getAttributeValue(CODE_CLASSIFY_OID_FIELD)));
-			createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,true);
-			//鑾峰彇缂栫爜锛屾煡璇㈠湪绯荤粺涓槸鍚﹁鍏朵粬鐨勫紩鐢ㄤ簡
-			//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
-			Map<String, String> newErrorMap = new HashMap<>();
-			newErrorMap.putAll(resembleMap);
-			newErrorMap.putAll(errorMap);
-			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
-			needSaveCboList = cboList.stream().filter(cbo -> {
-				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-				return !newErrorMap.containsKey(rowIndex);
-			}).collect(Collectors.toList());
-			if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
-				isCreateUUid=true;
-			}
+			createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
 
-			List<String> needRowIndexList = needSaveCboList.stream().filter(s -> errorMap.containsKey(s.getAttributeValue(IMPORT_ROW_INDEX))).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
-			if (isExport||newErrorMap.size() > 0) {
-				createRedisDatas(uuid + "-ok", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap, true);
-			} else {
-				List<BaseModel> dataCBOIdList=new ArrayList<>();
-				//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
-				List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
-				CodeClassifyTemplateVO finalTemplateVO = templateVO;
-				ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
-					//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
-					List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
-					List<ClientBusinessObject> thisCbos = finalNeedSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
-					List<BaseModel> dataCBOList=new ArrayList<>();
-					thisCbos.stream().forEach(clientBusinessObject -> {
-						BaseModel baseModel=new BaseModel();
-						BeanUtil.convert(clientBusinessObject,baseModel);
-						//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
-						dataCBOList.add(baseModel);
-						dataCBOIdList.add(baseModel);
-					});
-
-					if (!CollectionUtils.isEmpty(thisCbos)) {
-						try {
-							productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
-						} catch (Throwable e) {
-							log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
-							thisCbos.stream().forEach(cbo -> {
-								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡");
-							});
-
-						}
-					}
-				});
-				if (errorMap.size() > 0) {
-					isExport = true;
-				}
-				createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
-				engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
-			}
 		}
-		String excelFileName="";
-		if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
+		String excelFileName = "";
+		if (isExport && !CollectionUtils.isEmpty(shetNameMap)) {
 			excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
 			WriteExcelOption eo = new WriteExcelOption();
 			shetNameMap.forEach((shetName, errorDataList) -> {
@@ -1075,15 +1517,15 @@
 			}
 			ExcelUtil.writeDataToFile(excelFileName, eo);
 		}
-		CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
-		if(StringUtils.isNotBlank(excelFileName)) {
+		CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
+		if (StringUtils.isNotBlank(excelFileName)) {
 			codeImProtRusultVO.setFilePath(excelFileName);
 			codeImProtRusultVO.setFileOid("");
+			saveLogUtil.operateLog("鏁版嵁鎵归噺鏇存敼", true, StringUtil.format("閿欒淇℃伅锛歿}", JSON.toJSONString(shetNameMap)));
+		} else {
+			saveLogUtil.operateLog("鏁版嵁鎵归噺鏇存敼", false, StringUtil.format("瀵煎叆鎴愬姛鎬绘暟涓猴細{}",
+				sheetDataSetList.size() - 1));
 		}
-		if(isCreateUUid){
-			codeImProtRusultVO.setRedisUuid(uuid);
-		}
-
 		return codeImProtRusultVO;
 	}
 	/*private void converBaseModels(List<ClientBusinessObject> clientBusinessObjects,List<BaseModel>dataCBOList){
@@ -1099,6 +1541,7 @@
 		});
 
 	}*/
+
 	/***
 	 * 浠巈xecl閲屾瀯寤哄璞�
 	 * @param rowDataList
@@ -1108,29 +1551,29 @@
 	 * @param shetNameMap
 	 * @param templateVO
 	 */
-	private void createWriteExcelData(Collection<SheetRowData> rowDataList, Map<String,String> errorMap,
-									  List<String> needRowIndexList, List<String> titleRowData, Map<String,List<WriteExcelData>> shetNameMap, CodeClassifyTemplateVO templateVO){
-		List<WriteExcelData> errorDataList=new ArrayList<>();
+	private void createWriteExcelData(Collection<SheetRowData> rowDataList, Map<String, String> errorMap,
+									  List<String> needRowIndexList, List<String> titleRowData, Map<String, List<WriteExcelData>> shetNameMap, CodeClassifyTemplateVO templateVO) {
+		List<WriteExcelData> errorDataList = new ArrayList<>();
 		Map<String, SheetRowData> rowIndexDataMap = rowDataList.stream().filter(s -> !needRowIndexList.contains(s.getRowIndex())).collect(Collectors.toMap(s -> s.getRowIndex(), t -> t));
-		errorDataList.add(new WriteExcelData(0,0,"閿欒淇℃伅"));
+		errorDataList.add(new WriteExcelData(0, 0, "閿欒淇℃伅"));
 		for (int i = 0; i < titleRowData.size(); i++) {
 			//閿欒淇℃伅鍦ㄦ渶鍚�
-			errorDataList.add(new WriteExcelData(0,i+1,titleRowData.get(i)));
+			errorDataList.add(new WriteExcelData(0, i + 1, titleRowData.get(i)));
 		}
 		Integer[] newRowIndex = new Integer[]{1};
-		errorMap.forEach((index,error)->{
+		errorMap.forEach((index, error) -> {
 			//閿欒淇℃伅鍏ㄩ儴缁勫悎鍒颁竴璧�
 			SheetRowData rowData = rowIndexDataMap.getOrDefault(index, null);
-			if(rowData!=null){
-				errorDataList.add(new WriteExcelData(newRowIndex[0],0,error));
-				rowData.getData().forEach((colIndex,value)->{
-					errorDataList.add(new WriteExcelData(newRowIndex[0],colIndex+1,value));
+			if (rowData != null) {
+				errorDataList.add(new WriteExcelData(newRowIndex[0], 0, error));
+				rowData.getData().forEach((colIndex, value) -> {
+					errorDataList.add(new WriteExcelData(newRowIndex[0], colIndex + 1, value));
 				});
 				newRowIndex[0]++;
 			}
 		});
 
-		shetNameMap.put(templateVO.getName(),errorDataList);
+		shetNameMap.put(templateVO.getName(), errorDataList);
 	}
 
 	/***
@@ -1138,8 +1581,7 @@
 	 * @param currentTemplateVO
 	 * @param templateColumnVOMap
 	 */
-
-	private void createTemplate(CodeClassifyTemplateVO currentTemplateVO,Map<String,List<ColumnVO>>templateColumnVOMap){
+	private void createTemplate(CodeClassifyTemplateVO currentTemplateVO, Map<String, List<ColumnVO>> templateColumnVOMap) {
 
 		List<CodeClassifyTemplateAttrVO> templateAttrVOS = currentTemplateVO.getAttributes().stream().filter(s ->
 			!DEFAULT_ATTR_LIST.contains(s.getId())
@@ -1147,66 +1589,65 @@
 				&& StringUtils.isBlank(s.getClassifyInvokeAttr())
 				&& (VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 		).collect(Collectors.toList());
-		if(CollectionUtils.isEmpty(templateAttrVOS)){
+		if (CollectionUtils.isEmpty(templateAttrVOS)) {
 			throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
 		}
-		List<ColumnVO> columnVOList=new ArrayList<>();
+		List<ColumnVO> columnVOList = new ArrayList<>();
 
-		ColumnVO errorMsgColumnVO=new ColumnVO();
+		ColumnVO errorMsgColumnVO = new ColumnVO();
 		errorMsgColumnVO.setTitle("閿欒淇℃伅");
 		errorMsgColumnVO.setField("errorMsg");
 		columnVOList.add(errorMsgColumnVO);
 
 
-
-		ColumnVO pathColumnVO=new ColumnVO();
+		ColumnVO pathColumnVO = new ColumnVO();
 		pathColumnVO.setTitle("鍒嗙被璺緞");
 		pathColumnVO.setField("codeclsfid");
 		columnVOList.add(pathColumnVO);
-		templateAttrVOS.stream().forEach(codetemplateAttr ->{
-			String field=codetemplateAttr.getId();
-			String name=codetemplateAttr.getName();
-			ColumnVO columnVO=new ColumnVO();
+		templateAttrVOS.stream().forEach(codetemplateAttr -> {
+			String field = codetemplateAttr.getId();
+			String name = codetemplateAttr.getName();
+			ColumnVO columnVO = new ColumnVO();
 			columnVO.setTitle(name);
 			columnVO.setField(field);
-			columnVO.setWidth(codetemplateAttr.getAttrTableWidth()==0?columnVO.getWidth():codetemplateAttr.getAttrTableWidth());
+			columnVO.setWidth(codetemplateAttr.getAttrTableWidth() == 0 ? columnVO.getWidth() : codetemplateAttr.getAttrTableWidth());
 			columnVOList.add(columnVO);
 		});
 
-		templateColumnVOMap.put(currentTemplateVO.getOid(),columnVOList);
-		log.info("妯℃澘"+currentTemplateVO.getName()+"瀵瑰簲鐨勫睘鎬�"+columnVOList.size());
+		templateColumnVOMap.put(currentTemplateVO.getOid(), columnVOList);
+		log.info("妯℃澘" + currentTemplateVO.getName() + "瀵瑰簲鐨勫睘鎬�" + columnVOList.size());
 	}
 
 	/**
 	 * 閿欒淇℃伅杩斿洖excel
-	 * @param rowDataList 鎵�鏈夌殑瀵煎叆鏁版嵁
-	 * @param errorMap 閿欒鐨勪俊鎭�
-	 * @param needRowIndexList 闇�瑕佸啓鍏ョ殑鏁版嵁鐨勮鍙�
-	 * @param titleRowData 鏍囬琛�
 	 *
+	 * @param rowDataList      鎵�鏈夌殑瀵煎叆鏁版嵁
+	 * @param errorMap         閿欒鐨勪俊鎭�
+	 * @param needRowIndexList 闇�瑕佸啓鍏ョ殑鏁版嵁鐨勮鍙�
+	 * @param titleRowData     鏍囬琛�
 	 * @return 閿欒鐨別xcel鏂囦欢锛屾病鏈夐敊璇細杩斿洖绌�
 	 */
 	private String returnErrorToExcel(Collection<SheetRowData> rowDataList,
-									  Map<String,String> errorMap,
-									  List<String> needRowIndexList,List<String> titleRowData){
-		if(CollectionUtils.isEmpty(errorMap)){
+									  Map<String, String> errorMap,
+									  List<String> needRowIndexList, List<String> titleRowData) {
+		if (CollectionUtils.isEmpty(errorMap)) {
 			return "";
 		}
 		Map<String, SheetRowData> rowIndexDataMap = rowDataList.stream().filter(s -> !needRowIndexList.contains(s.getRowIndex())).collect(Collectors.toMap(s -> s.getRowIndex(), t -> t));
 		List<WriteExcelData> errorDataList = new ArrayList<>();
-		errorDataList.add(new WriteExcelData(0,0,"閿欒淇℃伅"));
+		errorDataList.add(new WriteExcelData(0, 0, "閿欒淇℃伅"));
 		for (int i = 0; i < titleRowData.size(); i++) {
 			//閿欒淇℃伅鍦ㄦ渶鍚�
-			errorDataList.add(new WriteExcelData(0,i+1,titleRowData.get(i)));
+			errorDataList.add(new WriteExcelData(0, i + 1, titleRowData.get(i)));
 		}
 		Integer[] newRowIndex = new Integer[]{1};
-		errorMap.forEach((index,error)->{
+		errorMap.forEach((index, error) -> {
 			//閿欒淇℃伅鍏ㄩ儴缁勫悎鍒颁竴璧�
 			SheetRowData rowData = rowIndexDataMap.getOrDefault(index, null);
-			if(rowData!=null){
-				errorDataList.add(new WriteExcelData(newRowIndex[0],0,error));
-				rowData.getData().forEach((colIndex,value)->{
-					errorDataList.add(new WriteExcelData(newRowIndex[0],colIndex+1,value));
+			if (rowData != null) {
+				errorDataList.add(new WriteExcelData(newRowIndex[0], 0, error));
+				rowData.getData().forEach((colIndex, value) -> {
+					errorDataList.add(new WriteExcelData(newRowIndex[0], colIndex + 1, value));
 				});
 				newRowIndex[0]++;
 			}
@@ -1218,23 +1659,24 @@
 		} catch (IOException e) {
 			throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
 		}
-		ExcelUtil.writeDataToFile(excelFileName,eo);
+		ExcelUtil.writeDataToFile(excelFileName, eo);
 		return excelFileName;
 	}
 
 	/**
 	 * 鏍¢獙妯℃澘鏄惁涓哄悓姝ョ殑
+	 *
 	 * @param sheetDataSetList excel閲岀殑鍐呭
-	 * @param templateVO 妯℃澘鐨勪俊鎭�
+	 * @param templateVO       妯℃澘鐨勪俊鎭�
 	 */
-	private void checkTemplateSync(List<SheetDataSet> sheetDataSetList,CodeClassifyTemplateVO templateVO,int i){
+	private void checkTemplateSync(List<SheetDataSet> sheetDataSetList, CodeClassifyTemplateVO templateVO, int i) {
 		String templateOidInExcel = "";
-		String templateName="";
-		if(!CollectionUtils.isEmpty(sheetDataSetList)
-			&& sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
-			List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
-			templateName=rowData.get(i).getData().get(2);
-			templateOidInExcel=rowData.get(i).getData().get(0);
+		String templateName = "";
+		if (!CollectionUtils.isEmpty(sheetDataSetList)
+			&& sheetDataSetList.size() > 1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size() - 1).getColName())) {
+			List<SheetRowData> rowData = sheetDataSetList.get(sheetDataSetList.size() - 1).getRowData();
+			templateName = rowData.get(i).getData().get(2);
+			templateOidInExcel = rowData.get(i).getData().get(0);
 			//templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
 		}
        /* if(!CollectionUtils.isEmpty(sheetDataSetList)
@@ -1243,12 +1685,11 @@
             templateOidInExcel=rowData.get(i).getData().get(0);
            //templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
         }*/
-		if(StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(templateVO.getOid())){
-			throw new VciBaseException("妯℃澘銆�"+templateName+"銆戜腑鐨勬暟鎹幏鍙栫殑妯$増淇℃伅涓庡綋鍓嶆ā鏉夸笉鍖归厤锛岃纭繚excel鏂囦欢閲屾湁銆愭ā鏉夸俊鎭�-璇峰嬁绉诲姩鎴栧垹闄ゃ�戠殑宸ヤ綔琛紝涓旂‘淇濇瘡娆″鍏ラ兘鏄厛涓嬭浇鐨勫鍏ユā鏉垮悗娣诲姞鐨勬暟鎹�");
+		if (StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(templateVO.getOid())) {
+			throw new VciBaseException("妯℃澘銆�" + templateName + "銆戜腑鐨勬暟鎹幏鍙栫殑妯$増淇℃伅涓庡綋鍓嶆ā鏉夸笉鍖归厤锛岃纭繚excel鏂囦欢閲屾湁銆愭ā鏉夸俊鎭�-璇峰嬁绉诲姩鎴栧垹闄ゃ�戠殑宸ヤ綔琛紝涓旂‘淇濇瘡娆″鍏ラ兘鏄厛涓嬭浇鐨勫鍏ユā鏉垮悗娣诲姞鐨勬暟鎹�");
 		}
 
 	}
-
 
 	/***
 	 * 鎵归噺澶勭悊鐢宠鏁版嵁
@@ -1257,151 +1698,161 @@
 	 * @param dataSet
 	 * @return
 	 */
-	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
-		List<String> codeList=new ArrayList<>();
-		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
-		//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
-		CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
-		//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
-		engineService.checkSecValueOnOrder(ruleVO,orderDTO);
-		List<SheetRowData> rowDataList = dataSet.getRowData();
+	private String batchImportCodes(CodeOrderDTO orderDTO, CodeClassifyTemplateVO templateVO, SheetDataSet dataSet, Map<String, String> errorMap, boolean isEnumType) throws Exception {
+		List<String> codeList = new ArrayList<>();
+		String uuid = "";
+		try {
+			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+			//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
+			CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
+			//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
+			engineService.checkSecValueOnOrder(ruleVO, orderDTO);
+			List<SheetRowData> rowDataList = dataSet.getRowData();
 
-		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
-		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
-			!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
-		).collect(Collectors.toList());
-		Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
-		List<String> titleRowData = dataSet.getColName();
-		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
-		getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
+			//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
+			List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
+				!DEFAULT_ATTR_LIST.contains(s.getId()) &&
+					((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
+			).collect(Collectors.toList());
+			Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
+			List<String> titleRowData = dataSet.getColName();
+			Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT), (o1, o2) -> o2));
+			getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
 
-		//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
-		List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
-			&& StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
-		).collect(Collectors.toList());
-		if(!CollectionUtils.isEmpty(unExistAttrVOs)){
-			throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
-		}
-		List<ClientBusinessObject> cboList = new ArrayList<>();
-		String fullPath = getFullPath(classifyFullInfo);
-		excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
-
-		//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
-		//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
-		//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
-		batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
-		//3.鍒ゆ柇鍏抽敭灞炴��
-		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
-		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
-			selfRepeatRowIndexList.stream().forEach(rowIndex->{
-				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
-			});
-		}
-		if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
-			keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
-			});
-		}
-		//鍒嗙被娉ㄥ叆
-		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
-		//boolean
-		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
-		//4.鏍¢獙瑙勫垯
-		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
-		if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
-			//5.鏍¢獙鏋氫妇鏄惁姝g‘
-			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-			//7.澶勭悊鍙傜収鐨勬儏鍐�
-			batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
-		}
-		//6.鏃堕棿鏍煎紡鐨勯獙璇�
-		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
-		//鏈�鍚庡紕缁勫悎瑙勫垯
-		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
-		String uuid=VciBaseUtil.getPk();
-		Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
-
-		if(errorMap.size()>0) {
-			createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
-		}
-		boolean isCreateUUid=false;
-		List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
-			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-			return !errorMap.containsKey(rowIndex);
-		}).collect(Collectors.toList());
-		//鐩镐技鏍¢獙
-		Map<String,String>resembleMap=new HashMap<>();
-		List<DataResembleVO> dataResembleVOS=new ArrayList<>();
-		String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
-		bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
-		if(resembleMap.size()>0) {
-			isCreateUUid=true;
-			if(!CollectionUtils.isEmpty(dataResembleVOS)) {
-				bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
-				createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+			//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
+			List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
+				&& StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
+			).collect(Collectors.toList());
+			if (!CollectionUtils.isEmpty(unExistAttrVOs)) {
+				throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
 			}
-		}
-		//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
-		Map<String,String> newErrorMap=new HashMap<>();
-		newErrorMap.putAll(resembleMap);
-		newErrorMap.putAll(errorMap);
-		needSaveCboList = cboList.stream().filter(cbo -> {
-			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-			return !newErrorMap.containsKey(rowIndex);
-		}).collect(Collectors.toList());
-		if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
-			isCreateUUid=true;
-		}
-		createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
-		if(newErrorMap.size()>0) {
-			createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
-		}else {
-			uuid="";
+			List<ClientBusinessObject> cboList = new ArrayList<>();
+			String fullPath = getFullPath(classifyFullInfo);
+			excelToCbo(classifyFullInfo, fieldIndexMap, rowDataList, templateVO, cboList, fullPath, true);
 
-			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+			//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
+			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+			//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
+			batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
+			//3.鍒ゆ柇鍏抽敭灞炴��
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList, false, errorMap);
+			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
+			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+			if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
+				selfRepeatRowIndexList.stream().forEach(rowIndex -> {
+					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format(";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶峓%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
+				});
+			}
+			if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+				keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format("鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅[%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
+				});
+			}
+			//鍒嗙被娉ㄥ叆
+			batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo, false);
+			//boolean
+			reSwitchBooleanAttrOnOrder(attrVOS, cboList);
+			//4.鏍¢獙瑙勫垯
+			batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
+			if (isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
+				//5.鏍¢獙鏋氫妇鏄惁姝g‘
+				batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+				//7.澶勭悊鍙傜収鐨勬儏鍐�
+				batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
+			}
+			//6.鏃堕棿鏍煎紡鐨勯獙璇�
+			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+			batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
+			//鏈�鍚庡紕缁勫悎瑙勫垯
+			batchSwitchComponentAttrOnOrder(attrVOS, cboList);
+			uuid = VciBaseUtil.getPk();
+			Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+
+			if (errorMap.size() > 0) {
+				createRedisDatas(uuid + "-error", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap, false);
+			}
+			boolean isCreateUUid = false;
+			List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
+				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+				return !errorMap.containsKey(rowIndex);
+			}).collect(Collectors.toList());
+			//鐩镐技鏍¢獙
+			Map<String, String> resembleMap = new HashMap<>();
+			List<DataResembleVO> dataResembleVOS = new ArrayList<>();
+			String btmtypeid = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
+			//鐩镐技椤规煡璇�
+			bathcResembleQuery(orderDTO.getCodeClassifyOid(), templateVO, needSaveCboList, resembleMap, btmtypeid, dataResembleVOS);
+			if (resembleMap.size() > 0) {
+				isCreateUUid = true;
+				if (!CollectionUtils.isEmpty(dataResembleVOS)) {
+					bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
+					createRedisDatas(uuid + "-resemble", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+				}
+			}
+			//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
+			Map<String, String> newErrorMap = new HashMap<>();
+			newErrorMap.putAll(resembleMap);
+			newErrorMap.putAll(errorMap);
 			needSaveCboList = cboList.stream().filter(cbo -> {
 				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 				return !newErrorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
+			if ((errorMap.size() > 0 && needSaveCboList.size() > 0) || resembleMap.size() > 0) {
+				isCreateUUid = true;
+			}
+			createRedisByCodeClassify(uuid + "-class", templateVO, dataSet, fieldIndexMap, false);
+			if (newErrorMap.size() > 0) {
+				createRedisDatas(uuid + "-ok", templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap, true);
+			} else {
+				uuid = "";
+				final BladeUser user = AuthUtil.getUser();
+				//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+				needSaveCboList = cboList.stream().filter(cbo -> {
+					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					return !newErrorMap.containsKey(rowIndex);
+				}).collect(Collectors.toList());
 
-			if (!CollectionUtils.isEmpty(needSaveCboList)) {
-				//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
-				//鐢熸垚缂栫爜鐨勫唴瀹�
-				List<String> dataCBOIdList=new ArrayList<>();
-				List<BaseModel> dataCBOList=new ArrayList<>();
-				cboList.stream().forEach(clientBusinessObject -> {
-					BaseModel baseModel=new BaseModel();
-					BeanUtil.convert(clientBusinessObject,baseModel);
-					//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
-					dataCBOList.add(baseModel);
-					dataCBOIdList.add(baseModel.getOid());
-				});
-				try {
-					codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
-					//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
-					engineService.batchSaveSelectChar(templateVO, dataCBOList);
-				} catch (Exception e) {
-					e.printStackTrace();
-					log.error("鎵逛簡鐢宠鏃跺け璐�");
+				if (!CollectionUtils.isEmpty(needSaveCboList)) {
+					//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
+					//鐢熸垚缂栫爜鐨勫唴瀹�
+					List<String> dataCBOIdList = new ArrayList<>();
+					List<BaseModel> dataCBOList = new ArrayList<>();
+					cboList.stream().forEach(clientBusinessObject -> {
+						BaseModel baseModel = new BaseModel();
+						BeanUtil.convert(clientBusinessObject, baseModel);
+						//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
+						dataCBOList.add(baseModel);
+						dataCBOIdList.add(baseModel.getOid());
+					});
+					try {
+						codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList, user);
+						//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
+						engineService.batchSaveSelectChar(templateVO, dataCBOList);
+					} catch (Exception e) {
+						e.printStackTrace();
+						log.error("鎵归噺鐢宠鏃跺け璐�");
+						throw e;
+					}
 				}
 			}
-		}
-		if(!isCreateUUid){
-			return uuid="";
+			if (!isCreateUUid) {
+				return uuid = "";
+			}
+			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜", false, StringUtil.format("鎵归噺瀵煎叆鐢宠鎴愬姛鍏眥}鏉℃暟鎹紝鐢熸垚鐨勭爜鍊煎涓嬨�恵}銆�", codeList.size(), codeList));
+		} catch (Exception e) {
+			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜", true, e.toString());
+			throw e;
 		}
 		return uuid;
 	}
 
 	@Override
 	public List<CodeImportTemplateVO> gridclassifys(String redisOid) {
-		List<CodeImportTemplateVO> codeImportTemplateVOs=new ArrayList<>();
-		VciBaseUtil.alertNotNull(redisOid,"鍒嗙被",redisOid,"鍒嗙被缂撳瓨涓婚敭");
-		List<CodeImportTemplateVO> redisServiceCacheObjects=bladeRedis.get(redisOid);
-		if(redisServiceCacheObjects!=null){
-			codeImportTemplateVOs=  redisServiceCacheObjects;
+		List<CodeImportTemplateVO> codeImportTemplateVOs = new ArrayList<>();
+		VciBaseUtil.alertNotNull(redisOid, "鍒嗙被", redisOid, "鍒嗙被缂撳瓨涓婚敭");
+		List<CodeImportTemplateVO> redisServiceCacheObjects = bladeRedis.get(redisOid);
+		if (redisServiceCacheObjects != null) {
+			codeImportTemplateVOs = redisServiceCacheObjects;
 		}
 		return codeImportTemplateVOs;
 	}
@@ -1414,24 +1865,24 @@
 	 */
 	@Override
 	public DataGrid<Map<String, String>> gridDatas(String codeClssifyOid, String redisOid) {
-		VciBaseUtil.alertNotNull(redisOid,"瀵煎叆鐩镐技鏁版嵁",redisOid,"鏁版嵁缂撳瓨涓婚敭");
-		List<CodeImprotDataVO> codeImprotDataVOs = bladeRedis.get(redisOid+"-"+codeClssifyOid);
+		VciBaseUtil.alertNotNull(redisOid, "瀵煎叆鐩镐技鏁版嵁", redisOid, "鏁版嵁缂撳瓨涓婚敭");
+		List<CodeImprotDataVO> codeImprotDataVOs = bladeRedis.get(redisOid + "-" + codeClssifyOid);
 //		redisService.getCacheList(redisOid+"-"+codeClssifyOid);
-		CodeImprotDataVO codeImprotDataVO=new CodeImprotDataVO();
-		if(!CollectionUtils.isEmpty(codeImprotDataVOs)){
-			if(StringUtils.isNotBlank(codeClssifyOid)){
-				Map<String/**鍒嗙被鍚嶇О**/, CodeImprotDataVO/**鑻辨枃鍚嶇О**/> codeClassifyDatasMap = codeImprotDataVOs.stream().collect(Collectors.toMap(s -> s.getCodeClassifyOid(), t -> t,(o1, o2)->o2));
-				if(codeClassifyDatasMap.containsKey(codeClssifyOid)){
-					codeImprotDataVO= codeClassifyDatasMap.get(codeClssifyOid);
-				}else{
-					codeImprotDataVO=  codeImprotDataVOs.get(0);
+		CodeImprotDataVO codeImprotDataVO = new CodeImprotDataVO();
+		if (!CollectionUtils.isEmpty(codeImprotDataVOs)) {
+			if (StringUtils.isNotBlank(codeClssifyOid)) {
+				Map<String/**鍒嗙被鍚嶇О**/, CodeImprotDataVO/**鑻辨枃鍚嶇О**/> codeClassifyDatasMap = codeImprotDataVOs.stream().collect(Collectors.toMap(s -> s.getCodeClassifyOid(), t -> t, (o1, o2) -> o2));
+				if (codeClassifyDatasMap.containsKey(codeClssifyOid)) {
+					codeImprotDataVO = codeClassifyDatasMap.get(codeClssifyOid);
+				} else {
+					codeImprotDataVO = codeImprotDataVOs.get(0);
 				}
 			}
 		}
 		DataGrid<Map<String, String>> dataGrid = new DataGrid<>();
 		List<Map<String, String>> dataList = new ArrayList<>();
-		if(codeImprotDataVO!=null){
-			dataList= codeImprotDataVO.getDatas();
+		if (codeImprotDataVO != null) {
+			dataList = codeImprotDataVO.getDatas();
 		}
 		dataGrid.setData(dataList);
 		if (!CollectionUtils.isEmpty(dataList)) {
@@ -1441,23 +1892,23 @@
 	}
 
 	/**
-	 *
 	 * @param oid
 	 * @param redisOid
 	 * @return
 	 */
 	@Override
-	public DataGrid<Map<String,String>> gridRowResemble(String oid,String redisOid){
-		VciBaseUtil.alertNotNull(redisOid,"瀵煎叆鐩镐技鏁版嵁",redisOid,"鏁版嵁缂撳瓨涓婚敭");
-		List<DataResembleVO> codeImprotDataVOs = bladeRedis.get(redisOid);;
+	public DataGrid<Map<String, String>> gridRowResemble(String oid, String redisOid) {
+		VciBaseUtil.alertNotNull(redisOid, "瀵煎叆鐩镐技鏁版嵁", redisOid, "鏁版嵁缂撳瓨涓婚敭");
+		List<DataResembleVO> codeImprotDataVOs = bladeRedis.get(redisOid);
+		;
 		DataGrid<Map<String, String>> dataGrid = new DataGrid<>();
 		List<Map<String, String>> dataList = new ArrayList<>();
 
-		if(!CollectionUtils.isEmpty(codeImprotDataVOs)){
-			Map<String/**鍒嗙被鍚嶇О**/, DataResembleVO/**鏁版嵁瀵硅薄**/> rowResembleDataMap = codeImprotDataVOs.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t,(o1, o2)->o2));
-			if(rowResembleDataMap.containsKey(oid)){
-				DataResembleVO dataResembleVO=  rowResembleDataMap.get(oid);
-				dataList= dataResembleVO.getDataList();
+		if (!CollectionUtils.isEmpty(codeImprotDataVOs)) {
+			Map<String/**鍒嗙被鍚嶇О**/, DataResembleVO/**鏁版嵁瀵硅薄**/> rowResembleDataMap = codeImprotDataVOs.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t, (o1, o2) -> o2));
+			if (rowResembleDataMap.containsKey(oid)) {
+				DataResembleVO dataResembleVO = rowResembleDataMap.get(oid);
+				dataList = dataResembleVO.getDataList();
 			}
 		}
 
@@ -1476,165 +1927,167 @@
 	 */
 	@Override
 	public String exportCode(CodeExportAttrDTO exportAttrDTO) {
-		VciBaseUtil.alertNotNull(exportAttrDTO,"瀵煎嚭鐨勯厤缃�",exportAttrDTO.getCodeClassifyOid(),"涓婚搴撳垎绫荤殑涓婚敭");
+		VciBaseUtil.alertNotNull(exportAttrDTO, "瀵煎嚭鐨勯厤缃�", exportAttrDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭");
 		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(exportAttrDTO.getCodeClassifyOid());
 		//鑾峰彇鏈�鏂扮殑妯℃澘
 		CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(exportAttrDTO.getCodeClassifyOid());
 		//鍏堟煡璇㈡暟鎹�
 		String btmTypeId = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
 		Map<String, String> conditionMap = exportAttrDTO.getConditionMap();
-		if(conditionMap == null){
+		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)) + ")");
+		if (conditionMap.containsKey(VciQueryWrapperForDO.OID_FIELD)) {
+			conditionMap.put(VciQueryWrapperForDO.OID_FIELD, QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(conditionMap.get(VciQueryWrapperForDO.OID_FIELD)) + ")");
 		}
-		PageHelper pageHelper = new PageHelper(exportAttrDTO.getLimit()==null?-1:exportAttrDTO.getLimit());
-		pageHelper.setPage(exportAttrDTO.getPage()==null?1:exportAttrDTO.getPage());
+		PageHelper pageHelper = new PageHelper(exportAttrDTO.getLimit() == null ? -1 : exportAttrDTO.getLimit());
+		pageHelper.setPage(exportAttrDTO.getPage() == null ? 1 : exportAttrDTO.getPage());
 		pageHelper.setSort(exportAttrDTO.getSort());
 		pageHelper.setOrder(exportAttrDTO.getOrder());
 
 		pageHelper.addDefaultDesc("createTime");
-		conditionMap.put("codeclsfpath","*" + exportAttrDTO.getCodeClassifyOid() + "*");
+		conditionMap.put("codeclsfpath", "*" + exportAttrDTO.getCodeClassifyOid() + "*");
 		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{
+		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);
 		}
 
-		String countSql = "select count(*) from " + tableName +" where 1=1" +
+		String countSql = "select count(*) from " + tableName + " where 1=1" +
 			" and lastr = '1'" +
 			" and lastv='1'" +
 			" and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%'";
-
 		//鍏堟煡璇㈡�绘暟
 		int total = 0;
-		if(exportAttrDTO.getEndPage()!=null && exportAttrDTO.getEndPage()>0
-			&&exportAttrDTO.getPage() !=null && exportAttrDTO.getPage() >0
-			&&exportAttrDTO.getEndPage()>exportAttrDTO.getPage()){
+		if (exportAttrDTO.getEndPage() != null && exportAttrDTO.getEndPage() > 0
+			&& exportAttrDTO.getPage() != null && exportAttrDTO.getPage() > 0
+			&& exportAttrDTO.getEndPage() > exportAttrDTO.getPage()) {
 			//浠庡灏戦〉鍒板灏戦〉鐨勬煡璇㈡柟寮忥紝
-			for(int i = exportAttrDTO.getPage() ;i <= exportAttrDTO.getEndPage();i++){
-				PageHelper thisPage = new PageHelper(exportAttrDTO.getLimit()==null?-1:exportAttrDTO.getLimit());
-				thisPage.setPage(exportAttrDTO.getPage()==null?1:exportAttrDTO.getPage());
+			String countPageSql = "select count(*) from (select * FROM " + tableName + " where 1=1" +
+				" and lastr = '1'" +
+				" and lastv='1'" +
+				" and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%' {}";
+			for (int i = exportAttrDTO.getPage(); i <= exportAttrDTO.getEndPage(); i++) {
+				PageHelper thisPage = new PageHelper(exportAttrDTO.getLimit() == null ? -1 : exportAttrDTO.getLimit());
+				thisPage.setPage(exportAttrDTO.getPage() == null ? 1 : exportAttrDTO.getPage());
 				thisPage.setSort(exportAttrDTO.getSort());
 				thisPage.setOrder(exportAttrDTO.getOrder());
 				thisPage.addDefaultDesc("createTime");
-
-				total += commonsMapper.queryCountBySql(countSql);
+				total += commonsMapper.queryCountBySql(StringUtil.format(countPageSql, " limit " + exportAttrDTO.getLimit() + " offset " + i + ")subquery;"));
 			}
-		}else{
-
+		} else {
 			total = commonsMapper.queryCountBySql(countSql);
 		}
 		List<String> selectFieldList = new ArrayList<>();
-		if(!CollectionUtils.isEmpty(exportAttrDTO.getAttrIdIndexMap())){
-			selectFieldList = exportAttrDTO.getAttrIdIndexMap().values().stream().map(s->s.toLowerCase(Locale.ROOT)).collect(Collectors.toList());
-		}else{
-			selectFieldList = templateVO.getAttributes().stream().filter(s->VciBaseUtil.getBoolean(s.getFormDisplayFlag())
-				||VciBaseUtil.getBoolean(s.getTableDisplayFlag())).map(s->s.getId().toLowerCase(Locale.ROOT)).collect(Collectors.toList());
+		if (!CollectionUtils.isEmpty(exportAttrDTO.getAttrIdIndexMap())) {
+			selectFieldList = exportAttrDTO.getAttrIdIndexMap().values().stream().map(s -> s.toLowerCase(Locale.ROOT)).collect(Collectors.toList());
+		} else {
+			selectFieldList = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getFormDisplayFlag())
+				|| VciBaseUtil.getBoolean(s.getTableDisplayFlag())).map(s -> s.getId().toLowerCase(Locale.ROOT)).collect(Collectors.toList());
 		}
 		//鍙傜収璁╁钩鍙扮洿鎺ユ煡璇㈠氨琛�
 		List<String> finalSelectFieldList = selectFieldList;
 		List<CodeClassifyTemplateAttrVO> referAttrVOs = templateVO.getAttributes().stream().filter(
 			s -> StringUtils.isNotBlank(s.getReferBtmId())
 				&&
-				(finalSelectFieldList.size() ==0 || finalSelectFieldList.contains(s.getId().toLowerCase(Locale.ROOT)))
+				(finalSelectFieldList.size() == 0 || finalSelectFieldList.contains(s.getId().toLowerCase(Locale.ROOT)))
 		).collect(Collectors.toList());
-		if(!CollectionUtils.isEmpty(referAttrVOs)){
+		if (!CollectionUtils.isEmpty(referAttrVOs)) {
 			for (int i = 0; i < referAttrVOs.size(); i++) {
 				selectFieldList.add(referAttrVOs.get(i).getId() + ".name");
 			}
 		}
 		List<String> excelNameList = new CopyOnWriteArrayList<>();
 		String tempFolder = LocalFileUtil.getDefaultTempFolder();
-		if(total>EXPORT_LIMIT){
+		if (total > EXPORT_LIMIT) {
 			//鍒嗙粍鏉ユ墽琛�
-			int queryCount = (total-total%EXPORT_LIMIT)/EXPORT_LIMIT;
-			if(total%EXPORT_LIMIT>0){
+			int queryCount = (total - total % EXPORT_LIMIT) / EXPORT_LIMIT;
+			if (total % EXPORT_LIMIT > 0) {
 				queryCount = queryCount + 1;
 			}
 			List<Integer> indexList = new ArrayList<>();
-			for (int i = 0; i <queryCount ; i++) {
+			for (int i = 0; i < queryCount; i++) {
 				indexList.add(i);
 			}
 			Map<String, String> finalConditionMap = conditionMap;
 			//骞惰鏌ヨ鐪嬬湅
-			SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
-			indexList.stream().forEach(index->{
+			//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+			indexList.stream().forEach(index -> {
 				//绾跨▼鐨勬柟寮忥紝鎵�浠ラ渶瑕佽缃綋鍓嶇敤鎴�
-				VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+				//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
 				PageHelper thisPage = new PageHelper(EXPORT_LIMIT);
-				thisPage.setPage(index+1);
+				thisPage.setPage(index + 1);
 				thisPage.setSort(exportAttrDTO.getSort());
 				thisPage.setOrder(exportAttrDTO.getOrder());
 				thisPage.addDefaultDesc("createTime");
-				selectDataAndExportExcelName(btmTypeId, finalConditionMap,thisPage,finalSelectFieldList,
-					classifyFullInfo,templateVO,exportAttrDTO,
-					excelNameList,tempFolder,index);
+				selectDataAndExportExcelName(btmTypeId, finalConditionMap, thisPage, finalSelectFieldList,
+					classifyFullInfo, templateVO, exportAttrDTO,
+					excelNameList, tempFolder, index);
 			});
-		}else{
+		} else {
 			pageHelper.setLimit(total);
 			pageHelper.setPage(1);
-			selectDataAndExportExcelName(btmTypeId,conditionMap,pageHelper,finalSelectFieldList,
-				classifyFullInfo,templateVO,exportAttrDTO,
-				excelNameList,tempFolder,1);
+			selectDataAndExportExcelName(btmTypeId, conditionMap, pageHelper, finalSelectFieldList,
+				classifyFullInfo, templateVO, exportAttrDTO,
+				excelNameList, tempFolder, 1);
 		}
-		if(excelNameList.size() ==0){
+		if (excelNameList.size() == 0) {
 			throw new VciBaseException("娌℃湁鏁版嵁鍙互琚鍑�");
 		}
-		if(excelNameList.size() == 1){
+		if (excelNameList.size() == 1) {
 			return excelNameList.get(0);
 		}
 		//鏄涓紝鎴戜滑闇�瑕佹墦鎴愬帇缂╁寘
-		String zipFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + classifyFullInfo.getCurrentClassifyVO().getId() + "_" + classifyFullInfo.getCurrentClassifyVO().getName() + "_瀵煎嚭_" + excelNameList.size()+".zip";
+		String zipFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + classifyFullInfo.getCurrentClassifyVO().getId() + "_" + classifyFullInfo.getCurrentClassifyVO().getName() + "_瀵煎嚭_" + excelNameList.size() + ".zip";
 		VciZipUtil zipUtil = new VciZipUtil();
 		File file = new File(tempFolder);
-		zipUtil.addFileToZip(file,zipFileName);
+		zipUtil.addFileToZip(file, zipFileName);
 		File[] files = file.listFiles();
 		for (int i = 0; i < files.length; i++) {
-			LocalFileUtil.deleteTempFile(files[i],false);
+			LocalFileUtil.deleteTempFile(files[i], false);
 		}
-		LocalFileUtil.deleteTempFile(file,true);
+		LocalFileUtil.deleteTempFile(file, true);
 		return zipFileName;
 	}
 
 	/**
 	 * 鏌ヨ鏁版嵁骞跺鍑哄埌excel
-	 * @param btmTypeId 涓氬姟绫诲瀷
-	 * @param conditionMap 鏌ヨ鏉′欢
-	 * @param pageHelper 鍒嗛〉
-	 * @param selectFieldList 鏌ヨ鐨勫瓧娈�
+	 *
+	 * @param btmTypeId        涓氬姟绫诲瀷
+	 * @param conditionMap     鏌ヨ鏉′欢
+	 * @param pageHelper       鍒嗛〉
+	 * @param selectFieldList  鏌ヨ鐨勫瓧娈�
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
-	 * @param templateVO 妯℃澘鐨勪俊鎭�
-	 * @param exportAttrDTO 瀵煎嚭鐨勫睘鎬�
-	 * @param excelNameList excel鐨勬枃浠跺悕绉�
-	 * @param tempFolder 涓存椂鏂囦欢澶�
-	 * @param excelIndex excel鐨勯『搴�
+	 * @param templateVO       妯℃澘鐨勪俊鎭�
+	 * @param exportAttrDTO    瀵煎嚭鐨勫睘鎬�
+	 * @param excelNameList    excel鐨勬枃浠跺悕绉�
+	 * @param tempFolder       涓存椂鏂囦欢澶�
+	 * @param excelIndex       excel鐨勯『搴�
 	 */
 	private void selectDataAndExportExcelName(String btmTypeId, Map<String, String> conditionMap, PageHelper pageHelper, List<String> selectFieldList,
 											  CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO, CodeExportAttrDTO exportAttrDTO,
 											  List<String> excelNameList, String tempFolder,
 											  Integer excelIndex) {
 		DataGrid<Map<String, String>> dataGrid = engineService.queryGrid(btmTypeId, templateVO, conditionMap, pageHelper);
-		if(dataGrid == null || CollectionUtils.isEmpty(dataGrid.getData())){
+		if (dataGrid == null || CollectionUtils.isEmpty(dataGrid.getData())) {
 			return;
 		}
 		//杞崲鏁版嵁
 		List<Map<String, String>> dataMap = dataGrid.getData();
 		//灏佽鏌ヨ鍑烘潵鐨勬暟鎹�
-		engineService.wrapperData(dataMap, templateVO, selectFieldList,false);
+		engineService.wrapperData(dataMap, templateVO, selectFieldList, false);
 		//modify by weidy@2022-09-27
 		//鍥犱负鍦ㄥ垪琛ㄥ拰琛ㄥ崟鐨勬樉绀虹殑鏃跺�欙紝鎴戜滑鐨勫紑鍏崇被鍨嬮〉闈細澶勭悊锛屼絾鏄湪瀵煎嚭鐨勬椂鍊欙紝鎴戜滑闇�瑕佸皢true鍜宖alse閮芥浛鎹㈡垚涓枃
-		engineService.wrapperBoolean(dataMap,templateVO);
-		Map<String, CodeClassifyTemplateAttrVO> attrVOMap = templateVO.getAttributes().stream().filter(s->selectFieldList.contains(s.getId().toLowerCase(Locale.ROOT))).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		engineService.wrapperBoolean(dataMap, templateVO);
+		Map<String, CodeClassifyTemplateAttrVO> attrVOMap = templateVO.getAttributes().stream().filter(s -> selectFieldList.contains(s.getId().toLowerCase(Locale.ROOT))).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 		Map<Integer, String> attrIdIndexMap = exportAttrDTO.getAttrIdIndexMap();
 		if (CollectionUtils.isEmpty(attrIdIndexMap)) {
-			attrIdIndexMap = templateVO.getAttributes().stream().filter(s->selectFieldList.contains(s.getId().toLowerCase(Locale.ROOT))).collect(Collectors.toMap(s -> s.getOrderNum(), t -> t.getId()));
+			attrIdIndexMap = templateVO.getAttributes().stream().filter(s -> selectFieldList.contains(s.getId().toLowerCase(Locale.ROOT))).collect(Collectors.toMap(s -> s.getOrderNum(), t -> t.getId()));
 		}
 		List<Integer> indexList = attrIdIndexMap.keySet().stream().sorted().collect(Collectors.toList());
 
@@ -1653,9 +2106,9 @@
 			if (attrVOMap.containsKey(attrId)) {
 				CodeClassifyTemplateAttrVO attrVO = attrVOMap.get(attrId);
 				Object text = attrVO.getName();
-				text = exportKeyAndRequired(workbook,attrVO,text);
+				text = exportKeyAndRequired(workbook, attrVO, text);
 				WriteExcelData excelData = new WriteExcelData(0, i, text);
-				if(text instanceof RichTextString){
+				if (text instanceof RichTextString) {
 					excelData.setFontColor(String.valueOf(HSSFColor.HSSFColorPredefined.RED.getIndex()));
 				}
 				excelDataList.add(excelData);
@@ -1676,7 +2129,7 @@
 					if (StringUtils.isNotBlank(attrVO.getReferBtmId()) || StringUtils.isNotBlank(attrVO.getReferConfig())) {
 						attrId = attrId + "name";
 					}
-					if(VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(attrId)){
+					if (VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(attrId)) {
 						attrId = VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT);
 					}
 					excelDataList.add(new WriteExcelData(rowIndex[0], i, data.getOrDefault(attrId, "")));
@@ -1687,53 +2140,63 @@
 		ExcelUtil.writeDataToFile(excelName, excelOption);
 	}
 
+	/**
+	 * 鐩镐技椤规煡璇㈠嚭鏉ヤ箣鍚庡啀鐐瑰嚮纭鏃惰皟鐢ㄧ殑
+	 *
+	 * @param codeImprotSaveDatVOList
+	 * @param classifyAttr
+	 * @param isImprot
+	 * @return
+	 */
 	@Override
 	public R batchImportData(List<CodeImprotSaveDatVO> codeImprotSaveDatVOList, String classifyAttr, boolean isImprot) {
 		WriteExcelOption eo = new WriteExcelOption();
-		AtomicBoolean success= new AtomicBoolean(true);
+		AtomicBoolean success = new AtomicBoolean(true);
+		AtomicReference<CodeClassifyTemplateVO> codeClassifyTemplateVO = new AtomicReference<>();
 		codeImprotSaveDatVOList.stream().forEach(codeImprotSaveDatVO -> {
 			List<SheetRowData> rowDataList = new ArrayList<>();
-			List<ClientBusinessObject>cboList=new ArrayList<>();
-			List<String> colList=codeImprotSaveDatVO.getClos();
-			CodeOrderDTO orderDTO= codeImprotSaveDatVO.getOrderDTO();
-			List<Map<String, String>> dataList= codeImprotSaveDatVO.getDataList();
+			List<ClientBusinessObject> cboList = new ArrayList<>();
+			List<String> colList = codeImprotSaveDatVO.getClos();
+			CodeOrderDTO orderDTO = codeImprotSaveDatVO.getOrderDTO();
+			List<Map<String, String>> dataList = codeImprotSaveDatVO.getDataList();
 			Map<Integer, String> fieldIndexMap = new HashMap();
-			for (int i=0;i<dataList.size();i++){
-				SheetRowData sheetRowData=new SheetRowData();
-				Map<String,String> dataMap= dataList.get(i);
+			for (int i = 0; i < dataList.size(); i++) {
+				SheetRowData sheetRowData = new SheetRowData();
+				Map<String, String> dataMap = dataList.get(i);
 				Map<Integer, String> data = new HashMap();
 				final int[] colIndex = {0};
 				Map<Integer, String> finalFieldIndexMap = new HashMap<>();
-				dataMap.forEach((field, value)->{
-					if(!ROW_INDEX.equalsIgnoreCase(field) && !ERROR_MSG.equalsIgnoreCase(field)){
-						data.put(colIndex[0],value);
-						finalFieldIndexMap.put(colIndex[0]++,field);
+				dataMap.forEach((field, value) -> {
+					if (!ROW_INDEX.equalsIgnoreCase(field) && !ERROR_MSG.equalsIgnoreCase(field)) {
+						data.put(colIndex[0], value);
+						finalFieldIndexMap.put(colIndex[0]++, field);
 					}
 				});
-				fieldIndexMap=finalFieldIndexMap;
+				fieldIndexMap = finalFieldIndexMap;
 				sheetRowData.setData(data);
-				sheetRowData.setRowIndex(i+"");
+				sheetRowData.setRowIndex(i + "");
 				rowDataList.add(sheetRowData);
 			}
 			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
-			log.info("鍒嗙被锛�"+classifyFullInfo.getCurrentClassifyVO().getName()+"鏁版嵁:"+codeImprotSaveDatVO.getDataList().size());
+			log.info("鍒嗙被锛�" + classifyFullInfo.getCurrentClassifyVO().getName() + "鏁版嵁:" + codeImprotSaveDatVO.getDataList().size());
 
 			// CodeClassifyTemplateVO codeClassifyTemplateVO=   engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
-			CodeClassifyTemplateVO codeClassifyTemplateVO=  templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
+			codeClassifyTemplateVO.set(templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid()));
 			//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
 			CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
 			//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
-			List<CodeClassifyTemplateAttrVO> attrVOS = codeClassifyTemplateVO.getAttributes().stream().filter(s ->
-				!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
+			List<CodeClassifyTemplateAttrVO> attrVOS = codeClassifyTemplateVO.get().getAttributes().stream().filter(s ->
+				!DEFAULT_ATTR_LIST.contains(s.getId()) &&
+					((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 			).collect(Collectors.toList());
 			String fullPath = getFullPath(classifyFullInfo);
-			excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList, codeClassifyTemplateVO,cboList,fullPath,!isImprot);
-			Map<String,String> errorMap=new HashMap<>();
-			Map<String/**璺緞**/, CodeClassifyVO> pathMap=new HashMap<>() ;
+			excelToCbo(classifyFullInfo, fieldIndexMap, rowDataList, codeClassifyTemplateVO.get(), cboList, fullPath, !isImprot);
+			Map<String, String> errorMap = new ConcurrentHashMap<>();
+			Map<String/**璺緞**/, CodeClassifyVO> pathMap = new HashMap<>();
 			//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
 			Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
-			Map<String, CodeRuleVO> ruleVOMap =new ConcurrentHashMap<>();
-			if(isImprot) {
+			Map<String, CodeRuleVO> ruleVOMap = new ConcurrentHashMap<>();
+			if (isImprot) {
 				Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
 				//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
 				//鎵炬墍鏈夌殑鍒嗙被璺緞,闇�瑕佹牎楠岃矾寰勬槸鍚︽纭紝鏄惁閮藉湪褰撳墠鐨勫垎绫荤殑涓嬬骇
@@ -1749,49 +2212,52 @@
 				Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
 				List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
 				checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
-				ruleVOMap = ruleService.listCodeRuleByIds(ruleOidMap.values(), true).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				// TODO	鏀圭敤oid鏌ヨ鐨勶紝杩欏効涓嶈鐢╥d
+				ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
 
 				checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
 			}
 
 			//鍒嗙被娉ㄥ叆
-			batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,isImprot);
+			batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo, isImprot);
 			//boolean
-			reSwitchBooleanAttrOnOrder(attrVOS,cboList);
+			reSwitchBooleanAttrOnOrder(attrVOS, cboList);
 			//4.鏍¢獙瑙勫垯
-			batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
+			batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
 			//5.鏍¢獙鏋氫妇鏄惁姝g‘
 			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
 			//7.澶勭悊鍙傜収鐨勬儏鍐�
-			batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
+			batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
 			//6.鏃堕棿鏍煎紡鐨勯獙璇�
 			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-			batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
+			batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
 			//璁剧疆榛樿鍊�
 			batchSwitchAttrDefault(attrVOS, cboList);
 			//鏈�鍚庡紕缁勫悎瑙勫垯
-			batchSwitchComponentAttrOnOrder(attrVOS,cboList);
+			batchSwitchComponentAttrOnOrder(attrVOS, cboList);
 			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, codeClassifyTemplateVO, cboList);
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, codeClassifyTemplateVO.get(), cboList, false, errorMap);
 			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-			if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
-				keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+			if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+				keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format("鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅[%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
 				});
 			}
 			//4.鏍¢獙瑙勫垯
-			batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
+			batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
 
-			if(isImprot){
+			if (isImprot) {
 				List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
 					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 					return !errorMap.containsKey(rowIndex);
 				}).collect(Collectors.toList());
 				List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
 				Map<String, CodeRuleVO> finalRuleVOMap = ruleVOMap;
-				ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
-					List <BaseModel>dataCBOList=new CopyOnWriteArrayList<>();
+				// TODO锛� 澶氱嚎绋嬫祦濂楀绾跨▼娴侊紝鏈夊潙锛屾垜鎶婅繖鍎挎敼鎴愬崟绾跨▼浜�
+				final BladeUser user = AuthUtil.getUser();
+				ruleRowIndexMap.keySet().stream().forEach(ruleOid -> {
+					List<BaseModel> dataCBOList = new CopyOnWriteArrayList<>();
 					List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
 					List<ClientBusinessObject> thisCbos = needSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
 					if (!CollectionUtils.isEmpty(thisCbos)) {
@@ -1801,20 +2267,21 @@
 							dataCBOList.add(baseModel);
 						});
 						try {
-							productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, finalRuleVOMap.get(ruleOid), null, dataCBOList);
+							productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO.get(), finalRuleVOMap.get(ruleOid), null, dataCBOList, user);
 						} catch (Throwable e) {
 							//success=false;
 							log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
 							thisCbos.stream().forEach(cbo -> {
 								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:"+e.getMessage());
+								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:" + e.getMessage());
 							});
 						}
 					}
-					engineService.batchSaveSelectChar(codeClassifyTemplateVO, dataCBOList);
+					engineService.batchSaveSelectChar(codeClassifyTemplateVO.get(), dataCBOList);
 				});
-			}else {
-				List<BaseModel> dataCBOList=new ArrayList<>();
+			} else {
+				final BladeUser user = AuthUtil.getUser();
+				List<BaseModel> dataCBOList = new ArrayList<>();
 				List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
 					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 					return !errorMap.containsKey(rowIndex);
@@ -1827,34 +2294,36 @@
 						dataCBOList.add(baseModel);
 					});
 					try {
-						productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList);
+						productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO.get(), ruleVO, orderDTO.getSecDTOList(), dataCBOList, user);
 					} catch (Exception e) {
 						log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
 						needSaveCboList.stream().forEach(cbo -> {
 							String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-							errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:"+e.getMessage());
+							errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:" + e.getMessage());
 						});
 					}
 					//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
-					engineService.batchSaveSelectChar(codeClassifyTemplateVO, dataCBOList);
+					engineService.batchSaveSelectChar(codeClassifyTemplateVO.get(), dataCBOList);
 				}
 			}
-			if(errorMap.size()>0) {
+			if (errorMap.size() > 0) {
 				success.set(false);
 				LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
 				excelDataList.add(new WriteExcelData(0, 0, "閿欒淇℃伅"));
 				final int[] index = {1};
-				errorMap.forEach((key,v)->{
-					excelDataList.add(new WriteExcelData(index[0]++, 0, "绗�"+(Integer.parseInt(key)+1)+"琛屾暟鎹細"+v));
+				errorMap.forEach((key, v) -> {
+					excelDataList.add(new WriteExcelData(index[0]++, 0, "绗�" + (Integer.parseInt(key) + 1) + "琛屾暟鎹細" + v));
 				});
-				eo.addSheetDataList(codeClassifyTemplateVO.getName() + "瀵煎叆妯℃澘", excelDataList);
+				eo.addSheetDataList(codeClassifyTemplateVO.get().getName() + "瀵煎叆妯℃澘", excelDataList);
 			}
 		});
-		if(!success.get()){
-			String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + (isImprot?"鎵归噺鍘嗗彶閿欒淇℃伅.xls":"鎵归噺鐢宠閿欒淇℃伅.xls");
-			ExcelUtil.writeDataToFile(excelName,eo);
-			return  R.fail(excelName);
-		}else {
+		if (!success.get()) {
+			String excelName = LocalFileUtil.getDefaultTempFolder() + File.separator + (isImprot ? "鎵归噺鍘嗗彶閿欒淇℃伅.xls" : "鎵归噺鐢宠閿欒淇℃伅.xls");
+			ExcelUtil.writeDataToFile(excelName, eo);
+			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆", true, StringUtil.format("閿欒淇℃伅锛歿}", JSON.toJSONString(eo.getWriteDataMap())));
+			return R.fail(excelName);
+		} else {
+			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆", false, StringUtil.format("瀵煎叆鍒板垎绫粄}涓紝瀵煎叆鎴愬姛鎬绘暟涓猴細{}", JSON.toJSONString(codeClassifyTemplateVO), Func.isEmpty(codeImprotSaveDatVOList.get(0).getDataList().size())));
 			return R.success(isImprot ? "鎵归噺鍘嗗彶瀵煎叆鎴愬姛" : "鎵归噺鐢宠鎴愬姛");
 		}
 	}
@@ -1867,12 +2336,12 @@
 	 * @return
 	 */
 	@Override
-	public R deleteDatas(String redisOid,String codeClssifyOid,String dataOids) {
+	public R deleteDatas(String redisOid, String codeClssifyOid, String dataOids) {
 		VciBaseUtil.alertNotNull(redisOid, "鏁版嵁鍒犻櫎", redisOid, "鏁版嵁缂撳瓨涓婚敭");
 		VciBaseUtil.alertNotNull(codeClssifyOid, "鏁版嵁鍒犻櫎", codeClssifyOid, "缂栫爜瑙勫垯缂撳瓨涓婚敭");
 		VciBaseUtil.alertNotNull(dataOids, "鏁版嵁鍒犻櫎", dataOids, "鎵�闇�鍒犻櫎鐨勬暟鎹富閿�");
 		try {
-			List<CodeImprotDataVO> codeImprotDataVOs = bladeRedis.lRange(redisOid + "-" + codeClssifyOid,0,-1);
+			List<CodeImprotDataVO> codeImprotDataVOs = bladeRedis.lRange(redisOid + "-" + codeClssifyOid, 0, -1);
 			List<String> dataOidList = new ArrayList<>();
 			codeImprotDataVOs.stream().forEach(codeImprotDataVO -> {
 				List<Map<String, String>> newDataList = new ArrayList<>();
@@ -1892,22 +2361,23 @@
 			bladeRedis.set(redisOid + "-" + codeClssifyOid, codeImprotDataVOs);
 			bladeRedis.expire(redisOid + "-" + codeClssifyOid, BATCHADD_REDIS_TIME);
 			return R.success("鍒犻櫎缂撳瓨鏁版嵁鎴愬姛");
-		}catch (Throwable e){
+		} catch (Throwable e) {
 			return R.fail("鍒犻櫎缂撳瓨鏁版嵁澶辫触!");
 		}
 	}
 
 	/**
 	 * 闆嗘垚鎵归噺鐢宠鏁版嵁
-	 * @param orderDTO 鍒嗙被鐨勪富閿�
-	 * @param dataObjectVO 鏁版嵁淇℃伅
+	 *
+	 * @param orderDTO                  鍒嗙被鐨勪富閿�
+	 * @param dataObjectVO              鏁版嵁淇℃伅
 	 * @param resultDataObjectDetailDOs 閿欒淇℃伅
 	 * @return 鏈夐敊璇俊鎭殑excel
 	 */
 	@Override
-	public void batchSyncApplyCode(CodeOrderDTO orderDTO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs,boolean isCodeOrGroupCode) {
-		Map<String,String> errorMap=new HashMap<>();
-		VciBaseUtil.alertNotNull(orderDTO,"缂栫爜鐢宠鐩稿叧鐨勬暟鎹�",orderDTO.getCodeClassifyOid(),"涓婚搴撳垎绫讳富閿�");
+	public void batchSyncApplyCode(CodeOrderDTO orderDTO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs, boolean isCodeOrGroupCode) {
+		Map<String, String> errorMap = new ConcurrentHashMap<>();
+		VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勬暟鎹�", orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫讳富閿�");
 		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
 		//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
 		CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
@@ -1916,61 +2386,78 @@
 		//鏌ヨ鍒嗙被鍜屾ā鏉�
 		//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
 		List<RowDatas> rowDataList = dataObjectVO.getRowData();
-		Map<String , RowDatas>rowDataMap=new LinkedHashMap<>();
-		rowDataList.stream().forEach(rowData->{
-			rowDataMap.put(rowData.getRowIndex(),rowData);
+		Map<String, RowDatas> rowDataMap = new LinkedHashMap<>();
+		rowDataList.stream().forEach(rowData -> {
+			rowDataMap.put(rowData.getRowIndex(), rowData);
 		});
 		//鎵剧涓�琛岋紝涓轰簡鎵炬爣棰�
 		CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
 
 		//鏍¢獙妯℃澘鏄笉鏄渶鏂扮殑
 		//checkTemplateSync(sheetDataSetList,templateVO);
-		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
-		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
+		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁鍏锋湁鍒嗙被娉ㄥ叆鐨勬墠杩囨护鍑烘潵
+		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(
+			s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) &&
+				((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 		).collect(Collectors.toList());
-		Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
+		Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
 		List<String> titleRowData = dataObjectVO.getColName();
-		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
-		getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
+		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT), (o1, o2) -> o2));
+		getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
 
 		//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
 		List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
 			&& com.alibaba.cloud.commons.lang.StringUtils.isBlank(s.getComponentRule()) && com.alibaba.cloud.commons.lang.StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
 		).collect(Collectors.toList());
-		if(!CollectionUtils.isEmpty(unExistAttrVOs)){
-			throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪excel涓病鏈夋壘鍒�");
+		if (!CollectionUtils.isEmpty(unExistAttrVOs)) {
+			String message = unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(SERIAL_UNIT_SPACE));
+			throw new VciBaseException("銆�" + message + "銆戣繖浜涘睘鎬у湪excel涓病鏈夋壘鍒�");
 		}
 		List<ClientBusinessObject> cboList = new ArrayList<>();
 		String fullPath = getFullPath(classifyFullInfo);
 
 		// List<CodeClassifyProcessTempVO> codeClassifyProcessTempVOS=codeClassifyProcessTempService.listProcessTemplate(templateVO.getOid(),"code_cls_flow_use_order");
-		boolean isProcess=false;
+		boolean isProcess = false;
 		//娉ㄩ噴鎺夋澶勪笅闈㈡墍鏈夐兘鎸夌収涓嶅垽鏂祦绋嬪瓨鍌ㄧ姸鎬佷簡
 		/** if(!CollectionUtils.isEmpty(codeClassifyProcessTempVOS)){
 		 isProcess=true;
 		 }***/
-		Map<String,String> codeOidToSystemOidMap=new HashMap<>();//瀛樺偍缂栫爜鏁版嵁鍜岄泦鎴愮郴缁熸暟鎹畂id瀵圭収鏄犲皠
-		excelToCbo(classifyFullInfo,titleRowData,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,isProcess,"create",errorMap,codeOidToSystemOidMap);
+		Map<String, String> codeOidToSystemOidMap = new HashMap<>();//瀛樺偍缂栫爜鏁版嵁鍜岄泦鎴愮郴缁熸暟鎹畂id瀵圭収鏄犲皠
+		excelToCbo(classifyFullInfo, titleRowData, fieldIndexMap, rowDataList, templateVO, cboList, fullPath, isProcess, "create", errorMap, codeOidToSystemOidMap);
 
 		//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
 		//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+
+		Map<String, String> errorKeyMap = new ConcurrentHashMap<>();
+		//1.鍒嗙被娉ㄥ叆
+		batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo, false);
+		//boolean
+		reSwitchBooleanAttrOnOrder(attrVOS, cboList);
+		// cboList.stream().forEach(cbo->{
+		//2.鏍¢獙瑙勫垯
+		batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
+		//3.鏍¢獙鏋氫妇鏄惁姝g‘
+		batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+		//4.鏃堕棿鏍煎紡鐨勯獙璇�
+		//4.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+		batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
+		//5.澶勭悊鍙傜収鐨勬儏鍐�
+		batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
+		//6璁剧疆榛樿鍊�
+		batchSwitchAttrDefault(attrVOS, cboList);
 		//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
-		batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
-
-
-		/**
-		 * 鍏抽敭鐔熸倝閿欒鎻愮ず
-		 */
-		Map<String,String> errorKeyMap=new HashMap<>();
-
-
+		batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
+		//鏈�鍚庡紕缁勫悎瑙勫垯
+		batchSwitchComponentAttrOnOrder(attrVOS, cboList);
 		//3.鍒ゆ柇鍏抽敭灞炴��
-		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
+		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList, false, errorKeyMap);
+		log.info("================鏌ラ噸鍚庣殑errorKeyMap閿欒淇℃伅================="+JSON.toJSONString(errorKeyMap));
 		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-		Map<String,List<String>>keyAttrOkOidTORepeatOidMap= keyResultVO.getKeyAttrOkOidTORepeatOidMap();
-		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
-			selfRepeatRowIndexList.stream().forEach(rowIndex->{
+
+		Map<String, List<String>> keyAttrOkOidTORepeatOidMap = keyResultVO.getKeyAttrOkOidTORepeatOidMap();
+		if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
+			selfRepeatRowIndexList.stream().forEach(rowIndex -> {
                /* //浼犲叆鏁版嵁涔嬮棿鍏抽敭灞炴�х殑鏍¢獙
                 RowDatas rowData= rowDataMap.get(rowIndex);
                 XMLResultDataObjectDetailDO resultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
@@ -1980,14 +2467,14 @@
                 resultDataObjectDetailDO.setMsg(errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�ч噸澶�");
                 resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
                 */
-				errorKeyMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";浼犲叆鐨勬暟鎹腑鍏抽敭灞炴�ч噸澶�");
+				errorKeyMap.put(rowIndex, errorKeyMap.getOrDefault(rowIndex, "") + String.format(";浼犲叆鐨勬暟鎹腑鍏抽敭灞炴�ч噸澶峓%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
 			});
 		}
 		/****
 		 * 鍏抽敭灞炴�т笌绯荤粺涓噸澶嶇殑鍒ゆ柇
 		 */
-		if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
-			keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
+		if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+			keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
 				//浼犲叆鏁版嵁涔嬮棿鍏抽敭灞炴�х殑鏍¢獙
                /* RowDatas rowData= rowDataMap.get(rowIndex);
                 XMLResultDataObjectDetailDO resultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
@@ -1997,42 +2484,32 @@
                 resultDataObjectDetailDO.setMsg(errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
                 resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
                 */
-				errorKeyMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+				Map<String, List<BaseModel>> indexTODataMap = keyResultVO.getIndexTODataMap();
+				if (indexTODataMap.containsKey(rowIndex)) {
+					List<BaseModel> baseModelList = indexTODataMap.get(rowIndex);
+				}
+				errorKeyMap.put(rowIndex, errorKeyMap.getOrDefault(rowIndex, "") + String.format("鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅[%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
 			});
 		}
-		//鍒嗙被娉ㄥ叆
-		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
-		//boolean
-		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
-		// cboList.stream().forEach(cbo->{
-		//4.鏍¢獙瑙勫垯
-		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
-		//5.鏍¢獙鏋氫妇鏄惁姝g‘
-		batchSwitchEnumAttrOnOrder(attrVOS,cboList,errorMap);
-		//6.鏃堕棿鏍煎紡鐨勯獙璇�
-		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
-		//7.澶勭悊鍙傜収鐨勬儏鍐�
-		batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
 		//鏍¢獙灞炴�ф槸鍚︽纭敊璇俊鎭�
-		if(errorMap.size()>0){
+		if (errorMap.size() > 0) {
 			String[] newMsg = {""};
 			cboList.stream().forEach(cbo -> {
-				String rowIndex =cbo.getAttributeValue(IMPORT_ROW_INDEX);
-				if(errorMap.containsKey(rowIndex)){
-					String oid=cbo.getOid();
-					String sourceOid=oid;
-					if(codeOidToSystemOidMap.containsKey(oid)){
-						sourceOid=codeOidToSystemOidMap.get(oid);
+				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+				if (errorMap.containsKey(rowIndex)) {
+					String oid = cbo.getOid();
+					String sourceOid = oid;
+					if (codeOidToSystemOidMap.containsKey(oid)) {
+						sourceOid = codeOidToSystemOidMap.get(oid);
 					}
-					String code="";
-					String groupCode="";
-					String errorid="103";
-					String mes=errorMap.get(rowIndex);
-					XMLResultDataObjectDetailDO resultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
-					if(isCodeOrGroupCode){
+					String code = "";
+					String groupCode = "";
+					String errorid = "103";
+					String mes = errorMap.get(rowIndex);
+					XMLResultDataObjectDetailDO resultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
+					if (isCodeOrGroupCode) {
 						resultDataObjectDetailDO.setCode(groupCode);
-					}else{
+					} else {
 						resultDataObjectDetailDO.setCode(code);
 					}
 					resultDataObjectDetailDO.setId(sourceOid);
@@ -2044,131 +2521,135 @@
 
 		}
 
-		Map<String,String> newKeyMap=new HashedMap();
-		if(errorKeyMap.size()>0 ) {
-			errorKeyMap.keySet().forEach(key->{
-				if(!errorMap.containsKey(key)){
-					newKeyMap.put(key,errorKeyMap.get(key));
+		Map<String, String> newKeyMap = new HashedMap();
+		if (errorKeyMap.size() > 0) {
+			errorKeyMap.keySet().forEach(key -> {
+				if (!errorMap.containsKey(key)) {
+					newKeyMap.put(key, errorKeyMap.get(key));
 				}
 			});
-			if(newKeyMap.size()>0) {
+			if (newKeyMap.size() > 0) {
 				List<BaseModel> editBoList = new ArrayList<>();
 				Map<String, List<BaseModel>> indexTodataMap = keyResultVO.getIndexTODataMap();
 				cboList.stream().forEach(cbo -> {
 					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					String msg = errorKeyMap.get(rowIndex);
 					if (indexTodataMap.containsKey(rowIndex)) {
 						String oid = cbo.getOid();
 						String sourceOid = oid;
 						String code = "";
-						String groupCode="";
 						String errorid = "201";
-						if(codeOidToSystemOidMap.containsKey(oid)){
-							sourceOid=codeOidToSystemOidMap.get(oid);
+						if (codeOidToSystemOidMap.containsKey(oid)) {
+							sourceOid = codeOidToSystemOidMap.get(oid);
 						}
 						List<BaseModel> newCboList = indexTodataMap.get(rowIndex);
 						if (!CollectionUtils.isEmpty(newCboList)) {
-							BaseModel newCbo= newCboList.get(0);
-							String lcstatus =newCbo.getLcStatus();
-							String newOid =newCbo.getOid();
-							Date ts =newCbo.getTs();
-							code = StringUtils.isBlank(newCbo.getId())?"":newCbo.getId();
-							groupCode=newCbo.getData().getOrDefault("GROUPCODE","");
-							String lastmodifier=newCbo.getLastModifier();
-							if (lcstatus!=null&&!lcstatus.equals(CodeDefaultLC.RELEASED.getValue())) {
-								newCbo.setOid(newOid);
-								newCbo.setLastModifier(lastmodifier);
-								/*if(isCodeOrGroupCode) {
-									newCbo.setId(code);
-								}else{
-									newCbo.getData().put("groupcode",groupCode);
-								}*/
-								newCbo.setTs(ts);
-								cbo.setLastModifier(cbo.getLastModifier());
-								editBoList.add(newCbo);
-							}
-							String mes = errorKeyMap.get(rowIndex);
-							XMLResultDataObjectDetailDO resultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
-							if(isCodeOrGroupCode) {
-								if(StringUtils.isBlank(groupCode)){
-									mes+="锛涚敵璇风殑缂栫爜绫诲瀷涓洪泦鍥㈢爜锛岀瓑寰呴泦鍥㈢紪鐮佽祴鍊�";
+							//澶勭悊鍏抽敭灞炴�ф煡鍑哄鏉$殑璇濓紝鏍规嵁闆嗘垚璋冪敤鐨勫綋鍓嶅垎绫讳唬鍙峰彇褰撳墠鍒嗙被鐨勭爜鍊笺��
+							Map<String/**缂栫爜**/, BaseModel/**閲嶅缂栫爜鏁版嵁**/> classOidTOBaseModelMap = new HashMap<>();
+							newCboList.stream().forEach(baseModel -> {
+								String codeclsfid = baseModel.getData().get(CODE_CLASSIFY_OID_FIELD.toLowerCase(Locale.ROOT));
+								classOidTOBaseModelMap.put(codeclsfid, baseModel);
+							});
+							String codeclsfid = classifyFullInfo.getCurrentClassifyVO().getOid();
+							if (classOidTOBaseModelMap.containsKey(codeclsfid)) {
+								BaseModel newCbo = classOidTOBaseModelMap.get(codeclsfid);
+								String lcstatus = newCbo.getLcStatus();
+								String newOid = newCbo.getOid();
+								Date ts = newCbo.getTs();
+								code = StringUtils.isBlank(newCbo.getId()) ? "" : newCbo.getId();
+								if (isCodeOrGroupCode) {
+									code = newCbo.getData().getOrDefault("GROUPCODE", "");
+									if (StringUtils.isBlank(code)) {
+										errorid = "1";
+										msg = "锛涚敵璇风殑缂栫爜绫诲瀷涓洪泦鍥㈢爜锛岀瓑寰呴泦鍥㈢紪鐮佽祴鍊�";
+									}
 								}
-								resultDataObjectDetailDO.setCode(groupCode);
-							}else{
-								resultDataObjectDetailDO.setCode(code);
+								String lastmodifier = newCbo.getLastModifier();
+								if (lcstatus != null && !lcstatus.equals(CodeDefaultLC.RELEASED.getValue())) {
+									newCbo.setOid(newOid);
+									newCbo.setLastModifier(lastmodifier);
+									newCbo.setTs(ts);
+									cbo.setLastModifier(cbo.getLastModifier());
+									editBoList.add(newCbo);
+								}
+							} else {
+								errorid = "205";
+								msg += "锛涚紪鐮佸垯灞炰簬鍏朵粬鍒嗙被銆�";
 							}
+							XMLResultDataObjectDetailDO resultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
+							resultDataObjectDetailDO.setCode(code);
 							resultDataObjectDetailDO.setId(sourceOid);
 							resultDataObjectDetailDO.setErrorid(errorid);
-							resultDataObjectDetailDO.setMsg(mes);
+							resultDataObjectDetailDO.setMsg(msg);
 
 							resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
 						}
 					}
 				});
-				//鍏抽敭鐔熸倝鏇存敼
+				//鍏抽敭灞炴�ф洿鏀�
 				if (!CollectionUtils.isEmpty(editBoList)) {
-					engineService.updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(),editBoList);//淇濆瓨鏁版嵁
+					engineService.updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), editBoList);//淇濆瓨鏁版嵁
 				}
 				errorMap.putAll(errorKeyMap);
 			}
 		}
 
 		//  });
-		//璁剧疆榛樿鍊�
-		batchSwitchAttrDefault(attrVOS, cboList);
-		//鏈�鍚庡紕缁勫悎瑙勫垯
-		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
+
 		//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
 		List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
-			String rowIndex =cbo.getAttributeValue(IMPORT_ROW_INDEX);
+			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 			return !errorMap.containsKey(rowIndex);
 		}).collect(Collectors.toList());
 		List<String> needRowIndexList = new ArrayList<>();
-		if(!CollectionUtils.isEmpty(needSaveCboList)) {
+		if (!CollectionUtils.isEmpty(needSaveCboList)) {
 			//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
 			//鐢熸垚缂栫爜鐨勫唴瀹�
 
-			List<String>allNeedSaveCboList=new ArrayList<>();
-			List<BaseModel> dataCBOList=new ArrayList<>();
+			List<String> allNeedSaveCboList = new ArrayList<>();
+			List<BaseModel> dataCBOList = new ArrayList<>();
+			final BladeUser user = AuthUtil.getUser();
 			needSaveCboList.stream().forEach(clientBusinessObject -> {
-				BaseModel baseModel=new BaseModel();
-				BeanUtil.convert(clientBusinessObject,baseModel);
-			//(VciBaseUtil.objectToMapString(clientBusinessObject));
+				BaseModel baseModel = new BaseModel();
+				BeanUtil.convert(clientBusinessObject, baseModel);
+				//(VciBaseUtil.objectToMapString(clientBusinessObject));
 				dataCBOList.add(baseModel);
 				allNeedSaveCboList.add(baseModel.getOid());
 			});
 			try {
-				List<String>applyGroupCodeIdList=new ArrayList<>();
-				productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList);
+				List<String> applyGroupCodeIdList = new ArrayList<>();
+				productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList, user);
 				//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
 				engineService.batchSaveSelectChar(templateVO, dataCBOList);
 				// if(!isProcess){
-				dataCBOList.stream().forEach(needSaveCbo->{
+				dataCBOList.stream().forEach(needSaveCbo -> {
 
-					XMLResultDataObjectDetailDO resultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
-					String code=StringUtils.isBlank(needSaveCbo.getId())?" ":needSaveCbo.getId();
-					String groupCode=needSaveCbo.getData().getOrDefault("GROUPCODE"," ");
+					XMLResultDataObjectDetailDO resultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
+					String code = StringUtils.isBlank(needSaveCbo.getId()) ? " " : needSaveCbo.getId();
+					String groupCode = needSaveCbo.getData().getOrDefault("GROUPCODE", " ");
 					//resultDataObjectDetailDO.setCode(needSaveCbo.getId());
-					String msg="鐢宠缂栫爜鎴愬姛";
-					String oid=needSaveCbo.getOid();
-					String sourceOid=oid;
+					String msg = "鐢宠缂栫爜鎴愬姛";
+					String oid = needSaveCbo.getOid();
+					String sourceOid = oid;
 					applyGroupCodeIdList.add(oid);
-					if(codeOidToSystemOidMap.containsKey(oid)){
-						sourceOid=codeOidToSystemOidMap.get(oid);
+					if (codeOidToSystemOidMap.containsKey(oid)) {
+						sourceOid = codeOidToSystemOidMap.get(oid);
 					}
-					if(isCodeOrGroupCode) {
-						if(StringUtils.isBlank(groupCode)){
-							msg="鐢宠鐨勭紪鐮佺被鍨嬩负闆嗗洟鐮侊紝绛夊緟闆嗗洟缂栫爜璧嬪��";
+					if (isCodeOrGroupCode) {
+						if (StringUtils.isBlank(groupCode)) {
+							resultDataObjectDetailDO.setErrorid("1");
+							msg = "鐢宠鐨勭紪鐮佺被鍨嬩负闆嗗洟鐮侊紝绛夊緟闆嗗洟缂栫爜璧嬪��";
 						}
 						resultDataObjectDetailDO.setCode(groupCode);
-					}else{
+					} else {
 						resultDataObjectDetailDO.setCode(code);
+						resultDataObjectDetailDO.setErrorid("0");
 					}
 					resultDataObjectDetailDO.setId(sourceOid);
-					resultDataObjectDetailDO.setErrorid("0");
 					resultDataObjectDetailDO.setMsg(msg);
 					resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
 					//澶勭悊浼犻�佺殑鏁版嵁涓叧閿睘鎬ч噸澶嶇殑锛岀洿鎺ユ嬁鍒板凡缁忕敵璇峰埌缂栫爜鐨勬暟鎹紪鐮佺洿鎺ュ皢璧嬬粰鍏抽敭灞炴�ч噸澶嶇殑鏁版嵁
-					LinkedList<XMLResultDataObjectDetailDO> repeatDataObjectDetailDOS=handleApplyDataKeyAttrRepeat(keyAttrOkOidTORepeatOidMap,codeOidToSystemOidMap,needSaveCbo,isCodeOrGroupCode);
+					LinkedList<XMLResultDataObjectDetailDO> repeatDataObjectDetailDOS = handleApplyDataKeyAttrRepeat(keyAttrOkOidTORepeatOidMap, codeOidToSystemOidMap, needSaveCbo, isCodeOrGroupCode);
 					resultDataObjectDetailDOs.addAll(repeatDataObjectDetailDOS);
 				});
                /* }else{
@@ -2188,31 +2669,30 @@
 
                 }*/
 				//鏄惁璋冪敤闆嗗洟鎺ュ彛鐢宠鎺ュ彛
-				if(isCodeOrGroupCode){
-					if(!CollectionUtils.isEmpty(applyGroupCodeIdList)) {
+				if (isCodeOrGroupCode) {
+					if (!CollectionUtils.isEmpty(applyGroupCodeIdList)) {
 						this.sendApplyGroupcode(applyGroupCodeIdList, classifyFullInfo.getTopClassifyVO().getId(), sysIntegrationPushTypeEnum.ACCPET_APPCODE.getValue());
 					}
 				}
 
-			}catch (Throwable e){
+			} catch (Throwable e) {
 				e.printStackTrace();
-				needSaveCboList.stream().forEach(needSaveCbo->{
-					XMLResultDataObjectDetailDO resultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
+				needSaveCboList.stream().forEach(needSaveCbo -> {
+					XMLResultDataObjectDetailDO resultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
 					resultDataObjectDetailDO.setCode("");
-					String oid=needSaveCbo.getOid();
-					String sourceOid=oid;
-					if(codeOidToSystemOidMap.containsKey(oid)){
-						sourceOid=codeOidToSystemOidMap.get(oid);
+					String oid = needSaveCbo.getOid();
+					String sourceOid = oid;
+					if (codeOidToSystemOidMap.containsKey(oid)) {
+						sourceOid = codeOidToSystemOidMap.get(oid);
 					}
 					resultDataObjectDetailDO.setId(sourceOid);
 					resultDataObjectDetailDO.setErrorid("1");
-					resultDataObjectDetailDO.setMsg("淇濆瓨鍑虹幇闂:"+e.getMessage());
+					resultDataObjectDetailDO.setMsg("淇濆瓨鍑虹幇闂:" + e.getMessage());
 					resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
 				});
 
 			}
 		}
-
 	}
 
 	/***
@@ -2222,31 +2702,32 @@
 	 * @param needSaveCbo
 	 * @param isCodeOrGroupCode
 	 */
-	private LinkedList<XMLResultDataObjectDetailDO> handleApplyDataKeyAttrRepeat(Map<String,List<String>>keyAttrOkOidTORepeatOidMap,Map<String,String> codeOidToSystemOidMap,BaseModel needSaveCbo,boolean isCodeOrGroupCode){
-		LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs=new LinkedList<>();
-		String oid=needSaveCbo.getOid();
-		if(keyAttrOkOidTORepeatOidMap.containsKey(oid)){
-			List<String> repeatOidList= keyAttrOkOidTORepeatOidMap.get(oid);
-			if(!CollectionUtils.isEmpty(repeatOidList)){
-				String sourceNewOid=needSaveCbo.getOid();
-				String sourceOid=sourceNewOid;
-				if(codeOidToSystemOidMap.containsKey(oid)){
-					sourceOid=codeOidToSystemOidMap.get(oid);
+	private LinkedList<XMLResultDataObjectDetailDO> handleApplyDataKeyAttrRepeat(Map<String, List<String>> keyAttrOkOidTORepeatOidMap, Map<String, String> codeOidToSystemOidMap, BaseModel needSaveCbo, boolean isCodeOrGroupCode) {
+		LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs = new LinkedList<>();
+		String oid = needSaveCbo.getOid();
+		if (keyAttrOkOidTORepeatOidMap.containsKey(oid)) {
+			List<String> repeatOidList = keyAttrOkOidTORepeatOidMap.get(oid);
+			if (!CollectionUtils.isEmpty(repeatOidList)) {
+				String sourceNewOid = needSaveCbo.getOid();
+				String sourceOid = sourceNewOid;
+				if (codeOidToSystemOidMap.containsKey(oid)) {
+					sourceOid = codeOidToSystemOidMap.get(oid);
 				}
-				String code=StringUtils.isBlank(needSaveCbo.getId())?" ":needSaveCbo.getId();
-				String groupCode=needSaveCbo.getData().getOrDefault("GROUPCODE"," ");
+				String code = StringUtils.isBlank(needSaveCbo.getId()) ? " " : needSaveCbo.getId();
+				String groupCode = needSaveCbo.getData().getOrDefault("GROUPCODE", " ");
 				String finalSourceOid = sourceOid;
-				repeatOidList.stream().forEach(repeatOid->{
-					if(codeOidToSystemOidMap.containsKey(repeatOid)){
-						XMLResultDataObjectDetailDO repeatresultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
-						String repeatSourceOid=codeOidToSystemOidMap.get(repeatOid);
-						String repeatMsg="姝ゆ暟鎹笌鐢宠鐨勭紪鐮佹暟鎹甶d涓恒��"+ finalSourceOid +"銆戠殑鍏抽敭灞炴�т竴鑷达紝鍒欏彇鐩稿悓缂栫爜";
-						if(isCodeOrGroupCode) {
-							if(StringUtils.isBlank(groupCode)){
-								repeatMsg="鐢宠鐨勭紪鐮佺被鍨嬩负闆嗗洟鐮侊紝绛夊緟闆嗗洟缂栫爜璧嬪��";
+				repeatOidList.stream().forEach(repeatOid -> {
+					if (codeOidToSystemOidMap.containsKey(repeatOid)) {
+						XMLResultDataObjectDetailDO repeatresultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
+						String repeatSourceOid = codeOidToSystemOidMap.get(repeatOid);
+						//String repeatMsg = "姝ゆ暟鎹笌鐢宠鐨勭紪鐮佹暟鎹甶d涓恒��" + finalSourceOid + "銆戠殑鍏抽敭灞炴�т竴鑷达紝鍒欏彇鐩稿悓缂栫爜";
+						String repeatMsg = "姝ゆ暟鎹笌鐢宠鐨勭紪鐮佹暟鎹甶d涓恒��" + code + "銆戠殑鍏抽敭灞炴�т竴鑷达紝鍒欏彇鐩稿悓缂栫爜";
+						if (isCodeOrGroupCode) {
+							if (StringUtils.isBlank(groupCode)) {
+								repeatMsg = "鐢宠鐨勭紪鐮佺被鍨嬩负闆嗗洟鐮侊紝绛夊緟闆嗗洟缂栫爜璧嬪��";
 							}
 							repeatresultDataObjectDetailDO.setCode(groupCode);
-						}else{
+						} else {
 							repeatresultDataObjectDetailDO.setCode(code);
 						}
 						repeatresultDataObjectDetailDO.setId(repeatSourceOid);
@@ -2257,8 +2738,9 @@
 				});
 			}
 		}
-		return  resultDataObjectDetailDOs;
+		return resultDataObjectDetailDOs;
 	}
+
 	/***
 	 * 闆嗘垚鎵归噺鍚屾鏇存柊鎺ュ彛
 	 * @param codeClassifyVO;
@@ -2268,9 +2750,9 @@
 	 */
 	@Transactional(rollbackFor = VciBaseException.class)
 	@Override
-	public void batchSyncEditDatas(CodeClassifyVO codeClassifyVO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs,boolean isCodeOrGroupCode) {
-		String errorid="";
-		String msg="";
+	public void batchSyncEditDatas(CodeClassifyVO codeClassifyVO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs, boolean isCodeOrGroupCode) {
+		String errorid = "";
+		String msg = "";
 		//鏌ヨ鍒嗙被鍜屾ā鏉�
 		//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
 		List<RowDatas> rowDataList = dataObjectVO.getRowData();
@@ -2287,7 +2769,8 @@
 		//鏍¢獙妯℃澘鏄笉鏄渶鏂扮殑
 		//checkTemplateSync(sheetDataSetList,templateVO);
 		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
-		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
+		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) &&
+			((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 		).collect(Collectors.toList());
 		Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
 		List<String> titleRowData = dataObjectVO.getColName();
@@ -2295,10 +2778,10 @@
 		getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
 		//Map<String, String> cboOidMap = new HashMap<>();
 		//cboOidMap.put("id", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])) + ")");
-		String tableName ="";
+		String tableName = "";
 		try {
-			R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(templateVO.getBtmTypeId());
-			if(!r.isSuccess()) {
+			R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(classifyFullInfo.getTopClassifyVO().getBtmTypeId());
+			if (!r.isSuccess()) {
 				throw new Throwable(r.getMsg());
 			}
 			BtmTypeVO btmTypeVO = r.getData();
@@ -2309,37 +2792,44 @@
 			if (StringUtils.isBlank(tableName)) {
 				throw new Throwable("鏍规嵁涓氬姟绫诲瀷鏈煡璇㈠埌涓氬姟绫诲瀷鐩稿叧鑱旂殑琛�");
 			}
-		}catch (Throwable e){
-			log.error("鏌ヨ涓氬姟瀵硅薄琛�"+e);
-			XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
+		} catch (Throwable e) {
+			log.error("鏌ヨ涓氬姟瀵硅薄琛�" + e);
+			XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
 			xmlResultDataObjectDetailDO.setErrorid("103");
-			xmlResultDataObjectDetailDO.setMsg("鏌ヨ涓氬姟瀵硅薄琛�"+e);
+			xmlResultDataObjectDetailDO.setMsg("鏌ヨ涓氬姟瀵硅薄琛�" + e);
 			xmlResultDataObjectDetailDO.setId("");
 			xmlResultDataObjectDetailDO.setCode("");
 			resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
 			return;
 		}
 
-		StringBuffer sb=new StringBuffer();
+		StringBuffer sb = new StringBuffer();
 		sb.append(" select * from ");
 		sb.append(tableName);
 		sb.append(" where 1=1 ");
-		if(isCodeOrGroupCode) {
-			sb.append(" groupcode in (");
-		}else{
-			sb.append(" id in (");
+		sb.append(" and lastr=1 and lastv=1");
+		if (isCodeOrGroupCode) {
+			sb.append(" and ( groupcode in (");
+			sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
+			sb.append(")");
+			sb.append(" or id in (");
+			sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
+			sb.append("))");
+		} else {
+			sb.append(" and id in (");
+			sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
+			sb.append(")");
 		}
-		sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
-		sb.append(")");
 
-		List<Map<String,String>> dataMapList=commonsMapper.queryByOnlySqlForMap(sb.toString());
-		List<ClientBusinessObject> cboList=	ChangeMapTOClientBusinessObjects(dataMapList);
+		List<Map<String, String>> dataMapList = commonsMapper.queryByOnlySqlForMap(sb.toString());
+		DefaultAttrAssimtUtil.mapToLowerCase(dataMapList, true);
+		List<ClientBusinessObject> cboList = ChangeMapTOClientBusinessObjects(dataMapList);
 		Map<String, ClientBusinessObject> codeSystemObjectMap = cboList.stream().filter(systeDataObject -> systeDataObject != null && StringUtils.isNotBlank(systeDataObject.getId())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getId(), t -> t));
 		Map<String, String> errorMap = new HashMap<>();
 		List<CodeOrderDTO> codeOrderDTOList = new ArrayList<>();
-		this.getCodeOrderDTOs(codeClassifyVO, templateVO, codeDataMap, codeSystemObjectMap, codeOrderDTOList, errorMap,isCodeOrGroupCode);
+		this.getCodeOrderDTOs(codeClassifyVO, templateVO, codeDataMap, codeSystemObjectMap, codeOrderDTOList, errorMap, isCodeOrGroupCode);
 		// List<CodeClassifyProcessTempVO> codeClassifyProcessTempVOS=codeClassifyProcessTempService.listProcessTemplate(templateVO.getOid(),"code_cls_flow_use_order");
-		boolean isProcess=false;
+		boolean isProcess = false;
 		/**  if(!CollectionUtils.isEmpty(codeClassifyProcessTempVOS)){
 		 isProcess=true;
 		 }**/
@@ -2349,88 +2839,107 @@
 		List<CodeAllCode> codeAllCodeList = new ArrayList<>();
 		List<String> deleteList = new ArrayList<>();
 
-		CodeClassifyTemplateVO firstTemplateVO = templateService.getObjectHasAttrByOid(orderDTOMap.values().stream().findFirst().get().getTemplateOid());
+		// CodeClassifyTemplateVO firstTemplateVO = templateService.getObjectHasAttrByOid(orderDTOMap.values().stream().findFirst().get().getTemplateOid());
 		Map<String, ClientBusinessObject> cboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getId(), t -> t));
-		//  boolean finalIsProcess = isProcess;
+		// boolean finalIsProcess = isProcess;
 		orderDTOMap.keySet().stream().forEach(code -> {
 			CodeOrderDTO orderDTO = orderDTOMap.get(code);
 			ClientBusinessObject cbo = cboMap.get(code);
-			String dataStatus=cbo.getLcStatus();
-			RowDatas rowData=codeDataMap.get(code);
-			String status=rowData.getStatus();
-			String operation=rowData.getOperation();
-			if (cbo.getTs().compareTo(orderDTO.getTs())==0?true:false) {
+			String dataStatus = cbo.getLcStatus();
+			RowDatas rowData = codeDataMap.get(code);
+			String status = rowData.getStatus();
+			String lastModifier = rowData.getEditor();
+			String operation = rowData.getOperation();
+			if (cbo.getTs().compareTo(orderDTO.getTs()) == 0 ? false : true) {
 				// throw new VciBaseException("鏁版嵁涓嶆槸鏈�鏂扮殑锛屽彲鑳戒粬浜哄凡缁忎慨鏀癸紝璇峰埛鏂板悗鍐嶈瘯");
-				errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+";鏁版嵁涓嶆槸鏈�鏂扮殑锛屽彲鑳戒粬浜哄凡缁忎慨鏀癸紝璇峰埛鏂板悗鍐嶈瘯");
+				errorMap.put(orderDTO.getId(), errorMap.getOrDefault(orderDTO.getId(), "") + ";鏁版嵁涓嶆槸鏈�鏂扮殑锛屽彲鑳戒粬浜哄凡缁忎慨鏀癸紝璇峰埛鏂板悗鍐嶈瘯");
 			}
            /* if (!CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(cbo.getLcStatus()) && !orderDTO.isEditInProcess()) {
                 throw new VciBaseException("鏁版嵁涓嶆槸{0}鐨勭姸鎬侊紝涓嶅厑璁镐慨鏀�", new String[]{CodeDefaultLC.EDITING.getText()});
             }*/
-			if(operation.equals("update")) {
-				//1. 鍒ゆ柇蹇呰緭椤�
-				checkRequiredAttrOnOrder(templateVO, orderDTO, errorMap);
-				//2.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
+			if (operation.equals("update")) {
+				//1.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
 				switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO, errorMap);
-				//3.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
+				//2.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
 				switchComponentAttrOnOrder(templateVO, orderDTO);
-				//4.鏍¢獙瑙勫垯
+				//3.鏍¢獙瑙勫垯
 				checkVerifyOnOrder(templateVO, orderDTO, errorMap);
-				//5.鍒ゆ柇鍏抽敭灞炴��
-				checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO, errorMap);
-				//6.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
+				//4.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
 				checkEnumOnOrder(templateVO, orderDTO, errorMap);
-				//7.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
+				//5.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
 				switchDateAttrOnOrder(templateVO, orderDTO);
+				//6. 鍒ゆ柇蹇呰緭椤�
+				checkRequiredAttrOnOrder(templateVO, orderDTO, errorMap);
+				//7.鍒ゆ柇鍏抽敭灞炴��
+				checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO, errorMap);
 				//榛樿鐨勫唴瀹逛笉鑳藉彉锛屾墍浠ュ彧闇�瑕佹嫹璐濊嚜瀹氫箟鐨勭浉鍏冲睘鎬у嵆鍙�
 				copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, true, errorMap);
 				//浼佷笟鐮佸拰闆嗗洟鐮佺殑涓嶄慨鏀�
-				cbo.setDescription(StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
+				cbo.setDescription(StringUtils.isBlank(orderDTO.getDescription()) ? "" : orderDTO.getDescription());
 				cbo.setName(orderDTO.getName());
 				try {
-					cbo.setAttributeValueWithNoCheck("description", orderDTO.getDescription());
-					cbo.setAttributeValue("name", orderDTO.getName());
+					//涓昏澶勭悊澶у皬鍐欓棶棰橈紝灏哾ata閲岄潰鐨勬暟鎹殑key閮借浆涓哄皬鍐�
+					HashMap<String, String> lowerData = new HashMap<>();
+					Iterator<Map.Entry<String, String>> iterator = cbo.getData().entrySet().iterator();
+					while (iterator.hasNext()) {
+						Map.Entry<String, String> next = iterator.next();
+						lowerData.put(next.getKey().toLowerCase(Locale.ROOT), next.getValue());
+					}
+					cbo.getData().clear();
+					cbo.getData().putAll(lowerData);
+					cbo.setAttributeValueWithNoCheck("description", (StringUtil.isNotBlank(orderDTO.getData()
+						.get("description")) ? orderDTO.getData().get("description") : orderDTO.getDescription()));
+					//	cbo.setAttributeValue("name", orderDTO.getName());
 					//  if(finalIsProcess){//鍦ㄦ祦绋嬩腑涓嶅厑璁告洿鏀�
 					//     errorMap.put(code,errorMap.getOrDefault(code, errorMap.getOrDefault(code,"")+";鏁版嵁"+code+"鍦ㄦ祦绋嬩腑锛屼笉鍏佽鏇存敼!"));
 					//  }else{
+					Date date = new Date();
 					cbo.setLcStatus(status);
-					cbo.setAttributeValue("lcstatus",status);
+					cbo.setAttributeValue("lcstatus", status);
+					cbo.setLastModifyTime(date);
+					cbo.setLastModifier(lastModifier);
+					cbo.setLastModifyTime(date);
+					cbo.setAttributeValue("lastmodifier", lastModifier);
+					cbo.setAttributeValue("lastmodifytime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date));
+					cbo.setTs(date);
+					cbo.setAttributeValue("ts", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date));
 					//  }
 				} catch (VciBaseException e) {
 					e.printStackTrace();
 				}
 
-				List<CodeAllCode>newCodeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
+				List<CodeAllCode> newCodeAllCodeList = codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
 				if (!CollectionUtils.isEmpty(newCodeAllCodeList)) {
-					CodeAllCode codeCbo = codeAllCodeList.get(0);
+					CodeAllCode codeCbo = newCodeAllCodeList.get(0);
 					log.info("codeCbos code:" + codeCbo.getId());
 					codeCbo.setLcStatus(status);
 					codeAllCodeList.add(codeCbo);
 				}
 
-				BaseModel baseModel=new BaseModel();
-				BeanUtil.convert(cbo,baseModel);
+				BaseModel baseModel = new BaseModel();
+				BeanUtil.convert(cbo, baseModel);
 				//baseModel.setData(VciBaseUtil.objectToMapString(cbo));
 				updateList.add(baseModel);
-			}else if(operation.equals("delete")){//濡傛灉鍦ㄦ祦绋嬩腑涓嶅厑璁稿垹闄わ紝涓嶅湪娴佺▼涓姸鎬佷负鍙戝竷鎴栬�呭仠鐢ㄧ殑鏁版嵁涓嶅厑璁稿垹闄わ紝灏嗗叾鏇存敼涓哄仠鐢紝鍏朵粬鐨勬儏鍐电洿鎺ュ垹闄�
+			} else if (operation.equals("delete")) {//濡傛灉鍦ㄦ祦绋嬩腑涓嶅厑璁稿垹闄わ紝涓嶅湪娴佺▼涓姸鎬佷负鍙戝竷鎴栬�呭仠鐢ㄧ殑鏁版嵁涓嶅厑璁稿垹闄わ紝灏嗗叾鏇存敼涓哄仠鐢紝鍏朵粬鐨勬儏鍐电洿鎺ュ垹闄�
 				//  if(finalIsProcess){
 				//    errorMap.put(code,errorMap.getOrDefault(code, errorMap.getOrDefault(code,"")+";鏁版嵁"+code+"鍦ㄦ祦绋嬩腑锛屼笉鍏佽鍒犻櫎!"));
 				//}else {
 				try {
 					log.info("oid:" + cbo.getOid());
-					List<CodeAllCode>newCodeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
+					List<CodeAllCode> newCodeAllCodeList = codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
 					log.info("codeCbos size:" + newCodeAllCodeList.size());
 					if (!CollectionUtils.isEmpty(newCodeAllCodeList)) {
-						CodeAllCode codeCbo = codeAllCodeList.get(0);
+						CodeAllCode codeCbo = newCodeAllCodeList.get(0);
 						log.info("codeCbos code:" + codeCbo.getId());
 						codeCbo.setLcStatus(CodeDefaultLC.TASK_BACK.getValue());
 						codeAllCodeList.add(codeCbo);
 					}
 					deleteList.add(cbo.getOid());
-				}catch (VciBaseException e) {
+				} catch (VciBaseException e) {
 					e.printStackTrace();
 				}
 				// }
-			}else if(operation.equals("editstatus")){
+			} else if (operation.equals("editstatus")) {
 				try {
 					//  if (finalIsProcess) {
 					//      errorMap.put(code, errorMap.getOrDefault(code, errorMap.getOrDefault(code, "") + ";鏁版嵁" + code + "鍦ㄦ祦绋嬩腑锛屼笉鍏佽鏇存敼鐘舵��!"));
@@ -2440,19 +2949,19 @@
 
 					//  }
 
-					List<CodeAllCode>newCodeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
+					List<CodeAllCode> newCodeAllCodeList = codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
 					if (!CollectionUtils.isEmpty(newCodeAllCodeList)) {
-						CodeAllCode codeCbo = codeAllCodeList.get(0);
+						CodeAllCode codeCbo = newCodeAllCodeList.get(0);
 						log.info("codeCbos code:" + codeCbo.getId());
 						codeCbo.setLcStatus(status);
 						codeAllCodeList.add(codeCbo);
 					}
 
-					BaseModel baseModel=new BaseModel();
-					BeanUtil.convert(cbo,baseModel);
+					BaseModel baseModel = new BaseModel();
+					BeanUtil.convert(cbo, baseModel);
 					//baseModel.setData(VciBaseUtil.objectToMapString(cbo));
 					updateList.add(baseModel);
-				}catch (VciBaseException e) {
+				} catch (VciBaseException e) {
 					e.printStackTrace();
 				}
 			}
@@ -2460,13 +2969,13 @@
 		/**
 		 * 閿欒淇℃伅杈撳嚭
 		 */
-		if(errorMap.size()>0){
-			errorMap.keySet().forEach(code->{
-				if(codeDataMap.containsKey(code)){
-					RowDatas rowDatas=  codeDataMap.get(code);
-					String dataMsg=errorMap.get(code);
-					String oid=rowDatas.getOid();
-					XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
+		if (errorMap.size() > 0) {
+			errorMap.keySet().forEach(code -> {
+				if (codeDataMap.containsKey(code)) {
+					RowDatas rowDatas = codeDataMap.get(code);
+					String dataMsg = errorMap.get(code);
+					String oid = rowDatas.getOid();
+					XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
 					xmlResultDataObjectDetailDO.setErrorid("103");
 					xmlResultDataObjectDetailDO.setMsg(dataMsg);
 					xmlResultDataObjectDetailDO.setId(oid);
@@ -2474,34 +2983,34 @@
 					resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
 				}
 			});
-		}else {
+		} else {
 			//瀛樺偍鏁版嵁
 			try {
-				engineService.updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(),updateList);
-				codeAllCodeService.saveBatch(codeAllCodeList);
-				if(deleteList.size()>0) {
-					commonsMapper.deleteByTaleAndOid(tableName, VciBaseUtil.array2String(deleteList.toArray(new String[]{})));
+				engineService.updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), updateList);
+				codeAllCodeService.saveOrUpdateBatch(codeAllCodeList);
+				if (deleteList.size() > 0) {
+					commonsMapper.deleteByTaleAndOid(tableName, VciBaseUtil.toInSql(deleteList.toArray(new String[]{})));
 				}
 				//鏄惁璋冪敤闆嗗洟鎺ュ彛鐢宠鎺ュ彛
-				if(isCodeOrGroupCode){
-					List<String> IdList=resultDataObjectDetailDOs.stream().filter(xMLResultDataObjectDetailDO-> com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(xMLResultDataObjectDetailDO.getId())).map(XMLResultDataObjectDetailDO::getId).distinct().collect(Collectors.toList());
-					if(!CollectionUtils.isEmpty(IdList)) {
-						this.sendApplyGroupcode(IdList, classifyFullInfo.getTopClassifyVO().getBtmTypeId(),sysIntegrationPushTypeEnum.ACCPET_EDITCODE.getValue());
+				if (isCodeOrGroupCode) {
+					List<String> IdList = resultDataObjectDetailDOs.stream().filter(xMLResultDataObjectDetailDO -> com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(xMLResultDataObjectDetailDO.getId())).map(XMLResultDataObjectDetailDO::getId).distinct().collect(Collectors.toList());
+					if (!CollectionUtils.isEmpty(IdList)) {
+						this.sendApplyGroupcode(IdList, classifyFullInfo.getTopClassifyVO().getBtmTypeId(), sysIntegrationPushTypeEnum.ACCPET_EDITCODE.getValue());
 					}
 				}
-				errorid="0";
-				msg="鏇存柊/鐘舵�佹洿鏀�/鍒犻櫎鎴愬姛锛�";
-			}catch (Throwable e){
-				errorid="1";
-				msg="淇濆瓨澶辫触锛�"+e;
-			}finally {
+				errorid = "0";
+				msg = "鏇存柊/鐘舵�佹洿鏀�/鍒犻櫎鎴愬姛锛�";
+			} catch (Throwable e) {
+				errorid = "1";
+				msg = "淇濆瓨澶辫触锛�" + e;
+			} finally {
 				String finalMsg = msg;
 				String finalErrorid = errorid;
-				cboList.stream().forEach(cbo->{
-					String code =cbo.getId();
-					if(codeDataMap.containsKey(code)) {
-						RowDatas rowDatas=codeDataMap.get(code);
-						String oid=rowDatas.getOid();
+				cboList.stream().forEach(cbo -> {
+					String code = cbo.getId();
+					if (codeDataMap.containsKey(code)) {
+						RowDatas rowDatas = codeDataMap.get(code);
+						String oid = rowDatas.getOid();
 						XMLResultDataObjectDetailDO xmlResultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
 						xmlResultDataObjectDetailDO.setErrorid(finalErrorid);
 						xmlResultDataObjectDetailDO.setMsg(finalMsg);
@@ -2521,7 +3030,7 @@
 	 * @param templateVO 妯℃澘鐨勬樉绀哄璞★紝闇�瑕佸寘鍚ā鏉垮睘鎬�
 	 * @param orderDTO   缂栫爜鐢宠鐨勪俊鎭�
 	 */
-	private void checkRequiredAttrOnOrder(CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO,Map<String,String> errorMap) {
+	private void checkRequiredAttrOnOrder(CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO, Map<String, String> errorMap) {
 		Map<String, CodeClassifyTemplateAttrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(
 				s -> VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule())
 					&& StringUtils.isBlank(s.getClassifyInvokeAttr()))
@@ -2530,12 +3039,13 @@
 			requiredAttrMap.forEach((attrId, attrVO) -> {
 				//鍙湁浼佷笟缂栫爜锛岀姸鎬侊紝澶囨敞锛屾ā鏉夸富閿紝鍒嗙被涓婚敭杩欏嚑涓槸鍥哄畾鐨勶紝鍏朵綑閮芥槸鑷閰嶇疆鐨�
 				if (StringUtils.isBlank(getValueFromOrderDTO(orderDTO, attrId))) {
-					errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"") + ";灞炴�с�恵"+attrVO.getName()+"}銆戝繀椤昏杈撳叆(閫夋嫨)鍐呭" );
+					errorMap.put(orderDTO.getId(), errorMap.getOrDefault(orderDTO.getId(), "") + ";灞炴�с�恵" + attrVO.getName() + "}銆戝繀椤昏杈撳叆(閫夋嫨)鍐呭");
 					//  throw new VciBaseException("灞炴�с�恵0}銆戝繀椤昏杈撳叆(閫夋嫨)鍐呭", new String[]{attrVO.getName()});
 				}
 			});
 		}
 	}
+
 	/**
 	 * 杞崲缁勫悎瑙勫垯鐨勫��
 	 *
@@ -2569,19 +3079,20 @@
 	 * @param templateVO 妯℃澘鐨勪俊鎭紝蹇呴』鍖呭惈灞炴�х殑鍐呭
 	 * @param orderDTO   缂栫爜鐢宠鐨勭浉鍏崇殑淇℃伅
 	 */
-	private void checkVerifyOnOrder(CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO,Map<String,String> errorMap) {
+	private void checkVerifyOnOrder(CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO, Map<String, String> errorMap) {
 		Map<String, CodeClassifyTemplateAttrVO> verifyAttrVOMap = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getVerifyRule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 		if (!CollectionUtils.isEmpty(verifyAttrVOMap)) {
 			verifyAttrVOMap.forEach((attrId, attrVO) -> {
 				String value = getValueFromOrderDTO(orderDTO, attrId);
 				if (StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyRule())) {
-					errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+";灞炴�"+attrVO.getName()+"]鐨勫�间笉绗﹀悎鏍¢獙瑙勫垯鐨勮姹�");
+					errorMap.put(orderDTO.getId(), errorMap.getOrDefault(orderDTO.getId(), "") + ";灞炴�" + attrVO.getName() + "]鐨勫�间笉绗﹀悎鏍¢獙瑙勫垯鐨勮姹�");
 					//鏍¢獙姝e垯琛ㄨ揪寮�
 					// throw new VciBaseException("灞炴�{0}]鐨勫�间笉绗﹀悎鏍¢獙瑙勫垯鐨勮姹�", new String[]{attrVO.getName()});
 				}
 			});
 		}
 	}
+
 	/**
 	 * 鏍¢獙鍏抽敭灞炴��
 	 *
@@ -2589,57 +3100,92 @@
 	 * @param templateVO       妯℃澘鐨勫唴瀹癸紝蹇呴』鍖呭惈妯℃澘灞炴��
 	 * @param orderDTO         缂栫爜鐢宠鐨勭浉鍏崇殑淇℃伅
 	 */
-	private void checkKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO,Map<String,String> errorMap) {
+	private void checkKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO, Map<String, String> errorMap) {
 		//鍏堣幏鍙栧叧閿睘鎬х殑瑙勫垯锛屼篃鍒╃敤缁ф壙鐨勬柟寮�
 		CodeKeyAttrRepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
 		//娉ㄦ剰鐨勬槸keyRuleVO鍙兘涓虹┖锛岃〃绀轰笉浣跨敤瑙勫垯鎺у埗
 		//鑾峰彇鎵�鏈夌殑鍏抽敭灞炴��
 		Map<String, CodeClassifyTemplateAttrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		// TODO:2024-02-01 鍏堣幏鍙栭厤缃簡杩戜箟璇嶆煡璇㈣鍒欑殑灞炴�э紝涓嶅悓浜庡叧閿睘鎬э紝璁剧疆浜嗚繎涔夎瘝鏌ヨ瑙勫垯鐨勫睘鎬у彲鑳芥槸澶氭潯涓嶅悓鐨勮繎涔夎瘝鏌ヨ瑙勫垯
+		Map<String, CodeClassifyTemplateAttrVO> sysonymAttrMaps = templateVO.getAttributes().stream().filter(item -> Func.isNotBlank(item.getSysonymRuleOids())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		// 鑾峰彇鏄惁鏈夐厤缃繎涔夎瘝鏌ヨ瑙勫垯灞炴��
+		Map<String, List<CodeSynonym>> codeSynonymMaps = new HashMap<>();
+		if (!sysonymAttrMaps.isEmpty()) {
+			// 鏌ヨ杩戜箟璇嶈鍒欙紝瀛樺偍鏂瑰紡key锛氬睘鎬d锛寁alue杩戜箟璇嶆煡璇㈣鍒欏垪琛�
+			codeSynonymMaps = codeSynonymService.getCodeSynonymByOids(sysonymAttrMaps);
+		}
 		Map<String, String> conditionMap = new HashMap<>();
 		boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
 		//鍏ㄩ儴鍘荤┖鐨勪紭鍏堢骇澶т簬鍘荤┖
 		boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
 		boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
 		boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
+		Map<String, List<CodeSynonym>> finalCodeSynonymMaps = codeSynonymMaps;
 		ketAttrMap.forEach((attrId, attrVO) -> {
 			String value = getValueFromOrderDTO(orderDTO, attrId);
 			if (value == null) {
 				value = "";
 			}
-			engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
+			engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, finalCodeSynonymMaps.get(attrId), attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
 		});
 
 		//娌℃湁闄愬埗鍒嗙被锛屼絾鏄竴涓ā鏉垮彧鍙兘鍦ㄤ竴涓笟鍔$被鍨嬮噷闈紝鎵�浠ョ洿鎺ユ煡璇㈣繖涓笟鍔$被鍨嬪嵆鍙�
-
 		if (!CollectionUtils.isEmpty(conditionMap)) {
-			final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmTypeId()) + " where 1 = 1 "};
+			String tableName = "";
+			R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(templateVO.getBtmTypeId());
+			if (r.isSuccess()) {
+				BtmTypeVO btmTypeVO = r.getData();
+				if (btmTypeVO != null) {
+					tableName = btmTypeVO.getTableName();
+
+				}
+			}
+			if (StringUtils.isBlank(tableName)) {
+				String errormsg = "鏍规嵁涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿叧涓氬姟琛�";
+				errorMap.put(orderDTO.getId(), errorMap.getOrDefault(orderDTO.getId(), "") + errormsg);
+				return;
+			}
+			//final String[] sql = {"select count(*) from " + tableName + " t where 1 = 1 "};
+			final String[] sql = {"select t.id from " + tableName + " t where 1 = 1 "};
 			conditionMap.forEach((key, value) -> {
-				sql[0] += " and " + key + " = " + value;
+				if (StringUtils.isBlank(value) || value.equals(QueryOptionConstant.ISNULL)) {
+					sql[0] += " and " + key + " is null ";
+				} else {
+					sql[0] += " and " + key + " = " + value;
+				}
+
 			});
 			if (StringUtils.isNotBlank(orderDTO.getOid())) {
 				//淇敼鐨勬椂鍊欙紝闇�瑕佹帓闄よ嚜宸�
-				sql[0] += " and oid != '" + orderDTO.getOid() + "'";
+				sql[0] += " and t.oid != '" + orderDTO.getOid() + "'";
 			} else if (StringUtils.isNotBlank(orderDTO.getCopyFromVersion())) {
-				sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
+				sql[0] += " and t.oid != '" + orderDTO.getCopyFromVersion() + "'";
 			}
-			sql[0] += " and lastR = '1' and lastV = '1' ";
-			if (commonsMapper.queryCountBySql(sql[0]) > 0) {
+			// 涓嶉渶瑕佸弬涓庢牎楠岀殑瑙勫垯oid
+			String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
+			if (Func.isNotBlank(isParticipateCheckOids)) {
+				sql[0] += " and codeclsfid not in(" + isParticipateCheckOids + ")";
+			}
+			sql[0] += " and t.lastR = '1' and t.lastV = '1' ";
+			List<String> repeatData = commonsMapper.selectList(sql[0]);
+			if (!repeatData.isEmpty()) {
 				String ruleInfoMsg = keyRuleVO == null ? "" : "鏌ヨ瑙勫垯锛氬幓闄ょ┖鏍�--{0},蹇界暐澶у皬鍐�--{1},蹇界暐鍏ㄥ崐瑙�--{2},蹇界暐鍏ㄩ儴绌烘牸--{3}";
 				String[] objs = new String[]{trim ? "鏄�" : "鍚�", ignoreCase ? "鏄�" : "鍚�", ignoreWidth ? "鏄�" : "鍚�", trimAll ? "鏄�" : "鍚�"};
-				String defaultValue=";鏍规嵁鎮ㄥ~鍐欑殑鍏抽敭灞炴�х殑鍐呭锛岀粨鍚堝叧閿睘鎬ф煡璇㈣鍒欙紝鍙戠幇杩欎釜鏁版嵁宸茬粡鍦ㄧ郴缁熶腑瀛樺湪浜嗐�傝淇!銆�";
-				String errormsg=defaultValue+ MessageFormat.format(ruleInfoMsg, objs);
-				errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+errormsg);
+				String defaultValue = ";鏍规嵁鎮ㄥ~鍐欑殑鍏抽敭灞炴�х殑鍐呭锛岀粨鍚堝叧閿睘鎬ф煡璇㈣鍒欙紝鍙戠幇杩欎釜鏁版嵁宸茬粡鍦ㄧ郴缁熶腑瀛樺湪浜�,鏁版嵁鐨勭紪鍙峰涓嬶細" + repeatData.stream().collect(Collectors.joining(",")) + "銆傝淇!銆�";
+				String errormsg = defaultValue + MessageFormat.format(ruleInfoMsg, objs);
+				errorMap.put(orderDTO.getId(), errorMap.getOrDefault(orderDTO.getId(), "") + errormsg);
 				// throw new VciBaseException("鏍规嵁鎮ㄥ~鍐欑殑鍏抽敭灞炴�х殑鍐呭锛岀粨鍚堝叧閿睘鎬ф煡璇㈣鍒欙紝鍙戠幇杩欎釜鏁版嵁宸茬粡鍦ㄧ郴缁熶腑瀛樺湪浜嗐�傝淇!銆�" + ruleInfoMsg, objs);
 			}
 		}
 	}
+
 	/**
 	 * 鏍¢獙鏋氫妇鐨勫唴瀹�
 	 *
 	 * @param templateVO 妯℃澘鐨勬樉绀哄璞★紝闇�瑕佸寘鍚睘鎬�
 	 * @param orderDTO   缂栫爜鐢宠鐨勪俊鎭�
 	 */
-	private void checkEnumOnOrder(CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO,Map<String,String> errorMap) {
+	private void checkEnumOnOrder(CodeClassifyTemplateVO templateVO, CodeOrderDTO orderDTO, Map<String, String> errorMap) {
 		//濡傛灉鏋氫妇鍙互淇敼锛屽垯涓嶉渶瑕佹牎楠屾槸鍚︾鍚堟灇涓剧殑閫夐」
 		Map<String, CodeClassifyTemplateAttrVO> enumAttrVOMap = templateVO.getAttributes().stream().filter(s -> (StringUtils.isNotBlank(s.getEnumString()) || StringUtils.isNotBlank(s.getEnumId())) && !VciBaseUtil.getBoolean(s.getEnumEditFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 		if (!CollectionUtils.isEmpty(enumAttrVOMap)) {
@@ -2649,13 +3195,14 @@
 					//鏈夊�兼墠鑳芥牎楠�
 					List<KeyValue> comboboxKVs = this.engineService.listComboboxItems(attrVO);
 					if (!comboboxKVs.stream().anyMatch(s -> value.equalsIgnoreCase(s.getKey()))) {
-						errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+";灞炴�с��"+attrVO.getName()+"銆戠殑鍊间笉绗﹀悎鏋氫妇鐨勮姹�");
+						errorMap.put(orderDTO.getId(), errorMap.getOrDefault(orderDTO.getId(), "") + ";灞炴�с��" + attrVO.getName() + "銆戠殑鍊间笉绗﹀悎鏋氫妇鐨勮姹�");
 						//throw new VciBaseException("灞炴�с�恵0}銆戠殑鍊间笉绗﹀悎鏋氫妇鐨勮姹�", new String[]{attrVO.getName()});
 					}
 				}
 			});
 		}
 	}
+
 	/**
 	 * 杞崲鏃堕棿鐨勬牸寮�
 	 *
@@ -2688,7 +3235,7 @@
 	 */
 	private void copyValueToCBO(CodeClassifyFullInfoBO classifyFullInfo, ClientBusinessObject cbo,
 								CodeOrderDTO orderDTO, CodeClassifyTemplateVO templateVO,
-								boolean edit,Map<String,String> errorMap) {
+								boolean edit, Map<String, String> errorMap) {
 		String fullPath = "";
 		if (!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())) {
 			fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel())))
@@ -2717,10 +3264,10 @@
 //					if (lifeCycleVO != null) {
 //						cbo.setLcStatus(lifeCycleVO.getStartStatus());
 //					} else {
-						cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 //					}
 				} else {
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}
 
 			}
@@ -2733,6 +3280,7 @@
 			log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�", e);
 		}
 	}
+
 	/**
 	 * 璁剧疆鏂扮殑鍊煎埌鐢宠瀵硅薄涓�
 	 *
@@ -2748,6 +3296,7 @@
 			orderDTO.getData().put(attrId, value);
 		}
 	}
+
 	/**
 	 * 浠庣紪鐮佺敵璇蜂俊鎭璞′笂鑾峰彇鏌愪釜灞炴�х殑鍊�
 	 *
@@ -2767,6 +3316,7 @@
 		}
 		return value;
 	}
+
 	/**
 	 * 澶勭悊鍒嗙被娉ㄥ叆鐨勪俊鎭�
 	 *
@@ -2774,7 +3324,7 @@
 	 * @param classifyFullInfoBO 鍒嗙被鐨勫叏璺緞
 	 * @param orderDTO           缂栫爜鐢宠鐨勪俊鎭�
 	 */
-	private void switchClassifyLevelOnOrder(CodeClassifyTemplateVO templateVO, CodeClassifyFullInfoBO classifyFullInfoBO, CodeOrderDTO orderDTO,Map<String,String> errorMap) {
+	private void switchClassifyLevelOnOrder(CodeClassifyTemplateVO templateVO, CodeClassifyFullInfoBO classifyFullInfoBO, CodeOrderDTO orderDTO, Map<String, String> errorMap) {
 		Map<String, CodeClassifyTemplateAttrVO> classifyAttrVOMap = templateVO.getAttributes().stream().filter(
 			s -> StringUtils.isNotBlank(s.getClassifyInvokeAttr()) && StringUtils.isNotBlank(s.getClassifyInvokeLevel())
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
@@ -2801,7 +3351,7 @@
 				}
 				if (classifyVO == null) {
 					//璇存槑灞傜骇鏈夎
-					errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+";鍒嗙被鏍戜笂娌℃湁灞傜骇[" + attrVO.getClassifyInvokeLevel() + "]");
+					errorMap.put(orderDTO.getId(), errorMap.getOrDefault(orderDTO.getId(), "") + ";鍒嗙被鏍戜笂娌℃湁灞傜骇[" + attrVO.getClassifyInvokeLevel() + "]");
 					//orderDTO.getData().put(attrId, "鍒嗙被鏍戜笂娌℃湁灞傜骇[" + attrVO.getClassifyinvokelevel() + "]");
 					// classifyVO = classifyFullInfoBO.getCurrentClassifyVO();
 				} else {
@@ -2812,6 +3362,7 @@
 			});
 		}
 	}
+
 	/***
 	 *
 	 * @param codeClassifyVO
@@ -2822,37 +3373,42 @@
 	 * @param errorMap
 	 * @return
 	 */
-	private void getCodeOrderDTOs(CodeClassifyVO codeClassifyVO,CodeClassifyTemplateVO templateVO,Map<String ,RowDatas>codeDataMap,Map<String, ClientBusinessObject> codeSystemObjectMap,List<CodeOrderDTO> codeOrderDTOList,Map<String,String> errorMap,boolean isCodeOrGroupCode){
-		codeSystemObjectMap.keySet().forEach(code->{
-			ClientBusinessObject sysDataObject= codeSystemObjectMap.get(code);
+	private void getCodeOrderDTOs(CodeClassifyVO codeClassifyVO, CodeClassifyTemplateVO templateVO, Map<String, RowDatas> codeDataMap, Map<String, ClientBusinessObject> codeSystemObjectMap, List<CodeOrderDTO> codeOrderDTOList, Map<String, String> errorMap, boolean isCodeOrGroupCode) {
+		codeSystemObjectMap.keySet().forEach(code -> {
+			ClientBusinessObject sysDataObject = codeSystemObjectMap.get(code);
+			/*if (isCodeOrGroupCode) {
+			//	code = sysDataObject.getAttributeValue("GROUPCODE");
+				if (StringUtils.isBlank(code)) {
+					code = sysDataObject.getId();
+				}
+			}*/
 			if(isCodeOrGroupCode){
-				code=sysDataObject.getAttributeValue("GROUPCODE");
+				String groupCode=sysDataObject.getAttributeValue("GROUPCODE");
+				if(codeDataMap.containsKey(groupCode)){
+					code=groupCode;
+				}
 			}
 			CodeOrderDTO orderDTO = new CodeOrderDTO();
-			if(codeDataMap.containsKey(code)){
-				RowDatas rowDatas=codeDataMap.get(code);
-				Map<String, String> data= rowDatas.getFiledValue();
+			if (codeDataMap.containsKey(code)) {
+				RowDatas rowDatas = codeDataMap.get(code);
+				Map<String, String> data = rowDatas.getFiledValue();
 				orderDTO.setCodeClassifyOid(codeClassifyVO.getOid());//鍒嗙被涓婚敭
 				orderDTO.setOid(sysDataObject.getOid());//鏁版嵁oid
 				orderDTO.setLcStatus(rowDatas.getStatus());//鐘舵��
-				if(isCodeOrGroupCode){
-					orderDTO.setId(sysDataObject.getId());
-				}else{
-					orderDTO.setId(code);
-				}
+				orderDTO.setId(code);
 				orderDTO.setTs(sysDataObject.getTs());
 				orderDTO.setBtmname(codeClassifyVO.getBtmname());//涓氬姟绫诲瀷
 				orderDTO.setDescription("闆嗘垚璋冪敤:鏇存柊");//鏁版嵁鎻忚堪
-				if(data.containsKey("name")){
-					String name=data.get("name");
+				if (data.containsKey("name")) {
+					String name = data.get("name");
 					orderDTO.setName(name);//鍚嶇О灞炴�у��
 				}
 				orderDTO.setData(data);//璁剧疆鏁版嵁
 				orderDTO.setSecDTOList(null);//鍒嗙被鐮佹
 				orderDTO.setEditInProcess(false);//鏄惁鍦ㄦ祦绋嬩腑
 				orderDTO.setTemplateOid(templateVO.getOid());
-			}else{
-				errorMap.put("code","缂栫爜涓猴細銆�"+code+"銆戠殑鏁版嵁鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
+			} else {
+				errorMap.put("code", "缂栫爜涓猴細銆�" + code + "銆戠殑鏁版嵁鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
 			}
 			codeOrderDTOList.add(orderDTO);
 		});
@@ -2860,15 +3416,16 @@
 
 	/**
 	 * 鑾峰彇鍒嗙被鐨勫叏璺緞
+	 *
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
 	 * @return 鍏ㄨ矾寰�
 	 */
-	private String getFullPath(CodeClassifyFullInfoBO classifyFullInfo){
+	private String getFullPath(CodeClassifyFullInfoBO classifyFullInfo) {
 		String fullPath = "";
-		if(!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())){
+		if (!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())) {
 			fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel())))
 				.map(CodeClassifyVO::getOid).collect(Collectors.joining("##"));
-		}else{
+		} else {
 			fullPath = classifyFullInfo.getCurrentClassifyVO().getOid();
 		}
 		return fullPath;
@@ -2876,17 +3433,18 @@
 
 	/**
 	 * 妫�鏌ョ爜娈电殑闀垮害鏄惁绗﹀悎瑕佹眰
-	 * @param cboList 鏁版嵁
-	 * @param classifyVOMap 鍒嗙被鏄犲皠
-	 * @param ruleVOMap 瑙勫垯瀵硅薄
-	 * @param ruleOidMap 鍒嗙被鍖呭惈瑙勫垯
-	 * @param errorMap 閿欒鐨勪俊鎭�
+	 *
+	 * @param cboList         鏁版嵁
+	 * @param classifyVOMap   鍒嗙被鏄犲皠
+	 * @param ruleVOMap       瑙勫垯瀵硅薄
+	 * @param ruleOidMap      鍒嗙被鍖呭惈瑙勫垯
+	 * @param errorMap        閿欒鐨勪俊鎭�
 	 * @param ruleRowIndexMap 瑙勫垯鍖呭惈鐨勮鍙凤紝key鏄鍒欎富閿紝value鏄寘鍚殑鍏ㄩ儴琛屽彿
 	 */
-	private void checkSecLengthInHistory(List<ClientBusinessObject> cboList,Map<String,CodeClassifyVO> classifyVOMap,Map<String,CodeRuleVO> ruleVOMap,
-										 Map<String/**鍒嗙被涓婚敭**/,String/**瑙勫垯涓婚敭**/> ruleOidMap,Map<String,String> errorMap,Map<String,List<String>> ruleRowIndexMap){
+	private void checkSecLengthInHistory(List<ClientBusinessObject> cboList, Map<String, CodeClassifyVO> classifyVOMap, Map<String, CodeRuleVO> ruleVOMap,
+										 Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap, Map<String, String> errorMap, Map<String, List<String>> ruleRowIndexMap) {
 
-		cboList.stream().forEach(cbo-> {
+		cboList.stream().forEach(cbo -> {
 			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 			String secLength = cbo.getAttributeValue(CODE_SEC_LENGTH_FIELD);
 			//鎵惧垎绫�
@@ -2895,22 +3453,22 @@
 			if (classifyVO != null) {
 				//2#2#4#1杩欐牱鐨勬柟寮�
 				CodeRuleVO ruleVO = ruleVOMap.getOrDefault(ruleOidMap.get(classifyVO.getOid()), null);
-				if(ruleVO!=null){
+				if (ruleVO != null) {
 					String[] secValues = secLength.split("#");
 					//鎬婚暱搴﹀拰缂栫爜鐨勯暱搴�
 					String code = cbo.getAttributeValue(CODE_FIELD);
-					if(code.length() != Arrays.stream(secValues).mapToInt(s->VciBaseUtil.getInt(s)).sum()){
-						errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鐮佹瀹藉害涓庣郴缁熶腑鐨勭紪鐮佽鍒欎笉鍚�" );
-					}else if(secValues.length != ruleVO.getSecVOList().size()){
-						errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鐮佹瀹藉害涓庣郴缁熶腑鐨勭紪鐮佽鍒欎笉鍚�" );
+					if (code.length() != Arrays.stream(secValues).mapToInt(s -> VciBaseUtil.getInt(s)).sum()) {
+						errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鐮佹瀹藉害涓庣郴缁熶腑鐨勭紪鐮佽鍒欎笉鍚�");
+					} else if (secValues.length != ruleVO.getSecVOList().size()) {
+						errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鐮佹瀹藉害涓庣郴缁熶腑鐨勭紪鐮佽鍒欎笉鍚�");
 					} else {
 						//姣忎竴涓暱搴﹂兘涓嶈兘瓒呰繃鐮佹鐨�
 						boolean fined = false;
 						for (int j = 0; j < ruleVO.getSecVOList().size(); j++) {
 							CodeBasicSecVO secVO = ruleVO.getSecVOList().get(j);
-							String length= secValues[j];
-							if(StringUtils.isNotBlank(secVO.getCodeSecLength())&&VciBaseUtil.getInt(length)>VciBaseUtil.getInt(secVO.getCodeSecLength())){
-								errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鐮佹瀹藉害涓庣郴缁熶腑鐨勭紪鐮佽鍒欎笉鍚�" );
+							String length = secValues[j];
+							if (StringUtils.isNotBlank(secVO.getCodeSecLength()) && VciBaseUtil.getInt(length) > (VciBaseUtil.getInt(secVO.getCodeSecLength()) + ((secVO.getPrefixCode() + secVO.getSuffixCode()).length()))) {
+								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鐮佹瀹藉害涓庣郴缁熶腑鐨勭紪鐮佽鍒欎笉鍚�");
 								fined = true;
 								break;
 							}
@@ -2928,76 +3486,78 @@
 						 break;
 						 }
 						 }***/
-						if(!fined){
+						if (!fined) {
 							//鏆傛椂涓嶅彇娴佹按鐨勫唴瀹癸紝鍥犱负璋冪敤produceCode鐨勬椂鍊欏幓澶勭悊
 							List<String> rowIndexList = ruleRowIndexMap.getOrDefault(ruleVO.getOid(), new ArrayList<>());
 							rowIndexList.add(rowIndex);
-							ruleRowIndexMap.put(ruleVO.getOid(),rowIndexList);
+							ruleRowIndexMap.put(ruleVO.getOid(), rowIndexList);
 						}
 					}
-				}else{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍒嗙被娌℃湁璁剧疆缂栫爜瑙勫垯" );
+				} else {
+					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍒嗙被娌℃湁璁剧疆缂栫爜瑙勫垯");
 				}
 			}
 		});
 	}
+
 	/**
 	 * excel杞崲涓篶bo鐨勫璞�
+	 *
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
-	 * @param fieldIndexMap 瀛楁鐨勪綅缃�
-	 * @param rowDataList excel閲岀殑琛屾暟鎹�
-	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
-	 * @param cboList 鏁版嵁鐨勫垪琛�
-	 * @param fullPath 鍏ㄨ矾寰�
-	 * @param operation 鎿嶄綔绫诲瀷
-	 * @param errorMap 閿欒淇℃伅璁板綍
+	 * @param fieldIndexMap    瀛楁鐨勪綅缃�
+	 * @param rowDataList      excel閲岀殑琛屾暟鎹�
+	 * @param templateVO       妯℃澘鐨勬樉绀哄璞�
+	 * @param cboList          鏁版嵁鐨勫垪琛�
+	 * @param fullPath         鍏ㄨ矾寰�
+	 * @param operation        鎿嶄綔绫诲瀷
+	 * @param errorMap         閿欒淇℃伅璁板綍
 	 */
-	private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo,List<String> titleRowData,Map<Integer,String> fieldIndexMap,List<RowDatas> rowDataList,
-							CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,
-							String fullPath,boolean isProcess,String operation,Map<String,String> errorMap,Map<String,String> codeOidToSystemOidMap){
+	private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo, List<String> titleRowData, Map<Integer, String> fieldIndexMap, List<RowDatas> rowDataList,
+							CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList,
+							String fullPath, boolean isProcess, String operation, Map<String, String> errorMap, Map<String, String> codeOidToSystemOidMap) {
 		rowDataList.stream().forEach(rowData -> {
-			String oid=rowData.getOid();
-			String rowNumber=rowData.getRowIndex();
+			String oid = rowData.getOid();
+			String rowNumber = rowData.getRowIndex();
 			ClientBusinessObject cbo = new ClientBusinessObject();
 			DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmTypeId());
-			rowData.getData().forEach((index,value)->{
+			rowData.getData().forEach((index, value) -> {
 				String field = fieldIndexMap.get(index);
-				if(StringUtils.isBlank(field)){
-					errorMap.put(rowNumber,"灞炴�э細銆�" +titleRowData.get(index)+ "銆戝湪绯荤粺涓笉瀛樺湪");
+				if (StringUtils.isBlank(field)) {
+					errorMap.put(rowNumber, "灞炴�э細銆�" + titleRowData.get(index) + "銆戝湪绯荤粺涓笉瀛樺湪");
 				}
 				try {
-					cbo.setAttributeValueWithNoCheck(field,value);
-					if(WebUtil.isDefaultField(field)){
+					cbo.setAttributeValueWithNoCheck(field, value);
+					if (WebUtil.isDefaultField(field)) {
 						WebUtil.setValueToField(field, cbo, value);
 					}
 				} catch (VciBaseException e) {
-					log.error("璁剧疆灞炴�х殑鍊奸敊璇�",e);
-					errorMap.put(rowNumber,"灞炴�э細銆�" +titleRowData.get(index)+ "銆戝湪绯荤粺涓笉瀛樺湪");
+					log.error("璁剧疆灞炴�х殑鍊奸敊璇�", e);
+					errorMap.put(rowNumber, "灞炴�э細銆�" + titleRowData.get(index) + "銆戝湪绯荤粺涓笉瀛樺湪");
 				}
 			});
 			try {
-				cbo.setAttributeValue(IMPORT_ROW_INDEX,rowData.getRowIndex());
-				cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD,templateVO.getOid());
-				if(operation.equals("create")){
-					log.info("鍒嗙被瀵硅薄锛�"+classifyFullInfo.getCurrentClassifyVO());
-					log.info("codeClassoid:"+classifyFullInfo.getCurrentClassifyVO().getOid());
-					cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD,classifyFullInfo.getCurrentClassifyVO().getOid());
-					cbo.setAttributeValue(CODE_FULL_PATH_FILED,fullPath);
+				cbo.setAttributeValue(IMPORT_ROW_INDEX, rowData.getRowIndex());
+				cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD, templateVO.getOid());
+				if (operation.equals("create")) {
+					log.info("鍒嗙被瀵硅薄锛�" + classifyFullInfo.getCurrentClassifyVO());
+					log.info("codeClassoid:" + classifyFullInfo.getCurrentClassifyVO().getOid());
+					cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD, classifyFullInfo.getCurrentClassifyVO().getOid());
+					cbo.setAttributeValue(CODE_FULL_PATH_FILED, fullPath);
 					int secret = VciBaseUtil.getInt(cbo.getAttributeValue(SECRET_FIELD));
-					if(secret == 0 || !secretService.checkDataSecret(secret).getData() ){
+					if (secret == 0 || !secretService.checkDataSecret(secret).getData()) {
 						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
-						String secretValue= String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret);
-						cbo.setAttributeValue(SECRET_FIELD,secretValue);
+						String secretValue = String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret);
+						cbo.setAttributeValue(SECRET_FIELD, secretValue);
 					}
-					if(rowData.getStatus().equals(CodeDefaultLC.DISABLE.getValue())){//鍋滅敤
+					if (rowData.getStatus().equals(CodeDefaultLC.DISABLE.getValue())) {//鍋滅敤
 						cbo.setLcStatus(CodeDefaultLC.DISABLE.getValue());
-					}else if(rowData.getStatus().equals(CodeDefaultLC.EDITING.getValue())){//缂栬緫
+					} else if (rowData.getStatus().equals(CodeDefaultLC.EDITING.getValue())) {//缂栬緫
 						cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
-					}else if(rowData.getStatus().equals(CodeDefaultLC.AUDITING.getValue())) {//瀹℃壒涓�
+					} else if (rowData.getStatus().equals(CodeDefaultLC.AUDITING.getValue())) {//瀹℃壒涓�
 						cbo.setLcStatus(CodeDefaultLC.AUDITING.getValue());
-					}else if(rowData.getStatus().equals(CodeDefaultLC.TASK_BACK.getValue())){//鍥炴敹
+					} else if (rowData.getStatus().equals(CodeDefaultLC.TASK_BACK.getValue())) {//鍥炴敹
 						cbo.setLcStatus(CodeDefaultLC.TASK_BACK.getValue());
-					}else{
+					} else {
 						cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());//鍙戝竷
 					}
 					/**  if(!isProcess){
@@ -3012,113 +3572,122 @@
 					 }
 					 }***/
 					cbo.setCreator(rowData.getCreator());
-					cbo.setLastModifier(rowData.getEditor()==null?"":rowData.getEditor());
-				}else if(operation.equals("update")){
+					cbo.setLastModifier(rowData.getEditor() == null ? "" : rowData.getEditor());
+				} else if (operation.equals("update")) {
 					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
 					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
-					if(rowData.getStatus().equals(CodeDefaultLC.DISABLE.getValue())){//鍋滅敤
+					if (rowData.getStatus().equals(CodeDefaultLC.DISABLE.getValue())) {//鍋滅敤
 						cbo.setLcStatus(CodeDefaultLC.DISABLE.getValue());
-					}else if(rowData.getStatus().equals(CodeDefaultLC.RELEASED.getValue())){//鍙戝竷
+					} else if (rowData.getStatus().equals(CodeDefaultLC.RELEASED.getValue())) {//鍙戝竷
 						cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
-					}else if(rowData.getStatus().equals(CodeDefaultLC.EDITING.getValue())){//缂栬緫
+					} else if (rowData.getStatus().equals(CodeDefaultLC.EDITING.getValue())) {//缂栬緫
 						cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
-					}else if(rowData.getStatus().equals(CodeDefaultLC.AUDITING.getValue())) {//瀹℃壒涓�
+					} else if (rowData.getStatus().equals(CodeDefaultLC.AUDITING.getValue())) {//瀹℃壒涓�
 						cbo.setLcStatus(CodeDefaultLC.AUDITING.getValue());
-					}else if(rowData.getStatus().equals(CodeDefaultLC.TASK_BACK.getValue())){//鍥炴敹
+					} else if (rowData.getStatus().equals(CodeDefaultLC.TASK_BACK.getValue())) {//鍥炴敹
 						cbo.setLcStatus(CodeDefaultLC.TASK_BACK.getValue());
 					}
 					cbo.setLastModifier(rowData.getEditor() == null ? "" : rowData.getEditor());//淇敼鑰�
-				}else if(operation.equals("delete")){
-					if(rowData.getStatus().equals(CodeDefaultLC.TASK_BACK.getValue())){//鍥炴敹
+				} else if (operation.equals("delete")) {
+					if (rowData.getStatus().equals(CodeDefaultLC.TASK_BACK.getValue())) {//鍥炴敹
 						cbo.setLcStatus(CodeDefaultLC.TASK_BACK.getValue());
-					}else{
+					} else {
 						cbo.setLcStatus(CodeDefaultLC.DISABLE.getValue());//鍋滅敤
 					}
 				}
 
 
-			}catch (Throwable e){
-				log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�",e);
-				if(e instanceof  VciBaseException){
-					errorMap.put(rowNumber,"璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�"+((VciBaseException) e).getMessage());
-				}else{
-					errorMap.put(rowNumber,"璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�"+e.getMessage());
+			} catch (Throwable e) {
+				log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�", e);
+				if (e instanceof VciBaseException) {
+					errorMap.put(rowNumber, "璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�" + ((VciBaseException) e).getMessage());
+				} else {
+					errorMap.put(rowNumber, "璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�" + e.getMessage());
 				}
 
-			}finally {
-				codeOidToSystemOidMap.put(cbo.getOid(),oid);
+			} finally {
+				codeOidToSystemOidMap.put(cbo.getOid(), oid);
 			}
 			cbo.setDescription("");
 			cboList.add(cbo);
 		});
 
 	}
+
 	/**
 	 * excel杞崲涓篶bo鐨勫璞�
-	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 *
+	 * @param classifyFullInfo  鍒嗙被鐨勫叏閮ㄤ俊鎭�
 	 * @param codeImprotDataVO: 鍒嗙被瀵瑰簲鐨勬暟鎹�
-	 * @param cboList 鏁版嵁鐨勫垪琛�
-	 * @param newCode 鏄惁涓烘壒閲忕敵璇�
+	 * @param cboList           鏁版嵁鐨勫垪琛�
+	 * @param newCode           鏄惁涓烘壒閲忕敵璇�
 	 */
-	private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo,CodeImprotDataVO codeImprotDataVO,List<ClientBusinessObject> cboList, boolean newCode){
+	private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo, CodeImprotDataVO codeImprotDataVO, List<ClientBusinessObject> cboList, boolean newCode) {
 		String fullPath = getFullPath(classifyFullInfo);
 		codeImprotDataVO.getDatas().stream().forEach(rowData -> {
-			ClientBusinessObject cbo=new ClientBusinessObject();
+			ClientBusinessObject cbo = new ClientBusinessObject();
 			DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmTypeId());
-			rowData.forEach((field,value)->{
+			rowData.forEach((field, value) -> {
 				try {
-					cbo.setAttributeValueWithNoCheck(field,value);
-					if(WebUtil.isDefaultField(field)){
+					cbo.setAttributeValueWithNoCheck(field, value);
+					if (WebUtil.isDefaultField(field)) {
 						WebUtil.setValueToField(field, cbo, value);
 					}
 				} catch (VciBaseException e) {
-					log.error("璁剧疆灞炴�х殑鍊奸敊璇�",e);
+					log.error("璁剧疆灞炴�х殑鍊奸敊璇�", e);
 				}
 			});
 			try {
-				cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD,codeImprotDataVO.getTemplateOid());
-				cbo.setAttributeValue(IMPORT_ROW_INDEX,rowData.get(IMPORT_ROW_INDEX));
-				if(newCode){
-					cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD,classifyFullInfo.getCurrentClassifyVO().getOid());
-					cbo.setAttributeValue(CODE_FULL_PATH_FILED,fullPath);
+				cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD, codeImprotDataVO.getTemplateOid());
+				cbo.setAttributeValue(IMPORT_ROW_INDEX, rowData.get(IMPORT_ROW_INDEX));
+				if (newCode) {
+					cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD, classifyFullInfo.getCurrentClassifyVO().getOid());
+					cbo.setAttributeValue(CODE_FULL_PATH_FILED, fullPath);
 					//cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
 					int secret = VciBaseUtil.getInt(cbo.getAttributeValue(SECRET_FIELD));
-					if(secret == 0 || !secretService.checkDataSecret(secret).getData() ){
+					if (secret == 0 || !secretService.checkDataSecret(secret).getData()) {
 						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
-						cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
+						cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
 					}
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
-				}else{
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
+				} else {
 					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
 					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
 					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}
-				rowData.put("oid",cbo.getOid());
+				rowData.put("oid", cbo.getOid());
 
-			}catch (Throwable e){
-				log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�",e);
+			} catch (Throwable e) {
+				log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�", e);
 			}
 			cboList.add(cbo);
 		});
 
 	}
+
 	/**
 	 * excel杞崲涓篶bo鐨勫璞�
+	 *
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
-	 * @param fieldIndexMap 瀛楁鐨勪綅缃�
-	 * @param rowDataList excel閲岀殑琛屾暟鎹�
-	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
-	 * @param cboList 鏁版嵁鐨勫垪琛�
-	 * @param fullPath 鍏ㄨ矾寰�
-	 * @param newCode 鏄惁涓烘壒閲忕敵璇�
+	 * @param fieldIndexMap    瀛楁鐨勪綅缃�
+	 * @param rowDataList      excel閲岀殑琛屾暟鎹�
+	 * @param templateVO       妯℃澘鐨勬樉绀哄璞�
+	 * @param cboList          鏁版嵁鐨勫垪琛�
+	 * @param fullPath         鍏ㄨ矾寰�
+	 * @param newCode          鏄惁涓烘壒閲忕敵璇�
 	 */
-	private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo,Map<Integer,String> fieldIndexMap,List<SheetRowData> rowDataList,
-							CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,
-							String fullPath,boolean newCode){
+	private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo, Map<Integer, String> fieldIndexMap, List<SheetRowData> rowDataList,
+							CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList,
+							String fullPath, boolean newCode) {
 		rowDataList.stream().forEach(rowData -> {
-			ClientBusinessObject cbo=new ClientBusinessObject();
-			 DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmTypeId());
-			rowData.getData().forEach((index,value)->{
+			ClientBusinessObject cbo = new ClientBusinessObject();
+			DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmTypeId());
+			R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(classifyFullInfo.getTopClassifyVO().getBtmTypeId()));
+			if (!listR.isSuccess() || listR.getData().size() == 0) {
+				throw new VciBaseException("浼犲叆涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿簲琛ㄥ崟锛岃妫�鏌ワ紒");
+			}
+			cbo.setRevisionRule("".equals(listR.getData().get(0).getVersionRule()) ? "1" : listR.getData().get(0).getVersionRule());
+			rowData.getData().forEach((index, value) -> {
 				String field = fieldIndexMap.get(index);
 				if (StringUtils.isBlank(field)) {
 					throw new VciBaseException("绗�" + (index + 1) + "鍒楃殑鏍囬鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
@@ -3133,26 +3702,26 @@
 				}
 			});
 			try {
-				cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD,templateVO.getOid());
-				cbo.setAttributeValue(IMPORT_ROW_INDEX,rowData.getRowIndex());
-				if(newCode){
-					cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD,classifyFullInfo.getCurrentClassifyVO().getOid());
-					cbo.setAttributeValue(CODE_FULL_PATH_FILED,fullPath);
+				cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD, templateVO.getOid());
+				cbo.setAttributeValue(IMPORT_ROW_INDEX, rowData.getRowIndex());
+				if (newCode) {
+					cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD, classifyFullInfo.getCurrentClassifyVO().getOid());
+					cbo.setAttributeValue(CODE_FULL_PATH_FILED, fullPath);
 					//cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
 					int secret = VciBaseUtil.getInt(cbo.getAttributeValue(SECRET_FIELD));
-					if(secret == 0 || !secretService.checkDataSecret(secret).getData() ){
+					if (secret == 0 || !secretService.checkDataSecret(secret).getData()) {
 						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
-						cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
+						cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
 					}
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
-				}else{
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
+				} else {
 					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
 					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
 					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}
 
-			}catch (Throwable e){
-				log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�",e);
+			} catch (Throwable e) {
+				log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�", e);
 			}
 			cboList.add(cbo);
 		});
@@ -3160,48 +3729,151 @@
 	}
 
 	/**
+	 * excel杞崲涓篶bo鐨勫璞�
+	 *
+	 * @param fieldIndexMap 瀛楁鐨勪綅缃�
+	 * @param rowDataList   excel閲岀殑琛屾暟鎹�
+	 * @param orderDTO      鏁寸悊鐨勬暟鎹�
+	 * @param map           鏁版嵁鐨勫垪琛�
+	 */
+	private void excelToCboEdit(Map<Integer, String> fieldIndexMap, SheetRowData rowDataList,
+								CodeOrderDTO orderDTO,
+								Map map) {
+		rowDataList.getData().forEach((index, value) -> {
+			String field = fieldIndexMap.get(index);
+			if (StringUtils.isBlank(field)) {
+				throw new VciBaseException("绗�" + (index + 1) + "鍒楃殑鏍囬鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
+			}
+			map.put(field.toUpperCase(), value);
+		});
+
+		try {
+//			for (Map map : cbos) {
+//			Object obj = CodeOrderDTO.class.newInstance();
+			BeanInfo beanInfo = Introspector.getBeanInfo(orderDTO.getClass());
+			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+			for (PropertyDescriptor property : propertyDescriptors) {
+				Method setter = property.getWriteMethod();
+				if (setter != null) {
+					//oracle鐨勬椂闂翠负TIMESTAMP鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚data锛屽惁鍒欏皢鎶ラ敊
+					if (map.get(property.getName().toUpperCase()) instanceof TIMESTAMP) {
+						LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
+						ZoneId zoneId = ZoneId.systemDefault();
+						ZonedDateTime zdt = localDateTime.atZone(zoneId);
+						Date date = Date.from(zdt.toInstant());
+						setter.invoke(orderDTO, date);
+						map.remove(property.getName().toUpperCase());
+					} //oracle鐨勬暟瀛椾负BigDecimal鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚Integer锛屽惁鍒欏皢鎶ラ敊
+					else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
+						&& ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())) {
+						setter.invoke(orderDTO, ((BigDecimal) map.get(property.getName().toUpperCase())).intValue());
+						map.remove(property.getName().toUpperCase());
+					} else if (map.containsKey(property.getName().toUpperCase())) {
+						if (setter.getParameterTypes()[0].getSimpleName().equals("String")) {
+							setter.invoke(orderDTO, map.get(property.getName().toUpperCase()) == null ? null : String.valueOf(map.get(property.getName().toUpperCase())));
+						} else {
+							setter.invoke(orderDTO, map.get(property.getName().toUpperCase()));
+						}
+						map.remove(property.getName().toUpperCase());
+					}
+				}
+			}
+			for (Object key : map.keySet()) {
+				map.put(key, map.get(key) == null ? null : String.valueOf(map.get(key)));
+			}
+		} catch (Exception e) {
+			throw new VciBaseException("鏌ヨ澶辫触锛�" + e.getMessage());
+		}
+
+
+//		Iterator<Map.Entry<String, String>> iterator = cbos.entrySet().iterator();
+//
+//		Map.Entry<String, String> entry;
+//		while (iterator.hasNext()) {
+//			entry = iterator.next();
+////			if (WebUtil.isDefaultField(entry.getKey())) {
+//				Object obj = BaseModel.class.newInstance();
+//				BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
+//				PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+//				for (PropertyDescriptor property : propertyDescriptors) {
+//					Method setter = property.getWriteMethod();
+//					if (setter != null) {
+//						//oracle鐨勬椂闂翠负TIMESTAMP鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚data锛屽惁鍒欏皢鎶ラ敊
+//						if (map.get(property.getName().toUpperCase()) instanceof TIMESTAMP) {
+//							LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
+//							ZoneId zoneId = ZoneId.systemDefault();
+//							ZonedDateTime zdt = localDateTime.atZone(zoneId);
+//							Date date = Date.from(zdt.toInstant());
+//							setter.invoke(obj, date);
+//							map.remove(property.getName().toUpperCase());
+//						} //oracle鐨勬暟瀛椾负BigDecimal鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚Integer锛屽惁鍒欏皢鎶ラ敊
+//						else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
+//							&& ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())) {
+//							setter.invoke(obj, ((BigDecimal) map.get(property.getName().toUpperCase())).intValue());
+//							map.remove(property.getName().toUpperCase());
+//						} else if (map.containsKey(property.getName().toUpperCase())) {
+//							if(setter.getParameterTypes()[0].getSimpleName().equals("String")){
+//								setter.invoke(obj, map.get(property.getName().toUpperCase()) == null ? null:String.valueOf(map.get(property.getName().toUpperCase())));
+//							}else{
+//								setter.invoke(obj, map.get(property.getName().toUpperCase()));
+//							}
+//							map.remove(property.getName().toUpperCase());
+//						}
+//					}
+//				}
+//				WebUtil.setValueToField(entry.getKey(), orderDTO, entry.getValue());
+//				iterator.remove();
+////			}
+//		}
+		orderDTO.setData(map);
+	}
+
+	/**
 	 * 妫�鏌ユ牎楠岃鍒欐病鏈夐�氳繃鐨勫唴瀹�
-	 * @param attrVOS 闇�瑕佹牎楠岀殑灞炴��
+	 *
+	 * @param attrVOS  闇�瑕佹牎楠岀殑灞炴��
 	 * @param dataList 鏁版嵁鐨勫垪琛�
 	 * @param errorMap 閿欒鐨勪俊鎭槧灏�
 	 * @return 鏍¢獙涓嶉�氳繃鐨勮鏁�
 	 */
-	private void batchCheckVerifyOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList,Map<String,String> errorMap) {
+	private void batchCheckVerifyOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList, Map<String, String> errorMap) {
 		Map<String, CodeClassifyTemplateAttrVO> verifyAttrVOMap = attrVOS.stream().filter(s -> StringUtils.isNotBlank(s.getVerifyRule()) && StringUtils.isBlank(s.getComponentRule())
-			&&StringUtils.isBlank(s.getClassifyInvokeAttr())
+			&& StringUtils.isBlank(s.getClassifyInvokeAttr())
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
-		if(!CollectionUtils.isEmpty(verifyAttrVOMap)){
-			Map<String/**琛屽彿**/,List<String>/**鏍¢獙涓嶉�氳繃鐨勫睘鎬�**/> unPassCheckMap = new HashMap<>();
-			verifyAttrVOMap.forEach((attrId,attrVO)->{
+		if (!CollectionUtils.isEmpty(verifyAttrVOMap)) {
+			Map<String/**琛屽彿**/, List<String>/**鏍¢獙涓嶉�氳繃鐨勫睘鎬�**/> unPassCheckMap = new HashMap<>();
+			verifyAttrVOMap.forEach((attrId, attrVO) -> {
 				dataList.stream().forEach(cbo -> {
 					String value = cbo.getAttributeValue(attrId);
-					if(StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyRule())){
+					if (StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyRule())) {
 						String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 						List<String> unPassAttrs = unPassCheckMap.getOrDefault(rowIndex, new ArrayList<>());
 						unPassAttrs.add(attrVO.getName());
-						unPassCheckMap.put(rowIndex,unPassAttrs);
+						unPassCheckMap.put(rowIndex, unPassAttrs);
 					}
 				});
 			});
-			if(!CollectionUtils.isEmpty(unPassCheckMap)){
-				unPassCheckMap.forEach((rowIndex,unPassAttrs)->{
-					errorMap.put(rowIndex,";灞炴�" + unPassAttrs.stream().collect(Collectors.joining(",")) + "]鍐呭涓嶇鍚堟牎楠岃鍒欑殑瑕佹眰");
+			if (!CollectionUtils.isEmpty(unPassCheckMap)) {
+				unPassCheckMap.forEach((rowIndex, unPassAttrs) -> {
+					errorMap.put(rowIndex, ";灞炴�" + unPassAttrs.stream().collect(Collectors.joining(",")) + "]鍐呭涓嶇鍚堟牎楠岃鍒欑殑瑕佹眰");
 				});
 			}
 		}
 	}
+
 	/**
 	 * 鎵归噺杞崲鏃堕棿閮戒负鎸囧畾鐨勬牸寮�
-	 * @param attrVOS 妯℃澘灞炴��
-	 * @param cboList 鏁版嵁鐨勫垪琛�
+	 *
+	 * @param attrVOS  妯℃澘灞炴��
+	 * @param cboList  鏁版嵁鐨勫垪琛�
 	 * @param errorMap 閿欒鐨勪俊鎭�
 	 */
-	private void batchSwitchDateAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> cboList,Map<String,String> errorMap){
-		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap =attrVOS.stream().filter(s ->
+	private void batchSwitchDateAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> cboList, Map<String, String> errorMap) {
+		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(s ->
 			StringUtils.isNotBlank(s.getCodeDateFormat()) && VciBaseUtil.getBoolean(s.getCodeDateFormat()) && StringUtils.isBlank(s.getComponentRule())
 				&& StringUtils.isBlank(s.getClassifyInvokeAttr())
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
-		if(!CollectionUtils.isEmpty(dateAttrVOMap)) {
+		if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
 			dateAttrVOMap.forEach((attrId, attrVO) -> {
 				cboList.stream().forEach(cbo -> {
 					String value = cbo.getAttributeValue(attrId);
@@ -3210,27 +3882,27 @@
 					}
 					if (StringUtils.isNotBlank(value)) {
 						boolean formated = false;
-						if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())){
+						if (StringUtils.isNotBlank(attrVO.getCodeDateFormat())) {
 							try {
 								Date date = VciDateUtil.str2Date(value, attrVO.getCodeDateFormat());
-								if(date!=null){
-									cbo.setAttributeValue(attrId,value);
+								if (date != null) {
+									cbo.setAttributeValue(attrId, value);
 									formated = true;
 								}
 							} catch (Exception e) {
 								//璇存槑涓嶆槸杩欎釜鏍煎紡
 							}
 						}
-						if(!formated) {
+						if (!formated) {
 							try {
 								DateConverter dateConverter = new DateConverter();
 								dateConverter.setAsText(value);
 								value = VciDateUtil.date2Str(dateConverter.getValue(), VciDateUtil.DateTimeMillFormat);
-								cbo.setAttributeValue(attrId,value);
-							}catch (Throwable e){
+								cbo.setAttributeValue(attrId, value);
+							} catch (Throwable e) {
 								//杞崲涓嶄簡
 								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-								errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";灞炴�" + attrVO.getName() + "]鏃堕棿鏍煎紡涓嶆纭�" );
+								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";灞炴�" + attrVO.getName() + "]鏃堕棿鏍煎紡涓嶆纭�");
 							}
 						}
 					}
@@ -3241,23 +3913,24 @@
 
 	/**
 	 * 绯荤粺妯℃澘涓粯璁ゅ�艰缃�
-	 * @param attrVOS 妯℃澘灞炴��
+	 *
+	 * @param attrVOS  妯℃澘灞炴��
 	 * @param dataList excel鐨勬暟鎹唴瀹�
 	 */
-	private void batchSwitchAttrDefault(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList) {
+	private void batchSwitchAttrDefault(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList) {
 		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(s -> StringUtils.isNotBlank(s.getDefaultValue())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
-		if(!CollectionUtils.isEmpty(dateAttrVOMap)) {
+		if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
 			dateAttrVOMap.forEach((attrId, attrVO) -> {
 				String defaultValue = attrVO.getDefaultValue();
 				dataList.stream().forEach(cbo -> {
-					String dataValue= cbo.getAttributeValue(attrId);
-					if(StringUtils.isBlank(dataValue)){
-						dataValue=defaultValue;
+					String dataValue = cbo.getAttributeValue(attrId);
+					if (StringUtils.isBlank(dataValue)) {
+						dataValue = defaultValue;
 					}
 					try {
 						cbo.setAttributeValue(attrId, dataValue);
-					}catch (Throwable e){
-						log.error("璁剧疆灞炴�х殑閿欒",e);
+					} catch (Throwable e) {
+						log.error("璁剧疆灞炴�х殑閿欒", e);
 					}
 				});
 			});
@@ -3266,10 +3939,11 @@
 
 	/**
 	 * 杞Щboolean鍨嬬殑灞炴��
-	 * @param attrVOS 灞炴�х殑瀵硅薄
+	 *
+	 * @param attrVOS  灞炴�х殑瀵硅薄
 	 * @param dataList 鏁版嵁
 	 */
-	private void reSwitchBooleanAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList){
+	private void reSwitchBooleanAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList) {
 		Map<String, CodeClassifyTemplateAttrVO> booleanAttrMap = attrVOS.stream().filter(
 			s -> VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(s.getAttributeDataType())
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
@@ -3283,7 +3957,7 @@
 						} else {
 							cbo.setAttributeValue(attrId, BooleanEnum.FASLE.getValue());
 						}
-					}catch (Throwable e){
+					} catch (Throwable e) {
 
 					}
 				});
@@ -3293,26 +3967,27 @@
 
 	/**
 	 * 澶勭悊缁勫悎瑙勫垯
-	 * @param attrVOS 妯℃澘灞炴��
+	 *
+	 * @param attrVOS  妯℃澘灞炴��
 	 * @param dataList excel鐨勬暟鎹唴瀹�
 	 */
-	private void batchSwitchComponentAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList) {
+	private void batchSwitchComponentAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList) {
 		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(s -> StringUtils.isNotBlank(s.getComponentRule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
-		if(!CollectionUtils.isEmpty(dateAttrVOMap)) {
+		if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
 			dateAttrVOMap.forEach((attrId, attrVO) -> {
 				dataList.stream().forEach(cbo -> {
 					//浠巈xcel涓婃妸灞炴�ц浆鎹负map
-					Map<String,String> thisRowDataMap = new HashMap<>();
-					copyValueToMapFromCbos(cbo,thisRowDataMap);
+					Map<String, String> thisRowDataMap = new HashMap<>();
+					copyValueToMapFromCbos(cbo, thisRowDataMap);
 					//缁勫悎鍐呭
-					String value = formulaService.getValueByFormula(thisRowDataMap,attrVO.getComponentRule());
-					if(value == null){
+					String value = formulaService.getValueByFormula(thisRowDataMap, attrVO.getComponentRule());
+					if (value == null) {
 						value = "";
 					}
 					try {
 						cbo.setAttributeValue(attrId, value);
-					}catch (Throwable e){
-						log.error("璁剧疆灞炴�х殑閿欒",e);
+					} catch (Throwable e) {
+						log.error("璁剧疆灞炴�х殑閿欒", e);
 					}
 				});
 			});
@@ -3321,58 +3996,60 @@
 
 	/**
 	 * 杞崲鍙傜収鐨勫��
-	 * @param attrVOS 灞炴�х殑鏄剧ず瀵硅薄
+	 *
+	 * @param attrVOS  灞炴�х殑鏄剧ず瀵硅薄
 	 * @param dataList 鏁版嵁鍒楄〃
 	 * @param errorMap 閿欒鐨勪俊鎭�
 	 */
-	private void batchSwitchReferAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,Map<String,String> errorMap){
+	private void batchSwitchReferAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList, Map<String, String> errorMap) {
 		Map<String, CodeClassifyTemplateAttrVO> referAttrVOMap = attrVOS.stream().filter(
 			s -> (StringUtils.isNotBlank(s.getReferBtmId()) || StringUtils.isNotBlank(s.getReferConfig()))
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
-		if(!CollectionUtils.isEmpty(referAttrVOMap)){
-			Map<String/**琛ㄦ牸鍜屽�肩殑灞炴��**/,Map<String/**鏄剧ず灞炴�х殑鍊�**/,List<String>/**琛ㄦ牸閲岀殑鍊�**/>> linkValueMap = new HashMap<>();
-			referAttrVOMap.forEach((attrId,attrVO)->{
+		if (!CollectionUtils.isEmpty(referAttrVOMap)) {
+			Map<String/**琛ㄦ牸鍜屽�肩殑灞炴��**/, Map<String/**鏄剧ず灞炴�х殑鍊�**/, List<String>/**琛ㄦ牸閲岀殑鍊�**/>> linkValueMap = new HashMap<>();
+			referAttrVOMap.forEach((attrId, attrVO) -> {
 				dataList.stream().forEach(cbo -> {
 					String text = cbo.getAttributeValue(attrId);
-					if(StringUtils.isNotBlank(text)){
+					if (StringUtils.isNotBlank(text)) {
 						UIFormReferVO referVO = getReferVO(attrVO);
 						String valueField = getValueField(referVO);
 						String showText = getTextField(referVO);
 						String tableAndAttr = VciBaseUtil.getTableName(referVO.getReferType()) + "#" + valueField;
 						Map<String, List<String>> showTextMap = linkValueMap.getOrDefault(tableAndAttr, new HashMap<>());
 						List<String> textList = showTextMap.getOrDefault(showText, new ArrayList<>());
-						if(!textList.contains(text)) {
+						if (!textList.contains(text)) {
 							textList.add(text);
 						}
-						showTextMap.put(showText,textList);
-						linkValueMap.put(tableAndAttr,showTextMap);
+						showTextMap.put(showText, textList);
+						linkValueMap.put(tableAndAttr, showTextMap);
 					}
 				});
 			});
-			if(!CollectionUtils.isEmpty(linkValueMap)){
+			if (!CollectionUtils.isEmpty(linkValueMap)) {
 				//闇�瑕侀�愪釜琛ㄧ殑鍊煎瓧娈碉紝閫愪釜鏌ヨ
-				Map<String/**琛ㄦ牸鍜屽�煎睘鎬�**/,Map<String/**鏄剧ず灞炴��**/, Map<String/**鍊�**/,String/**鏄剧ず鐨勫��**/>>> linkCboMap = new HashMap<>();
-				linkValueMap.forEach((tableAndAttr,showValueMap)->{
+				Map<String/**琛ㄦ牸鍜屽�煎睘鎬�**/, Map<String/**鏄剧ず灞炴��**/, Map<String/**鍊�**/, String/**鏄剧ず鐨勫��**/>>> linkCboMap = new HashMap<>();
+				linkValueMap.forEach((tableAndAttr, showValueMap) -> {
 					String[] split = tableAndAttr.split("#");
 					String table = split[0];
 					String valueField = split[1].toLowerCase(Locale.ROOT);
-					Map<String,Map<String,String>> dataMap = new HashMap<>();
-					showValueMap.forEach((showText,valueList)->{
-						Map<String,String> valueOidTextMap = new HashMap<>();
+					Map<String, Map<String, String>> dataMap = new HashMap<>();
+					showValueMap.forEach((showText, valueList) -> {
+						Map<String, String> valueOidTextMap = new HashMap<>();
 						List<List<String>> valueCollections = VciBaseUtil.switchListForOracleIn(valueList);
-						String sql = "select " + valueField + "," + showText.toLowerCase(Locale.ROOT) +" from " + table + "  where " + showText + " in (%s)";
-						valueCollections.stream().forEach(values->{
-							List<Map<String,String>> dataMapList = commonsMapper.queryByOnlySqlForMap(String.format(sql, VciBaseUtil.toInSql(values.toArray(new String[0]))));
-							List<ClientBusinessObject> cbos=	ChangeMapTOClientBusinessObjects(dataMapList);
-							if(!CollectionUtils.isEmpty(cbos)){
-								valueOidTextMap.putAll(cbos.stream().collect(Collectors.toMap(s->s.getAttributeValue(valueField),t->t.getAttributeValue(showText))));
+						String sql = "select " + valueField + "," + showText.toLowerCase(Locale.ROOT) + " from " + table + "  where " + showText + " in (%s)";
+						valueCollections.stream().forEach(values -> {
+							List<Map<String, String>> dataMapList = commonsMapper.queryByOnlySqlForMap(String.format(sql, VciBaseUtil.toInSql(values.toArray(new String[0]))));
+							DefaultAttrAssimtUtil.mapToLowerCase(dataMapList, true);
+							List<ClientBusinessObject> cbos = ChangeMapTOClientBusinessObjects(dataMapList);
+							if (!CollectionUtils.isEmpty(cbos)) {
+								valueOidTextMap.putAll(cbos.stream().collect(Collectors.toMap(s -> s.getAttributeValue(valueField), t -> t.getAttributeValue(showText))));
 							}
 						});
-						dataMap.put(showText,valueOidTextMap);
+						dataMap.put(showText, valueOidTextMap);
 					});
-					linkCboMap.put(tableAndAttr,dataMap);
+					linkCboMap.put(tableAndAttr, dataMap);
 				});
-				referAttrVOMap.forEach((attrId,attrVO)->{
+				referAttrVOMap.forEach((attrId, attrVO) -> {
 					dataList.stream().forEach(cbo -> {
 						String text = cbo.getAttributeValue(attrId);
 						if (StringUtils.isNotBlank(text)) {
@@ -3380,31 +4057,31 @@
 							String valueField = getValueField(referVO);
 							String showText = getTextField(referVO);
 							String tableAndAttr = VciBaseUtil.getTableName(referVO.getReferType()) + "#" + valueField;
-							if(!linkCboMap.containsKey(tableAndAttr)){
+							if (!linkCboMap.containsKey(tableAndAttr)) {
 								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-								errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪" );
+								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪");
 
-							}else{
+							} else {
 								Map<String, Map<String, String>> dataMap = linkCboMap.get(tableAndAttr);
-								if(!dataMap.containsKey(showText)){
+								if (!dataMap.containsKey(showText)) {
 									String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-									errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪" );
-								}else{
+									errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪");
+								} else {
 									Map<String, String> data = dataMap.get(showText);
 									final boolean[] fined = {false};
-									data.forEach((key,value)->{
-										if(value.equalsIgnoreCase(text)){
+									data.forEach((key, value) -> {
+										if (value.equalsIgnoreCase(text)) {
 											fined[0] = true;
 											try {
 												cbo.setAttributeValue(attrId, key);
-											}catch (Throwable e){
+											} catch (Throwable e) {
 
 											}
 										}
 									});
-									if(!fined[0]){
+									if (!fined[0]) {
 										String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-										errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪" );
+										errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪");
 									}
 								}
 							}
@@ -3415,18 +4092,20 @@
 		}
 
 	}
+
 	/**
 	 * 鎵归噺妫�鏌ヤ紒涓氱紪鐮佹槸鍚﹀瓨鍦�
+	 *
 	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
-	 * @param cboList 鏁版嵁鐨勫垪琛�
-	 * @param errorMap 閿欒鐨勪俊鎭�
+	 * @param cboList    鏁版嵁鐨勫垪琛�
+	 * @param errorMap   閿欒鐨勪俊鎭�
 	 */
-	private void batchCheckIdExistOnOrder(CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,Map<String ,String> errorMap) throws Throwable{
+	private void batchCheckIdExistOnOrder(CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList, Map<String, String> errorMap) throws Throwable {
 		List<String> existIds = new ArrayList<>();
-		String tableName ="";
+		String tableName = "";
 		try {
 			R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(templateVO.getBtmTypeId());
-			if(!r.isSuccess()) {
+			if (!r.isSuccess()) {
 				throw new Throwable(r.getMsg());
 			}
 			BtmTypeVO btmTypeVO = r.getData();
@@ -3437,7 +4116,7 @@
 			if (StringUtils.isBlank(tableName)) {
 				throw new Throwable("鏍规嵁涓氬姟绫诲瀷鏈煡璇㈠埌涓氬姟绫诲瀷鐩稿叧鑱旂殑琛�");
 			}
-		}catch (Throwable e){
+		} catch (Throwable e) {
 			throw e;
 		}
 		String finalTableName = tableName;
@@ -3445,37 +4124,39 @@
 			Map<String, String> conditionMap = new HashMap<>();
 			conditionMap.put("id", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0])) + ")");
 
-			StringBuffer sb=new StringBuffer();
+			StringBuffer sb = new StringBuffer();
 			sb.append(" select id from ");
 			sb.append(finalTableName);
-			sb.append(" where 1=1 ");
+			//sb.append(" where 1 = 1");
+			sb.append(" where lastr = 1 and lastv = 1"); //TODO:娑夊強鍒板凡鍗囩増鐨勬暟鎹篃搴旇鎺掗櫎鎺夛紝鍚﹀垯浼氭姤閲�
 			sb.append(" and id in (");
 			sb.append(VciBaseUtil.toInSql(cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0])));
 			sb.append(")");
-			List<String> idList= commonsMapper.selectById(sb.toString());
+			List<String> idList = commonsMapper.selectById(sb.toString());
 			//涓氬姟鏁版嵁濡傛灉鐮佸�煎洖鏀朵細鐩存帴鍒犻櫎鏁版嵁锛屾墍浠ヨ繖閲岀洿鎺ュ垽鏂槸鍚﹀瓨鍦ㄥ嵆鍙�
 			existIds.addAll(Optional.ofNullable(idList).orElseGet(() -> new ArrayList<>()).stream().map(s -> s.toLowerCase(Locale.ROOT)).collect(Collectors.toList()));
 		});
-		if(!CollectionUtils.isEmpty(existIds)){
+		if (!CollectionUtils.isEmpty(existIds)) {
 			String idFieldName = templateVO.getAttributes().stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
-			if(StringUtils.isBlank(idFieldName)){
+			if (StringUtils.isBlank(idFieldName)) {
 				idFieldName = "浼佷笟缂栫爜";
 			}
 			String finalIdFieldName = idFieldName;
-			cboList.stream().forEach(cbo->{
+			cboList.stream().forEach(cbo -> {
 				String id = cbo.getId();
-				if(StringUtils.isBlank(id)){
+				if (StringUtils.isBlank(id)) {
 					id = cbo.getAttributeValue("id");
 				}
-				if(existIds.contains(id)){
+				if (existIds.contains(id)) {
 					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 					String msg = errorMap.getOrDefault(rowIndex, "");
-					msg+=";" + finalIdFieldName + "鐨勫�煎湪绯荤粺涓凡缁忓瓨鍦�";
-					errorMap.put(rowIndex,msg);
+					msg += ";" + finalIdFieldName + "鐨勫�煎湪绯荤粺涓凡缁忓瓨鍦�";
+					errorMap.put(rowIndex, msg);
 				}
 			});
 		}
 	}
+
 	/***
 	 * 鏍¢獙鍒嗙被瀵瑰簲鐨勬ā鏉夸俊鎭�
 	 * @param titleRowData
@@ -3486,27 +4167,27 @@
 	 * @return
 	 * @throws Throwable
 	 */
-	private LinkedList<CodeClassifyTemplateVO> checkSamesTemplate(List<String> titleRowData,  List<SheetDataSet> sheetDataSetList,int shetNumber,Map<String/**璺緞**/, CodeClassifyVO> pathMap,Map<String,String>errorMap) throws Throwable {
-		Map<String,String>pathOidMap =new HashMap<>();
-		Map<String,String> templateIdRowIndex=new HashedMap();
-		SheetDataSet dataSet=  sheetDataSetList.get(shetNumber);
-		LinkedHashMap<String,CodeClassifyTemplateVO> codeClassifyTemplateVOMap=new LinkedHashMap <String,CodeClassifyTemplateVO>();
-		for (int i=0; i<titleRowData.size();i++){
-			String title= titleRowData.get(i);
-			if(title.equals("鍒嗙被璺緞")) {
+	private LinkedList<CodeClassifyTemplateVO> checkSamesTemplate(List<String> titleRowData, List<SheetDataSet> sheetDataSetList, int shetNumber, Map<String/**璺緞**/, CodeClassifyVO> pathMap, Map<String, String> errorMap) throws Throwable {
+		Map<String, String> pathOidMap = new HashMap<>();
+		Map<String, String> templateIdRowIndex = new HashedMap();
+		SheetDataSet dataSet = sheetDataSetList.get(shetNumber);
+		LinkedHashMap<String, CodeClassifyTemplateVO> codeClassifyTemplateVOMap = new LinkedHashMap<String, CodeClassifyTemplateVO>();
+		for (int i = 0; i < titleRowData.size(); i++) {
+			String title = titleRowData.get(i);
+			if (title.equals("鍒嗙被璺緞")) {
 				int finalI = i;
 				dataSet.getRowData().stream().forEach(sheetRowData -> {
 					String Path = sheetRowData.getData().get(finalI);
-					String rowIndex=sheetRowData.getRowIndex();
-					if(StringUtils.isBlank(Path)){
-						Path= "#current#";
+					String rowIndex = sheetRowData.getRowIndex();
+					if (StringUtils.isBlank(Path)) {
+						Path = "#current#";
 					}
-					CodeClassifyTemplateVO newTemplateVO=new CodeClassifyTemplateVO();
-					String templateOid="";
-					if(pathOidMap.containsKey(Path)){
-						templateOid= pathOidMap.get(Path) ;
-						newTemplateVO=codeClassifyTemplateVOMap.get(templateOid);
-					}else{
+					CodeClassifyTemplateVO newTemplateVO = new CodeClassifyTemplateVO();
+					String templateOid = "";
+					if (pathOidMap.containsKey(Path)) {
+						templateOid = pathOidMap.get(Path);
+						newTemplateVO = codeClassifyTemplateVOMap.get(templateOid);
+					} else {
 						if (pathMap.containsKey(Path)) {
 							CodeClassifyVO codeClassifyVO = pathMap.get(Path);
 							newTemplateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyVO.getOid());
@@ -3522,53 +4203,55 @@
 					}
 					pathOidMap.put(Path, templateOid);
 					codeClassifyTemplateVOMap.put(templateOid, newTemplateVO);
-					templateIdRowIndex.put(templateOid, templateIdRowIndex.getOrDefault(templateOid, "") + "锛�" +rowIndex );
+					templateIdRowIndex.put(templateOid, templateIdRowIndex.getOrDefault(templateOid, "") + "锛�" + rowIndex);
 				});
 				break;
 			}
 		}
-		LinkedList<CodeClassifyTemplateVO> codeClassifyTemplateVOList=new LinkedList<>();
-		StringBuffer sb=new StringBuffer();
-		codeClassifyTemplateVOMap.keySet().forEach(tempateOid->{
-			String templateOidInExcel="";
-			String tempateName="";
-			CodeClassifyTemplateVO t= codeClassifyTemplateVOMap.get(tempateOid);
+		LinkedList<CodeClassifyTemplateVO> codeClassifyTemplateVOList = new LinkedList<>();
+		StringBuffer sb = new StringBuffer();
+		codeClassifyTemplateVOMap.keySet().forEach(tempateOid -> {
+			String templateOidInExcel = "";
+			String tempateName = "";
+			CodeClassifyTemplateVO t = codeClassifyTemplateVOMap.get(tempateOid);
 			codeClassifyTemplateVOList.add(t);
-			if(!CollectionUtils.isEmpty(sheetDataSetList)
-				&& sheetDataSetList.size()>1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size()-1).getColName())){
-				List<SheetRowData>  rowData=  sheetDataSetList.get(sheetDataSetList.size()-1).getRowData();
-				templateOidInExcel=rowData.get(shetNumber).getData().get(0);
-				tempateName=rowData.get(shetNumber).getData().get(2);
+			if (!CollectionUtils.isEmpty(sheetDataSetList)
+				&& sheetDataSetList.size() > 1 && !CollectionUtils.isEmpty(sheetDataSetList.get(sheetDataSetList.size() - 1).getColName())) {
+				List<SheetRowData> rowData = sheetDataSetList.get(sheetDataSetList.size() - 1).getRowData();
+				templateOidInExcel = rowData.get(shetNumber).getData().get(0);
+				tempateName = rowData.get(shetNumber).getData().get(2);
 				//templateOidInExcel = sheetDataSetList.get(sheetDataSetList.size()-1).getColName().get(sheetDataSetList.size()-i);
 			}
-			if(StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(tempateOid)){
-				sb.append("妯℃澘銆�"+tempateName+"銆戜腑绗�"+templateIdRowIndex.get(tempateOid)+"琛屾暟鎹笉灞炰簬褰撳墠妯℃澘鐨勬暟鎹紝璇锋牳瀵�!");
+			if (StringUtils.isBlank(templateOidInExcel) || !templateOidInExcel.equalsIgnoreCase(tempateOid)) {
+				sb.append("妯℃澘銆�" + tempateName + "銆戜腑绗�" + templateIdRowIndex.get(tempateOid) + "琛屾暟鎹笉灞炰簬褰撳墠妯℃澘鐨勬暟鎹紝璇锋牳瀵�!");
 			}
 		});
-		if(StringUtils.isNotBlank(sb.toString())){
-			throw  new Throwable(sb.toString());
+		if (StringUtils.isNotBlank(sb.toString())) {
+			throw new Throwable(sb.toString());
 		}
-		if(codeClassifyTemplateVOList.size()>1){
-			String message="妯℃澘銆�"+dataSet.getSheetName()+"銆戞牴鎹垎绫昏矾寰勫垽鏂紝鍒嗙被瀛樺湪澶氫釜妯℃澘";
+		if (codeClassifyTemplateVOList.size() > 1) {
+			String message = "妯℃澘銆�" + dataSet.getSheetName() + "銆戞牴鎹垎绫昏矾寰勫垽鏂紝鍒嗙被瀛樺湪澶氫釜妯℃澘";
 
-			throw  new Throwable(message);
+			throw new Throwable(message);
 		}
-		if(codeClassifyTemplateVOList.size()==0){
-			String message="妯℃澘銆�"+dataSet.getSheetName()+"銆戞牴鎹暟鎹垎绫昏矾寰勫垽鏂紝鏈尮閰嶅埌瀵瑰簲妯℃澘";
-			throw  new Throwable(message);
+		if (codeClassifyTemplateVOList.size() == 0) {
+			String message = "妯℃澘銆�" + dataSet.getSheetName() + "銆戞牴鎹暟鎹垎绫昏矾寰勫垽鏂紝鏈尮閰嶅埌瀵瑰簲妯℃澘";
+			throw new Throwable(message);
 		}
-		return codeClassifyTemplateVOList ;
+		return codeClassifyTemplateVOList;
 	}
+
 	/**
 	 * 浠庡睘鎬т笂鑾峰彇鍙傜収鐨勫唴瀹�
+	 *
 	 * @param attrVO 灞炴�х殑淇℃伅
 	 * @return 鍙傜収鐨勫唴瀹�
 	 */
-	private UIFormReferVO getReferVO(CodeClassifyTemplateAttrVO attrVO){
+	private UIFormReferVO getReferVO(CodeClassifyTemplateAttrVO attrVO) {
 		UIFormReferVO referVO = null;
-		if(StringUtils.isNotBlank(attrVO.getReferConfig())){
-			referVO = JSONObject.parseObject(attrVO.getReferConfig(),UIFormReferVO.class);
-		}else{
+		if (StringUtils.isNotBlank(attrVO.getReferConfig())) {
+			referVO = JSONObject.parseObject(attrVO.getReferConfig(), UIFormReferVO.class);
+		} else {
 			referVO = new UIFormReferVO();
 			referVO.setReferType(attrVO.getReferBtmId());
 			referVO.setValueField(VciQueryWrapperForDO.OID_FIELD);
@@ -3579,20 +4262,21 @@
 
 	/**
 	 * 鑾峰彇鍙傜収涓殑鍊肩殑瀛楁
+	 *
 	 * @param referVO 鍙傜収鐨勫璞�
 	 * @return 榛樿涓篛id锛屾湁澶氫釜鐨勬椂鍊欙紝鑾峰彇绗竴涓�
 	 */
-	private String getValueField(UIFormReferVO referVO){
+	private String getValueField(UIFormReferVO referVO) {
 		String showText = referVO.getValueField();
-		if(StringUtils.isBlank(showText)){
+		if (StringUtils.isBlank(showText)) {
 			return "oid";
 		}
-		if(showText.contains(",")){
+		if (showText.contains(",")) {
 			//闃叉涓囦竴鏈夊涓紝鐪嬬湅鏈夋病鏈塷id
 			List<String> strings = VciBaseUtil.str2List(showText);
-			if(strings.contains("oid")){
+			if (strings.contains("oid")) {
 				showText = "oid";
-			}else{
+			} else {
 				showText = strings.get(0);
 			}
 		}
@@ -3601,33 +4285,36 @@
 
 	/**
 	 * 鑾峰彇鍙傜収涓殑鏄剧ず鍐呭鐨勫瓧娈�
+	 *
 	 * @param referVO 鍙傜収鐨勫璞�
 	 * @return 榛樿涓簄ame锛屾湁澶氫釜鐨勬椂鍊欙紝鑾峰彇绗竴涓�
 	 */
-	private String getTextField(UIFormReferVO referVO){
+	private String getTextField(UIFormReferVO referVO) {
 		String showText = referVO.getTextField();
-		if(StringUtils.isBlank(showText)){
+		if (StringUtils.isBlank(showText)) {
 			return "name";
 		}
-		if(showText.contains(",")){
+		if (showText.contains(",")) {
 			//闃叉涓囦竴鏈夊涓紝鐪嬬湅鏈夋病鏈塶ame
 			List<String> strings = VciBaseUtil.str2List(showText);
-			if(strings.contains("name")){
+			if (strings.contains("name")) {
 				showText = "name";
-			}else{
+			} else {
 				showText = strings.get(0);
 			}
 		}
 		return showText;
 	}
+
 	/**
 	 * 澶勭悊鏋氫妇鐨勬樉绀哄璞�
-	 * @param attrVOS 妯℃澘灞炴��
+	 *
+	 * @param attrVOS  妯℃澘灞炴��
 	 * @param dataList excel鐨勬暟鎹唴瀹�
 	 * @param errorMap 閿欒淇℃伅鐨勬槧灏�
 	 */
-	private void batchSwitchEnumAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,
-											Map<String,String> errorMap ) {
+	private void batchSwitchEnumAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList,
+											Map<String, String> errorMap) {
 		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(
 			s -> (StringUtils.isNotBlank(s.getEnumString()) || StringUtils.isNotBlank(s.getEnumId()))
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
@@ -3635,25 +4322,25 @@
 			dateAttrVOMap.forEach((attrId, attrVO) -> {
 				dataList.stream().forEach(cbo -> {
 					String text = cbo.getAttributeValue(attrId);
-					if(StringUtils.isNotBlank(text)){
+					if (StringUtils.isNotBlank(text)) {
 						List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
 						boolean fined = false;
 						for (int i = 0; i < valueList.size(); i++) {
 							KeyValue keyValue = valueList.get(i);
 							//if(keyValue.getValue().equalsIgnoreCase(text)){
-							if(keyValue.getValue().equalsIgnoreCase(text)||keyValue.getKey().equalsIgnoreCase(text)){
+							if (keyValue.getValue().equalsIgnoreCase(text) || keyValue.getKey().equalsIgnoreCase(text)) {
 								try {
 									cbo.setAttributeValue(attrId, keyValue.getKey());
-								}catch (Throwable e){
+								} catch (Throwable e) {
 									log.error("璁剧疆灞炴�у嚭閿�");
 								}
 								fined = true;
 								break;
 							}
 						}
-						if(!fined){
+						if (!fined) {
 							String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-							errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";灞炴�" + attrVO.getName() + "]鐨勫�间笉绗﹀悎涓嬫媺鐨勮姹�");
+							errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";灞炴�" + attrVO.getName() + "]鐨勫�间笉绗﹀悎涓嬫媺鐨勮姹�");
 						}
 					}
 				});
@@ -3663,59 +4350,63 @@
 
 	/**
 	 * 鎵归噺鏍¢獙鏁版嵁鐨勪俊鎭�
+	 *
 	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
-	 * @param cboList 鏁版嵁鐨勫唴瀹�
+	 * @param cboList    鏁版嵁鐨勫唴瀹�
 	 */
-	private void batchCheckRequiredAttrOnOrder(CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,Map<String,String> errorMap){
+	private void batchCheckRequiredAttrOnOrder(CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList, Map<String, String> errorMap) {
 		Map<String, CodeClassifyTemplateAttrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(s ->
-			VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeLevel())//涓嶈兘鏄粍鍚堢殑鍜屽垎绫绘敞鍏ョ殑
+			VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule()) && (StringUtils.isBlank(s.getClassifyInvokeLevel()) || s.getClassifyInvokeLevel().equals("none"))//涓嶈兘鏄粍鍚堢殑鍜屽垎绫绘敞鍏ョ殑
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 		//涓嶮dmEngineServiceImpl閲岄潰鐨刢heckRequiredAttrOnOrder 閫昏緫搴旇鐩镐技
-		if(!CollectionUtils.isEmpty(requiredAttrMap)) {
+		if (!CollectionUtils.isEmpty(requiredAttrMap)) {
 			Set<String> nullRowIndex = cboList.stream().filter(cbo -> requiredAttrMap.keySet().stream().anyMatch(attrId -> StringUtils.isBlank(cbo.getAttributeValue(attrId)))).map(cbo -> cbo.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet());
-			if(!CollectionUtils.isEmpty(nullRowIndex)){
+			if (!CollectionUtils.isEmpty(nullRowIndex)) {
 				String checkAttr = requiredAttrMap.values().stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(","));
-				nullRowIndex.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鏍¢獙瑙勫垯涓嶉�氳繃锛屾湁鏍¢獙鐨勫睘鎬т负" + checkAttr);
+				nullRowIndex.stream().forEach(rowIndex -> {
+					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鏍¢獙瑙勫垯蹇呭~椤逛笉閫氳繃锛屽鏋滄湁蹇呭~灞炴�т负绌猴紝鍒欏~銆�/銆戜唬鏇�,鏈夋牎楠岀殑灞炴�т负" + checkAttr);
 				});
 			}
 		}
 	}
+
 	/**
 	 * 澶勭悊鍒嗙被娉ㄥ叆
-	 * @param attrVOS 妯℃澘灞炴��
-	 * @param dataList excel鐨勬暟鎹唴瀹�
+	 *
+	 * @param attrVOS          妯℃澘灞炴��
+	 * @param dataList         excel鐨勬暟鎹唴瀹�
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏璺緞
 	 */
-	private void batchSwitchClassifyAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,
-												CodeClassifyFullInfoBO classifyFullInfo,boolean isImPort) {
+	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);
+		Map<String, CodeClassifyFullInfoBO> classifyFullInfoMap = new HashMap<>();
+		classifyFullInfoMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo);
 		if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
 			dataList.stream().forEach(cbo -> {
 				dateAttrVOMap.forEach((attrId, attrVO) -> {
 					//鍒嗙被娉ㄥ叆鐨勭紪鍙锋垨鑰呭悕绉帮紝
 					//灞傜骇鍖呭惈鎸囧畾灞傚拰鏈�灏忓眰
 					CodeClassifyVO classifyVO = null;
-					if(!CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(attrVO.getClassifyInvokeLevel()) && !"min".equalsIgnoreCase(attrVO.getClassifyInvokeLevel())) {
+					if (!CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(attrVO.getClassifyInvokeLevel()) && !"min".equalsIgnoreCase(attrVO.getClassifyInvokeLevel())) {
 						//鎸囧畾浜嗗眰绾х殑
 						//娉ㄦ剰锛屽洜涓烘煡璇笂绾у垎绫诲嚭鏉ョ殑灞傜骇鏄�掑簭鐨勶紝鍗抽《灞傝妭鐐规槸鏈�澶х殑鍊�
-						if(isImPort){
-							if(!classifyFullInfoMap.containsKey(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
+						if (isImPort) {
+							if (!classifyFullInfoMap.containsKey(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
 								CodeClassifyFullInfoBO currentClassifyFullInfo = classifyService.getClassifyFullInfo(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD));
 								classifyFullInfoMap.put(currentClassifyFullInfo.getCurrentClassifyVO().getOid(), currentClassifyFullInfo);
 							}
 						}
-						CodeClassifyFullInfoBO newClassifyFullInfo= classifyFullInfoMap.get(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD));
-						List<CodeClassifyVO> classifyVOS = newClassifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
+						CodeClassifyFullInfoBO newClassifyFullInfo = classifyFullInfoMap.get(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD));
+						List<CodeClassifyVO> classifyVOS = newClassifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
+
 						int level = VciBaseUtil.getInt(attrVO.getClassifyInvokeLevel());
-						if (classifyVOS.size()>=level && level > 0 ) {
-							classifyVO = classifyVOS.get(level-1);
+						if (classifyVOS.size() >= level && level > 0) {
+							classifyVO = classifyVOS.get(level - 1);
 						}
-					}else{
+					} else {
 						//褰撳墠鐨勫垎绫�
 						classifyVO = classifyFullInfo.getCurrentClassifyVO();
 					}
@@ -3726,6 +4417,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) {
@@ -3735,76 +4427,128 @@
 			});
 		}
 	}
+
 	/**
-	 * 鏍¢獙鍏抽敭灞炴��
+	 * 鏍¢獙鍏抽敭灞炴�э紝鍜岃繎涔夎瘝鏌ヨ瑙勫垯
+	 *
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
-	 * @param templateVO 妯℃澘鐨勫唴瀹癸紝蹇呴』鍖呭惈妯℃澘灞炴��
-	 * @param cboList 鎵归噺鐨勬暟鎹�
-	 */
+	 * @param templateVO       妯℃澘鐨勫唴瀹癸紝蹇呴』鍖呭惈妯℃澘灞炴��
+	 * @param cboList          鎵归噺鐨勬暟鎹�
+	 * @param isEdit          鏄惁鏄慨鏀�
+	 * @param errorMap          蹇呴』蹇呴』蹇呴』鏄嚎绋嬪畨鍏ㄧ殑闆嗗悎
+	 * */
 	private CodeImportResultVO batchCheckKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO,
-														List<ClientBusinessObject> cboList) {
+														List<ClientBusinessObject> cboList, boolean isEdit, Map<String, String> errorMap/*蹇呴』瑕佹槸绾跨▼瀹夊叏鐨勯泦鍚�*/) {
 		//涓嶮dmEngineServiceImpl閲岀殑checkKeyAttrOnOrder鐩镐技
 		//鍏堣幏鍙栧叧閿睘鎬х殑瑙勫垯锛屼篃鍒╃敤缁ф壙鐨勬柟寮�
 		CodeKeyAttrRepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
 		//娉ㄦ剰鐨勬槸keyRuleVO鍙兘涓虹┖锛岃〃绀轰笉浣跨敤瑙勫垯鎺у埗
 		//鑾峰彇鎵�鏈夌殑鍏抽敭灞炴��
-		Map<String/**灞炴�х殑缂栧彿**/, CodeClassifyTemplateAttrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		Map<String/**灞炴�х殑缂栧彿**/, CodeClassifyTemplateAttrVO> keyAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 
-		boolean trimAll =keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
+		// TODO:2024-02-01 鍏堣幏鍙栭厤缃簡杩戜箟璇嶆煡璇㈣鍒欑殑灞炴�э紝涓嶅悓浜庡叧閿睘鎬э紝璁剧疆浜嗚繎涔夎瘝鏌ヨ瑙勫垯鐨勫睘鎬у彲鑳芥槸澶氭潯涓嶅悓鐨勮繎涔夎瘝鏌ヨ瑙勫垯
+		Map<String, CodeClassifyTemplateAttrVO> sysonymAttrMaps = templateVO.getAttributes().stream().filter(item -> Func.isNotBlank(item.getSysonymRuleOids())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		// 鑾峰彇鏄惁鏈夐厤缃繎涔夎瘝鏌ヨ瑙勫垯灞炴��
+		Map<String, List<CodeSynonym>> codeSynonymMaps = new HashMap<>();
+		if (!sysonymAttrMaps.isEmpty()) {
+			// 鏌ヨ杩戜箟璇嶈鍒欙紝瀛樺偍鏂瑰紡key锛氬睘鎬d锛寁alue杩戜箟璇嶆煡璇㈣鍒欏垪琛�
+			codeSynonymMaps = codeSynonymService.getCodeSynonymByOids(sysonymAttrMaps);
+		}
+
+		boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
 		//鍏ㄩ儴鍘荤┖鐨勪紭鍏堢骇澶т簬鍘荤┖
-		boolean trim =keyRuleVO ==null?false:  VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
-		boolean ignoreCase = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
-		boolean ignoreWidth = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
+		boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
+		boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
+		boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
 
 		//1. 鎴戜滑闇�瑕佸厛鍒ゆ柇excel瀵煎叆鐨勫唴瀹规槸鍚︽纭�
 		CodeImportResultVO resultVO = new CodeImportResultVO();
-		resultVO.setKeyAttrRuleInfo(String.format(keyRuleVO ==null?"":"鏌ヨ瑙勫垯锛氬幓闄ょ┖鏍�--{0},蹇界暐澶у皬鍐�--{1},蹇界暐鍏ㄥ崐瑙�--{2},蹇界暐鍏ㄩ儴绌烘牸--{3}",
-			new String[]{trim?"鏄�":"鍚�",ignoreCase?"鏄�":"鍚�",ignoreWidth?"鏄�":"鍚�",trimAll?"鏄�":"鍚�"}));
-		//resultVO.setSelfRepeatRowIndexList(getSelfRepeatRowIndex(ketAttrMap,cboList,keyRuleVO));
-		getSelfRepeatRowIndex(ketAttrMap,cboList,keyRuleVO,resultVO);
-		if(!CollectionUtils.isEmpty(resultVO.getSelfRepeatRowIndexList())){
+		StringBuilder synonymResString = new StringBuilder();
+		if (Func.isNotEmpty(codeSynonymMaps)) {
+			codeSynonymMaps.keySet().stream().forEach(item -> {
+				synonymResString.append(item);
+				synonymResString.append(",");
+			});
+		}
+		resultVO.setSynonymRuleInfo(Func.isEmpty(codeSynonymMaps) ? "" : String.format("浠ヤ笅[%s]琚缃簡杩戜箟璇嶆煡璇㈣鍒欑殑鍏抽敭灞炴��,涓嚭鐜颁簡閲嶅锛�", synonymResString));
+		resultVO.setKeyAttrRuleInfo(keyRuleVO == null ? "" : String.format("鏌ヨ瑙勫垯锛氬幓闄ょ┖鏍�--{%s},蹇界暐澶у皬鍐�--{%s},蹇界暐鍏ㄥ崐瑙�--{%s},蹇界暐鍏ㄩ儴绌烘牸--{%s}"
+			, trim ? "鏄�" : "鍚�", ignoreCase ? "鏄�" : "鍚�", ignoreWidth ? "鏄�" : "鍚�", trimAll ? "鏄�" : "鍚�"));
+		//resultVO.setSelfRepeatRowIndexList(getSelfRepeatRowIndex(keyAttrMap,cboList,keyRuleVO));
+		// 鍏堝湪琛ㄦ牸涓煡璇㈠叧閿睘鎬у拰杩戜箟璇嶈浆鎹㈠悗閲嶅鐨勫垪
+		getSelfRepeatRowIndex(keyAttrMap, cboList, keyRuleVO, codeSynonymMaps, resultVO);
+		// 鍐嶅湪琛ㄦ牸涓煡璇㈣繎涔夎瘝鏌ヨ瑙勫垯鐨勫垪
+		//getSelfRepeatSysnomRowIndex(sysonymAttrMaps,cboList,codeSynonymMaps,resultVO);
+
+		if (!CollectionUtils.isEmpty(resultVO.getSelfRepeatRowIndexList())) {
 			//鎴戜滑绉婚櫎鏈韩閲嶅鐨勬暟鎹�
-			cboList = cboList.stream().filter(s->!resultVO.getSelfRepeatRowIndexList().contains(s.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+			cboList = cboList.stream().filter(s -> !resultVO.getSelfRepeatRowIndexList().contains(s.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
 		}
 		//2.鍒ゆ柇鍏抽敭灞炴�у湪绯荤粺閲屾槸鍚﹂噸澶�
-		//鍥犱负鏁版嵁閲忓緢澶э紝鎵�浠ュ緱鎯冲姙娉曞苟琛�
-		//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
-		Map<String,List<BaseModel>> indexTODataMap=new HashMap<>();
-		List<ClientBusinessObject> repeatDataMap = cboList.parallelStream().filter(cbo -> {
-			//姣忚閮藉緱鏌ヨ.濡傛灉鍏朵腑鍑虹幇浜嗛敊璇紝鎴戜滑灏辩洿鎺ユ姏鍑哄紓甯革紝鍏朵綑鐨勬樉绀�
-			//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
-			Map<String, String> conditionMap = new HashMap<>();
-			ketAttrMap.forEach((attrId, attrVO) -> {
-				String value =cbo.getAttributeValue(attrId.toLowerCase(Locale.ROOT));
-				if (value == null) {
-					value = "";
-				}
-				value= value.replace(REQUIRED_CHAR,SPECIAL_CHAR);
-				engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
-			});
-			if (!CollectionUtils.isEmpty(ketAttrMap)) {
-				CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), templateVO, conditionMap, null);
-				boolean isKeyCheck= commonsMapper.queryCountBySql(sqlBO.getSqlCount()) > 0;
-				if(isKeyCheck){
-					List<Map<String,String>> newDataList=  commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
-					//List<ClientBusinessObject> newCboList=	ChangeMapTOClientBusinessObjects(newDataList);
-					List<BaseModel> newCboList=new ArrayList<>();
-					newDataList.stream().forEach(stringStringMap -> {
-						BaseModel baseModel=new BaseModel();
-						DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel);
-						newCboList.add(baseModel);
-					});
-					if(!CollectionUtils.isEmpty(newCboList)) {
-						indexTODataMap.put(cbo.getAttributeValue(IMPORT_ROW_INDEX), newCboList);
+		Map<String, List<BaseModel>> indexTODataMap = new ConcurrentHashMap<>();
+		// 鏌ヨ涓嶉渶瑕佸弬涓庡叧閿睘鎬ф牎楠岀殑闄よ嚜宸变互澶栫殑鎵�鏈夊垎绫籵id
+		final String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
+		final BladeUser user = AuthUtil.getUser();
+		// TODO:Thread limit exceeded replacing blocked 寮傚父鏄繖閮ㄥ垎浠g爜鎶涘嚭鐨�
+		//  ,鎵�浠ユ殏鏃跺皢parallelStream鏀规垚浜唖tream锛屾敼鎴愪簡stream涔嬪悗鍙戠幇宸ㄦ參
+		// customForkJoinPool鎺у埗骞跺彂搴�
+		final List<ClientBusinessObject> finalCboList = cboList;
+		final Map<String, List<CodeSynonym>> finalCodeSynonymMaps = codeSynonymMaps;
+		List<ClientBusinessObject> repeatDataMap = (List<ClientBusinessObject>) customForkJoinPool.submit(() -> {
+			finalCboList.parallelStream().filter(cbo -> {
+				//姣忚閮藉緱鏌ヨ.濡傛灉鍏朵腑鍑虹幇浜嗛敊璇紝鎴戜滑灏辩洿鎺ユ姏鍑哄紓甯革紝鍏朵綑鐨勬樉绀�
+				//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+				Map<String, String> conditionMap = new HashMap<>();
+				keyAttrMap.forEach((attrId, attrVO) -> {
+					String value = cbo.getAttributeValue(attrId.toLowerCase(Locale.ROOT));
+					if (value == null) {
+						value = "";
 					}
+					value = value.replace(REQUIRED_CHAR, SPECIAL_CHAR);
+					// 鍏抽敭灞炴�ф煡璇㈡潯浠秏ap鑾峰彇
+					engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, finalCodeSynonymMaps.get(attrId), attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
+				});
+
+				if (!CollectionUtils.isEmpty(keyAttrMap)) {
+					// 娣诲姞涓嶅弬涓庡叧閿睘鎬ф牎楠岀殑鍒嗙被oid鍒ゆ柇
+					if (Func.isNotBlank(isParticipateCheckOids)) {
+						conditionMap.put("t.codeclsfid", QueryOptionConstant.NOTIN + isParticipateCheckOids);
+					}
+					//濡傛灉鏄洿鏀瑰垯闇�鎺掗櫎绯荤粺鏈韩
+					if (isEdit) {
+						conditionMap.put("t.id", QueryOptionConstant.NOTEQUAL + cbo.getId());
+					}
+					conditionMap.put("t.lastr", "1");
+					conditionMap.put("t.lastv", "1");
+
+					CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), templateVO, conditionMap, null);
+					List<String> repeatData = commonsMapper.selectList(sqlBO.getSqlId());
+					if (!repeatData.isEmpty()) {
+						final List<Map<String, String>> newDataList = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
+						DefaultAttrAssimtUtil.mapToLowerCase(newDataList, true);
+						//List<ClientBusinessObject> newCboList=ChangeMapTOClientBusinessObjects(newDataList);
+						List<BaseModel> newCboList = new ArrayList<>();
+						newDataList.stream().forEach(stringStringMap -> {
+							BaseModel baseModel = new BaseModel();
+							DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap, baseModel, false, user);
+							baseModel.setData(stringStringMap);
+							newCboList.add(baseModel);
+						});
+						// 娣诲姞閿欒鍊�
+						String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+						log.info("=============鍏抽敭灞炴�ф煡璇㈤噸澶嶇殑============="+JSON.toJSONString(repeatData));
+						errorMap.put(rowIndex, "閲嶅鐨勮褰曠紪鍙蜂负:" + repeatData.stream().collect(Collectors.joining(",")));
+						if (!CollectionUtils.isEmpty(newCboList)) {
+							indexTODataMap.put(cbo.getAttributeValue(IMPORT_ROW_INDEX), newCboList);
+						}
+					}
+					return !repeatData.isEmpty();
+				} else {
+					return false;
 				}
-				return isKeyCheck;
-			}else{
-				return false;
-			}
-		}).collect(Collectors.toList());
-		if(!CollectionUtils.isEmpty(repeatDataMap)){
-			resultVO.setKeyAttrRepeatRowIndexList(repeatDataMap.stream().map(s->s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet()));
+			}).collect(Collectors.toList());
+		}).join();
+		if (!CollectionUtils.isEmpty(repeatDataMap)) {
+			resultVO.setKeyAttrRepeatRowIndexList(repeatDataMap.stream().map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet()));
 		}
 		resultVO.setIndexTODataMap(indexTODataMap);
 		//resultVO.setSuccess(true);
@@ -3813,28 +4557,29 @@
 
 	/**
 	 * 妫�鏌ュ垎绫荤殑璺緞鏄惁瀛樺湪
-	 * @param cboList 涓氬姟鏁版嵁
+	 *
+	 * @param cboList  涓氬姟鏁版嵁
 	 * @param errorMap 閿欒淇℃伅
-	 * @param pathMap 璺緞鍜屽垎绫荤殑鏄犲皠
+	 * @param pathMap  璺緞鍜屽垎绫荤殑鏄犲皠
 	 */
 	private void checkClassifyPathInHistory(List<ClientBusinessObject> cboList,
-											Map<String,String> errorMap,     Map<String/**璺緞**/,CodeClassifyVO> pathMap,
+											Map<String, String> errorMap, Map<String/**璺緞**/, CodeClassifyVO> pathMap,
 											Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap) {
 		cboList.parallelStream().forEach(cbo -> {
 			String classifyPath = cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD);
 			//濡傛灉path涓虹┖锛屽垯琛ㄧず鏄鍏ュ綋鍓嶅垎绫�
-			if(StringUtils.isBlank(classifyPath)){
+			if (StringUtils.isBlank(classifyPath)) {
 				classifyPath = "#current#";
 			}
-			if ( !pathMap.containsKey(classifyPath)) {
+			if (!pathMap.containsKey(classifyPath)) {
 				String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-				errorMap.put(row_index,errorMap.getOrDefault(row_index,"") + ";鍒嗙被璺緞涓嶅瓨鍦�");
+				errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";鍒嗙被璺緞涓嶅瓨鍦�");
 			} else {
 				//杞竴涓嬪垎绫荤殑涓婚敭
 				try {
 					String classifyOid = pathMap.get(classifyPath).getOid();
 					cbo.setAttributeValueWithNoCheck(CODE_CLASSIFY_OID_FIELD, classifyOid);
-					cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(classifyOid,classifyPath));
+					cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(classifyOid, classifyPath));
 				} catch (VciBaseException e) {
 					log.error("璁剧疆灞炴�х殑閿欒", e);
 				}
@@ -3844,23 +4589,24 @@
 
 	/**
 	 * 妫�鏌ュ垎绫讳互鍙婂瓙鍒嗙被鏄惁閮芥湁缂栫爜瑙勫垯
-	 * @param classifyVOMap 鍒嗙被鐨勬樉绀哄璞℃槧灏�
-	 * @param ruleOidMap 瑙勫垯鐨勪富閿槧灏�
+	 *
+	 * @param classifyVOMap              鍒嗙被鐨勬樉绀哄璞℃槧灏�
+	 * @param ruleOidMap                 瑙勫垯鐨勪富閿槧灏�
 	 * @param unExistRuleClassifyOidList 涓嶅瓨鍦ㄧ紪鐮佽鍒欑殑鍒嗙被鐨勪富閿�
 	 */
-	private void checkRuleOidInHistory( Map<String/**涓婚敭**/,CodeClassifyVO> classifyVOMap,  Map<String/**鍒嗙被涓婚敭**/,String/**瑙勫垯涓婚敭**/> ruleOidMap,
-										List<String> unExistRuleClassifyOidList   ){
-		if(!CollectionUtils.isEmpty(classifyVOMap)){
-			classifyVOMap.values().parallelStream().forEach(classifyVO->{
-				if(StringUtils.isNotBlank(classifyVO.getCodeRuleOid())){
-					ruleOidMap.put(classifyVO.getOid(),classifyVO.getCodeRuleOid());
-				}else{
+	private void checkRuleOidInHistory(Map<String/**涓婚敭**/, CodeClassifyVO> classifyVOMap, Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap,
+									   List<String> unExistRuleClassifyOidList) {
+		if (!CollectionUtils.isEmpty(classifyVOMap)) {
+			classifyVOMap.values().parallelStream().forEach(classifyVO -> {
+				if (StringUtils.isNotBlank(classifyVO.getCodeRuleOid())) {
+					ruleOidMap.put(classifyVO.getOid(), classifyVO.getCodeRuleOid());
+				} else {
 					//閫掑綊鎵句笂绾�
 					List<String> ruleOidList = new ArrayList<>();
-					recursionRule(classifyVOMap,classifyVO.getParentCodeClassifyOid(),ruleOidList);
-					if(!CollectionUtils.isEmpty(ruleOidList)){
-						ruleOidMap.put(classifyVO.getOid(),ruleOidList.get(0));
-					}else{
+					recursionRule(classifyVOMap, classifyVO.getParentCodeClassifyOid(), ruleOidList);
+					if (!CollectionUtils.isEmpty(ruleOidList)) {
+						ruleOidMap.put(classifyVO.getOid(), ruleOidList.get(0));
+					} else {
 						unExistRuleClassifyOidList.add(classifyVO.getOid());
 					}
 				}
@@ -3868,152 +4614,164 @@
 		}
 		log.info(";;;;");
 	}
+
 	/**
 	 * 閫掑綊鎵剧紪鐮佽鍒�
+	 *
 	 * @param classifyVOMap 鍒嗙被鐨勬樉绀哄璞℃槧灏�
-	 * @param classifyOid 鍒嗙被鐨勪富閿�
-	 * @param ruleOidList 瑙勫垯鐨勪富閿甽ist
+	 * @param classifyOid   鍒嗙被鐨勪富閿�
+	 * @param ruleOidList   瑙勫垯鐨勪富閿甽ist
 	 */
-	private void recursionRule(Map<String, CodeClassifyVO> classifyVOMap,String classifyOid,List<String> ruleOidList){
-		if(classifyVOMap.containsKey(classifyOid)){
+	private void recursionRule(Map<String, CodeClassifyVO> classifyVOMap, String classifyOid, List<String> ruleOidList) {
+		if (classifyVOMap.containsKey(classifyOid)) {
 			CodeClassifyVO classifyVO = classifyVOMap.get(classifyOid);
-			if(StringUtils.isNotBlank(classifyVO.getCodeRuleOid())){
+			if (StringUtils.isNotBlank(classifyVO.getCodeRuleOid())) {
 				ruleOidList.add(classifyVO.getCodeRuleOid());
 				return;
-			}else{
-				recursionRule(classifyVOMap,classifyVO.getParentCodeClassifyOid(),ruleOidList);
+			} else {
+				recursionRule(classifyVOMap, classifyVO.getParentCodeClassifyOid(), ruleOidList);
 			}
-		}else{
-			Map<String, CodeClassifyVO> parentClassifyVOMap=new HashMap<>();
-			CodeClassifyVO codeClassifyVO= this.classifyService.getObjectByOid(classifyOid);
-			parentClassifyVOMap.put(codeClassifyVO.getOid(),codeClassifyVO);
-			recursionRule(parentClassifyVOMap,codeClassifyVO.getOid(),ruleOidList);
+		} else {
+			Map<String, CodeClassifyVO> parentClassifyVOMap = new HashMap<>();
+			CodeClassifyVO codeClassifyVO = this.classifyService.getObjectByOid(classifyOid);
+			parentClassifyVOMap.put(codeClassifyVO.getOid(), codeClassifyVO);
+			recursionRule(parentClassifyVOMap, codeClassifyVO.getOid(), ruleOidList);
 		}
 	}
 
 	/**
 	 * 鑾峰彇瀛愬垎绫荤殑璺緞
+	 *
 	 * @param classifyFullInfo 鍒嗙被鍏ㄩ儴淇℃伅
-	 * @param fullPath 鍒嗙被鐨勫叏璺緞
+	 * @param fullPath         鍒嗙被鐨勫叏璺緞
 	 * @return 瀛愬垎绫荤殑璺緞锛宬ey鏄垎绫荤殑涓婚敭
 	 */
-	private Map<String/**鍒嗙被鐨勪富閿�**/,String/**鍒嗙被璺緞**/> getChildClassifyPathMap(CodeClassifyFullInfoBO classifyFullInfo,String fullPath){
+	private Map<String/**鍒嗙被鐨勪富閿�**/, String/**鍒嗙被璺緞**/> getChildClassifyPathMap(CodeClassifyFullInfoBO classifyFullInfo, String fullPath) {
 		List<CodeClassifyVO> childPathVOs = classifyService.listChildrenClassify(classifyFullInfo.getCurrentClassifyVO().getOid(), true, VciQueryWrapperForDO.OID_FIELD, true);
-		Map<String/**鍒嗙被鐨勪富閿�**/,String/**鍒嗙被鐨勪富閿�**/> childOidPathMap = new ConcurrentHashMap<>();
-		if(!CollectionUtils.isEmpty(childPathVOs)){
-			childPathVOs.parallelStream().forEach(childPath->{
+		Map<String/**鍒嗙被鐨勪富閿�**/, String/**鍒嗙被鐨勪富閿�**/> childOidPathMap = new ConcurrentHashMap<>();
+		if (!CollectionUtils.isEmpty(childPathVOs)) {
+			childPathVOs.parallelStream().forEach(childPath -> {
 				// String thisClassifyPath = fullPath + "##" + childPath.getPath().replace("#" + classifyFullInfo.getCurrentClassifyVO().getOid() + "#","").replace("#","##");
-				List<String> list=Arrays.asList(childPath.getPath().split("#"));
-				List<String> newPahtList=  list.stream().sorted(Comparator.comparing(s -> s,Comparator.reverseOrder())).collect(Collectors.toList());
-				String thisClassifyPath=StringUtils.join(newPahtList,"##")+fullPath;
-				childOidPathMap.put(childPath.getOid(),thisClassifyPath);
+				List<String> list = Arrays.asList(childPath.getPath().split("#"));
+				List<String> newPahtList = list.stream().sorted(Comparator.comparing(s -> s, Comparator.reverseOrder())).collect(Collectors.toList());
+				String thisClassifyPath = StringUtils.join(newPahtList, "##") + fullPath;
+				childOidPathMap.put(childPath.getOid(), thisClassifyPath);
 			});
 		}
+		String path = classifyFullInfo.getCurrentClassifyVO().getId();
+		//鏍规嵁瀹㈡埛閫夋嫨鐨勫垎绫昏矾寰勬湭id锛岃繕鏄痭ame纭畾璺緞鎷兼帴
+		childOidPathMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), fullPath);
 		return childOidPathMap;
 	}
 
-
 	/**
-	 * 鑾峰彇瀵煎叆鐨勫唴瀹逛腑鍏抽敭灞炴�ч噸澶嶇殑琛屽彿
+	 * 鑾峰彇瀵煎叆鐨勫唴瀹逛腑鍏抽敭灞炴�ц繎涔夎瘝杞崲鍚庨噸澶嶇殑琛屽彿
+	 *
 	 * @param ketAttrMap 鍏抽敭灞炴�х殑鏄犲皠
-	 * @param dataList 瀵煎叆鐨勬暟鎹�
-	 * @param keyRuleVO 鍏抽敭灞炴�ф帶鍒惰鍒�
+	 * @param dataList   瀵煎叆鐨勬暟鎹�
+	 * @param keyRuleVO  鍏抽敭灞炴�ф帶鍒惰鍒�
 	 * @return 閲嶅鐨勮鍙�
 	 */
 	private void getSelfRepeatRowIndex(Map<String/**灞炴�х殑缂栧彿**/, CodeClassifyTemplateAttrVO> ketAttrMap,
-											  List<ClientBusinessObject> dataList,CodeKeyAttrRepeatVO keyRuleVO,CodeImportResultVO resultVO){
+									   List<ClientBusinessObject> dataList, CodeKeyAttrRepeatVO keyRuleVO,/*杩戜箟璇嶆煡璇㈣鍒�*/Map<String, List<CodeSynonym>> codeSynonymMaps, CodeImportResultVO resultVO) {
 		Set<String> selfRepeatRowIndexList = new CopyOnWriteArraySet<>();
-		Map<String,List<String>> keyAttrOkOidTORepeatOidMap=new HashMap<>();
-		boolean trimAll =keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
+		Map<String, List<String>> keyAttrOkOidTORepeatOidMap = new ConcurrentHashMap<>();
+		boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
 		//鍏ㄩ儴鍘荤┖鐨勪紭鍏堢骇澶т簬鍘荤┖
-		boolean trim =keyRuleVO ==null?false:  VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
-		boolean ignoreCase = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
-		boolean ignoreWidth = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
+		boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
+		boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
+		boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
 		//蹇呴』灏嗗睘鎬ф寜鐓ч『搴忔帓搴忓ソ
 		List<CodeClassifyTemplateAttrVO> attrVOList = ketAttrMap.values().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
-		Map<String/**琛屽彿**/,String/**鍏抽敭灞炴�х殑缁勫悎鍐呭**/> rowIndexKeyStringMap = new HashMap<>();
-		Map<String/**鍏抽敭灞炴�х殑缁勫悎鍐呭**/,String/**绗竴涓叧閿睘鎬х殑鏁版嵁oid**/> okOidKeyStringMap = new HashMap<>();
-		dataList.parallelStream().forEach(cbo-> {
+		Map<String/**琛屽彿**/, String/**鍏抽敭灞炴�х殑缁勫悎鍐呭**/> rowIndexKeyStringMap = new ConcurrentHashMap<>();
+		Map<String/**鍏抽敭灞炴�х殑缁勫悎鍐呭**/, String/**绗竴涓叧閿睘鎬х殑鏁版嵁oid**/> okOidKeyStringMap = new ConcurrentHashMap<>();
+		dataList.stream().forEach(cbo -> {
 			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-			String oid=cbo.getOid();
+			String oid = cbo.getOid();
 			StringBuilder sb = new StringBuilder();
-			for (int i = 0; i < attrVOList.size(); i++) {
-				CodeClassifyTemplateAttrVO attrVO = attrVOList.get(i);
-				String attrId = attrVO.getId().toLowerCase(Locale.ROOT);
-				String value = cbo.getAttributeValue( attrId);
+			// TODO锛� 2024-02-25鏀归�犲疄鐜拌繎涔夎瘝鏌ヨ瑙勫垯鍔熻兘锛涘叧閿睘鎬ч噸澶嶆牎楠屽�煎鐞�
+			attrVOList.stream().forEach(item -> {
+				String attrId = item.getId().toLowerCase(Locale.ROOT);
+				String value = cbo.getAttributeValue(attrId);
 				if (value == null) {
 					value = "";
 				}
-				if(trim){
+				if (trim) {
 					value = value.trim();
 				}
-				if(trimAll){
-					value = value.replace(" ","");
+				if (trimAll) {
+					value = value.replace(" ", "");
 				}
-				if(ignoreCase){
+				if (ignoreCase) {
 					value = value.toLowerCase(Locale.ROOT);
 				}
-				if(ignoreWidth){
+				if (ignoreWidth) {
 					value = VciBaseUtil.toDBC(value);
 				}
+				value = mdmEngineService.getValueToSynony(codeSynonymMaps.get(attrId), value);
 				sb.append(value).append("${ks}");
-			}
+			});
 			String keyString = sb.toString();
-			if(rowIndexKeyStringMap.containsValue(keyString) && StringUtils.isNotBlank(keyString)){
+			if (rowIndexKeyStringMap.containsValue(keyString) && StringUtils.isNotBlank(keyString)) {
 				selfRepeatRowIndexList.add(rowIndex);
-				String okOid=okOidKeyStringMap.getOrDefault(keyString,"");
-				if(StringUtils.isNotBlank(okOid)){
-					List<String>newOidList=new ArrayList<>();
+				String okOid = okOidKeyStringMap.getOrDefault(keyString, "");
+				if (StringUtils.isNotBlank(okOid)) {
+					List<String> newOidList = new ArrayList<>();
 					newOidList.add(oid);
-					if(keyAttrOkOidTORepeatOidMap.containsKey(okOid)){
-						List<String> oldOidList=	keyAttrOkOidTORepeatOidMap.get(okOid);
+					if (keyAttrOkOidTORepeatOidMap.containsKey(okOid)) {
+						List<String> oldOidList = keyAttrOkOidTORepeatOidMap.get(okOid);
 						newOidList.addAll(oldOidList);
-
 					}
-					keyAttrOkOidTORepeatOidMap.put(okOid,newOidList);
+					keyAttrOkOidTORepeatOidMap.put(okOid, newOidList);
 				}
-			}else {
-				okOidKeyStringMap.put(sb.toString(),oid);
-				rowIndexKeyStringMap.put(rowIndex, sb.toString());
+			} else {
+				okOidKeyStringMap.put(sb.toString(), oid);
+				rowIndexKeyStringMap.put(rowIndex, keyString);
 			}
 		});
 		//鍥犱负鍙槸鍏抽敭灞炴�ч噸澶嶏紝鎵�浠ユ垜浠笉鑳介噸澶嶇殑澶氭潯閫変竴鏉℃潵鎶ラ敊
-		resultVO.setKeyAttrRepeatRowIndexList(selfRepeatRowIndexList);
+//		resultVO.setKeyAttrRepeatRowIndexList(selfRepeatRowIndexList);
+		resultVO.setSelfRepeatRowIndexList(selfRepeatRowIndexList);
 		resultVO.setKeyAttrOkOidTORepeatOidMap(keyAttrOkOidTORepeatOidMap);
 	}
+
 	/**
 	 * excel鐨勬爣棰樹笂鑾峰彇瀛楁鎵�鍦ㄧ殑浣嶇疆
-	 * @param titleRowData 鏍囬鐨勫唴瀹�
+	 *
+	 * @param titleRowData  鏍囬鐨勫唴瀹�
 	 * @param attrNameIdMap 妯℃澘涓睘鎬у悕绉板拰鑻辨枃鐨勬槧灏�
 	 * @param fieldIndexMap 浣嶇疆鍜岃嫳鏂囧瓧娈电殑鏄犲皠
 	 */
-	private void getFieldIndexMap(List<String> titleRowData,Map<String/**鍚嶇О**/,String/**瀛楁鍚�**/> attrNameIdMap,Map<Integer/**浣嶇疆**/,String/**鑻辨枃鍚嶅瓧**/> fieldIndexMap){
+	private void getFieldIndexMap(List<String> titleRowData, Map<String/**鍚嶇О**/, String/**瀛楁鍚�**/> attrNameIdMap, Map<Integer/**浣嶇疆**/, String/**鑻辨枃鍚嶅瓧**/> fieldIndexMap) {
 		for (int i = 0; i < titleRowData.size(); i++) {
 			String title = titleRowData.get(i);
-			String id = attrNameIdMap.getOrDefault(title.replace(KEY_ATTR_CHAR,"").replace(REQUIRED_CHAR
-				,""),"");
-			if(com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "鍒嗙被璺緞".equalsIgnoreCase(title)){
+			String id = attrNameIdMap.getOrDefault(title.replace(KEY_ATTR_CHAR, "").replace(REQUIRED_CHAR
+				, ""), "");
+			if (com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "鍒嗙被璺緞".equalsIgnoreCase(title)) {
 				id = CODE_CLASSIFY_OID_FIELD;
 			}
-			if(com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "鐮佹瀹藉害".equalsIgnoreCase(title)){
+			if (com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "鐮佹瀹藉害".equalsIgnoreCase(title)) {
 				id = CODE_SEC_LENGTH_FIELD;
 			}
-			if(com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "浼佷笟缂栫爜".equalsIgnoreCase(title)){
+			if (com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "浼佷笟缂栫爜".equalsIgnoreCase(title)) {
 				id = CODE_FIELD;
 			}
-			if(com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(id)){
-				fieldIndexMap.put(i,id);
+			if (com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(id)) {
+				fieldIndexMap.put(i, id);
 			}
 		}
 	}
-	private List<ClientBusinessObject> ChangeMapTOClientBusinessObjects(List<Map<String,String>> oldDataMap){
-		List<ClientBusinessObject> clientBusinessObjectList=new ArrayList<>();
-		oldDataMap.stream().forEach(dataMap->{
-			ClientBusinessObject clientBusinessObject=new ClientBusinessObject();
-			DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject);
-			for (String key:dataMap.keySet()){
-				Object value= dataMap.getOrDefault(key,"");
-				clientBusinessObject.setAttributeValue(key,value.toString());
+
+	private List<ClientBusinessObject> ChangeMapTOClientBusinessObjects(List<Map<String, String>> oldDataMap) {
+		List<ClientBusinessObject> clientBusinessObjectList = new ArrayList<>();
+		DefaultAttrAssimtUtil.mapToLowerCase(oldDataMap, true);
+		final BladeUser user = AuthUtil.getUser();
+		oldDataMap.stream().forEach(dataMap -> {
+			ClientBusinessObject clientBusinessObject = new ClientBusinessObject();
+			DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap, clientBusinessObject, false, user);
+			for (String key : dataMap.keySet()) {
+				Object value = dataMap.getOrDefault(key, "");
+				clientBusinessObject.setAttributeValue(key.toLowerCase(Locale.ROOT), value == null ? "" : value.toString());
 			}
 			clientBusinessObjectList.add(clientBusinessObject);
 		});
@@ -4026,122 +4784,126 @@
 	 * @param pathMap
 	 * @param errorMap
 	 */
-	private void createExeclClassData(SheetDataSet dataSet,Map<String/**璺緞**/, CodeClassifyVO> pathMap,Map<String,String>errorMap,List<CodeImprotDataVO> codeClassifyDatas){
+	private void createExeclClassData(SheetDataSet dataSet, Map<String/**璺緞**/, CodeClassifyVO> pathMap, Map<String, String> errorMap, List<CodeImprotDataVO> codeClassifyDatas) {
 
-		Map<String,CodeImprotDataVO> pathDatas=new HashMap<>();
-		List<String> titleRowData= dataSet.getColName();
-		List<SheetRowData>  rowDataList= dataSet.getRowData();
-		LinkedHashMap<String,CodeClassifyTemplateVO> codeClassifyTemplateVOMap=new LinkedHashMap <String,CodeClassifyTemplateVO>();
-		LinkedHashMap<String,CodeRuleVO> codeRuleVOVOMap=new LinkedHashMap <String,CodeRuleVO>();
+		Map<String, CodeImprotDataVO> pathDatas = new HashMap<>();
+		List<String> titleRowData = dataSet.getColName();
+		List<SheetRowData> rowDataList = dataSet.getRowData();
+		LinkedHashMap<String, CodeClassifyTemplateVO> codeClassifyTemplateVOMap = new LinkedHashMap<String, CodeClassifyTemplateVO>();
+		LinkedHashMap<String, CodeRuleVO> codeRuleVOVOMap = new LinkedHashMap<String, CodeRuleVO>();
 
-		for (int i=0;i<titleRowData.size();i++){
-			String title= titleRowData.get(i);
-			if(title.equals("鍒嗙被璺緞")) {
+		for (int i = 0; i < titleRowData.size(); i++) {
+			String title = titleRowData.get(i);
+			if (title.equals("鍒嗙被璺緞")) {
 				int finalI = i;
 				rowDataList.stream().forEach(sheetRowData -> {
-					CodeImprotDataVO dataVO=new CodeImprotDataVO();
+					CodeImprotDataVO dataVO = new CodeImprotDataVO();
 					String Path = sheetRowData.getData().get(finalI);
-					String rowIndex=sheetRowData.getRowIndex();
-					Map<Integer, String> execlData= sheetRowData.getData();
-					CodeClassifyTemplateVO newTemplateVO=new CodeClassifyTemplateVO();
-					CodeRuleVO codeRuleVO=new CodeRuleVO();
-					if(StringUtils.isEmpty(Path)){
-						Path="#current#";
+					String rowIndex = sheetRowData.getRowIndex();
+					Map<Integer, String> execlData = sheetRowData.getData();
+					CodeClassifyTemplateVO newTemplateVO = new CodeClassifyTemplateVO();
+					CodeRuleVO codeRuleVO = new CodeRuleVO();
+					if (StringUtils.isEmpty(Path)) {
+						Path = "#current#";
 					}
 
-					if(pathMap.containsKey(Path)){
-						CodeClassifyVO codeClassifyVO=pathMap.get(Path);
-						if(codeClassifyTemplateVOMap.containsKey(Path)){
-							newTemplateVO=  codeClassifyTemplateVOMap.get(Path);
-							codeRuleVO=  codeRuleVOVOMap.get(Path);
-							if(newTemplateVO==null||StringUtils.isBlank(newTemplateVO.getOid())){
-								errorMap.put(rowIndex,"绗�"+rowIndex+"琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫绘ā鏉�");
+					if (pathMap.containsKey(Path)) {
+						CodeClassifyVO codeClassifyVO = pathMap.get(Path);
+						if (codeClassifyTemplateVOMap.containsKey(Path)) {
+							newTemplateVO = codeClassifyTemplateVOMap.get(Path);
+							codeRuleVO = codeRuleVOVOMap.get(Path);
+							if (newTemplateVO == null || StringUtils.isBlank(newTemplateVO.getOid())) {
+								errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫绘ā鏉�");
 							}
-							if(codeRuleVO==null||StringUtils.isBlank(codeRuleVO.getOid())){
-								errorMap.put(rowIndex,"绗�"+rowIndex+"琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫昏鍒�");
+							if (codeRuleVO == null || StringUtils.isBlank(codeRuleVO.getOid())) {
+								errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫昏鍒�");
 							}
-						}else{
-							newTemplateVO =engineService.getUsedTemplateByClassifyOid(codeClassifyVO.getOid());
-							if(newTemplateVO==null||StringUtils.isBlank(newTemplateVO.getOid())){
-								errorMap.put(rowIndex,"绗�"+rowIndex+"琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫绘ā鏉�");
+						} else {
+							newTemplateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyVO.getOid());
+							if (newTemplateVO == null || StringUtils.isBlank(newTemplateVO.getOid())) {
+								errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫绘ā鏉�");
 							}
-							codeRuleVO=engineService.getCodeRuleByClassifyOid(codeClassifyVO.getOid());
-							if(codeRuleVO==null||StringUtils.isBlank(codeRuleVO.getOid())){
-								errorMap.put(rowIndex,"绗�"+rowIndex+"琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫昏鍒�");
+							codeRuleVO = engineService.getCodeRuleByClassifyOid(codeClassifyVO.getOid());
+							if (codeRuleVO == null || StringUtils.isBlank(codeRuleVO.getOid())) {
+								errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫昏鍒�");
 							}
 						}
-						if(pathMap.containsKey(Path)){
-							dataVO=pathDatas.getOrDefault(Path,dataVO);
+						if (pathMap.containsKey(Path)) {
+							dataVO = pathDatas.getOrDefault(Path, dataVO);
 						}
-						dataVO.setTemplateOid(newTemplateVO==null?"":newTemplateVO.getOid());
+						dataVO.setTemplateOid(newTemplateVO == null ? "" : newTemplateVO.getOid());
 						dataVO.setCodeClassifyTemplateVO(newTemplateVO);
 						dataVO.setCodeClassifyVO(codeClassifyVO);
 						dataVO.setCodeRuleVO(codeRuleVO);
 						dataVO.setRowIndex(rowIndex);
 						dataVO.setCodeClassifyOid(codeClassifyVO.getOid());//璁剧疆鍒嗙被oid
-						dataVO.setCodeRuleOid(codeRuleVO==null?"":codeRuleVO.getOid());
-						createExeclClassData(titleRowData,newTemplateVO,execlData,dataVO);
-						pathDatas.put(Path,dataVO);
+						dataVO.setCodeRuleOid(codeRuleVO == null ? "" : codeRuleVO.getOid());
+						createExeclClassData(titleRowData, newTemplateVO, execlData, dataVO);
+						pathDatas.put(Path, dataVO);
 						codeClassifyTemplateVOMap.put(Path, newTemplateVO);
-						codeRuleVOVOMap.put(Path,codeRuleVO);
-					}else{
-						errorMap.put(rowIndex,"绗�"+rowIndex+"琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫�");
+						codeRuleVOVOMap.put(Path, codeRuleVO);
+					} else {
+						errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍒嗙被璺緞鏈煡璇㈠埌鐩稿簲鐨勫垎绫�");
 					}
 				});
 				break;
 			}
 		}
-		List <CodeImprotDataVO> newCodeImprotDataVO= pathDatas.values().stream().collect(Collectors.toList());
+		List<CodeImprotDataVO> newCodeImprotDataVO = pathDatas.values().stream().collect(Collectors.toList());
 		codeClassifyDatas.addAll(newCodeImprotDataVO);
 		log.info("222");
 	}
+
 	/***
 	 *  @param titleRowData
 	 * @param newTemplateVO
 	 * @param execlData
 	 * @param codeImprotDataVO
 	 */
-	private void createExeclClassData(List<String> titleRowData, CodeClassifyTemplateVO newTemplateVO, Map<Integer, String> execlData, CodeImprotDataVO codeImprotDataVO){
+	private void createExeclClassData(List<String> titleRowData, CodeClassifyTemplateVO newTemplateVO, Map<Integer, String> execlData, CodeImprotDataVO codeImprotDataVO) {
 		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
 		List<CodeClassifyTemplateAttrVO> attrVOS = newTemplateVO.getAttributes().stream().filter(s ->
-			!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
+			!DEFAULT_ATTR_LIST.contains(s.getId()) &&
+				((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 		).collect(Collectors.toList());
 		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
-		List<String> fields=new ArrayList<>();
-		Map<String,String> filedValueMap=new HashMap<>();
-		List<String> colNames=new ArrayList<>();
+		List<String> fields = new ArrayList<>();
+		Map<String, String> filedValueMap = new HashMap<>();
+		List<String> colNames = new ArrayList<>();
 		for (int i = 0; i < titleRowData.size(); i++) {
 			String title = titleRowData.get(i);
-			title=title.replace(KEY_ATTR_CHAR,"").replace(REQUIRED_CHAR,"");
-			String id = attrNameIdMap.getOrDefault(title,"");
-			if(StringUtils.isBlank(id) && "鍒嗙被璺緞".equalsIgnoreCase(title)){
+			title = title.replace(KEY_ATTR_CHAR, "").replace(REQUIRED_CHAR, "");
+			String id = attrNameIdMap.getOrDefault(title, "");
+			if (StringUtils.isBlank(id) && "鍒嗙被璺緞".equalsIgnoreCase(title)) {
 				id = CODE_CLASSIFY_OID_FIELD;
 			}
-			if(StringUtils.isBlank(id) && "鐮佹瀹藉害".equalsIgnoreCase(title)){
+			if (StringUtils.isBlank(id) && "鐮佹瀹藉害".equalsIgnoreCase(title)) {
 				id = CODE_SEC_LENGTH_FIELD;
 			}
-			if(StringUtils.isBlank(id) && "浼佷笟缂栫爜".equalsIgnoreCase(title)){
+			if (StringUtils.isBlank(id) && "浼佷笟缂栫爜".equalsIgnoreCase(title)) {
 				id = CODE_FIELD;
 			}
-			if(StringUtils.isNotBlank(id)){
+			if (StringUtils.isNotBlank(id)) {
 				// fieldIndexMap.put(i,id);id
 				fields.add(id);
 				colNames.add(title);
-				String value= StringUtils.isNotBlank(execlData.get(i))?execlData.get(i):"";
-				filedValueMap.put(id,value);
+				String value = StringUtils.isNotBlank(execlData.get(i)) ? execlData.get(i) : "";
+				filedValueMap.put(id, value);
 
 			}
 		}
 		// filedValueMap.put(CODE_CLASSIFY_OID_FIELD,codeImprotDataVO.getCodeClassifyOid());//灏嗗綋鍓嶅垎绫籵id瀛樺叆瀛楁涓�
-		filedValueMap.put("codeclassifyid",codeImprotDataVO.getCodeClassifyOid());
-		filedValueMap.put(IMPORT_ROW_INDEX,codeImprotDataVO.getRowIndex());
-		filedValueMap.put("codetemplateoid",newTemplateVO.getOid());
+		filedValueMap.put("codeclassifyid", codeImprotDataVO.getCodeClassifyOid());
+		filedValueMap.put(IMPORT_ROW_INDEX, codeImprotDataVO.getRowIndex());
+		filedValueMap.put("codetemplateoid", newTemplateVO.getOid());
 		codeImprotDataVO.setFields(fields);
 		codeImprotDataVO.setColNames(colNames);
 		codeImprotDataVO.getDatas().add(filedValueMap);
 	}
-	/***
+
+	/**
 	 * 姝g‘閿欒鏁版嵁redis缂撳瓨
+	 *
 	 * @param uuid
 	 * @param templateVO
 	 * @param rowIndexCbo
@@ -4150,26 +4912,26 @@
 	 * @param errorMap
 	 * @param isok
 	 */
-	private void createRedisDatas(String uuid,CodeClassifyTemplateVO templateVO,Map<String,ClientBusinessObject> rowIndexCbo, SheetDataSet dataSet, Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap,Map<String,String> errorMap,boolean isok){
-		List<SheetRowData>  needsheetRowDataList =new ArrayList<>();
-		if(errorMap.size()>0) {
+	private void createRedisDatas(String uuid, CodeClassifyTemplateVO templateVO, Map<String, ClientBusinessObject> rowIndexCbo, SheetDataSet dataSet, Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap, Map<String, String> errorMap, boolean isok) {
+		List<SheetRowData> needsheetRowDataList = new ArrayList<>();
+		if (errorMap.size() > 0) {
 			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
 			needsheetRowDataList = dataSet.getRowData().stream().filter(cbo -> {
-				String rowIndex=cbo.getRowIndex();
-				return  isok? !errorMap.containsKey(rowIndex):errorMap.containsKey(rowIndex);
+				String rowIndex = cbo.getRowIndex();
+				return isok ? !errorMap.containsKey(rowIndex) : errorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
 
-		}else{
-			needsheetRowDataList= dataSet.getRowData();
+		} else {
+			needsheetRowDataList = dataSet.getRowData();
 		}
-		Map<String/**涓枃鍚嶇О**/, SheetRowData/**鑻辨枃鍚嶇О**/> rowIdexDataMap = needsheetRowDataList.stream().collect(Collectors.toMap(s -> s.getRowIndex(), t -> t,(o1, o2)->o2));
-		Map<String,CodeImprotDataVO> clsfDataMap=new HashMap<>();
-		rowIndexCbo .forEach((rowIndex, cbo) -> {
+		Map<String/**涓枃鍚嶇О**/, SheetRowData/**鑻辨枃鍚嶇О**/> rowIdexDataMap = needsheetRowDataList.stream().collect(Collectors.toMap(s -> s.getRowIndex(), t -> t, (o1, o2) -> o2));
+		Map<String, CodeImprotDataVO> clsfDataMap = new HashMap<>();
+		rowIndexCbo.forEach((rowIndex, cbo) -> {
 			CodeImprotDataVO codeImprotDataVO = new CodeImprotDataVO();
 			codeImprotDataVO.setTemplateOid(templateVO.getOid());
 			List<Map<String, String>> dataList = new ArrayList<>();
-			if(rowIdexDataMap.containsKey(rowIndex)){
-				SheetRowData sheetRowData=rowIdexDataMap.get(rowIndex);
+			if (rowIdexDataMap.containsKey(rowIndex)) {
+				SheetRowData sheetRowData = rowIdexDataMap.get(rowIndex);
 				Map<String, String> dataMap = new HashMap<>();
 				Map<Integer, String> data = sheetRowData.getData();
 				fieldIndexMap.forEach((integer, s) -> {
@@ -4179,57 +4941,57 @@
 						dataMap.put(field, vlues);
 					}
 				});
-				dataMap.put("oid",cbo.getOid());
+				dataMap.put("oid", cbo.getOid());
 				dataList.add(dataMap);
 			}
-			if(clsfDataMap.containsKey(templateVO.getOid())){
-				codeImprotDataVO=clsfDataMap.get(templateVO.getOid());
+			if (clsfDataMap.containsKey(templateVO.getOid())) {
+				codeImprotDataVO = clsfDataMap.get(templateVO.getOid());
 				dataList.addAll(codeImprotDataVO.getDatas());
 			}
 			codeImprotDataVO.setColNames(dataSet.getColName());
 			codeImprotDataVO.setDatas(dataList);
-			clsfDataMap.put(templateVO.getOid(),codeImprotDataVO);
+			clsfDataMap.put(templateVO.getOid(), codeImprotDataVO);
 		});
-		if(!CollectionUtils.isEmpty(clsfDataMap)) {
-			Collection codeImprotDataVOS=clsfDataMap.values();
-			List<CodeImprotDataVO> codeImprotDataVOList=new ArrayList<>();
+		if (!CollectionUtils.isEmpty(clsfDataMap)) {
+			Collection codeImprotDataVOS = clsfDataMap.values();
+			List<CodeImprotDataVO> codeImprotDataVOList = new ArrayList<>();
 			codeImprotDataVOList.addAll(codeImprotDataVOS);
-			bladeRedis.set(uuid+"-"+templateVO.getOid(), codeImprotDataVOList);
-			bladeRedis.expire(uuid+"-"+templateVO.getOid(),BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
+			bladeRedis.set(uuid + "-" + templateVO.getOid(), codeImprotDataVOList);
+			bladeRedis.expire(uuid + "-" + templateVO.getOid(), BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
 		}
 	}
 
-	/******
+	/**
 	 * 鏍规嵁缂栫爜瑙勫垯缂撳瓨鏁版嵁
 	 * @param uuid
 	 * @param codeImprotDataVOs
 	 * @param errorMap
 	 * @param isok
 	 */
-	private void createRedisDatas(String uuid, List<CodeImprotDataVO> codeImprotDataVOs, Map<String, String> errorMap, boolean isok){
+	private void createRedisDatas(String uuid, List<CodeImprotDataVO> codeImprotDataVOs, Map<String, String> errorMap, boolean isok) {
 		codeImprotDataVOs.stream().forEach(codeImprotDataVO -> {
-			List<Map<String, String>>  dataLists=new ArrayList<>();
-			CodeImprotDataVO newCodeImprotDataVO=new CodeImprotDataVO();
-			if(errorMap.size()>0) {
+			List<Map<String, String>> dataLists = new ArrayList<>();
+			CodeImprotDataVO newCodeImprotDataVO = new CodeImprotDataVO();
+			if (errorMap.size() > 0) {
 				//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
 				dataLists = codeImprotDataVO.getDatas().stream().filter(cbo -> {
-					String rowIndex=cbo.get(IMPORT_ROW_INDEX);
-					String msg=StringUtils.isBlank(errorMap.get(rowIndex))?"":errorMap.get(rowIndex);
-					cbo.put("errorMsg",msg);
-					return  isok? !errorMap.containsKey(rowIndex):errorMap.containsKey(rowIndex);
+					String rowIndex = cbo.get(IMPORT_ROW_INDEX);
+					String msg = StringUtils.isBlank(errorMap.get(rowIndex)) ? "" : errorMap.get(rowIndex);
+					cbo.put("errorMsg", msg);
+					return isok ? !errorMap.containsKey(rowIndex) : errorMap.containsKey(rowIndex);
 				}).collect(Collectors.toList());
 
-			}else{
-				dataLists= codeImprotDataVO.getDatas();
+			} else {
+				dataLists = codeImprotDataVO.getDatas();
 			}
-			BeanUtilForVCI.copyPropertiesIgnoreCase(codeImprotDataVO,newCodeImprotDataVO);
+			BeanUtilForVCI.copyPropertiesIgnoreCase(codeImprotDataVO, newCodeImprotDataVO);
 			newCodeImprotDataVO.setDatas(dataLists);
-			List<CodeImprotDataVO> codeImprotDataVOList=new ArrayList<>();
+			List<CodeImprotDataVO> codeImprotDataVOList = new ArrayList<>();
 			codeImprotDataVOList.add(newCodeImprotDataVO);
 			/***update 鏇存敼鎴愪互瑙勫垯鍒嗙粍*****/
-			String codeRuleOid=codeImprotDataVO.getCodeRuleOid();
-			log.info(uuid+"-"+codeRuleOid+":鏉$洰鏁�"+codeImprotDataVOList.size());
-			if(codeImprotDataVOList.size()>0) {
+			String codeRuleOid = codeImprotDataVO.getCodeRuleOid();
+			log.info(uuid + "-" + codeRuleOid + ":鏉$洰鏁�" + codeImprotDataVOList.size());
+			if (codeImprotDataVOList.size() > 0) {
 				bladeRedis.set(uuid + "-" + codeRuleOid, codeImprotDataVOList);
 				bladeRedis.expire(uuid + "-" + codeRuleOid, BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
 
@@ -4243,7 +5005,7 @@
 		});
 	}
 
-	/****
+	/**
 	 * 鏁版嵁鐩镐技椤规暟鎹牎楠宺edis缂撳瓨
 	 * @param codeClassifyOid
 	 * @param templateVO
@@ -4252,7 +5014,7 @@
 	 * @param btmtypeid
 	 * @param dataResembleVOS
 	 */
-	private void bathcResembleQuery(String codeClassifyOid, CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList,Map<String,String>resembleMap,String btmtypeid,List<DataResembleVO> dataResembleVOS){
+	private void bathcResembleQuery(String codeClassifyOid, CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList, Map<String, String> resembleMap, String btmtypeid, List<DataResembleVO> dataResembleVOS) {
 		CodeClassifyFullInfoBO fullInfoBO = classifyService.getClassifyFullInfo(codeClassifyOid);
 		Map<String, String> conditionMap = new HashMap<>();
 		CodeResembleRuleVO resembleRuleVO = Optional.ofNullable(engineService.getUseResembleRule(fullInfoBO, fullInfoBO.getCurrentClassifyVO())).orElseGet(() -> new CodeResembleRuleVO());
@@ -4261,34 +5023,34 @@
 		if (CollectionUtils.isEmpty(attrVOs)) {
 			return;
 		}
-		Map<String,CodeImprotResembleVO> codeImprotResembleVOMap=new HashMap<>();
-		List<CodeImprotResembleVO> codeImprotResembleVOList=new ArrayList<>();
-		Map<String,String> rowIndePathMap=new HashMap<>();
+		Map<String, CodeImprotResembleVO> codeImprotResembleVOMap = new HashMap<>();
+		List<CodeImprotResembleVO> codeImprotResembleVOList = new ArrayList<>();
+		Map<String, String> rowIndePathMap = new HashMap<>();
 		cboList.stream().forEach(clientBusinessObject -> {
-			CodeImprotResembleVO codeImprotResembleVO=new CodeImprotResembleVO();
+			CodeImprotResembleVO codeImprotResembleVO = new CodeImprotResembleVO();
 			final String[] path = {""};
-			List<String> fieldList=new ArrayList<>();
-			List<String> rowIndeList=new ArrayList<>();
+			List<String> fieldList = new ArrayList<>();
+			List<String> rowIndeList = new ArrayList<>();
 			String rowIndex = clientBusinessObject.getAttributeValue(IMPORT_ROW_INDEX);
 			attrVOs.forEach((attrId, attrVO) -> {
-				String value="";
+				String value = "";
                 /*if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
                     value = WebUtil.getStringValueFromObject(WebUtil.getValueFromField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO));
                 }else {*/
-				value= clientBusinessObject.getAttributeValue(attrId);
+				value = clientBusinessObject.getAttributeValue(attrId);
 				// }
 				fieldList.add(attrId);
-				value=StringUtils.isBlank(value)?"":value;
-				path[0] +=value+"#";
+				value = StringUtils.isBlank(value) ? "" : value;
+				path[0] += value + "#";
 				engineService.wrapperResembleConditionMap(value, resembleRuleVO, attrId, conditionMap);
 			});
-			List<Map<String,String>> dataMap=new ArrayList<>();
-			if(codeImprotResembleVOMap.containsKey(path[0])) {
-				codeImprotResembleVO=codeImprotResembleVOMap.get(path[0]);
-				rowIndeList=codeImprotResembleVO.getRownIndex();
-				dataMap=  codeImprotResembleVO.getDataList();
+			List<Map<String, String>> dataMap = new ArrayList<>();
+			if (codeImprotResembleVOMap.containsKey(path[0])) {
+				codeImprotResembleVO = codeImprotResembleVOMap.get(path[0]);
+				rowIndeList = codeImprotResembleVO.getRownIndex();
+				dataMap = codeImprotResembleVO.getDataList();
 				resembleMap.put(rowIndex, "瀛樺湪鐩镐技鏁版嵁");
-			}else{
+			} else {
 				if (!CollectionUtils.isEmpty(conditionMap)) {
 					Map<String, String> andConditionMap = new HashMap<>();
 					andConditionMap.put("lastr", "1");
@@ -4297,21 +5059,22 @@
 					PageHelper pageHelper = new PageHelper(-1);
 					pageHelper.addDefaultDesc("id");
 					CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(btmtypeid, templateVO, conditionMap, pageHelper);
-					List<Map<String,String>> dataMapList=commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
-					List<ClientBusinessObject> resembleCboList=	ChangeMapTOClientBusinessObjects(dataMapList);
-					if(!CollectionUtils.isEmpty(resembleCboList)) {
+					List<Map<String, String>> dataMapList = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
+					DefaultAttrAssimtUtil.mapToLowerCase(dataMapList, true);
+					List<ClientBusinessObject> resembleCboList = ChangeMapTOClientBusinessObjects(dataMapList);
+					if (!CollectionUtils.isEmpty(resembleCboList)) {
 						List<Map<String, String>> finalDataMap = dataMap;
-						resembleCboList.stream().forEach(cbo->{
-							Map<String,String> resembDataMap=new HashMap<>();
-							fieldList.stream().forEach(field->{
-								String value=cbo.getAttributeValue(field);
-								value=StringUtils.isBlank(value)?"":value;
-								resembDataMap.put(field,value);
+						resembleCboList.stream().forEach(cbo -> {
+							Map<String, String> resembDataMap = new HashMap<>();
+							fieldList.stream().forEach(field -> {
+								String value = cbo.getAttributeValue(field);
+								value = StringUtils.isBlank(value) ? "" : value;
+								resembDataMap.put(field, value);
 							});
-							resembDataMap.put("codetemplateoid",templateVO.getOid());
-							resembDataMap.put("id",StringUtils.isBlank(cbo.getAttributeValue("id"))?"":cbo.getAttributeValue("id"));
-							resembDataMap.put("rowIndex","");
-							resembDataMap.put("oid",cbo.getOid());
+							resembDataMap.put("codetemplateoid", templateVO.getOid());
+							resembDataMap.put("id", StringUtils.isBlank(cbo.getAttributeValue("id")) ? "" : cbo.getAttributeValue("id"));
+							resembDataMap.put("rowIndex", "");
+							resembDataMap.put("oid", cbo.getOid());
 							finalDataMap.add(resembDataMap);
 						});
 						resembleMap.put(rowIndex, "瀛樺湪鐩镐技鏁版嵁");
@@ -4319,36 +5082,36 @@
 					}
 				}
 			}
-			rowIndePathMap.put(rowIndex,path[0]);
+			rowIndePathMap.put(rowIndex, path[0]);
 			rowIndeList.add(rowIndex);
 			codeImprotResembleVO.setPath(path[0]);
 			codeImprotResembleVO.setRownIndex(rowIndeList);
 			codeImprotResembleVO.setConditionMap(conditionMap);
 			codeImprotResembleVO.setFields(fieldList);
 			codeImprotResembleVO.setDataList(dataMap);
-			codeImprotResembleVOMap.put(path[0],codeImprotResembleVO);
+			codeImprotResembleVOMap.put(path[0], codeImprotResembleVO);
 		});
 		Map<String, ClientBusinessObject> cboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
-		if(!CollectionUtils.isEmpty(rowIndePathMap)){
+		if (!CollectionUtils.isEmpty(rowIndePathMap)) {
 			rowIndePathMap.forEach((rowIndex, path) -> {
-				if(codeImprotResembleVOMap.containsKey(path)){
-					CodeImprotResembleVO codeImprotResembleVO=  codeImprotResembleVOMap.get(path);
-					List<String> fieldList=codeImprotResembleVO.getFields();
-					List<String> rownIndexList= codeImprotResembleVO.getRownIndex();
+				if (codeImprotResembleVOMap.containsKey(path)) {
+					CodeImprotResembleVO codeImprotResembleVO = codeImprotResembleVOMap.get(path);
+					List<String> fieldList = codeImprotResembleVO.getFields();
+					List<String> rownIndexList = codeImprotResembleVO.getRownIndex();
 					List<String> newRownIndexList = rownIndexList.stream().filter(cbo -> {
-						return rowIndex!=cbo;
+						return rowIndex != cbo;
 					}).collect(Collectors.toList());
 					newRownIndexList.stream().forEach(s -> {
 						resembleMap.put(s, "瀛樺湪鐩镐技鏁版嵁");
 					});
-					List<Map<String, String>>newDataList=new ArrayList<>();
-					DataResembleVO dataResembleVO=new DataResembleVO();
+					List<Map<String, String>> newDataList = new ArrayList<>();
+					DataResembleVO dataResembleVO = new DataResembleVO();
 					dataResembleVO.setOid(cboMap.get(rowIndex).getOid());
 					List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
 						String newRowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-						return rownIndexList.contains(newRowIndex)&&(!newRowIndex.equalsIgnoreCase(rowIndex));
+						return rownIndexList.contains(newRowIndex) && (!newRowIndex.equalsIgnoreCase(rowIndex));
 					}).collect(Collectors.toList());
-					if(!CollectionUtils.isEmpty(needSaveCboList)) {
+					if (!CollectionUtils.isEmpty(needSaveCboList)) {
 						needSaveCboList.stream().forEach(cbo -> {
 							String newRowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 							Map<String, String> resembDataMap = new HashMap<>();
@@ -4357,14 +5120,14 @@
 								value = StringUtils.isBlank(value) ? "" : value;
 								resembDataMap.put(field, value);
 							});
-							resembDataMap.put("codetemplateoid",templateVO.getOid());
-							resembDataMap.put("id",StringUtils.isBlank(cbo.getAttributeValue("id"))?"":cbo.getAttributeValue("id"));
+							resembDataMap.put("codetemplateoid", templateVO.getOid());
+							resembDataMap.put("id", StringUtils.isBlank(cbo.getAttributeValue("id")) ? "" : cbo.getAttributeValue("id"));
 							resembDataMap.put("rowIndex", newRowIndex);
-							resembDataMap.put("oid",cbo.getOid());
+							resembDataMap.put("oid", cbo.getOid());
 							newDataList.add(resembDataMap);
 						});
 					}
-					List<Map<String, String>>dataList=codeImprotResembleVO.getDataList();
+					List<Map<String, String>> dataList = codeImprotResembleVO.getDataList();
 					newDataList.addAll(dataList);
 					dataResembleVO.setDataList(newDataList);
 					dataResembleVOS.add(dataResembleVO);
@@ -4381,7 +5144,7 @@
 	 * @param fieldIndexMap
 	 * @param iscContain
 	 */
-	private  void createRedisByCodeClassify(String uuid,CodeClassifyTemplateVO templateVOList,SheetDataSet dataSet, Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap,boolean iscContain){
+	private void createRedisByCodeClassify(String uuid, CodeClassifyTemplateVO templateVOList, SheetDataSet dataSet, Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap, boolean iscContain) {
 		List<ColumnVO> columnVOList = new ArrayList<>();
 		List<String> outNameList = dataSet.getColName();
 		fieldIndexMap.forEach((integer, s) -> {
@@ -4392,47 +5155,50 @@
 			columnVOS.setTitle(outName);
 			columnVOList.add(columnVOS);
 		});
-		CodeImportTemplateVO codeImportTemplateVO=new CodeImportTemplateVO();
+		CodeImportTemplateVO codeImportTemplateVO = new CodeImportTemplateVO();
 		codeImportTemplateVO.setCodeClassifyTemplateVO(templateVOList);
 		codeImportTemplateVO.setCloNamesList(columnVOList);
-		List<CodeImportTemplateVO> codeImportTemplateVOs= new ArrayList<>();
+		List<CodeImportTemplateVO> codeImportTemplateVOs = new ArrayList<>();
 
 		codeImportTemplateVOs.add(codeImportTemplateVO);
-		if(codeImportTemplateVOs.size()>0) {
+		if (codeImportTemplateVOs.size() > 0) {
 			bladeRedis.set(uuid, codeImportTemplateVOs);
 			bladeRedis.expire(uuid, BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
 		}
 	}
+
 	/**
 	 * 鎷疯礉涓氬姟绫诲瀷鍒癿ap
+	 *
 	 * @param cbo 涓氬姟鏁版嵁
 	 * @param map map
 	 */
-	public static void copyValueToMapFromCbos(ClientBusinessObject cbo,Map<String,String> map){
-		if(cbo!=null){
-			copyValueToMapFromBos(cbo,map);
+	public static void copyValueToMapFromCbos(ClientBusinessObject cbo, Map<String, String> map) {
+		if (cbo != null) {
+			copyValueToMapFromBos(cbo, map);
 		}
 	}
 
 	/**
 	 * 鎷疯礉涓氬姟绫诲瀷鍒癿ap
-	 * @param bo 涓氬姟鏁版嵁
+	 *
+	 * @param bo  涓氬姟鏁版嵁
 	 * @param map map
 	 */
-	public static void copyValueToMapFromBos(ClientBusinessObject bo,Map<String,String> map){
-		if(bo!=null ){
+	public static void copyValueToMapFromBos(ClientBusinessObject bo, Map<String, String> map) {
+		if (bo != null) {
 			//鍏堟妸鎵�鏈夌殑瀛楁鏄犲皠鎵惧埌
 			AttributeValue[] newAList = bo.newAttrValList;
 			AttributeValue[] hisAList = bo.hisAttrValList;
-			if(hisAList!=null&&hisAList.length>0){//
-				for(int i = 0 ; i < hisAList.length;i++){
+			if (hisAList != null && hisAList.length > 0) {//
+				for (int i = 0; i < hisAList.length; i++) {
 					AttributeValue av = hisAList[i];
 					String attrName = av.attrName.toLowerCase();
 					map.put(attrName, av.attrVal);
 				}
 			}
-			if(newAList!=null&&newAList.length>0){//NEW鐨勪紭鍏堢骇楂樹簺
-				for(int i = 0 ; i < newAList.length;i++){
+			if (newAList != null && newAList.length > 0) {//NEW鐨勪紭鍏堢骇楂樹簺
+				for (int i = 0; i < newAList.length; i++) {
 					AttributeValue av = newAList[i];
 					String attrName = av.attrName.toLowerCase();
 					map.put(attrName, av.attrVal);
@@ -4446,12 +5212,518 @@
 	 * @param idList
 	 * @param btmName
 	 */
-	private void sendApplyGroupcode(List<String> idList,String btmName,String operationType){
-		String oids=VciBaseUtil.array2String(idList.toArray(new String[]{}));
-		if(operationType.equals(sysIntegrationPushTypeEnum.ACCPET_APPCODE.getValue())) {
-			mdmInterJtClient.applyGroupCode(oids,btmName);
-		}else if(operationType.equals(sysIntegrationPushTypeEnum.ACCPET_EDITCODE)){
-			mdmInterJtClient.receiveEditApply(oids,btmName);
+	public void sendApplyGroupcode(List<String> idList, String btmName, String operationType) {
+		String oids = VciBaseUtil.array2String(idList.toArray(new String[]{}));
+		if (operationType.equals(sysIntegrationPushTypeEnum.ACCPET_APPCODE.getValue())) {
+			mdmInterJtClient.applyGroupCode(oids, btmName);
+		} else if (operationType.equals(sysIntegrationPushTypeEnum.ACCPET_EDITCODE)) {
+			mdmInterJtClient.receiveEditApply(oids, btmName);
 		}
 	}
+
+	/***
+	 * @param codeClassifyOid
+	 * @return
+	 */
+	@Override
+	public String exportGroupCodeExcel(String codeClassifyOid) throws VciBaseException {
+		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 VciBaseException("闆嗗洟灞炴�ф槧灏勬湭閰嶇疆");
+		}
+		fieldList = execGroupCodePortDataDTO.getFieldList();
+		List<Map<String, String>> dataList = new ArrayList<>();
+		getDatas(classifyFullInfo, templateVO, fieldList, dataList, null);
+		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 codeClassifyOid
+	 * @param file
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public String importGroupCode(String codeClassifyOid, File file) throws Throwable {
+		VciBaseUtil.alertNotNull(codeClassifyOid, "鍒嗙被鐨勪富閿�");
+		ReadExcelOption reo = new ReadExcelOption();
+		reo.setReadAllSheet(true);
+		List<SheetDataSet> sheetDataSetList = ExcelUtil.readDataObjectFromExcel(file, null, reo);
+
+		if (sheetDataSetList.size() > LIMIT + 1) {
+			throw new ServiceException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�1涓囨潯鐨勬暟鎹�");
+		}
+		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
+		//鑾峰彇鏈�鏂扮殑妯℃澘
+		CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);        //闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
+		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) &&
+			((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
+		).collect(Collectors.toList());
+		ExecGroupCodePortDataDTO execGroupCodePortDataDTO = new ExecGroupCodePortDataDTO();
+		createExportGroupCodeMapConfig(templateVO, execGroupCodePortDataDTO);//缁勭粐鏁版嵁
+		List<CodeAndGroupCodeAttrMappingDTO> codeAttrMapGroupAttrDTOS = execGroupCodePortDataDTO.getCodeAttrMapGroupAttrDTOS();
+		if (CollectionUtils.isEmpty(codeAttrMapGroupAttrDTOS)) {
+			throw new ServiceException("闆嗗洟灞炴�ф槧灏勬湭閰嶇疆");
+		}
+		Map<String, CodeAndGroupCodeAttrMappingDTO> codeSystemObjectMap = codeAttrMapGroupAttrDTOS.stream().filter(codeAttrMappingDTO -> codeAttrMappingDTO != null && StringUtils.isNotBlank(codeAttrMappingDTO.getSourceAttrName())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getSourceAttrName(), t -> t));
+		SheetDataSet dataSet = sheetDataSetList.get(0);
+		List<String> titleRowData = dataSet.getColName();
+		Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
+		getGroupCodeFieldIndexMap(titleRowData, codeAttrMapGroupAttrDTOS, fieldIndexMap);
+		//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
+		/**    List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
+		 && com.alibaba.cloud.commons.lang.StringUtils.isBlank(s.getComponentRule()) && com.alibaba.cloud.commons.lang.StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
+		 ).collect(Collectors.toList());
+		 if(!CollectionUtils.isEmpty(unExistAttrVOs)){
+		 String message=unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(SERIAL_UNIT_SPACE));
+		 throw new VciBaseException("銆�" + message + "銆戣繖浜涘睘鎬у湪excel涓病鏈夋壘鍒�");
+		 }**/
+		List<ClientBusinessObject> cboList = new ArrayList<>();
+		List<SheetRowData> rowDataList = dataSet.getRowData();
+
+		getExportGroupCodeDatas(fieldIndexMap, rowDataList, cboList);//鏋勫缓鏁版嵁瀵硅薄
+
+		List<String> codeList = cboList.stream().map(ClientBusinessObject::getId).collect(Collectors.toList());
+		List<Map<String, String>> dataList = new ArrayList<>();
+		Map<String, String> errorMap = new ConcurrentHashMap<>();
+		batchSwitchCheckExist(errorMap, cboList, classifyFullInfo, templateVO, execGroupCodePortDataDTO, fieldIndexMap);
+		//鍒ゆ柇蹇呰緭椤�
+		batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
+		//	//浼樺厛鏍¢獙缂栫爜鏄惁瀛樺湪
+		//	batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
+		//boolean
+		reSwitchBooleanAttrOnOrder(attrVOS, cboList);
+
+		// 鏋氫妇鐨勫唴瀹归渶瑕佹牴鎹悕绉拌浆鎹负鏋氫妇鐨勫��
+		batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+
+		batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
+		//6.澶勭悊鍒嗙被娉ㄥ叆
+		batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo, false);
+
+		//璁剧疆榛樿鍊�
+		batchSwitchAttrDefault(attrVOS, cboList);
+
+		//7.澶勭悊缁勫悎瑙勫垯
+		batchSwitchComponentAttrOnOrder(attrVOS, cboList);
+		//4.鏍¢獙瑙勫垯
+		batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
+		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+		batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
+		//3.鍒ゆ柇鍏抽敭灞炴��
+		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList, true, errorMap);
+		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
+		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+		if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
+			selfRepeatRowIndexList.stream().forEach(rowIndex -> {
+				errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format(";浼犲叆鐨勬暟鎹腑鍏抽敭灞炴�ч噸澶峓%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
+				// errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
+			});
+		}
+		if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+			keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+				errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + String.format("鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅[%s],[%s];", keyResultVO.getKeyAttrRuleInfo(), keyResultVO.getSynonymRuleInfo()));
+				// errorMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex, ""));
+			});
+		}
+		Map<String, List<WriteExcelData>> shetNameMap = new HashMap<>();
+		createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, templateVO);
+		String excelFileName = "";
+		if (errorMap.size() == 0) {
+			try {
+				String btmTypeId = classifyFullInfo.getTopClassifyVO().getBtmTypeId();
+				List<BaseModel> oldCbos = execGroupCodePortDataDTO.getOldList();
+				List<BaseModel> newCbos = new ArrayList<>();
+				// 淇敼鐗堟鍙�
+				engineService.updateBatchByBaseModel(btmTypeId, oldCbos);
+				List<CodeAllCode> codeAllCodeList = new ArrayList<>();
+				final BladeUser user = AuthUtil.getUser();
+				cboList.stream().forEach(clientBusinessObject -> {
+					BaseModel newBaseModel = new BaseModel();
+					DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(clientBusinessObject.getData(), newBaseModel, false, user);
+					newCbos.add(newBaseModel);
+				});
+				// 鎻掑叆鏂扮殑鏁版嵁
+				engineService.insertBatchByType(btmTypeId, newCbos);
+				codeAllCodeService.saveOrUpdateBatch(execGroupCodePortDataDTO.getCodeAllCodeList());
+				engineService.batchSaveSelectChar(templateVO, newCbos);
+				// 璁板綍鏁版嵁鏇存敼鏃ュ織
+				saveLogUtil.operateLog("鏁版嵁鏇存敼", false, StringUtil.format("{}\n淇敼涓�:\n{}", JSON.toJSONString(oldCbos), JSON.toJSONString(newCbos)));
+			} catch (Exception vciError) {
+				// 璁板綍鏁版嵁鏇存敼鎶ラ敊鏃剁殑鏃ュ織
+				saveLogUtil.operateLog("鏁版嵁鏇存敼", true, vciError.toString());
+				throw new VciBaseException("鏁版嵁鏇存敼淇濆瓨鍑洪敊浜�", new String[0], vciError);
+			}
+		} else {
+			excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
+			WriteExcelOption eo = new WriteExcelOption();
+			shetNameMap.forEach((shetName, errorDataList) -> {
+				eo.addSheetDataList(shetName, errorDataList);
+			});
+			try {
+				new File(excelFileName).createNewFile();
+			} catch (IOException e) {
+				throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
+			}
+			ExcelUtil.writeDataToFile(excelFileName, eo);
+		}
+		return excelFileName;
+	}
+
+	public void batchSwitchCheckExist(Map<String, String> errorMap, List<ClientBusinessObject> cboList, CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO, ExecGroupCodePortDataDTO execGroupCodePortDataDTO, Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap) {
+		List<BaseModel> oldBaseModelList = new ArrayList<>();
+		List<CodeAllCode> codeAllCodeList = new ArrayList<>();
+		final BladeUser user = AuthUtil.getUser();
+		cboList.stream().forEach(clientBusinessObject -> {
+			String code = clientBusinessObject.getId();
+			String rowIndex = clientBusinessObject.getAttributeValue(IMPORT_ROW_INDEX);
+			List<Map<String, String>> dataList = new ArrayList<>();
+			List<String> fieldList = execGroupCodePortDataDTO.getFieldList();
+			getDatas(classifyFullInfo, templateVO, execGroupCodePortDataDTO.getFieldList(), dataList, Arrays.asList(code));
+			DefaultAttrAssimtUtil.mapToLowerCase(dataList, true);
+			if (!CollectionUtils.isEmpty(dataList)) {
+				Map<String, String> newDataMap = new HashMap<>();//灏嗘柊瀵硅薄灞炴�ф殏鏃跺瓨鍌ㄥ湪Map<>
+				newDataMap.putAll(clientBusinessObject.getData());
+				Map<String, String> dataMap = dataList.get(0);
+				BaseModel oldBaseModel = new BaseModel();
+				DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap, oldBaseModel, false, user);
+				String oldOid = oldBaseModel.getOid();
+
+				clientBusinessObject.setCopyFromVersion(oldOid);
+				clientBusinessObject.setAttributeValueWithNoCheck("copyfromversion", oldOid);
+				String oid = VciBaseUtil.getPk();
+				clientBusinessObject.setOid(oid);
+				clientBusinessObject.setAttributeValueWithNoCheck("oid", oid);
+				clientBusinessObject.setBtmname(oldBaseModel.getBtmname());
+				clientBusinessObject.setAttributeValueWithNoCheck("btmname", oldBaseModel.getBtmname());
+				clientBusinessObject.setLastR("1");
+				clientBusinessObject.setAttributeValueWithNoCheck("lastr", "1");
+				clientBusinessObject.setFirstR("1");
+				clientBusinessObject.setAttributeValueWithNoCheck("firstr", "1");
+				clientBusinessObject.setFirstV("1");
+				clientBusinessObject.setAttributeValueWithNoCheck("firstv", "1");
+				clientBusinessObject.setLastV("1");
+				clientBusinessObject.setAttributeValueWithNoCheck("lastv", "1");
+				clientBusinessObject.setRevisionSeq(1);
+				clientBusinessObject.setAttributeValueWithNoCheck("revisionseq", "1");
+				clientBusinessObject.setVersionSeq(1);
+				clientBusinessObject.setAttributeValueWithNoCheck("versionseq", "1");
+				clientBusinessObject.setRevisionRule(oldBaseModel.getRevisionRule());
+				clientBusinessObject.setAttributeValueWithNoCheck("revisionrule", oldBaseModel.getRevisionRule());
+				clientBusinessObject.setVersionRule(oldBaseModel.getRevisionRule());
+				clientBusinessObject.setAttributeValueWithNoCheck("versionrule", oldBaseModel.getVersionRule());
+				clientBusinessObject.setVersionValue(oldBaseModel.getVersionValue());
+				clientBusinessObject.setAttributeValueWithNoCheck("versionvalue", oldBaseModel.getVersionValue());
+				clientBusinessObject.setLctid(oldBaseModel.getLctid());
+				clientBusinessObject.setAttributeValueWithNoCheck("lctid", oldBaseModel.getLctid());
+				clientBusinessObject.setId(oldBaseModel.getId());
+				clientBusinessObject.setAttributeValueWithNoCheck("id", oldBaseModel.getId());
+				clientBusinessObject.setName(oldBaseModel.getName());
+				clientBusinessObject.setAttributeValueWithNoCheck("name", oldBaseModel.getName());
+				clientBusinessObject.setLcStatus(CodeDefaultLC.RELEASED.getValue());
+				clientBusinessObject.setAttributeValueWithNoCheck("lcstatus", CodeDefaultLC.RELEASED.getValue());
+				clientBusinessObject.setDescription("瀵煎叆闆嗗洟鐮�");
+				clientBusinessObject.setAttributeValueWithNoCheck("description", "瀵煎叆闆嗗洟鐮�");
+				clientBusinessObject.setOwner("1");
+				clientBusinessObject.setAttributeValueWithNoCheck("owner", "1");
+				clientBusinessObject.setTenantId(AuthUtil.getTenantId());
+				clientBusinessObject.setAttributeValueWithNoCheck("tenant_id", AuthUtil.getTenantId());
+				clientBusinessObject.setCreator(oldBaseModel.getCreator());
+				clientBusinessObject.setAttributeValueWithNoCheck("creator", oldBaseModel.getCreator());
+				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+				clientBusinessObject.setCreateTime(oldBaseModel.getCreateTime());
+				clientBusinessObject.setAttributeValueWithNoCheck("createtime", formatter.format(oldBaseModel.getCreateTime()));
+				clientBusinessObject.setLastModifier(AuthUtil.getUserAccount());
+				clientBusinessObject.setAttributeValueWithNoCheck("lastmodifier", AuthUtil.getUserAccount());
+				clientBusinessObject.setCreateTime(new Date());
+				clientBusinessObject.setAttributeValueWithNoCheck("lastmodifytime", formatter.format(new Date()));
+				clientBusinessObject.setRevisionValue(String.valueOf(Integer.parseInt(oldBaseModel.getRevisionValue()) + 1));
+				clientBusinessObject.setRevisionOid(oldBaseModel.getRevisionOid());
+				clientBusinessObject.setAttributeValueWithNoCheck("revisionoid", oldBaseModel.getRevisionOid());
+				clientBusinessObject.setAttributeValueWithNoCheck("revisionvalue", String.valueOf(Integer.parseInt(oldBaseModel.getRevisionValue()) + 1));
+
+				clientBusinessObject.setNameOid(oldBaseModel.getNameOid());
+				clientBusinessObject.setAttributeValueWithNoCheck("nameoid", oldBaseModel.getNameOid());
+
+				clientBusinessObject.setAttributeValueWithNoCheck(CODE_CLASSIFY_OID_FIELD, oldBaseModel.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD, ""));
+				clientBusinessObject.setAttributeValueWithNoCheck(CODE_FULL_PATH_FILED, oldBaseModel.getData().getOrDefault(CODE_FULL_PATH_FILED, ""));
+				clientBusinessObject.setAttributeValueWithNoCheck(CODE_TEMPLATE_OID_FIELD, oldBaseModel.getData().getOrDefault(CODE_TEMPLATE_OID_FIELD, ""));
+				clientBusinessObject.setTs(new Date());
+				clientBusinessObject.setAttributeValueWithNoCheck("ts", formatter.format(new Date()));
+				oldBaseModel.setLastV("0");
+				oldBaseModel.getData().put("lastv", "0");
+				oldBaseModelList.add(oldBaseModel);
+				List<CodeAllCode> oldCodeAllCodeList = codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getId, code));
+				CodeAllCode codeAllCode = new CodeAllCode();
+				if (!CollectionUtils.isEmpty(oldCodeAllCodeList)) {
+					codeAllCode = oldCodeAllCodeList.get(0);
+					codeAllCode.setId(code);
+					codeAllCode.setLcStatus(CodeDefaultLC.RELEASED.getValue());
+					codeAllCode.setCreateCodeOid(clientBusinessObject.getOid());
+					codeAllCode.setCreateCodeBtm(clientBusinessObject.getBtmname());
+					codeAllCode.setLastModifyTime(new Date());
+					codeAllCode.setLastModifier(AuthUtil.getUserAccount());
+					codeAllCodeList.add(codeAllCode);
+					if (!oldBaseModel.getLcStatus().equals(CodeDefaultLC.RELEASED.getValue()) || !codeAllCode.getLcStatus().equals(CodeDefaultLC.RELEASED.getValue())) {
+						errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍦ㄧ郴缁熶腑鏁版嵁涓嶆槸鍙戝竷鐘舵��");
+					}
+				} else {
+					errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍦ㄧ郴缁熶腑鏈煡璇㈠埌鐩稿簲鐨勭爜鍊兼暟鎹�");
+				}
+				//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
+				List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s -> !fieldIndexMap.containsValue(s.getId()) &&
+					((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
+				).collect(Collectors.toList());
+				attrVOS.stream().forEach(codeClassifyTemplateAttrVO -> {//灏嗕笉闇�瑕佹洿鏀圭殑榛樿瀛楁鎴栬�呬笉鏇存敼鐨勫睘鎬у鍒跺埌鏂扮殑鐗堟湰涓�
+					String arrtibuteKey = codeClassifyTemplateAttrVO.getId();
+					Map<String, String> attrDataMap = oldBaseModel.getData();
+					if (attrDataMap.containsKey(arrtibuteKey)) {
+						String arrtibuteValue = attrDataMap.get(arrtibuteKey);
+						clientBusinessObject.setAttributeValueWithNoCheck(arrtibuteKey, arrtibuteValue);
+					}
+				});
+			} else {
+				errorMap.put(rowIndex, "绗�" + rowIndex + "琛岋紝鍦ㄧ郴缁熶腑鏈煡璇㈠埌鐩稿簲鐨勬渶鏂扮増鏁版嵁");
+			}
+		});
+		execGroupCodePortDataDTO.setOldList(oldBaseModelList);
+		execGroupCodePortDataDTO.setCodeAllCodeList(codeAllCodeList);
+	}
+
+	/**
+	 * @param fieldIndexMap
+	 * @param rowDataList
+	 * @param cboList
+	 */
+	private void getExportGroupCodeDatas(Map<Integer, String> fieldIndexMap, List<SheetRowData> rowDataList, List<ClientBusinessObject> cboList) {
+		rowDataList.stream().forEach(sheetRowData -> {
+			String rowIndex = sheetRowData.getRowIndex();
+			ClientBusinessObject cbo = new ClientBusinessObject();
+			cbo.setAttributeValue(IMPORT_ROW_INDEX, rowIndex);
+			sheetRowData.getData().forEach((index, value) -> {
+				String field = fieldIndexMap.get(index);
+				if (StringUtils.isBlank(field)) {
+					throw new VciBaseException("绗�" + (index + 1) + "鍒楃殑鏍囬鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
+				}
+				try {
+					cbo.setAttributeValueWithNoCheck(field, value);
+					if (WebUtil.isDefaultField(field)) {
+						WebUtil.setValueToField(field, cbo, value);
+					}
+				} catch (VciBaseException e) {
+					log.error("璁剧疆灞炴�х殑鍊奸敊璇�", e);
+				}
+			});
+			cboList.add(cbo);
+		});
+	}
+
+	/***
+	 * 闆嗗洟瀵煎嚭妯℃澘灞炴�ф槧灏勪俊鎭幏鍙�
+	 * @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();
+				// TODO:2024/4/16鏀规垚鐢╧ey鍊煎垽鏂�
+				if (StringUtils.isNotBlank(dockingPreAttrMappingVO.getTargetAttrKey())) {
+					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 titleRowData
+	 * @param codeAttrMapGroupAttrDTOS
+	 * @param fieldIndexMap
+	 */
+	private void getGroupCodeFieldIndexMap(List<String> titleRowData, List<CodeAndGroupCodeAttrMappingDTO> codeAttrMapGroupAttrDTOS, Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap) {
+		Map<String, CodeAndGroupCodeAttrMappingDTO> codeSystemObjectMap = codeAttrMapGroupAttrDTOS.stream().filter(codeAttrMappingDTO -> codeAttrMappingDTO != null && StringUtils.isNotBlank(codeAttrMappingDTO.getSourceAttrName())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getSourceAttrName(), t -> t));
+		for (int i = 0; i < titleRowData.size(); i++) {
+			String title = titleRowData.get(i);
+			String id = "";
+			if ("闆嗗洟鐮�".equalsIgnoreCase(title)) {
+				id = CODE_GROUP_FIELD;
+			}
+			if ("浼佷笟缂栫爜".equalsIgnoreCase(title)) {
+				id = CODE_FIELD;
+			}
+			if (codeSystemObjectMap.containsKey(title)) {
+				CodeAndGroupCodeAttrMappingDTO codeAndGroupCodeAttrMappingDTO = codeSystemObjectMap.get(title.replace(KEY_ATTR_CHAR, "").replace(REQUIRED_CHAR, ""));
+				id = codeAndGroupCodeAttrMappingDTO.getTargetAttrKey();
+			}
+			if (com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(id)) {
+				fieldIndexMap.put(i, id);
+			}
+		}
+
+
+	}
+
+	/***
+	 * 鏌ヨ鏈湁闆嗗洟鐮佺殑鏁版嵁
+	 * @param classifyFullInfo
+	 * @param templateVO
+	 * @param selectFieldList
+	 * @param dataList
+	 */
+	private void getDatas(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO, LinkedList<String> selectFieldList, List<Map<String, String>> dataList, List<String> codeList) {
+		//鍏堟煡璇㈡暟鎹�
+		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)) + ")");
+		}
+		if (!CollectionUtils.isEmpty(codeList)) {
+			conditionMap.put("id_in", VciBaseUtil.array2String(codeList.toArray(new String[]{})));
+		}
+		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());
+	}
 }

--
Gitblit v1.9.3