From 25ef4e85586c27433c865b69c67ccf5a380b93a7 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期二, 05 十二月 2023 13:52:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java | 1445 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 1,067 insertions(+), 378 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 87cfaee..0090df0 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,15 +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.entity.DockingPreAttrMapping;
 import com.vci.ubcs.code.applyjtcodeservice.feign.IMdmInterJtClient;
+import com.vci.ubcs.code.applyjtcodeservice.vo.DockingPreAttrMappingVO;
 import com.vci.ubcs.code.bo.AttributeValue;
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
-import com.vci.ubcs.code.dto.CodeExportAttrDTO;
-import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.constant.MdmEngineConstant;
+import com.vci.ubcs.code.dto.*;
 import com.vci.ubcs.code.entity.CodeAllCode;
 import com.vci.ubcs.code.enumpack.CodeDefaultLC;
 import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
@@ -37,6 +41,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 +51,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;
@@ -54,8 +60,10 @@
 import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.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,15 +71,24 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
 import java.io.File;
 import java.io.IOException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
 import java.text.MessageFormat;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
@@ -175,11 +192,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涓�
@@ -360,7 +382,7 @@
 		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
 
 		//鑾峰彇鐮佹瀹藉害
-		//String secWidth = getCodeSegmentWidth(codeClassifyVO.getOid());
+		String secWidth = getCodeSegmentWidth(codeClassifyVO.getOid());
 
 		if(isHistory){
 			templateVOList= templateService.childTemplates(codeClassifyOid);
@@ -475,6 +497,123 @@
 	}
 
 	/**
+	 * 鐢熸垚鎵归噺淇敼瀵煎叆鐨勬枃浠�
+	 *
+	 * @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
@@ -538,7 +677,7 @@
 	 * @return  鏈夐敊璇俊鎭殑excel鐨勬枃浠�
 	 */
 	@Override
-	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) {
+	public CodeImProtRusultVO batchImportCode(CodeOrderDTO orderDTO, File file) throws Exception {
 		VciBaseUtil.alertNotNull(orderDTO,"缂栫爜鐢宠鐩稿叧鐨勬暟鎹�",orderDTO.getCodeClassifyOid(),"涓婚搴撳垎绫讳富閿�");
 		ReadExcelOption reo = new ReadExcelOption();
 		reo.setReadAllSheet(true);
@@ -810,19 +949,355 @@
 	 */
 	@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,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;
+					ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
+						//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+						List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
+						List<ClientBusinessObject> thisCbos = finalNeedSaveCboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+						List<BaseModel> dataCBOList=new CopyOnWriteArrayList<>();
+						thisCbos.stream().forEach(clientBusinessObject -> {
+							BaseModel baseModel=new BaseModel();
+							BeanUtil.convert(clientBusinessObject,baseModel);
+							//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
+							dataCBOList.add(baseModel);
+							dataCBOIdList.add(baseModel);
+						});
+
+						if (!CollectionUtils.isEmpty(thisCbos)) {
+							try {
+								// TODO 澶氱嚎绋嬫祦闂
+								productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
+								importCount.add(dataCBOList.size());
+							} catch (Throwable e) {
+								log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
+								thisCbos.stream().forEach(cbo -> {
+									String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+									errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡:"+e.getMessage());
+								});
+							}
+						}
+					});
+					if (errorMap.size() > 0) {
+						isExport = true;
+					}
+					createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
+					engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
+				}
+			}
+			//long end = System.currentTimeMillis();
+			//log.info("=============for鎵ц鏃堕棿================="+String.valueOf((end-start)/1000));
+			String excelFileName="";
+			if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
+				excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
+				WriteExcelOption eo = new WriteExcelOption();
+				shetNameMap.forEach((shetName, errorDataList) -> {
+					eo.addSheetDataList(shetName, errorDataList);
+				});
+				try {
+					new File(excelFileName).createNewFile();
+				} catch (IOException e) {
+					throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
+				}
+				ExcelUtil.writeDataToFile(excelFileName, eo);
+			}
+			CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
+			if(StringUtils.isNotBlank(excelFileName)) {
+				codeImProtRusultVO.setFilePath(excelFileName);
+				codeImProtRusultVO.setFileOid("");
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true, StringUtil.format("閿欒淇℃伅锛歿}",JSON.toJSONString(shetNameMap)));
+			}else{
+				saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",false, StringUtil.format("瀵煎叆鍒板垎绫粄}涓紝瀵煎叆鎴愬姛鎬绘暟涓猴細{}", JSON.toJSONString(classifyFullInfo),importCount.get(0)));
+			}
+			if(isCreateUUid){
+				codeImProtRusultVO.setRedisUuid(uuid);
+			}
+			return codeImProtRusultVO;
+		}catch (Exception e){
+			saveLogUtil.operateLog("鍘嗗彶鏁版嵁瀵煎叆",true,e.toString());
+			throw e;
+		}
+	}
+
+	/**
+	 * 瀵煎叆鎵归噺缂栬緫鏁版嵁
+	 *
+	 * @param codeClassifyOid 鍒嗙被鐨勪富閿�
+	 * @param classifyAttr 鍒嗙被璺緞浣跨敤鐨勫睘鎬�
+	 * @param file            excel鏂囦欢鐨勪俊鎭�
+	 * @return 鏈夐敊璇俊鎭殑excel
+	 */
+	@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) {
@@ -832,18 +1307,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);
 
