From db331894dca28ceadb69f53194a4a62edb9ce9e5 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期三, 13 十二月 2023 11:50:30 +0800
Subject: [PATCH] 特殊字符转义类修改,pom调整打包方式,编写systemctl命令方式启动脚本

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java | 1928 +++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 1,489 insertions(+), 439 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 ecc0089..ef3bc27 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,19 +1,19 @@
 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.QueryWrapper;
 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.enumpack.*;
 import com.vci.ubcs.code.lifecycle.CodeAllCodeLC;
 import com.vci.ubcs.code.mapper.CommonsMapper;
 import com.vci.ubcs.code.service.*;
@@ -27,6 +27,7 @@
 import com.vci.ubcs.omd.feign.IBtmTypeClient;
 import com.vci.ubcs.omd.feign.IWebSecretClient;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
+import com.vci.ubcs.omd.vo.RevisionRuleVO;
 import com.vci.ubcs.starter.bo.WriteExcelData;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.poi.bo.ReadExcelOption;
@@ -37,6 +38,7 @@
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
 import com.vci.ubcs.starter.util.LocalFileUtil;
+import com.vci.ubcs.starter.util.SaveLogUtil;
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
 import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
@@ -46,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,9 +56,13 @@
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.usermodel.Workbook;
+import org.aspectj.apache.bcel.classfile.Code;
 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;
@@ -63,10 +70,19 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+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;
@@ -97,7 +113,7 @@
 	@Value("${batchadd.exportattr.type:鍩烘湰淇℃伅}")
 	public String BATCHADD_EXCEPORT_ATTR_TYPE;
 
-
+	@Value("${batchadd.redis.time:6000000}")
 	public int BATCHADD_REDIS_TIME;
 
 	@Value("${batchadd.import_data_limit:5001}")
@@ -109,12 +125,15 @@
 	@Resource
 	private ICodeClassifyService classifyService;
 
+	@Resource
+	private MdmEngineService mdmEngineService;
 
 	/**
 	 * 閫氱敤鏌ヨ
 	 */
 	@Resource
 	private CommonsMapper commonsMapper;
+
 	/****
 	 * 鐮佸�兼湇鍔�
 	 */
@@ -172,11 +191,16 @@
 	 */
 	@Resource
 	private IWebSecretClient secretService;
+	/**
+	 * 鏃ュ織淇濆瓨宸ュ叿绫�
+	 */
+	@Autowired
+	private SaveLogUtil saveLogUtil;
 
 	/**
-	 * 瀵煎嚭鐨勫崄涓囨潯
+	 * 瀹㈡埛鐜板満excel涓鸿�佺増鏈紝瀵煎嚭鐨勬�绘暟闄愬埗涓�65535
 	 */
-	public static final int EXPORT_LIMIT = 100000;
+	public static final int EXPORT_LIMIT = 65535;
 
 	/**
 	 * 鎵归噺鐢宠锛氶�夊彇閫変腑鍒嗙被涓嬬殑鎵�鏈夋ā鏉垮叧閿睘鎬э紝鐩镐技灞炴�э紝蹇呭~灞炴�э紝鍐欏叆execl涓�
@@ -352,10 +376,12 @@
 	@Override
 	public String createImportExcel(String codeClassifyOid, boolean isHistory) {
 		List<CodeClassifyTemplateVO> templateVOList=new ArrayList<>();
-
 		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘","瀵煎嚭鐨勯厤缃�",codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
 
 		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
+
+		//鑾峰彇鐮佹瀹藉害
+		String secWidth = getCodeSegmentWidth(codeClassifyVO.getOid());
 
 		if(isHistory){
 			templateVOList= templateService.childTemplates(codeClassifyOid);
@@ -406,6 +432,8 @@
 				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);
@@ -470,6 +498,246 @@
 	}
 
 	/**
+	 * 鐢熸垚鎵归噺淇敼瀵煎叆鐨勬枃浠�
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @return excel鐨勬枃浠跺湴鍧�
+	 */
+	@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 鍗曞厓鏍肩殑鍊�
@@ -509,7 +777,7 @@
 	 * @return  鏈夐敊璇俊鎭殑excel鐨勬枃浠�
 	 */
 	@Override
