From ffb3d0f1af7e5a93b9a509b0838d9b58a1449bdc Mon Sep 17 00:00:00 2001
From: xiejun <xj@2023>
Date: 星期三, 14 六月 2023 14:27:16 +0800
Subject: [PATCH] 批量申请接口提交

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java | 1159 +++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 1,030 insertions(+), 129 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 526c013..c1fe797 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,11 +1,17 @@
 package com.vci.ubcs.code.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.StringUtils;
+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.CodeOrderDTO;
-import com.vci.ubcs.code.service.ICodeClassifyService;
-import com.vci.ubcs.code.service.MdmEngineService;
-import com.vci.ubcs.code.service.MdmIOService;
+import com.vci.ubcs.code.enumpack.CodeDefaultLC;
+import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
+import com.vci.ubcs.code.mapper.CommonsMapper;
+import com.vci.ubcs.code.service.*;
+import com.vci.ubcs.code.util.ClientBusinessObject;
+import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
 import com.vci.ubcs.code.vo.pagemodel.*;
 import com.vci.ubcs.code.vo.webserviceModel.attrmap.DataObjectVO;
 import com.vci.ubcs.code.vo.webserviceModel.attrmap.RowDatas;
@@ -17,14 +23,19 @@
 import com.vci.ubcs.starter.poi.bo.SheetRowData;
 import com.vci.ubcs.starter.poi.bo.WriteExcelOption;
 import com.vci.ubcs.starter.poi.util.ExcelUtil;
+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.web.enumpck.BooleanEnum;
 import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
 import com.vci.ubcs.starter.web.pagemodel.DataGrid;
 import com.vci.ubcs.starter.web.pagemodel.KeyValue;
-import com.vci.ubcs.starter.web.util.LangBaseUtil;
-import com.vci.ubcs.starter.web.util.VciBaseUtil;
-import com.vci.ubcs.starter.web.util.VciDateUtil;
+import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+import com.vci.ubcs.starter.web.pagemodel.UIFormReferVO;
+import com.vci.ubcs.starter.web.toolmodel.DateConverter;
+import com.vci.ubcs.starter.web.util.*;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.util.HSSFColor;
@@ -33,6 +44,9 @@
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springblade.core.redis.cache.BladeRedis;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -40,23 +54,31 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.stream.Collectors;
 
 import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
 import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
-import static com.vci.ubcs.starter.poi.util.ExcelUtil.KEY_ATTR_CHAR;
-import static com.vci.ubcs.starter.poi.util.ExcelUtil.REQUIRED_CHAR;
+import static com.vci.ubcs.starter.poi.util.ExcelUtil.*;
 
 @AllArgsConstructor
 @Service
+@Slf4j
 public class MdmIOServiceImpl implements MdmIOService {
-
-
+	@Value("${batchadd.redis.time:6000000}")
+	public int BATCHADD_REDIS_TIME;
 	/**
 	 * 涓婚搴撳垎绫荤殑鏈嶅姟
 	 */
 	@Resource
 	private ICodeClassifyService classifyService;
+
+	/**
+	 * 閫氱敤鏌ヨ
+	 */
+	@Resource
+	CommonsMapper commonsMapper;
 
 	/**
 	 * 妯℃澘鐨勬湇鍔�
@@ -69,9 +91,26 @@
 	 */
 	@Resource
 	private MdmEngineService engineService;
-
+	/***
+	 * resdis缂撳瓨鏈嶅姟
+	 */
 	private final BladeRedis bladeRedis;
+	/**
+	 * 鐢熸垚缂栫爜鐨勬湇鍔�
+	 */
+	@Resource
+	private MdmProductCodeService productCodeService;
+	/**
+	 * 鍏抽敭灞炴�х殑閰嶇疆
+	 */
+	@Autowired
+	private ICodeKeyAttrRepeatService keyRuleService;
 
+	/**
+	 * 鍏紡鐨勬湇鍔�
+	 */
+	@Autowired
+	private FormulaServiceImpl formulaService;
 	/**
 	 * 鐢熸垚瀵煎叆鐨勬枃浠�
 	 *
@@ -350,125 +389,140 @@
 	 */
 	private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
 		List<String> codeList=new ArrayList<>();
-//		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+		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> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
-//			&& StringUtils.isBlank(s.getComponentrule()) && StringUtils.isBlank(s.getClassifyinvokeattr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
-//		).collect(Collectors.toList());
-//		if(!CollectionUtils.isEmpty(unExistAttrVOs)){
-//			throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
-//		}
-//		List<ClientBusinessObject> cboList = new ArrayList<>();
-//		String fullPath = getFullPath(classifyFullInfo);
-//		excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
-//
-//		//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
-//		//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
-//		//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
-//		batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
-//		//3.鍒ゆ柇鍏抽敭灞炴��
-//		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
-//		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-//		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-//		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
-//			selfRepeatRowIndexList.stream().forEach(rowIndex->{
-//				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
-//			});
-//		}
-//		if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
-//			keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-//				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
-//			});
-//		}
-//		//鍒嗙被娉ㄥ叆
-//		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
-//		//boolean
-//		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
-//		//4.鏍¢獙瑙勫垯
-//		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
-//		if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
-//			//5.鏍¢獙鏋氫妇鏄惁姝g‘
-//			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-//			//7.澶勭悊鍙傜収鐨勬儏鍐�
-//			batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
-//		}
-//		//6.鏃堕棿鏍煎紡鐨勯獙璇�
-//		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-//		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
-//		//鏈�鍚庡紕缁勫悎瑙勫垯
-//		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
-//		String uuid=redisService.getUUIDEveryDay();
-//		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)) {
-//				redisService.setCacheList(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="";
-//			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
-//			needSaveCboList = cboList.stream().filter(cbo -> {
-//				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-//				return !newErrorMap.containsKey(rowIndex);
-//			}).collect(Collectors.toList());
-//			if (!CollectionUtils.isEmpty(needSaveCboList)) {
-//				//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
-//				//鐢熸垚缂栫爜鐨勫唴瀹�
-//				codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), needSaveCboList);
-//				//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
-//				engineService.batchSaveSelectChar(templateVO, needSaveCboList);
-//			}
-//		}
-//		if(!isCreateUUid){
-//			return uuid="";
-//		}
-//		return uuid;
-		return null;
+		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> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
+			&& StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
+		).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(unExistAttrVOs)){
+			throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪鍒楄〃涓病鏈夋壘鍒�");
+		}
+		List<ClientBusinessObject> cboList = new ArrayList<>();
+		String fullPath = getFullPath(classifyFullInfo);
+		excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
+
+		//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
+		//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+		//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
+		batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
+		//3.鍒ゆ柇鍏抽敭灞炴��
+		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
+		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
+		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
+			selfRepeatRowIndexList.stream().forEach(rowIndex->{
+				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍦ㄥ綋鍓嶅鐞嗙殑鏁版嵁鏂囦欢涓叧閿睘鎬ч噸澶�" );
+			});
+		}
+		if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
+			keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
+				errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+			});
+		}
+		//鍒嗙被娉ㄥ叆
+		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
+		//boolean
+		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
+		//4.鏍¢獙瑙勫垯
+		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
+		if(isEnumType) {//鏄惁闇�瑕佹牎楠屾灇涓�/鍙傜収
+			//5.鏍¢獙鏋氫妇鏄惁姝g‘
+			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
+			//7.澶勭悊鍙傜収鐨勬儏鍐�
+			batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
+		}
+		//6.鏃堕棿鏍煎紡鐨勯獙璇�
+		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
+		//鏈�鍚庡紕缁勫悎瑙勫垯
+		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
+		String uuid=VciBaseUtil.getPk();
+		Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+
+		if(errorMap.size()>0) {
+			createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
+		}
+		boolean isCreateUUid=false;
+		List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
+			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+			return !errorMap.containsKey(rowIndex);
+		}).collect(Collectors.toList());
+		//鐩镐技鏍¢獙
+		Map<String,String>resembleMap=new HashMap<>();
+		List<DataResembleVO> dataResembleVOS=new ArrayList<>();
+		String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmtypeid();
+		bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
+		if(resembleMap.size()>0) {
+			isCreateUUid=true;
+			if(!CollectionUtils.isEmpty(dataResembleVOS)) {
+				bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
+				createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
+			}
+		}
+		//鎺掗櫎閿欒鐨勶紝鍓╀笅姝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="";
+
+			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+			/*dataCBOList = cboList.stream().filter(cbo -> {
+				String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+				return !newErrorMap.containsKey(rowIndex);
+			}).collect(Collectors.toList());
+*/			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());
+			});
+
+			if (!CollectionUtils.isEmpty(needSaveCboList)) {
+				//9.鎴戜滑澶勭悊涓氬姟鏁版嵁
+				//鐢熸垚缂栫爜鐨勫唴瀹�
+				try {
+					codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
+					//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
+					engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
+				} catch (Exception e) {
+					e.printStackTrace();
+					log.error("鎵逛簡鐢宠鏃跺け璐�");
+				}
+			}
+		}
+		if(!isCreateUUid){
+			return uuid="";
+		}
+		return uuid;
 	}
 
 	@Override