@@ -852,10 +1315,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);
@@ -865,243 +1325,66 @@
 			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());
 			}
 
+			CodeClassifyTemplateVO finalTemplateVO = templateVO;
+
 			List<SheetRowData> needowDataList = rowDataList.stream().filter(cbo -> {
 				String rowIndex = cbo.getRowIndex();
 				return !errorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
-
-			//checkTemplateSync(sheetDataSetList, templateVO,i);
 			//杩欓噷涓嶉櫎鍘婚粯璁ょ殑灞炴��
 			List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes();
 			Map<Integer/**鍒楀彿**/, String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
 
 			Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
-			String idFieldName = attrVOS.stream().filter(s -> VciQueryWrapperForDO.ID_FIELD.equalsIgnoreCase(s.getId())).findFirst().orElseGet(() -> new CodeClassifyTemplateAttrVO()).getName();
+			fieldIndexMap.put(0,"id");
 			getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
 			//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
-			List<ClientBusinessObject> cboList = new ArrayList<>();
-			String fullPath = getFullPath(classifyFullInfo);
-			//鎴戜滑闇�瑕佽幏鍙栧埌鎵�鏈夌殑涓嬬骇鍒嗙被鐨刼id鐨勮矾寰勶紝鍥犱负鍚庨潰闇�瑕�
-			Map<String/**涓婚敭**/, String/**璺緞**/> childOidPathMap = getChildClassifyPathMap(classifyFullInfo, fullPath);
-			excelToCbo(classifyFullInfo, fieldIndexMap, needowDataList, templateVO, cboList, fullPath, false);
-
-
-			Map<String/**涓婚敭**/, CodeClassifyVO> classifyVOMap = Optional.ofNullable(childClassifyVOs).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-			classifyVOMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO());
-			pathMap.put("#current#", classifyFullInfo.getCurrentClassifyVO());
-
-			//鍒ゆ柇缂栧彿鍦╡xcel閲屾湰韬氨閲嶅鐨�
-			Map<String, Long> idCountMap = cboList.stream().collect(Collectors.groupingBy(ClientBusinessObject::getId, Collectors.counting()));
-			List<String> repeatIdList = new ArrayList<>();
-			idCountMap.forEach((id, count) -> {
-				if (count > 1) {
-					repeatIdList.add(id);
+			CodeOrderDTO orderDTO = new CodeOrderDTO();
+			for (SheetRowData sheetRowData : needowDataList) {
+				//鏌ヨ鏁版嵁
+				Map<String, String> conditionMap = new HashMap<>();
+				conditionMap.put("t.id", sheetRowData.getData().get(0));
+				conditionMap.put("t.lastv", "1");
+				CodeTemplateAttrSqlBO sqlBO = mdmEngineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), templateVO, conditionMap, new PageHelper(-1));
+				//鎴戜滑浣跨敤鍜屼笟鍔$被鍨嬬殑鏉ユ煡璇�
+				List<Map> cbosB = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
+				if(cbosB.size() == 0){
+					throw  new ServiceException("缂栫爜锛�"+ sheetRowData.getData().get(0) + ",鏈兘鏌ヨ鍒扮浉鍏虫暟鎹��");
 				}
-			});
-			if (!CollectionUtils.isEmpty(repeatIdList)) {
-				cboList.stream().filter(s -> repeatIdList.contains(s.getId())).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).forEach(rowIndex -> {
-					errorMap.put(rowIndex, "缂栧彿鍦ㄥ綋鍓峞xcel涓噸澶�;");
-				});
-			}
-			//鎴戜滑闇�瑕佸垽鏂繖浜涘垎绫荤殑妯℃澘鏄笉鏄竴鏍风殑锛屽彧闇�瑕佹牎楠岋紝涓嶇敤鑾峰彇
-			//妫�鏌ュ垎绫荤殑璺緞
-			checkClassifyPathInHistory(cboList, errorMap, pathMap, childOidPathMap);
-
-			//妫�鏌ヨ鍒�
-			Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
-			List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
-			checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
-			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
-
-			//鎴戜滑鏍规嵁鍑洪敊鐨勫垎绫荤殑涓婚敭锛屽幓鎵捐鍙�
-			if (!CollectionUtils.isEmpty(unExistRuleClassifyOidList)) {
-				cboList.stream().forEach(cbo -> {
-					if (unExistRuleClassifyOidList.contains(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
-						String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-						errorMap.put(row_index, errorMap.getOrDefault(row_index, "") + ";鏍规嵁鍒嗙被璺緞瀵瑰簲鐨勫垎绫伙紝娌℃湁璁剧疆缂栫爜瑙勫垯");
-					}
-				});
-			}
-
-			//鍒ゆ柇蹇呰緭椤�
-			batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
-
-			//浼樺厛鏍¢獙缂栫爜鏄惁瀛樺湪
-			batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
-
-			//boolean
-			reSwitchBooleanAttrOnOrder(attrVOS, cboList);
-
-			// 鏋氫妇鐨勫唴瀹归渶瑕佹牴鎹悕绉拌浆鎹负鏋氫妇鐨勫��
-			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-
-			batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
-
-			//6.澶勭悊鍒嗙被娉ㄥ叆
-			batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo,true);
-
-			//璁剧疆榛樿鍊�
-			batchSwitchAttrDefault(attrVOS, cboList);
-
-			//7.澶勭悊缁勫悎瑙勫垯
-			batchSwitchComponentAttrOnOrder(attrVOS, cboList);
-
-			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,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);
+					List<Map> newCbos = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
+					//瀵圭爜鍊艰〃杩涜澶勭悊鏇挎崲鍒涘缓鏁版嵁鐨刼id
+					QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
+					wrapper.eq("CREATECODEOID",orderDTO.getCopyFromVersion());
+					List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
+					codeAllCodes.get(0).setCreateCodeOid(newCbos.get(0).get("OID").toString());
+					codeAllCodes.get(0).setLastModifyTime(new Date());
+					codeAllCodes.get(0).setTs(new Date());
+					codeAllCodes.get(0).setLastModifier(AuthUtil.getUser().getUserName());
+					codeAllCodeService.updateBatchById(codeAllCodes);
+				} 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";
@@ -1120,14 +1403,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();
@@ -1291,7 +1573,6 @@
 
 	}
 