-	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
+	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) throws Exception {
 		VciBaseUtil.alertNotNull(orderDTO,"缂栫爜鐢宠鐩稿叧鐨勬暟鎹�",orderDTO.getCodeClassifyOid(),"涓婚搴撳垎绫讳富閿�");
 		ReadExcelOption reo = new ReadExcelOption();
 		reo.setReadAllSheet(true);
@@ -605,7 +873,8 @@
 
 			//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
 			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()));
@@ -654,7 +923,7 @@
 			//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
 			batchCheckRequiredAttrOnOrder(templateVO,allCboList,errorMap);
 			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, allCboList,errorMap);
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, allCboList,false,errorMap);
 			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
 			if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
@@ -781,19 +1050,357 @@
 	 */
 	@Override
 	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, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
+					});
+				}
+				if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+					keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+						errorMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex, ""));
+					});
+				}
+				//4.鏍¢獙瑙勫垯
+				batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
+
+				//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+				batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
+				if (CollectionUtils.isEmpty(ruleOidMap.values())) {
+					throw new VciBaseException("瀵煎叆鐨勬暟鎹墍閫夋嫨鐨勫垎绫婚兘娌℃湁璁剧疆缂栫爜瑙勫垯");
+				}
+				// TODO: 璇ョ敤oid鏌ヨ瑙勫垯鐨勶紝鍒敤id
+				Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
+				Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
+				checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
+				ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
+					List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
+					List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+					//鎴戜滑闇�瑕佸厛鏌ヨ涓�涓嬶紝鍐呭鏄惁宸茬粡瀛樺湪
+					if(!CollectionUtils.isEmpty(thisCbos)){
+						List<String> existIds = new ArrayList<>();
+						VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
+							List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
+								.notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
+								.notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
+							);
+							existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
+								String id = s.getId();
+								if (StringUtils.isBlank(id)) {
+									id = s.getId();
+								}
+								return id;
+							}).collect(Collectors.toList()));
+						});
+						List<String> existIdCbos = thisCbos.stream().filter(s -> {
+							String id = s.getId();
+							if (StringUtils.isBlank(id)) {
+								id = s.getAttributeValue("id");
+							}
+							return 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);
+				}
+			}
+			//long end = System.currentTimeMillis();
+			//log.info("=============for鎵ц鏃堕棿================="+String.valueOf((end-start)/1000));
+			String excelFileName="";
+			if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
+				excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
+				WriteExcelOption eo = new WriteExcelOption();
+				shetNameMap.forEach((shetName, errorDataList) -> {
+					eo.addSheetDataList(shetName, errorDataList);
+				});
+				try {
+					new File(excelFileName).createNewFile();
+				} catch (IOException e) {
+					throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
+				}
+				ExcelUtil.writeDataToFile(excelFileName, eo);
+			}
+			CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
+			if(StringUtils.isNotBlank(excelFileName)) {
+				codeImProtRusultVO.setFilePath(excelFileName);
+				codeImProtRusultVO.setFileOid("");
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true, StringUtil.format("閿欒淇℃伅锛歿}",JSON.toJSONString(shetNameMap)));
+			}else{
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",false, StringUtil.format("瀵煎叆鍒板垎绫粄}涓紝瀵煎叆鎴愬姛鎬绘暟涓猴細{}", JSON.toJSONString(classifyFullInfo),importCount.get(0)));
+			}
+			if(isCreateUUid){
+				codeImProtRusultVO.setRedisUuid(uuid);
+			}
+			return codeImProtRusultVO;
+		}catch (Exception e){
+			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true,e.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涓囨潯鐨勬暟鎹�");
+		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;
+		if (sheetDataSetList.get(0).getRowData().size() == 0) {
+			throw new ServiceException("鏈鍙栧埌excle鐩稿叧鏁版嵁锛岃纭锛侊紒锛�");
+		}
 		boolean isExport=false;
-		//long start = System.currentTimeMillis();
+		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) {
@@ -803,18 +1410,6 @@
 			if(sheetDataSetList.get(i).getRowData().size() > IMPORT_DATA_LIMIT){
 				throw new ServiceException("涓轰簡淇濊瘉绯荤粺鐨勭ǔ瀹氭�э紝璇蜂竴娆′笉瑕佸鍏ヨ秴杩�"+IMPORT_DATA_LIMIT+"鏉$殑鏁版嵁");
 			}
-			//鍘嗗彶瀵煎叆鐨勬椂鍊欎笉澶勭悊缂栫爜
-			//----閫昏緫鍐呭----
-			//1. 鍒嗙被鐨勮矾寰勫彲浠ュ湪椤甸潰涓婇�夋嫨鏄垎绫荤紪鍙疯繕鏄垎绫荤殑鍚嶇О
-			//2. 鍒嗙被鐨勮矾寰勶紝蹇呴』鏄綋鍓嶅鍏ラ�夋嫨鐨勫垎绫荤殑鑺傜偣锛屼互鍙婂叾涓嬬骇鑺傜偣
-			//3. 閫氳繃鏁版嵁瑕佸鍏ョ殑鍒嗙被鍘绘煡鎵惧搴旂殑缂栫爜瑙勫垯
-			//4. 鏁版嵁瀛樺偍鍜屾壒閲忕敵璇蜂竴鏍凤紝
-			//5. 闇�瑕佸崟鐙鐞嗕紒涓氱紪鐮佺殑鍐呭锛�
-			//     5.1 浼佷笟缂栫爜鍦ㄥ綋鍓峞xcel閲屼笉鑳介噸澶�
-			//     5.2 浼佷笟缂栫爜鍦ㄧ郴缁熶腑涓嶈兘閲嶅锛堝彲浠ユ槸宸茬粡鍥炴敹鐨勶級
-			//     5.3 浼佷笟缂栫爜鐨勯暱搴︼紝鍜岀紪鐮佽鍒欑殑闀垮害瑕佸搴斾笂
-			//     5.4 鑾峰彇娴佹按鐮佹鐨勫�硷紝鍘婚櫎濉厖鐨勫瓧绗︼紝鐪嬫祦姘村彿鏄灏戯紝鐒跺悗灏嗘祦姘村彿鍜岀幇鍦ㄧ殑鏈�澶ф祦姘村彿鍒ゆ柇锛屽皬浜庡氨鐩存帴褰曞叆锛屽ぇ浜庡垯淇敼鏈�澶ф祦姘村彿
-			//     5.5 瀛樺偍浼佷笟缂栫爜鍒癮llcode涓�
 			//鏌ヨ鍒嗙被鍜屾ā鏉�
 			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
 
@@ -823,10 +1418,7 @@
 			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);