@@ -629,6 +683,587 @@
 	}
 
 	/**
+	 * excel杞崲涓篶bo鐨勫璞�
+	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param fieldIndexMap 瀛楁鐨勪綅缃�
+	 * @param rowDataList excel閲岀殑琛屾暟鎹�
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
+	 * @param cboList 鏁版嵁鐨勫垪琛�
+	 * @param fullPath 鍏ㄨ矾寰�
+	 * @param newCode 鏄惁涓烘壒閲忕敵璇�
+	 */
+	private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo,Map<Integer,String> fieldIndexMap,List<SheetRowData> rowDataList,
+							CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,
+							String fullPath,boolean newCode){
+		rowDataList.stream().forEach(rowData -> {
+			ClientBusinessObject cbo=new ClientBusinessObject();
+			 DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmtypeid());
+			rowData.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);
+				}
+			});
+			try {
+				cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD,templateVO.getOid());
+				cbo.setAttributeValue(IMPORT_ROW_INDEX,rowData.getRowIndex());
+				if(newCode){
+					cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD,classifyFullInfo.getCurrentClassifyVO().getOid());
+					cbo.setAttributeValue(CODE_FULL_PATH_FILED,fullPath);
+					//cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					int secret = VciBaseUtil.getInt(cbo.getAttributeValue(SECRET_FIELD));
+					/*if(secret == 0 || !secretService.checkDataSecret(secret) ){
+						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
+						cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
+					}*/
+				}else{
+					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
+					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
+				}
+
+			}catch (Throwable e){
+				log.error("璁剧疆榛樿鐨勫睘鎬х殑鍊奸敊璇�",e);
+			}
+			cboList.add(cbo);
+		});
+
+	}
+
+	/**
+	 * 妫�鏌ユ牎楠岃鍒欐病鏈夐�氳繃鐨勫唴瀹�
+	 * @param attrVOS 闇�瑕佹牎楠岀殑灞炴��
+	 * @param dataList 鏁版嵁鐨勫垪琛�
+	 * @param errorMap 閿欒鐨勪俊鎭槧灏�
+	 * @return 鏍¢獙涓嶉�氳繃鐨勮鏁�
+	 */
+	private void batchCheckVerifyOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList,Map<String,String> errorMap) {
+		Map<String, CodeClassifyTemplateAttrVO> verifyAttrVOMap = attrVOS.stream().filter(s -> StringUtils.isNotBlank(s.getVerifyRule()) && StringUtils.isBlank(s.getComponentRule())
+			&&StringUtils.isBlank(s.getClassifyInvokeAttr())
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if(!CollectionUtils.isEmpty(verifyAttrVOMap)){
+			Map<String/**琛屽彿**/,List<String>/**鏍¢獙涓嶉�氳繃鐨勫睘鎬�**/> unPassCheckMap = new HashMap<>();
+			verifyAttrVOMap.forEach((attrId,attrVO)->{
+				dataList.stream().forEach(cbo -> {
+					String value = cbo.getAttributeValue(attrId);
+					if(StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyRule())){
+						String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+						List<String> unPassAttrs = unPassCheckMap.getOrDefault(rowIndex, new ArrayList<>());
+						unPassAttrs.add(attrVO.getName());
+						unPassCheckMap.put(rowIndex,unPassAttrs);
+					}
+				});
+			});
+			if(!CollectionUtils.isEmpty(unPassCheckMap)){
+				unPassCheckMap.forEach((rowIndex,unPassAttrs)->{
+					errorMap.put(rowIndex,";灞炴�" + unPassAttrs.stream().collect(Collectors.joining(",")) + "]鍐呭涓嶇鍚堟牎楠岃鍒欑殑瑕佹眰");
+				});
+			}
+		}
+	}
+	/**
+	 * 鎵归噺杞崲鏃堕棿閮戒负鎸囧畾鐨勬牸寮�
+	 * @param attrVOS 妯℃澘灞炴��
+	 * @param cboList 鏁版嵁鐨勫垪琛�
+	 * @param errorMap 閿欒鐨勪俊鎭�
+	 */
+	private void batchSwitchDateAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> cboList,Map<String,String> errorMap){
+		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap =attrVOS.stream().filter(s ->
+			StringUtils.isNotBlank(s.getCodeDateFormat()) && VciBaseUtil.getBoolean(s.getCodeDateFormat()) && StringUtils.isBlank(s.getComponentRule())
+				&& StringUtils.isBlank(s.getClassifyInvokeAttr())
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if(!CollectionUtils.isEmpty(dateAttrVOMap)) {
+			dateAttrVOMap.forEach((attrId, attrVO) -> {
+				cboList.stream().forEach(cbo -> {
+					String value = cbo.getAttributeValue(attrId);
+					if (value == null) {
+						value = "";
+					}
+					if (StringUtils.isNotBlank(value)) {
+						boolean formated = false;
+						if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())){
+							try {
+								Date date = VciDateUtil.str2Date(value, attrVO.getCodeDateFormat());
+								if(date!=null){
+									cbo.setAttributeValue(attrId,value);
+									formated = true;
+								}
+							} catch (Exception e) {
+								//璇存槑涓嶆槸杩欎釜鏍煎紡
+							}
+						}
+						if(!formated) {
+							try {
+								DateConverter dateConverter = new DateConverter();
+								dateConverter.setAsText(value);
+								value = VciDateUtil.date2Str(dateConverter.getValue(), VciDateUtil.DateTimeMillFormat);
+								cbo.setAttributeValue(attrId,value);
+							}catch (Throwable e){
+								//杞崲涓嶄簡
+								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+								errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";灞炴�" + attrVO.getName() + "]鏃堕棿鏍煎紡涓嶆纭�" );
+							}
+						}
+					}
+				});
+			});
+		}
+	}
+	/**
+	 * 杞Щboolean鍨嬬殑灞炴��
+	 * @param attrVOS 灞炴�х殑瀵硅薄
+	 * @param dataList 鏁版嵁
+	 */
+	private void reSwitchBooleanAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList){
+		Map<String, CodeClassifyTemplateAttrVO> booleanAttrMap = attrVOS.stream().filter(
+			s -> VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(s.getAttributeDataType())
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (!CollectionUtils.isEmpty(booleanAttrMap)) {
+			booleanAttrMap.forEach((attrId, attrVO) -> {
+				dataList.stream().forEach(cbo -> {
+					String text = cbo.getAttributeValue(attrId);
+					try {
+						if (BooleanEnum.TRUE.getValue().equalsIgnoreCase(text) || "鏄�".equalsIgnoreCase(text)) {
+							cbo.setAttributeValue(attrId, BooleanEnum.TRUE.getValue());
+						} else {
+							cbo.setAttributeValue(attrId, BooleanEnum.FASLE.getValue());
+						}
+					}catch (Throwable e){
+
+					}
+				});
+			});
+		}
+	}
+
+	/**
+	 * 澶勭悊缁勫悎瑙勫垯
+	 * @param attrVOS 妯℃澘灞炴��
+	 * @param dataList excel鐨勬暟鎹唴瀹�
+	 */
+	private void batchSwitchComponentAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList) {
+		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(s -> StringUtils.isNotBlank(s.getComponentRule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if(!CollectionUtils.isEmpty(dateAttrVOMap)) {
+			dateAttrVOMap.forEach((attrId, attrVO) -> {
+				dataList.stream().forEach(cbo -> {
+					//浠巈xcel涓婃妸灞炴�ц浆鎹负map
+					Map<String,String> thisRowDataMap = new HashMap<>();
+					copyValueToMapFromCbos(cbo,thisRowDataMap);
+					//缁勫悎鍐呭
+					String value = formulaService.getValueByFormula(thisRowDataMap,attrVO.getComponentRule());
+					if(value == null){
+						value = "";
+					}
+					try {
+						cbo.setAttributeValue(attrId, value);
+					}catch (Throwable e){
+						log.error("璁剧疆灞炴�х殑閿欒",e);
+					}
+				});
+			});
+		}
+	}
+
+	/**
+	 * 杞崲鍙傜収鐨勫��
+	 * @param attrVOS 灞炴�х殑鏄剧ず瀵硅薄
+	 * @param dataList 鏁版嵁鍒楄〃
+	 * @param errorMap 閿欒鐨勪俊鎭�
+	 */
+	private void batchSwitchReferAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,Map<String,String> errorMap){
+		Map<String, CodeClassifyTemplateAttrVO> referAttrVOMap = attrVOS.stream().filter(
+			s -> (StringUtils.isNotBlank(s.getReferBtmId()) || StringUtils.isNotBlank(s.getReferConfig()))
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if(!CollectionUtils.isEmpty(referAttrVOMap)){
+			Map<String/**琛ㄦ牸鍜屽�肩殑灞炴��**/,Map<String/**鏄剧ず灞炴�х殑鍊�**/,List<String>/**琛ㄦ牸閲岀殑鍊�**/>> linkValueMap = new HashMap<>();
+			referAttrVOMap.forEach((attrId,attrVO)->{
+				dataList.stream().forEach(cbo -> {
+					String text = cbo.getAttributeValue(attrId);
+					if(StringUtils.isNotBlank(text)){
+						UIFormReferVO referVO = getReferVO(attrVO);
+						String valueField = getValueField(referVO);
+						String showText = getTextField(referVO);
+						String tableAndAttr = VciBaseUtil.getTableName(referVO.getReferType()) + "#" + valueField;
+						Map<String, List<String>> showTextMap = linkValueMap.getOrDefault(tableAndAttr, new HashMap<>());
+						List<String> textList = showTextMap.getOrDefault(showText, new ArrayList<>());
+						if(!textList.contains(text)) {
+							textList.add(text);
+						}
+						showTextMap.put(showText,textList);
+						linkValueMap.put(tableAndAttr,showTextMap);
+					}
+				});
+			});
+			if(!CollectionUtils.isEmpty(linkValueMap)){
+				//闇�瑕侀�愪釜琛ㄧ殑鍊煎瓧娈碉紝閫愪釜鏌ヨ
+				Map<String/**琛ㄦ牸鍜屽�煎睘鎬�**/,Map<String/**鏄剧ず灞炴��**/, Map<String/**鍊�**/,String/**鏄剧ず鐨勫��**/>>> linkCboMap = new HashMap<>();
+				linkValueMap.forEach((tableAndAttr,showValueMap)->{
+					String[] split = tableAndAttr.split("#");
+					String table = split[0];
+					String valueField = split[1].toLowerCase(Locale.ROOT);
+					Map<String,Map<String,String>> dataMap = new HashMap<>();
+					showValueMap.forEach((showText,valueList)->{
+						Map<String,String> valueOidTextMap = new HashMap<>();
+						List<List<String>> valueCollections = VciBaseUtil.switchListForOracleIn(valueList);
+						String sql = "select " + valueField + "," + showText.toLowerCase(Locale.ROOT) +" from " + table + "  where " + showText + " in (%s)";
+						valueCollections.stream().forEach(values->{
+							List<Map<String,String>> dataMapList = commonsMapper.queryByOnlySqlForMap(String.format(sql, VciBaseUtil.toInSql(values.toArray(new String[0]))));
+							List<ClientBusinessObject> cbos=	ChangeMapTOClientBusinessObjects(dataMapList);
+							if(!CollectionUtils.isEmpty(cbos)){
+								valueOidTextMap.putAll(cbos.stream().collect(Collectors.toMap(s->s.getAttributeValue(valueField),t->t.getAttributeValue(showText))));
+							}
+						});
+						dataMap.put(showText,valueOidTextMap);
+					});
+					linkCboMap.put(tableAndAttr,dataMap);
+				});
+				referAttrVOMap.forEach((attrId,attrVO)->{
+					dataList.stream().forEach(cbo -> {
+						String text = cbo.getAttributeValue(attrId);
+						if (StringUtils.isNotBlank(text)) {
+							UIFormReferVO referVO = getReferVO(attrVO);
+							String valueField = getValueField(referVO);
+							String showText = getTextField(referVO);
+							String tableAndAttr = VciBaseUtil.getTableName(referVO.getReferType()) + "#" + valueField;
+							if(!linkCboMap.containsKey(tableAndAttr)){
+								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+								errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪" );
+
+							}else{
+								Map<String, Map<String, String>> dataMap = linkCboMap.get(tableAndAttr);
+								if(!dataMap.containsKey(showText)){
+									String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+									errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪" );
+								}else{
+									Map<String, String> data = dataMap.get(showText);
+									final boolean[] fined = {false};
+									data.forEach((key,value)->{
+										if(value.equalsIgnoreCase(text)){
+											fined[0] = true;
+											try {
+												cbo.setAttributeValue(attrId, key);
+											}catch (Throwable e){
+
+											}
+										}
+									});
+									if(!fined[0]){
+										String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+										errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍙傛暟灞炴�" + attrVO.getName() + "]鐨勫�煎湪绯荤粺涓笉瀛樺湪" );
+									}
+								}
+							}
+						}
+					});
+				});
+			}
+		}
+
+	}
+
+	/**
+	 * 浠庡睘鎬т笂鑾峰彇鍙傜収鐨勫唴瀹�
+	 * @param attrVO 灞炴�х殑淇℃伅
+	 * @return 鍙傜収鐨勫唴瀹�
+	 */
+	private UIFormReferVO getReferVO(CodeClassifyTemplateAttrVO attrVO){
+		UIFormReferVO referVO = null;
+		if(StringUtils.isNotBlank(attrVO.getReferConfig())){
+			referVO = JSONObject.parseObject(attrVO.getReferConfig(),UIFormReferVO.class);
+		}else{
+			referVO = new UIFormReferVO();
+			referVO.setReferType(attrVO.getReferBtmId());
+			referVO.setValueField(VciQueryWrapperForDO.OID_FIELD);
+			referVO.setTextField("name");
+		}
+		return referVO;
+	}
+
+	/**
+	 * 鑾峰彇鍙傜収涓殑鍊肩殑瀛楁
+	 * @param referVO 鍙傜収鐨勫璞�
+	 * @return 榛樿涓篛id锛屾湁澶氫釜鐨勬椂鍊欙紝鑾峰彇绗竴涓�
+	 */
+	private String getValueField(UIFormReferVO referVO){
+		String showText = referVO.getValueField();
+		if(StringUtils.isBlank(showText)){
+			return "oid";
+		}
+		if(showText.contains(",")){
+			//闃叉涓囦竴鏈夊涓紝鐪嬬湅鏈夋病鏈塷id
+			List<String> strings = VciBaseUtil.str2List(showText);
+			if(strings.contains("oid")){
+				showText = "oid";
+			}else{
+				showText = strings.get(0);
+			}
+		}
+		return showText;
+	}
+
+	/**
+	 * 鑾峰彇鍙傜収涓殑鏄剧ず鍐呭鐨勫瓧娈�
+	 * @param referVO 鍙傜収鐨勫璞�
+	 * @return 榛樿涓簄ame锛屾湁澶氫釜鐨勬椂鍊欙紝鑾峰彇绗竴涓�
+	 */
+	private String getTextField(UIFormReferVO referVO){
+		String showText = referVO.getTextField();
+		if(StringUtils.isBlank(showText)){
+			return "name";
+		}
+		if(showText.contains(",")){
+			//闃叉涓囦竴鏈夊涓紝鐪嬬湅鏈夋病鏈塶ame
+			List<String> strings = VciBaseUtil.str2List(showText);
+			if(strings.contains("name")){
+				showText = "name";
+			}else{
+				showText = strings.get(0);
+			}
+		}
+		return showText;
+	}
+	/**
+	 * 澶勭悊鏋氫妇鐨勬樉绀哄璞�
+	 * @param attrVOS 妯℃澘灞炴��
+	 * @param dataList excel鐨勬暟鎹唴瀹�
+	 * @param errorMap 閿欒淇℃伅鐨勬槧灏�
+	 */
+	private void batchSwitchEnumAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,
+											Map<String,String> errorMap ) {
+		Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(
+			s -> (StringUtils.isNotBlank(s.getEnumString()) || StringUtils.isNotBlank(s.getEnumId()))
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
+			dateAttrVOMap.forEach((attrId, attrVO) -> {
+				dataList.stream().forEach(cbo -> {
+					String text = cbo.getAttributeValue(attrId);
+					if(StringUtils.isNotBlank(text)){
+						List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
+						boolean fined = false;
+						for (int i = 0; i < valueList.size(); i++) {
+							KeyValue keyValue = valueList.get(i);
+							//if(keyValue.getValue().equalsIgnoreCase(text)){
+							if(keyValue.getValue().equalsIgnoreCase(text)||keyValue.getKey().equalsIgnoreCase(text)){
+								try {
+									cbo.setAttributeValue(attrId, keyValue.getKey());
+								}catch (Throwable e){
+									log.error("璁剧疆灞炴�у嚭閿�");
+								}
+								fined = true;
+								break;
+							}
+						}
+						if(!fined){
+							String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+							errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";灞炴�" + attrVO.getName() + "]鐨勫�间笉绗﹀悎涓嬫媺鐨勮姹�");
+						}
+					}
+				});
+			});
+		}
+	}
+
+	/**
+	 * 鎵归噺鏍¢獙鏁版嵁鐨勪俊鎭�
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
+	 * @param cboList 鏁版嵁鐨勫唴瀹�
+	 */
+	private void batchCheckRequiredAttrOnOrder(CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,Map<String,String> errorMap){
+		Map<String, CodeClassifyTemplateAttrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(s ->
+			VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeLevel())//涓嶈兘鏄粍鍚堢殑鍜屽垎绫绘敞鍏ョ殑
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		//涓嶮dmEngineServiceImpl閲岄潰鐨刢heckRequiredAttrOnOrder 閫昏緫搴旇鐩镐技
+		if(!CollectionUtils.isEmpty(requiredAttrMap)) {
+			Set<String> nullRowIndex = cboList.stream().filter(cbo -> requiredAttrMap.keySet().stream().anyMatch(attrId -> StringUtils.isBlank(cbo.getAttributeValue(attrId)))).map(cbo -> cbo.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet());
+			if(!CollectionUtils.isEmpty(nullRowIndex)){
+				String checkAttr = requiredAttrMap.values().stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(","));
+				nullRowIndex.stream().forEach(rowIndex->{
+					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鏍¢獙瑙勫垯涓嶉�氳繃锛屾湁鏍¢獙鐨勫睘鎬т负" + checkAttr);
+				});
+			}
+		}
+	}
+	/**
+	 * 澶勭悊鍒嗙被娉ㄥ叆
+	 * @param attrVOS 妯℃澘灞炴��
+	 * @param dataList excel鐨勬暟鎹唴瀹�
+	 * @param classifyFullInfo 鍒嗙被鐨勫叏璺緞
+	 */
+	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())
+		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		Map<String,CodeClassifyFullInfoBO> classifyFullInfoMap=new HashMap<>();
+		classifyFullInfoMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(),classifyFullInfo);
+		if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
+			dataList.stream().forEach(cbo -> {
+				dateAttrVOMap.forEach((attrId, attrVO) -> {
+					//鍒嗙被娉ㄥ叆鐨勭紪鍙锋垨鑰呭悕绉帮紝
+					//灞傜骇鍖呭惈鎸囧畾灞傚拰鏈�灏忓眰
+					CodeClassifyVO classifyVO = null;
+					if(!CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(attrVO.getClassifyInvokeLevel()) && !"min".equalsIgnoreCase(attrVO.getClassifyInvokeLevel())) {
+						//鎸囧畾浜嗗眰绾х殑
+						//娉ㄦ剰锛屽洜涓烘煡璇笂绾у垎绫诲嚭鏉ョ殑灞傜骇鏄�掑簭鐨勶紝鍗抽《灞傝妭鐐规槸鏈�澶х殑鍊�
+						if(isImPort){
+							if(!classifyFullInfoMap.containsKey(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
+								CodeClassifyFullInfoBO currentClassifyFullInfo = classifyService.getClassifyFullInfo(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD));
+								classifyFullInfoMap.put(currentClassifyFullInfo.getCurrentClassifyVO().getOid(), currentClassifyFullInfo);
+							}
+						}
+						CodeClassifyFullInfoBO newClassifyFullInfo= classifyFullInfoMap.get(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD));
+						List<CodeClassifyVO> classifyVOS = newClassifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
+						int level = VciBaseUtil.getInt(attrVO.getClassifyInvokeLevel());
+						if (classifyVOS.size()>=level && level > 0 ) {
+							classifyVO = classifyVOS.get(level-1);
+						}
+					}else{
+						//褰撳墠鐨勫垎绫�
+						classifyVO = classifyFullInfo.getCurrentClassifyVO();
+					}
+					try {
+						if (classifyVO == null) {
+							//璇存槑灞傜骇鏈夎
+							cbo.setAttributeValue(attrId, "鍒嗙被鏍戜笂娌℃湁灞傜骇[" + attrVO.getClassifyInvokeLevel() + "]");
+						} else {
+							Map<String, String> classifyDataMap = VciBaseUtil.objectToMapString(classifyVO);
+							String value = classifyDataMap.getOrDefault(attrVO.getClassifyInvokeAttr(), "");
+							cbo.setAttributeValue(attrId, value);
+						}
+					} catch (Throwable e) {
+						log.error("璁剧疆灞炴�ч敊璇�", e);
+					}
+				});
+			});
+		}
+	}
+	/**
+	 * 鏍¢獙鍏抽敭灞炴��
+	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param templateVO 妯℃澘鐨勫唴瀹癸紝蹇呴』鍖呭惈妯℃澘灞炴��
+	 * @param cboList 鎵归噺鐨勬暟鎹�
+	 */
+	private CodeImportResultVO batchCheckKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO,
+														List<ClientBusinessObject> cboList) {
+		//涓嶮dmEngineServiceImpl閲岀殑checkKeyAttrOnOrder鐩镐技
+		//鍏堣幏鍙栧叧閿睘鎬х殑瑙勫垯锛屼篃鍒╃敤缁ф壙鐨勬柟寮�
+		CodeKeyAttrRepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
+		//娉ㄦ剰鐨勬槸keyRuleVO鍙兘涓虹┖锛岃〃绀轰笉浣跨敤瑙勫垯鎺у埗
+		//鑾峰彇鎵�鏈夌殑鍏抽敭灞炴��
+		Map<String/**灞炴�х殑缂栧彿**/, CodeClassifyTemplateAttrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+
+		boolean trimAll =keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
+		//鍏ㄩ儴鍘荤┖鐨勪紭鍏堢骇澶т簬鍘荤┖
+		boolean trim =keyRuleVO ==null?false:  VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
+		boolean ignoreCase = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
+		boolean ignoreWidth = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
+
+		//1. 鎴戜滑闇�瑕佸厛鍒ゆ柇excel瀵煎叆鐨勫唴瀹规槸鍚︽纭�
+		CodeImportResultVO resultVO = new CodeImportResultVO();
+		resultVO.setKeyAttrRuleInfo(String.format(keyRuleVO ==null?"":"鏌ヨ瑙勫垯锛氬幓闄ょ┖鏍�--{0},蹇界暐澶у皬鍐�--{1},蹇界暐鍏ㄥ崐瑙�--{2},蹇界暐鍏ㄩ儴绌烘牸--{3}",
+			new String[]{trim?"鏄�":"鍚�",ignoreCase?"鏄�":"鍚�",ignoreWidth?"鏄�":"鍚�",trimAll?"鏄�":"鍚�"}));
+		resultVO.setSelfRepeatRowIndexList(getSelfRepeatRowIndex(ketAttrMap,cboList,keyRuleVO));
+		if(!CollectionUtils.isEmpty(resultVO.getSelfRepeatRowIndexList())){
+			//鎴戜滑绉婚櫎鏈韩閲嶅鐨勬暟鎹�
+			cboList = cboList.stream().filter(s->!resultVO.getSelfRepeatRowIndexList().contains(s.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
+		}
+		//2.鍒ゆ柇鍏抽敭灞炴�у湪绯荤粺閲屾槸鍚﹂噸澶�
+		//鍥犱负鏁版嵁閲忓緢澶э紝鎵�浠ュ緱鎯冲姙娉曞苟琛�
+		//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+		Map<String,List<ClientBusinessObject>> indexTODataMap=new HashMap<>();
+		List<ClientBusinessObject> repeatDataMap = cboList.parallelStream().filter(cbo -> {
+			//姣忚閮藉緱鏌ヨ.濡傛灉鍏朵腑鍑虹幇浜嗛敊璇紝鎴戜滑灏辩洿鎺ユ姏鍑哄紓甯革紝鍏朵綑鐨勬樉绀�
+			//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+			Map<String, String> conditionMap = new HashMap<>();
+			ketAttrMap.forEach((attrId, attrVO) -> {
+				String value =cbo.getAttributeValue(attrId.toLowerCase(Locale.ROOT));
+				if (value == null) {
+					value = "";
+				}
+				value= value.replace(REQUIRED_CHAR,SPECIAL_CHAR);
+				engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
+			});
+			if (!CollectionUtils.isEmpty(ketAttrMap)) {
+				CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), templateVO, conditionMap, null);
+				boolean isKeyCheck= commonsMapper.queryCountBySql(sqlBO.getSqlCount()) > 0;
+				if(isKeyCheck){
+					List<Map<String,String>> newDataList=  commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
+					List<ClientBusinessObject> newCboList=	ChangeMapTOClientBusinessObjects(newDataList);
+					indexTODataMap.put(cbo.getAttributeValue(IMPORT_ROW_INDEX),newCboList);
+				}
+				return isKeyCheck;
+			}else{
+				return false;
+			}
+		}).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(repeatDataMap)){
+			resultVO.setKeyAttrRepeatRowIndexList(repeatDataMap.stream().map(s->s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet()));
+		}
+		//resultVO.setIndexTODataMap(indexTODataMap);
+		//resultVO.setSuccess(true);
+		return resultVO;
+	}
+	/**
+	 * 鑾峰彇瀵煎叆鐨勫唴瀹逛腑鍏抽敭灞炴�ч噸澶嶇殑琛屽彿
+	 * @param ketAttrMap 鍏抽敭灞炴�х殑鏄犲皠
+	 * @param dataList 瀵煎叆鐨勬暟鎹�
+	 * @param keyRuleVO 鍏抽敭灞炴�ф帶鍒惰鍒�
+	 * @return 閲嶅鐨勮鍙�
+	 */
+	private Set<String> getSelfRepeatRowIndex(Map<String/**灞炴�х殑缂栧彿**/, CodeClassifyTemplateAttrVO> ketAttrMap,
+											  List<ClientBusinessObject> dataList,CodeKeyAttrRepeatVO keyRuleVO){
+		Set<String> selfRepeatRowIndexList = new CopyOnWriteArraySet<>();
+		boolean trimAll =keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
+		//鍏ㄩ儴鍘荤┖鐨勪紭鍏堢骇澶т簬鍘荤┖
+		boolean trim =keyRuleVO ==null?false:  VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
+		boolean ignoreCase = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
+		boolean ignoreWidth = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
+		//蹇呴』灏嗗睘鎬ф寜鐓ч『搴忔帓搴忓ソ
+		List<CodeClassifyTemplateAttrVO> attrVOList = ketAttrMap.values().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
+		Map<String/**琛屽彿**/,String/**鍏抽敭灞炴�х殑缁勫悎鍐呭**/> rowIndexKeyStringMap = new HashMap<>();
+		dataList.parallelStream().forEach(cbo-> {
+			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+			StringBuilder sb = new StringBuilder();
+			for (int i = 0; i < attrVOList.size(); i++) {
+				CodeClassifyTemplateAttrVO attrVO = attrVOList.get(i);
+				String attrId = attrVO.getId().toLowerCase(Locale.ROOT);
+				String value = cbo.getAttributeValue( attrId);
+				if (value == null) {
+					value = "";
+				}
+				if(trim){
+					value = value.trim();
+				}
+				if(trimAll){
+					value = value.replace(" ","");
+				}
+				if(ignoreCase){
+					value = value.toLowerCase(Locale.ROOT);
+				}
+				if(ignoreWidth){
+					value = VciBaseUtil.toDBC(value);
+				}
+				sb.append(value).append("${ks}");
+			}
+			String keyString = sb.toString();
+			if(rowIndexKeyStringMap.containsValue(keyString) && StringUtils.isNotBlank(keyString)){
+				selfRepeatRowIndexList.add(rowIndex);
+			}else {
+				rowIndexKeyStringMap.put(rowIndex, sb.toString());
+			}
+		});
+		//鍥犱负鍙槸鍏抽敭灞炴�ч噸澶嶏紝鎵�浠ユ垜浠笉鑳介噸澶嶇殑澶氭潯閫変竴鏉℃潵鎶ラ敊
+		return selfRepeatRowIndexList;
+	}
+	/**
 	 * excel鐨勬爣棰樹笂鑾峰彇瀛楁鎵�鍦ㄧ殑浣嶇疆
 	 * @param titleRowData 鏍囬鐨勫唴瀹�
 	 * @param attrNameIdMap 妯℃澘涓睘鎬у悕绉板拰鑻辨枃鐨勬槧灏�
@@ -653,6 +1288,272 @@
 			}
 		}
 	}
+	private List<ClientBusinessObject> ChangeMapTOClientBusinessObjects(List<Map<String,String>> oldDataMap){
+		List<ClientBusinessObject> clientBusinessObjectList=new CopyOnWriteArrayList<>();
+		oldDataMap.parallelStream().forEach(dataMap->{
+			ClientBusinessObject clientBusinessObject=new ClientBusinessObject();
+			DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject);
+			dataMap.forEach((key,value)->{
+				clientBusinessObject.setAttributeValue(key,value);
+			});
+		});
+		return clientBusinessObjectList;
+	}
 
+	/***
+	 * 姝g‘閿欒鏁版嵁redis缂撳瓨
+	 * @param uuid
+	 * @param templateVO
+	 * @param rowIndexCbo
+	 * @param dataSet
+	 * @param fieldIndexMap
+	 * @param errorMap
+	 * @param isok
+	 */
+	private void createRedisDatas(String uuid,CodeClassifyTemplateVO templateVO,Map<String,ClientBusinessObject> rowIndexCbo, SheetDataSet dataSet, Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap,Map<String,String> errorMap,boolean isok){
+		List<SheetRowData>  needsheetRowDataList =new ArrayList<>();
+		if(errorMap.size()>0) {
+			//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
+			needsheetRowDataList = dataSet.getRowData().stream().filter(cbo -> {
+				String rowIndex=cbo.getRowIndex();
+				return  isok? !errorMap.containsKey(rowIndex):errorMap.containsKey(rowIndex);
+			}).collect(Collectors.toList());
 
+		}else{
+			needsheetRowDataList= dataSet.getRowData();
+		}
+		Map<String/**涓枃鍚嶇О**/, SheetRowData/**鑻辨枃鍚嶇О**/> rowIdexDataMap = needsheetRowDataList.stream().collect(Collectors.toMap(s -> s.getRowIndex(), t -> t,(o1, o2)->o2));
+		Map<String,CodeImprotDataVO> clsfDataMap=new HashMap<>();
+		rowIndexCbo .forEach((rowIndex, cbo) -> {
+			CodeImprotDataVO codeImprotDataVO = new CodeImprotDataVO();
+			codeImprotDataVO.setTemplateOid(templateVO.getOid());
+			List<Map<String, String>> dataList = new ArrayList<>();
+			if(rowIdexDataMap.containsKey(rowIndex)){
+				SheetRowData sheetRowData=rowIdexDataMap.get(rowIndex);
+				Map<String, String> dataMap = new HashMap<>();
+				Map<Integer, String> data = sheetRowData.getData();
+				fieldIndexMap.forEach((integer, s) -> {
+					String field = fieldIndexMap.get(integer);
+					if (data.containsKey(integer)) {
+						String vlues = data.get(integer);
+						dataMap.put(field, vlues);
+					}
+				});
+				dataMap.put("oid",cbo.getOid());
+				dataList.add(dataMap);
+			}
+			if(clsfDataMap.containsKey(templateVO.getOid())){
+				codeImprotDataVO=clsfDataMap.get(templateVO.getOid());
+				dataList.addAll(codeImprotDataVO.getDatas());
+			}
+			codeImprotDataVO.setColNames(dataSet.getColName());
+			codeImprotDataVO.setDatas(dataList);
+			clsfDataMap.put(templateVO.getOid(),codeImprotDataVO);
+		});
+		if(!CollectionUtils.isEmpty(clsfDataMap)) {
+			Collection codeImprotDataVOS=clsfDataMap.values();
+			List<CodeImprotDataVO> codeImprotDataVOList=new ArrayList<>();
+			codeImprotDataVOList.addAll(codeImprotDataVOS);
+			bladeRedis.set(uuid+"-"+templateVO.getOid(), codeImprotDataVOList);
+			bladeRedis.expire(uuid+"-"+templateVO.getOid(),BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
+		}
+	}
+
+	/****
+	 * 鏁版嵁鐩镐技椤规暟鎹牎楠宺edis缂撳瓨
+	 * @param codeClassifyOid
+	 * @param templateVO
+	 * @param cboList
+	 * @param resembleMap
+	 * @param btmtypeid
+	 * @param dataResembleVOS
+	 */
+	private void bathcResembleQuery(String codeClassifyOid, CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList,Map<String,String>resembleMap,String btmtypeid,List<DataResembleVO> dataResembleVOS){
+		CodeClassifyFullInfoBO fullInfoBO = classifyService.getClassifyFullInfo(codeClassifyOid);
+		Map<String, String> conditionMap = new HashMap<>();
+		CodeResembleRuleVO resembleRuleVO = Optional.ofNullable(engineService.getUseResembleRule(fullInfoBO, fullInfoBO.getCurrentClassifyVO())).orElseGet(() -> new CodeResembleRuleVO());
+		//闇�瑕佽幏鍙栨槸鍚︽湁鐩镐技鏌ヨ灞炴��
+		Map<String, CodeClassifyTemplateAttrVO> attrVOs = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getSameRepeatAttrFlag())).collect(Collectors.toMap(s -> s.getId(), t -> t));
+		if (CollectionUtils.isEmpty(attrVOs)) {
+			return;
+		}
+		Map<String,CodeImprotResembleVO> codeImprotResembleVOMap=new HashMap<>();
+		List<CodeImprotResembleVO> codeImprotResembleVOList=new ArrayList<>();
+		Map<String,String> rowIndePathMap=new HashMap<>();
+		cboList.stream().forEach(clientBusinessObject -> {
+			CodeImprotResembleVO codeImprotResembleVO=new CodeImprotResembleVO();
+			final String[] path = {""};
+			List<String> fieldList=new ArrayList<>();
+			List<String> rowIndeList=new ArrayList<>();
+			String rowIndex = clientBusinessObject.getAttributeValue(IMPORT_ROW_INDEX);
+			attrVOs.forEach((attrId, attrVO) -> {
+				String value="";
+                /*if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
+                    value = WebUtil.getStringValueFromObject(WebUtil.getValueFromField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO));
+                }else {*/
+				value= clientBusinessObject.getAttributeValue(attrId);
+				// }
+				fieldList.add(attrId);
+				value=StringUtils.isBlank(value)?"":value;
+				path[0] +=value+"#";
+				engineService.wrapperResembleConditionMap(value, resembleRuleVO, attrId, conditionMap);
+			});
+			List<Map<String,String>> dataMap=new ArrayList<>();
+			if(codeImprotResembleVOMap.containsKey(path[0])) {
+				codeImprotResembleVO=codeImprotResembleVOMap.get(path[0]);
+				rowIndeList=codeImprotResembleVO.getRownIndex();
+				dataMap=  codeImprotResembleVO.getDataList();
+				resembleMap.put(rowIndex, "瀛樺湪鐩镐技鏁版嵁");
+			}else{
+				if (!CollectionUtils.isEmpty(conditionMap)) {
+					Map<String, String> andConditionMap = new HashMap<>();
+					andConditionMap.put("islastr", "1");
+					andConditionMap.put("islastv", "1");
+					conditionMap.putAll(andConditionMap);
+					PageHelper pageHelper = new PageHelper(-1);
+					pageHelper.addDefaultDesc("id");
+					CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(btmtypeid, templateVO, conditionMap, pageHelper);
+					List<Map<String,String>> dataMapList=commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
+					List<ClientBusinessObject> resembleCboList=	ChangeMapTOClientBusinessObjects(dataMapList);
+					if(!CollectionUtils.isEmpty(resembleCboList)) {
+						List<Map<String, String>> finalDataMap = dataMap;
+						resembleCboList.stream().forEach(cbo->{
+							Map<String,String> resembDataMap=new HashMap<>();
+							fieldList.stream().forEach(field->{
+								String value=cbo.getAttributeValue(field);
+								value=StringUtils.isBlank(value)?"":value;
+								resembDataMap.put(field,value);
+							});
+							resembDataMap.put("codetemplateoid",templateVO.getOid());
+							resembDataMap.put("id",StringUtils.isBlank(cbo.getAttributeValue("id"))?"":cbo.getAttributeValue("id"));
+							resembDataMap.put("rowIndex","");
+							resembDataMap.put("oid",cbo.getOid());
+							finalDataMap.add(resembDataMap);
+						});
+						resembleMap.put(rowIndex, "瀛樺湪鐩镐技鏁版嵁");
+
+					}
+				}
+			}
+			rowIndePathMap.put(rowIndex,path[0]);
+			rowIndeList.add(rowIndex);
+			codeImprotResembleVO.setPath(path[0]);
+			codeImprotResembleVO.setRownIndex(rowIndeList);
+			codeImprotResembleVO.setConditionMap(conditionMap);
+			codeImprotResembleVO.setFields(fieldList);
+			codeImprotResembleVO.setDataList(dataMap);
+			codeImprotResembleVOMap.put(path[0],codeImprotResembleVO);
+		});
+		Map<String, ClientBusinessObject> cboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
+		if(!CollectionUtils.isEmpty(rowIndePathMap)){
+			rowIndePathMap.forEach((rowIndex, path) -> {
+				if(codeImprotResembleVOMap.containsKey(path)){
+					CodeImprotResembleVO codeImprotResembleVO=  codeImprotResembleVOMap.get(path);
+					List<String> fieldList=codeImprotResembleVO.getFields();
+					List<String> rownIndexList= codeImprotResembleVO.getRownIndex();
+					List<String> newRownIndexList = rownIndexList.stream().filter(cbo -> {
+						return rowIndex!=cbo;
+					}).collect(Collectors.toList());
+					newRownIndexList.stream().forEach(s -> {
+						resembleMap.put(s, "瀛樺湪鐩镐技鏁版嵁");
+					});
+					List<Map<String, String>>newDataList=new ArrayList<>();
+					DataResembleVO dataResembleVO=new DataResembleVO();
+					dataResembleVO.setOid(cboMap.get(rowIndex).getOid());
+					List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
+						String newRowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+						return rownIndexList.contains(newRowIndex)&&(!newRowIndex.equalsIgnoreCase(rowIndex));
+					}).collect(Collectors.toList());
+					if(!CollectionUtils.isEmpty(needSaveCboList)) {
+						needSaveCboList.stream().forEach(cbo -> {
+							String newRowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+							Map<String, String> resembDataMap = new HashMap<>();
+							fieldList.stream().forEach(field -> {
+								String value = cbo.getAttributeValue(field);
+								value = StringUtils.isBlank(value) ? "" : value;
+								resembDataMap.put(field, value);
+							});
+							resembDataMap.put("codetemplateoid",templateVO.getOid());
+							resembDataMap.put("id",StringUtils.isBlank(cbo.getAttributeValue("id"))?"":cbo.getAttributeValue("id"));
+							resembDataMap.put("rowIndex", newRowIndex);
+							resembDataMap.put("oid",cbo.getOid());
+							newDataList.add(resembDataMap);
+						});
+					}
+					List<Map<String, String>>dataList=codeImprotResembleVO.getDataList();
+					newDataList.addAll(dataList);
+					dataResembleVO.setDataList(newDataList);
+					dataResembleVOS.add(dataResembleVO);
+				}
+			});
+		}
+	}
+
+	/***
+	 * 瀛樺偍鍒嗙被瀵硅薄鍙婂叾鍒楀悕
+	 * @param uuid
+	 * @param templateVOList
+	 * @param dataSet
+	 * @param fieldIndexMap
+	 * @param iscContain
+	 */
+	private  void createRedisByCodeClassify(String uuid,CodeClassifyTemplateVO templateVOList,SheetDataSet dataSet, Map<Integer/**鍒楀彿**/,String/**瀛楁鐨勫悕绉�**/> fieldIndexMap,boolean iscContain){
+		List<ColumnVO> columnVOList = new ArrayList<>();
+		List<String> outNameList = dataSet.getColName();
+		fieldIndexMap.forEach((integer, s) -> {
+			ColumnVO columnVOS = new ColumnVO();
+			String field = fieldIndexMap.get(integer);
+			String outName = outNameList.get(integer);
+			columnVOS.setField(field);
+			columnVOS.setTitle(outName);
+			columnVOList.add(columnVOS);
+		});
+		CodeImportTemplateVO codeImportTemplateVO=new CodeImportTemplateVO();
+		codeImportTemplateVO.setCodeClassifyTemplateVO(templateVOList);
+		codeImportTemplateVO.setCloNamesList(columnVOList);
+		List<CodeImportTemplateVO> codeImportTemplateVOs= new ArrayList<>();
+
+		codeImportTemplateVOs.add(codeImportTemplateVO);
+		if(codeImportTemplateVOs.size()>0) {
+			bladeRedis.set(uuid, codeImportTemplateVOs);
+			bladeRedis.expire(uuid, BATCHADD_REDIS_TIME);//redis杩囨湡鏃堕棿
+		}
+	}
+	/**
+	 * 鎷疯礉涓氬姟绫诲瀷鍒癿ap
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @param map map
+	 */
+	public static void copyValueToMapFromCbos(ClientBusinessObject cbo,Map<String,String> map){
+		if(cbo!=null){
+			copyValueToMapFromBos(cbo,map);
+		}
+	}
+
+	/**
+	 * 鎷疯礉涓氬姟绫诲瀷鍒癿ap
+	 * @param bo 涓氬姟鏁版嵁
+	 * @param map map
+	 */
+	public static void copyValueToMapFromBos(ClientBusinessObject bo,Map<String,String> map){
+		if(bo!=null ){
+			//鍏堟妸鎵�鏈夌殑瀛楁鏄犲皠鎵惧埌
+			AttributeValue[] newAList = bo.newAttrValList;
+			AttributeValue[] hisAList = bo.hisAttrValList;
+			if(hisAList!=null&&hisAList.length>0){//
+				for(int i = 0 ; i < hisAList.length;i++){
+					AttributeValue av = hisAList[i];
+					String attrName = av.attrName.toLowerCase();
+					map.put(attrName, av.attrVal);
+				}
+			}
+			if(newAList!=null&&newAList.length>0){//NEW鐨勪紭鍏堢骇楂樹簺
+				for(int i = 0 ; i < newAList.length;i++){
+					AttributeValue av = newAList[i];
+					String attrName = av.attrName.toLowerCase();
+					map.put(attrName, av.attrVal);
+				}
+			}
+		}
+	}
 }

--
Gitblit v1.9.3