-
 	/***
 	 * 鎵归噺澶勭悊鐢宠鏁版嵁
 	 * @param orderDTO
@@ -1299,140 +1580,148 @@
 	 * @param dataSet
 	 * @return
 	 */
-	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
+	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType) throws Exception {
 		List<String> codeList=new ArrayList<>();
-		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
-		//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
-		CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
-		//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
-		engineService.checkSecValueOnOrder(ruleVO,orderDTO);
-		List<SheetRowData> rowDataList = dataSet.getRowData();
+		String uuid = "";
+		try {
+			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+			//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
+			CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
+			//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
+			engineService.checkSecValueOnOrder(ruleVO,orderDTO);
+			List<SheetRowData> rowDataList = dataSet.getRowData();
 
-		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
-		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
-			!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
-		).collect(Collectors.toList());
-		Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
-		List<String> titleRowData = dataSet.getColName();
-		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
-		getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
+			//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
+			List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
+				!DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
+			).collect(Collectors.toList());
+			Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap = new HashMap<>();
+			List<String> titleRowData = dataSet.getColName();
+			Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
+			getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
 
-		//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
-		List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
-			&& StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
-		).collect(Collectors.toList());
-		if(!CollectionUtils.isEmpty(unExistAttrVOs)){
-			throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
-		}
-		List<ClientBusinessObject> cboList = new ArrayList<>();
-		String fullPath = getFullPath(classifyFullInfo);
-		excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
-
-		//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
-		//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
-		//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
-		batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
-		//3.鍒ゆ柇鍏抽敭灞炴��
-		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
-		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
-			selfRepeatRowIndexList.stream().forEach(rowIndex->{
-				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
-			});
-		}
-		if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
-			keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-				errorMap.put(rowIndex,"鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex,""));
-			});
-		}
-		//鍒嗙被娉ㄥ叆
-		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
-		//boolean
-		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
-		//4.鏍¢獙瑙勫垯
-		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
-		if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
-			//5.鏍¢獙鏋氫妇鏄惁姝g‘
-			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-			//7.澶勭悊鍙傜収鐨勬儏鍐�
-			batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
-		}
-		//6.鏃堕棿鏍煎紡鐨勯獙璇�
-		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
-		//鏈�鍚庡紕缁勫悎瑙勫垯
-		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
-		String uuid=VciBaseUtil.getPk();
-		Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
-
-		if(errorMap.size()>0) {
-			createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
-		}
-		boolean isCreateUUid=false;
-		List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
-			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-			return !errorMap.containsKey(rowIndex);
-		}).collect(Collectors.toList());
-		//鐩镐技鏍¢獙
-		Map<String,String>resembleMap=new HashMap<>();
-		List<DataResembleVO> dataResembleVOS=new ArrayList<>();
-		String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
-		bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
-		if(resembleMap.size()>0) {
-			isCreateUUid=true;
-			if(!CollectionUtils.isEmpty(dataResembleVOS)) {
-				bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
-				createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+			//闇�瑕佸垽鏂槸鍚︽墍鏈夌殑灞炴�ч兘鍦ㄦā鏉夸笂浜�
+			List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
+				&& StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
+			).collect(Collectors.toList());
+			if(!CollectionUtils.isEmpty(unExistAttrVOs)){
+				throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
 			}
-		}
-		//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
-		Map<String,String> newErrorMap=new HashMap<>();
-		newErrorMap.putAll(resembleMap);
-		newErrorMap.putAll(errorMap);
-		needSaveCboList = cboList.stream().filter(cbo -> {
-			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-			return !newErrorMap.containsKey(rowIndex);
-		}).collect(Collectors.toList());
-		if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
-			isCreateUUid=true;
-		}
-		createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
-		if(newErrorMap.size()>0) {
-			createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
-		}else {
-			uuid="";
+			List<ClientBusinessObject> cboList = new ArrayList<>();
+			String fullPath = getFullPath(classifyFullInfo);
+			excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
 
-			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+			//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
+			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+			//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
+			batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
+			//3.鍒ゆ柇鍏抽敭灞炴��
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorMap);
+			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
+			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+			if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
+				selfRepeatRowIndexList.stream().forEach(rowIndex->{
+					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
+				});
+			}
+			if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
+				keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
+					errorMap.put(rowIndex,"鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex,""));
+				});
+			}
+			//鍒嗙被娉ㄥ叆
+			batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
+			//boolean
+			reSwitchBooleanAttrOnOrder(attrVOS,cboList);
+			//4.鏍¢獙瑙勫垯
+			batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
+			if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
+				//5.鏍¢獙鏋氫妇鏄惁姝g‘
+				batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+				//7.澶勭悊鍙傜収鐨勬儏鍐�
+				batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
+			}
+			//6.鏃堕棿鏍煎紡鐨勯獙璇�
+			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+			batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
+			//鏈�鍚庡紕缁勫悎瑙勫垯
+			batchSwitchComponentAttrOnOrder(attrVOS,cboList);
+			uuid=VciBaseUtil.getPk();
+			Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+
+			if(errorMap.size()>0) {
+				createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
+			}
+			boolean isCreateUUid=false;
+			List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
+				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+				return !errorMap.containsKey(rowIndex);
+			}).collect(Collectors.toList());
+			//鐩镐技鏍¢獙
+			Map<String,String>resembleMap=new HashMap<>();
+			List<DataResembleVO> dataResembleVOS=new ArrayList<>();
+			String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmTypeId();
+			bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
+			if(resembleMap.size()>0) {
+				isCreateUUid=true;
+				if(!CollectionUtils.isEmpty(dataResembleVOS)) {
+					bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
+					createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+				}
+			}
+			//鎺掗櫎閿欒鐨勶紝鍓╀笅姝g‘鐨�
+			Map<String,String> newErrorMap=new HashMap<>();
+			newErrorMap.putAll(resembleMap);
+			newErrorMap.putAll(errorMap);
 			needSaveCboList = cboList.stream().filter(cbo -> {
 				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 				return !newErrorMap.containsKey(rowIndex);
 			}).collect(Collectors.toList());