@@ -836,243 +1428,56 @@
 			pathMap.put("#current#",classifyFullInfo.getCurrentClassifyVO());
 
 			try {
+				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 VciBaseException(e.getMessage());
+				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 CopyOnWriteArrayList<>();
-			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,errorMap);
-			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-			if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
-				selfRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
-				});
-			}
-			if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
-				keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex, ""));
-				});
-			}
-			//4.鏍¢獙瑙勫垯
-			batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
-
-			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-			batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
-			if (CollectionUtils.isEmpty(ruleOidMap.values())) {
-				throw new VciBaseException("瀵煎叆鐨勬暟鎹墍閫夋嫨鐨勫垎绫婚兘娌℃湁璁剧疆缂栫爜瑙勫垯");
-			}
-			// TODO: 璇ョ敤oid鏌ヨ瑙勫垯鐨勶紝鍒敤id
-			Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-			//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
-			Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
-			checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
-			ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
-				List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
-				List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
-				//鎴戜滑闇�瑕佸厛鏌ヨ涓�涓嬶紝鍐呭鏄惁宸茬粡瀛樺湪
-				if(!CollectionUtils.isEmpty(thisCbos)){
-					List<String> existIds = new ArrayList<>();
-					VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
-						List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
-							.notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
-							.notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
-						);
-						existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
-							String id = s.getId();
-							if (StringUtils.isBlank(id)) {
-								id = s.getId();
-							}
-							return id;
-						}).collect(Collectors.toList()));
-					});
-					List<String> existIdCbos = thisCbos.stream().filter(s -> {
-						String id = s.getId();
-						if (StringUtils.isBlank(id)) {
-							id = s.getAttributeValue("id");
-						}
-						return 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 CopyOnWriteArrayList<>();
-					thisCbos.stream().forEach(clientBusinessObject -> {
-						BaseModel baseModel=new BaseModel();
-						BeanUtil.convert(clientBusinessObject,baseModel);
-						//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
-						dataCBOList.add(baseModel);
-						dataCBOIdList.add(baseModel);
-					});
-
-					if (!CollectionUtils.isEmpty(thisCbos)) {
-						try {
-							// TODO 澶氱嚎绋嬫祦闂
-							productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
-						} catch (Throwable e) {
-							log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
-							thisCbos.stream().forEach(cbo -> {
-								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:"+e.getMessage());
-							});
-
-						}
-					}
-				});
-				if (errorMap.size() > 0) {
-					isExport = true;
-				}
-				createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
-				engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
-			}
 		}