+			if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
+				isCreateUUid=true;
+			}
+			createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
+			if(newErrorMap.size()>0) {
+				createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
+			}else {
+				uuid="";
 
-			if (!CollectionUtils.isEmpty(needSaveCboList)) {
-				//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
-				//鐢熸垚缂栫爜鐨勫唴瀹�
-				List<String> dataCBOIdList=new ArrayList<>();
-				List<BaseModel> dataCBOList=new ArrayList<>();
-				cboList.stream().forEach(clientBusinessObject -> {
-					BaseModel baseModel=new BaseModel();
-					BeanUtil.convert(clientBusinessObject,baseModel);
-					//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
-					dataCBOList.add(baseModel);
-					dataCBOIdList.add(baseModel.getOid());
-				});
-				try {
-					codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
-					//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
-					engineService.batchSaveSelectChar(templateVO, dataCBOList);
-				} catch (Exception e) {
-					e.printStackTrace();
-					log.error("鎵逛簡鐢宠鏃跺け璐�");
+				//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+				needSaveCboList = cboList.stream().filter(cbo -> {
+					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					return !newErrorMap.containsKey(rowIndex);
+				}).collect(Collectors.toList());
+
+				if (!CollectionUtils.isEmpty(needSaveCboList)) {
+					//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
+					//鐢熸垚缂栫爜鐨勫唴瀹�
+					List<String> dataCBOIdList=new ArrayList<>();
+					List<BaseModel> dataCBOList=new ArrayList<>();
+					cboList.stream().forEach(clientBusinessObject -> {
+						BaseModel baseModel=new BaseModel();
+						BeanUtil.convert(clientBusinessObject,baseModel);
+						//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
+						dataCBOList.add(baseModel);
+						dataCBOIdList.add(baseModel.getOid());
+					});
+					try {
+						codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
+						//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
+						engineService.batchSaveSelectChar(templateVO, dataCBOList);
+					} catch (Exception e) {
+						e.printStackTrace();
+						log.error("鎵归噺鐢宠鏃跺け璐�");
+						throw e;
+					}
 				}
 			}