-		//long end = System.currentTimeMillis();
-		//log.info("=============for鎵ц鏃堕棿================="+String.valueOf((end-start)/1000));
 		String excelFileName="";
 		if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
 			excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
@@ -1091,14 +1496,13 @@
 		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){
 		clientBusinessObjects.stream().forEach(clientBusinessObject -> {
 			BaseModel baseModel=new BaseModel();
@@ -1262,7 +1666,6 @@
 
 	}
 
-
 	/***
 	 * 鎵归噺澶勭悊鐢宠鏁版嵁
 	 * @param orderDTO
@@ -1270,140 +1673,149 @@
 	 * @param dataSet
 	 * @return
 	 */
-	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
+	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType) throws Exception {
 		List<String> codeList=new ArrayList<>();
-		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
-		//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
-		CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
-		//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
-		engineService.checkSecValueOnOrder(ruleVO,orderDTO);
-		List<SheetRowData> rowDataList = dataSet.getRowData();
+		String uuid = "";
+		try {
+			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+			//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
+			CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
+			//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
+			engineService.checkSecValueOnOrder(ruleVO,orderDTO);
+			List<SheetRowData> rowDataList = dataSet.getRowData();
 
-		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
-		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
-			!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
-		).collect(Collectors.toList());
-		Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
-		List<String> titleRowData = dataSet.getColName();
-		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
-		getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
+			//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
+			List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
+				!DEFAULT_ATTR_LIST.contains(s.getId()) &&
+					((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,errorMap);
-		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
-			selfRepeatRowIndexList.stream().forEach(rowIndex->{
-				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
-			});
-		}
-		if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
-			keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-				errorMap.put(rowIndex,"鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex,""));
-			});
-		}
-		//鍒嗙被娉ㄥ叆
-		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
-		//boolean
-		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
-		//4.鏍¢獙瑙勫垯
-		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
-		if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
-			//5.鏍¢獙鏋氫妇鏄惁姝g‘
-			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-			//7.澶勭悊鍙傜収鐨勬儏鍐�
-			batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
-		}
-		//6.鏃堕棿鏍煎紡鐨勯獙璇�
-		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
-		//鏈�鍚庡紕缁勫悎瑙勫垯
-		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
-		String uuid=VciBaseUtil.getPk();
-		Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
-
-		if(errorMap.size()>0) {
-			createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
-		}
-		boolean isCreateUUid=false;
-		List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
-			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-			return !errorMap.containsKey(rowIndex);
-		}).collect(Collectors.toList());
-		//鐩镐技鏍¢獙
-		Map<String,String>resembleMap=new HashMap<>();
-		List<DataResembleVO> dataResembleVOS=new ArrayList<>();
-		String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
-		bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
-		if(resembleMap.size()>0) {
-			isCreateUUid=true;
-			if(!CollectionUtils.isEmpty(dataResembleVOS)) {
-				bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
-				createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+			//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
+			List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
+				&& StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
+			).collect(Collectors.toList());
+			if(!CollectionUtils.isEmpty(unExistAttrVOs)){
+				throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
 			}
-		}
-		//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
-		Map<String,String> newErrorMap=new HashMap<>();
-		newErrorMap.putAll(resembleMap);
-		newErrorMap.putAll(errorMap);
-		needSaveCboList = cboList.stream().filter(cbo -> {
-			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-			return !newErrorMap.containsKey(rowIndex);
-		}).collect(Collectors.toList());
-		if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
-			isCreateUUid=true;
-		}
-		createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
-		if(newErrorMap.size()>0) {
-			createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
-		}else {
-			uuid="";
+			List<ClientBusinessObject> cboList = new ArrayList<>();
+			String fullPath = getFullPath(classifyFullInfo);
+			excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
 
-			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+			//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
+			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+			//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
+			batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
+			//3.鍒ゆ柇鍏抽敭灞炴��
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO,cboList,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(keyAttrRepeatRowIndexList)){
+				keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
+					errorMap.put(rowIndex,"鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex,""));
+				});
+			}
+			//鍒嗙被娉ㄥ叆
+			batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
+			//boolean
+			reSwitchBooleanAttrOnOrder(attrVOS,cboList);
+			//4.鏍¢獙瑙勫垯
+			batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
+			if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
+				//5.鏍¢獙鏋氫妇鏄惁姝g‘
+				batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+				//7.澶勭悊鍙傜収鐨勬儏鍐�
+				batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
+			}
+			//6.鏃堕棿鏍煎紡鐨勯獙璇�
+			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+			batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
+			//鏈�鍚庡紕缁勫悎瑙勫垯
+			batchSwitchComponentAttrOnOrder(attrVOS,cboList);
+			uuid=VciBaseUtil.getPk();
+			Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+
+			if(errorMap.size()>0) {
+				createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
+			}
+			boolean isCreateUUid=false;
+			List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
+				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+				return !errorMap.containsKey(rowIndex);
+			}).collect(Collectors.toList());
+			//鐩镐技鏍¢獙
+			Map<String,String>resembleMap=new HashMap<>();
+			List<DataResembleVO> dataResembleVOS=new ArrayList<>();
+			String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
+			bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
+			if(resembleMap.size()>0) {
+				isCreateUUid=true;
+				if(!CollectionUtils.isEmpty(dataResembleVOS)) {
+					bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
+					createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+				}
+			}
+			//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
+			Map<String,String> newErrorMap=new HashMap<>();
+			newErrorMap.putAll(resembleMap);
+			newErrorMap.putAll(errorMap);
 			needSaveCboList = cboList.stream().filter(cbo -> {
 				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 				return !newErrorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
+			if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
+				isCreateUUid=true;
+			}
+			createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
+			if(newErrorMap.size()>0) {
+				createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
+			}else {
+				uuid="";
+				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;
 	}
@@ -1524,21 +1936,23 @@
 			" 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()){
 			//浠庡灏戦〉鍒板灏戦〉鐨勬煡璇㈡柟寮忥紝
+			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{
 			total = commonsMapper.queryCountBySql(countSql);
@@ -1576,10 +1990,10 @@
 			}
 			Map<String, String> finalConditionMap = conditionMap;
 			//骞惰鏌ヨ鐪嬬湅
-			SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+			//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.setSort(exportAttrDTO.getSort());
@@ -1736,7 +2150,8 @@
 			CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
 			//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
 			List<CodeClassifyTemplateAttrVO> attrVOS = codeClassifyTemplateVO.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());
 			String fullPath = getFullPath(classifyFullInfo);
 			excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList, codeClassifyTemplateVO,cboList,fullPath,!isImprot);