-		}
-		if(!isCreateUUid){
-			return uuid="";
+			if(!isCreateUUid){
+				return uuid="";
+			}
+			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜",false, StringUtil.format("鎵归噺瀵煎叆鐢宠鎴愬姛鍏眥}鏉℃暟鎹紝鐢熸垚鐨勭爜鍊煎涓嬨�恵}銆�",codeList.size(),codeList));
+		}catch (Exception e){
+			saveLogUtil.operateLog("鎵归噺鐢宠缂栫爜",true,e.toString());
+			throw e;
 		}
 		return uuid;
 	}
@@ -1549,10 +1838,10 @@
 			tableName = VciBaseUtil.getTableName(btmTypeId);
 		}
 
-		String countSql = "select count(*) from " + tableName +" where 1=1" +
+		String countSql = "select count(*) from (select * FROM " + tableName +" where 1=1" +
 			" and lastr = '1'" +
 			" and lastv='1'" +
-			" and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%'";
+			" and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%' {}";
 
 		//鍏堟煡璇㈡�绘暟
 		int total = 0;
@@ -1566,8 +1855,7 @@
 				thisPage.setSort(exportAttrDTO.getSort());
 				thisPage.setOrder(exportAttrDTO.getOrder());
 				thisPage.addDefaultDesc("createTime");
-
-				total += commonsMapper.queryCountBySql(countSql);
+				total += commonsMapper.queryCountBySql(StringUtil.format(countSql," limit " + exportAttrDTO.getLimit() +" offset "+ i +")subquery;"));
 			}
 		}else{
 			total = commonsMapper.queryCountBySql(countSql);
@@ -1605,10 +1893,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());
@@ -3263,6 +3551,106 @@
 	}
 
 	/**
+	 * 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,value);
+			});
+
+		try {
+//			for (Map map : cbos) {
+//			Object obj = CodeOrderDTO.class.newInstance();
+			BeanInfo beanInfo = Introspector.getBeanInfo(orderDTO.getClass());
+			PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+			for (PropertyDescriptor property : propertyDescriptors) {
+				Method setter = property.getWriteMethod();
+				if (setter != null) {
+					//oracle鐨勬椂闂翠负TIMESTAMP鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚data锛屽惁鍒欏皢鎶ラ敊
+					if (map.get(property.getName().toUpperCase()) instanceof TIMESTAMP) {
+						LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
+						ZoneId zoneId = ZoneId.systemDefault();
+						ZonedDateTime zdt = localDateTime.atZone(zoneId);
+						Date date = Date.from(zdt.toInstant());
+						setter.invoke(orderDTO, date);
+						map.remove(property.getName().toUpperCase());
+					} //oracle鐨勬暟瀛椾负BigDecimal鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚Integer锛屽惁鍒欏皢鎶ラ敊
+					else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
+						&& ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())) {
+						setter.invoke(orderDTO, ((BigDecimal) map.get(property.getName().toUpperCase())).intValue());
+						map.remove(property.getName().toUpperCase());
+					} else if (map.containsKey(property.getName().toUpperCase())) {
+						if(setter.getParameterTypes()[0].getSimpleName().equals("String")){
+							setter.invoke(orderDTO, map.get(property.getName().toUpperCase()) == null ? null:String.valueOf(map.get(property.getName().toUpperCase())));
+						}else{
+							setter.invoke(orderDTO, map.get(property.getName().toUpperCase()));
+						}
+						map.remove(property.getName().toUpperCase());
+					}
+				}
+			}
+			for (Object key : map.keySet()) {
+				map.put(key, map.get(key) == null ? null : String.valueOf(map.get(key)));
+			}
+		} catch (Exception e) {
+			throw new VciBaseException("鏌ヨ澶辫触锛�" + e.getMessage());
+		}
+
+
+
+//		Iterator<Map.Entry<String, String>> iterator = cbos.entrySet().iterator();
+//
+//		Map.Entry<String, String> entry;
+//		while (iterator.hasNext()) {
+//			entry = iterator.next();
+////			if (WebUtil.isDefaultField(entry.getKey())) {
+//				Object obj = BaseModel.class.newInstance();
+//				BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
+//				PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+//				for (PropertyDescriptor property : propertyDescriptors) {
+//					Method setter = property.getWriteMethod();
+//					if (setter != null) {
+//						//oracle鐨勬椂闂翠负TIMESTAMP鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚data锛屽惁鍒欏皢鎶ラ敊
+//						if (map.get(property.getName().toUpperCase()) instanceof TIMESTAMP) {
+//							LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
+//							ZoneId zoneId = ZoneId.systemDefault();
+//							ZonedDateTime zdt = localDateTime.atZone(zoneId);
+//							Date date = Date.from(zdt.toInstant());
+//							setter.invoke(obj, date);
+//							map.remove(property.getName().toUpperCase());
+//						} //oracle鐨勬暟瀛椾负BigDecimal鐨勶紝闇�瑕佽繘琛岃浆鎹㈡垚Integer锛屽惁鍒欏皢鎶ラ敊
+//						else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
+//							&& ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())) {
+//							setter.invoke(obj, ((BigDecimal) map.get(property.getName().toUpperCase())).intValue());
+//							map.remove(property.getName().toUpperCase());
+//						} else if (map.containsKey(property.getName().toUpperCase())) {
+//							if(setter.getParameterTypes()[0].getSimpleName().equals("String")){
+//								setter.invoke(obj, map.get(property.getName().toUpperCase()) == null ? null:String.valueOf(map.get(property.getName().toUpperCase())));
+//							}else{
+//								setter.invoke(obj, map.get(property.getName().toUpperCase()));
+//							}
+//							map.remove(property.getName().toUpperCase());
+//						}
+//					}
+//				}
+//				WebUtil.setValueToField(entry.getKey(), orderDTO, entry.getValue());
+//				iterator.remove();
+////			}
+//		}
+		orderDTO.setData(map);
+	}
+
+	/**
 	 * 妫�鏌ユ牎楠岃鍒欐病鏈夐�氳繃鐨勫唴瀹�
 	 * @param attrVOS 闇�瑕佹牎楠岀殑灞炴��
 	 * @param dataList 鏁版嵁鐨勫垪琛�
@@ -3799,7 +4187,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);
@@ -3836,6 +4224,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) {
@@ -4580,4 +4969,304 @@
 		}
 	}
 
+	/***
+	 * @param codeClassifyOid
+	 * @return
+	 */
+	@Override
+	public String exportGroupCodeExcel(String codeClassifyOid) throws ServiceException {
+		VciBaseUtil.alertNotNull(codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
+		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
+		CodeClassifyVO codeClassifyVO= classifyFullInfo.getCurrentClassifyVO();
+		//鑾峰彇鏈�鏂扮殑妯℃澘
+		CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);
+		LinkedList<String> colName=new LinkedList<>();//鍒楀ご
+		LinkedList<String> fieldList=new LinkedList<>();//鍒楀瓧娈�
+
+		ExecGroupCodePortDataDTO execGroupCodePortDataDTO=new ExecGroupCodePortDataDTO();
+		createExportGroupCodeMapConfig(templateVO,execGroupCodePortDataDTO);//缁勭粐鏁版嵁
+		if(!CollectionUtils.isEmpty(execGroupCodePortDataDTO.getCodeAttrMapGroupAttrDTOS())){
+			throw new ServiceException("闆嗗洟灞炴�ф槧灏勬湭閰嶇疆");
+		}
+		fieldList=execGroupCodePortDataDTO.getFieldList();
+		List<Map<String,String>>dataList=new ArrayList<>();
+		getDatas(classifyFullInfo,templateVO,fieldList,dataList,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
+	 */
+	public String improtGroupCode(String codeClassifyOid, File file) throws ServiceException {
+		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 = new CodeClassifyTemplateVO();
+		//闄ゅ幓榛樿鐨勫睘鎬�.杩樻湁鍙湁琛ㄥ崟鏄剧ず鐨勫瓧娈垫墠瀵煎叆
+		List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && 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<>();
+		getDatas(classifyFullInfo,templateVO,execGroupCodePortDataDTO.getFieldList(),dataList,codeList);
+		//鏌ヨ绯荤粺涓瓨鍦�
+		if(!CollectionUtils.isEmpty(dataList)){
+
+
+		}
+		return "";
+	}
+
+	/**
+	 *
+	 * @param fieldIndexMap
+	 * @param rowDataList
+	 * @param cboList
+	 */
+	private void getExportGroupCodeDatas(Map<Integer,String> fieldIndexMap,List<SheetRowData> rowDataList,List<ClientBusinessObject>cboList){
+		rowDataList.stream().forEach(sheetRowData -> {
+			sheetRowData.getData().forEach((index,value)->{
+				ClientBusinessObject cbo=new ClientBusinessObject();
+				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);
+			CodeAndGroupCodeAttrMappingDTO codeAndGroupCodeAttrMappingDTO =codeSystemObjectMap.get(title.replace(KEY_ATTR_CHAR,"").replace(REQUIRED_CHAR,""));
+			String id=codeAndGroupCodeAttrMappingDTO.getTargetAttrKey();
+			if(com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "闆嗗洟鐮�".equalsIgnoreCase(title)){
+				id = CODE_GROUP_FIELD;
+			}
+			if(com.alibaba.cloud.commons.lang.StringUtils.isBlank(id) && "浼佷笟缂栫爜".equalsIgnoreCase(title)){
+				id = CODE_FIELD;
+			}
+			if(com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(id)){
+				fieldIndexMap.put(i,id);
+			}
+		}
+
+
+	}
+	/***
+	 * 鏌ヨ鏈湁闆嗗洟鐮佺殑鏁版嵁
+	 * @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