@@ -1785,7 +2200,7 @@
 			//鏈�鍚庡紕缁勫悎瑙勫垯
 			batchSwitchComponentAttrOnOrder(attrVOS,cboList);
 			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, codeClassifyTemplateVO, cboList,errorMap);
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, codeClassifyTemplateVO, cboList,false,errorMap);
 			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
 			if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
@@ -1803,7 +2218,9 @@
 				}).collect(Collectors.toList());
 				List<ClientBusinessObject> finalNeedSaveCboList = needSaveCboList;
 				Map<String, CodeRuleVO> finalRuleVOMap = ruleVOMap;
-				ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
+				// 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());
@@ -1814,7 +2231,7 @@
 							dataCBOList.add(baseModel);
 						});
 						try {
-							productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, finalRuleVOMap.get(ruleOid), null, dataCBOList);
+							productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, finalRuleVOMap.get(ruleOid), null, dataCBOList, user);
 						} catch (Throwable e) {
 							//success=false;
 							log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
@@ -1827,6 +2244,7 @@
 					engineService.batchSaveSelectChar(codeClassifyTemplateVO, dataCBOList);
 				});
 			}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);
@@ -1840,7 +2258,7 @@
 						dataCBOList.add(baseModel);
 					});
 					try {
-						productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList);
+						productCodeService.productCodeAndSaveData(classifyFullInfo, codeClassifyTemplateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList,user);
 					} catch (Exception e) {
 						log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
 						needSaveCboList.stream().forEach(cbo -> {
@@ -1938,8 +2356,10 @@
 
 		//鏍¢獙妯℃澘鏄笉鏄渶鏂扮殑
 		//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();
@@ -1991,9 +2411,10 @@
 		//鏈�鍚庡紕缁勫悎瑙勫垯
 		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
 		//3.鍒ゆ柇鍏抽敭灞炴��
-		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
+		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,false,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->{
@@ -2023,7 +2444,11 @@
                 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,""));
 			});
 		}
 		//鏍¢獙灞炴�ф槸鍚︽纭敊璇俊鎭�
@@ -2068,56 +2493,60 @@
 				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);
 						}
 						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)){
-									errorid="1";
-									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);
+								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{
-								resultDataObjectDetailDO.setCode(code);
+								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);//淇濆瓨鏁版嵁
 				}
@@ -2139,6 +2568,7 @@
 
 			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);
@@ -2148,7 +2578,7 @@
 			});
 			try {
 				List<String>applyGroupCodeIdList=new ArrayList<>();
-				productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList);
+				productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList,user);
 				//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
 				engineService.batchSaveSelectChar(templateVO, dataCBOList);
 				// if(!isProcess){
@@ -2176,7 +2606,6 @@
 						resultDataObjectDetailDO.setErrorid("0");
 					}
 					resultDataObjectDetailDO.setId(sourceOid);
-
 					resultDataObjectDetailDO.setMsg(msg);
 					resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
 					//澶勭悊浼犻�佺殑鏁版嵁涓叧閿睘鎬ч噸澶嶇殑锛岀洿鎺ユ嬁鍒板凡缁忕敵璇峰埌缂栫爜鐨勬暟鎹紪鐮佺洿鎺ュ皢璧嬬粰鍏抽敭灞炴�ч噸澶嶇殑鏁版嵁
@@ -2300,7 +2729,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();
@@ -2352,6 +2782,7 @@
 		}
 
 		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<>();
@@ -2659,7 +3090,7 @@
 				return;
 			}
 			//final String[] sql = {"select count(*) from " + tableName + " t where 1 = 1 "};
-			final String[] sql = {"select id from " + tableName + " t where 1 = 1 "};
+			final String[] sql = {"select t.id from " + tableName + " t where 1 = 1 "};
 			conditionMap.forEach((key, value) -> {
 				if(StringUtils.isBlank(value)||value.equals(QueryOptionConstant.ISNULL)){
 					sql[0] += " and " + key + " is null ";
@@ -2777,10 +3208,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());
 				}
 
 			}
@@ -3003,6 +3434,7 @@
 			}
 		});
 	}
+
 	/**
 	 * excel杞崲涓篶bo鐨勫璞�
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
@@ -3150,7 +3582,7 @@
 						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 						cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
 					}
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}else{
 					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
 					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
@@ -3208,7 +3640,7 @@
 						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 						cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
 					}
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}else{
 					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
 					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
@@ -3221,6 +3653,106 @@
 			cboList.add(cbo);
 		});
 
+	}
+
+	/**
+	 * 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);
 	}
 
 	/**
@@ -3428,7 +3960,8 @@
 						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);
+							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))));
 							}
@@ -3745,7 +4278,7 @@
 			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);
+					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鏍¢獙瑙勫垯蹇呭~椤逛笉閫氳繃锛屽鏋滄湁蹇呭~灞炴�т负绌猴紝鍒欏~銆�/銆戜唬鏇�,鏈夋牎楠岀殑灞炴�т负" + checkAttr);
 				});
 			}
 		}
@@ -3760,7 +4293,7 @@
 	private void batchSwitchClassifyAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,
 												CodeClassifyFullInfoBO classifyFullInfo,boolean isImPort) {
 		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(
-			s -> StringUtils.isNotBlank(s.getClassifyInvokeAttr()) && StringUtils.isNotBlank(s.getClassifyInvokeAttr())
+			s -> StringUtils.isNotBlank(s.getClassifyInvokeAttr())
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 		Map<String,CodeClassifyFullInfoBO> classifyFullInfoMap=new HashMap<>();
 		classifyFullInfoMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(),classifyFullInfo);
@@ -3797,6 +4330,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) {
@@ -3813,7 +4347,7 @@
 	 * @param cboList 鎵归噺鐨勬暟鎹�
 	 */
 	private CodeImportResultVO batchCheckKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO,
-														List<ClientBusinessObject> cboList,Map<String,String> errorMap) {
+														List<ClientBusinessObject> cboList,boolean isEdit,Map<String,String> errorMap) {
 		//涓嶮dmEngineServiceImpl閲岀殑checkKeyAttrOnOrder鐩镐技
 		//鍏堣幏鍙栧叧閿睘鎬х殑瑙勫垯锛屼篃鍒╃敤缁ф壙鐨勬柟寮�
 		CodeKeyAttrRepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
@@ -3843,7 +4377,10 @@
 		Map<String,List<BaseModel>> indexTODataMap=new ConcurrentHashMap<>();
 		// 鏌ヨ涓嶉渶瑕佸弬涓庡叧閿睘鎬ф牎楠岀殑闄よ嚜宸变互澶栫殑鎵�鏈夊垎绫籵id
 		final String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
-		List<ClientBusinessObject> repeatDataMap = cboList.parallelStream().filter(cbo -> {
+		final BladeUser user = AuthUtil.getUser();
+		cboList = new CopyOnWriteArrayList<>(cboList);
+		// TODO:Thread limit exceeded replacing blocked 寮傚父鏄繖閮ㄥ垎浠g爜鎶涘嚭鐨�,鎵�浠ユ殏鏃跺皢parallelStream鏀规垚浜唖tream
+		List<ClientBusinessObject> repeatDataMap = cboList.stream().filter(cbo -> {
 			//姣忚閮藉緱鏌ヨ.濡傛灉鍏朵腑鍑虹幇浜嗛敊璇紝鎴戜滑灏辩洿鎺ユ姏鍑哄紓甯革紝鍏朵綑鐨勬樉绀�
 			//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
 			Map<String, String> conditionMap = new HashMap<>();
@@ -3860,15 +4397,23 @@
 				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);
+						DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel,false,user);
+						baseModel.setData(stringStringMap);
 						newCboList.add(baseModel);
 					});
 					// 娣诲姞閿欒鍊�
@@ -3989,6 +4534,9 @@
 				childOidPathMap.put(childPath.getOid(),thisClassifyPath);
 			});
 		}
+		String path=classifyFullInfo.getCurrentClassifyVO().getId();
+		//鏍规嵁瀹㈡埛閫夋嫨鐨勫垎绫昏矾寰勬湭id锛岃繕鏄痭ame纭畾璺緞鎷兼帴
+		childOidPathMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(),fullPath);
 		return childOidPathMap;
 	}
 
@@ -4086,12 +4634,13 @@
 			}
 		}
 	}
-
 	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);
+			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());
@@ -4186,7 +4735,8 @@
 	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<>();
@@ -4381,6 +4931,7 @@
 					pageHelper.addDefaultDesc("id");
 					CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(btmtypeid, templateVO, conditionMap, pageHelper);
 					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;
@@ -4538,4 +5089,503 @@
 		}
 	}
 
+	/***
+	 * @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
+	 */
+	@Transactional(rollbackFor = VciBaseException.class)
+	@Override
+	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 HashMap<>();
+		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, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
+			});
+		}
+		if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
+			keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
+				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();
+				if(StringUtils.isNotBlank(dockingPreAttrMappingVO.getTargetAttrId())){
+					codeAndGroupCodeAttrMappingDTO.setDefaultValue(dockingPreAttrMappingVO.getDefaultValue());
+					codeAndGroupCodeAttrMappingDTO.setMetaListId(dockingPreAttrMappingVO.getMetaListId());
+					codeAndGroupCodeAttrMappingDTO.setSourceAttrKey(dockingPreAttrMappingVO.getSourceAttrKey());
+					codeAndGroupCodeAttrMappingDTO.setSourceAttrName(dockingPreAttrMappingVO.getSourceAttrName());
+					codeAndGroupCodeAttrMappingDTO.setTargetAttrId(dockingPreAttrMappingVO.getTargetAttrId());
+					codeAndGroupCodeAttrMappingDTO.setTargetAttrKey(dockingPreAttrMappingVO.getTargetAttrKey());
+					codeAndGroupCodeAttrMappingDTO.setTargetAttrName(dockingPreAttrMappingVO.getTargetAttrName());
+					fieldList.add(dockingPreAttrMappingVO.getTargetAttrKey());
+					colNameList.add(dockingPreAttrMappingVO.getSourceAttrName());
+				}
+				codeAttrMapGroupAttrDTOS.add(codeAndGroupCodeAttrMappingDTO);
+			});
+			execGroupCodePortDataDTO.setCodeAttrMapGroupAttrDTOS(codeAttrMapGroupAttrDTOS);
+			execGroupCodePortDataDTO.setFieldList(fieldList);
+			execGroupCodePortDataDTO.setColName(colNameList);
+		}
+	}
+
+	/***
+	 * 闆嗗洟鐮佸睘鎬ц浆鎹�
+	 * @param 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