From 93c7226d536d312fc083a57619629192ba076413 Mon Sep 17 00:00:00 2001
From: xiejun <xj@2023>
Date: 星期五, 01 十二月 2023 12:36:50 +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 | 1394 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 835 insertions(+), 559 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 1bd7198..371139a 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,8 +1,11 @@
 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.toolkit.Wrappers;
+import com.google.protobuf.ServiceException;
+import com.vci.ubcs.code.applyjtcodeservice.feign.IMdmInterJtClient;
 import com.vci.ubcs.code.bo.AttributeValue;
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
@@ -11,6 +14,7 @@
 import com.vci.ubcs.code.entity.CodeAllCode;
 import com.vci.ubcs.code.enumpack.CodeDefaultLC;
 import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
+import com.vci.ubcs.code.enumpack.sysIntegrationPushTypeEnum;
 import com.vci.ubcs.code.lifecycle.CodeAllCodeLC;
 import com.vci.ubcs.code.mapper.CommonsMapper;
 import com.vci.ubcs.code.service.*;
@@ -34,6 +38,7 @@
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
 import com.vci.ubcs.starter.util.LocalFileUtil;
+import com.vci.ubcs.starter.util.SaveLogUtil;
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
 import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
@@ -53,6 +58,7 @@
 import org.springblade.core.redis.cache.BladeRedis;
 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,11 +69,13 @@
 import java.io.File;
 import java.io.IOException;
 import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
 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;
@@ -95,18 +103,25 @@
 
 	@Value("${batchadd.redis.time:6000000}")
 	public int BATCHADD_REDIS_TIME;
+
+	@Value("${batchadd.import_data_limit:5001}")
+	private Integer IMPORT_DATA_LIMIT;
+
 	/**
 	 * 涓婚搴撳垎绫荤殑鏈嶅姟
 	 */
 	@Resource
 	private ICodeClassifyService classifyService;
 
+	@Resource
+	private MdmEngineService mdmEngineService;
 
 	/**
 	 * 閫氱敤鏌ヨ
 	 */
 	@Resource
 	private CommonsMapper commonsMapper;
+
 	/****
 	 * 鐮佸�兼湇鍔�
 	 */
@@ -154,12 +169,21 @@
 	 */
 	@Autowired
 	private IBtmTypeClient btmTypeClient;
-
+	/***
+	 * 鐢宠闆嗗洟缂栫爜鏈嶅姟
+	 */
+	@Resource
+	private IMdmInterJtClient mdmInterJtClient;
 	/***
 	 * 瀵嗙骇鏈嶅姟
 	 */
 	@Resource
 	private IWebSecretClient secretService;
+	/**
+	 * 鏃ュ織淇濆瓨宸ュ叿绫�
+	 */
+	@Autowired
+	private SaveLogUtil saveLogUtil;
 
 	/**
 	 * 瀵煎嚭鐨勫崄涓囨潯
@@ -173,7 +197,7 @@
 	 * @return excel鐨勬枃浠跺湴鍧�
 	 */
 	@Override
-	public  String downloadTopImportExcel(String codeClassifyOid){
+	public String downloadTopImportExcel(String codeClassifyOid){
 		List<CodeClassifyTemplateVO> templateVOList=new ArrayList<>();
 		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘","瀵煎嚭鐨勯厤缃�",codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
 		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
@@ -340,10 +364,12 @@
 	@Override
 	public String createImportExcel(String codeClassifyOid, boolean isHistory) {
 		List<CodeClassifyTemplateVO> templateVOList=new ArrayList<>();
-
 		VciBaseUtil.alertNotNull("瀵煎嚭妯℃澘","瀵煎嚭鐨勯厤缃�",codeClassifyOid,"涓婚搴撳垎绫荤殑涓婚敭");
 
 		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
+
+		//鑾峰彇鐮佹瀹藉害
+		//String secWidth = getCodeSegmentWidth(codeClassifyVO.getOid());
 
 		if(isHistory){
 			templateVOList= templateService.childTemplates(codeClassifyOid);
@@ -383,17 +409,17 @@
 					&& (isHistory || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
 			).collect(Collectors.toList());
 
-				if (CollectionUtils.isEmpty(templateAttrVOS)) {
-					throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
-				}
+			if (CollectionUtils.isEmpty(templateAttrVOS)) {
+				throw new VciBaseException("妯℃澘娌℃湁閰嶇疆浠讳綍銆愯〃鍗曟樉绀恒�戜负銆愭槸銆戠殑灞炴��");
+			}
 
 			List<CodeClassifyTemplateAttrVO> idAttrVOList = codeClassifyTemplateVO.getAttributes().stream().filter(s -> s.getId().equalsIgnoreCase(CODE_FIELD)).collect(Collectors.toList());
 			LinkedList<WriteExcelData> excelDataList = new LinkedList<>();
 			Workbook workbook = new HSSFWorkbook();
 			if(isHistory){
-				excelDataList.add(new WriteExcelData(0,0,"鍒嗙被璺緞"));
-				excelDataList.add(new WriteExcelData(0,1,"鐮佹瀹藉害"));
-				excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"浼佷笟缂栫爜"));
+				excelDataList.add(new WriteExcelData(0,0,"鍒嗙被璺緞",""));
+				excelDataList.add(new WriteExcelData(0,1,"鐮佹瀹藉害",""));
+				excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"浼佷笟缂栫爜",idAttrVOList.get(0).getId()));
 			}
 			for (int i = 0; i < templateAttrVOS.size(); i++) {
 				CodeClassifyTemplateAttrVO attrVO = templateAttrVOS.get(i);
@@ -401,7 +427,7 @@
 				Object text = attrVO.getName();
 				text = exportKeyAndRequired(workbook,attrVO,text);
 				int colIndex = (isHistory?3:0) + i;
-				WriteExcelData excelData = new WriteExcelData(0, colIndex, text);
+				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())
@@ -458,6 +484,30 @@
 	}
 
 	/**
+	 * 鑾峰彇鐮佹瀹藉害
+	 * @param codeClassifyOid
+	 * @return
+	 */
+	private String getCodeSegmentWidth(String codeClassifyOid){
+		CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
+		// 瑕佽幏鍙栫爜娈靛搴︼紝鍏堣鑾峰彇瑙勫垯锛屽綋鍓嶆病鏈夊線涓婃壘
+		CodeRuleVO codeRuleByClassifyFullInfo = mdmEngineService.getCodeRuleByClassifyFullInfo(classifyService.getClassifyFullInfo(codeClassifyOid));
+		List<CodeBasicSecVO> secVOList = codeRuleByClassifyFullInfo.getSecVOList();
+		if(secVOList.isEmpty()){
+			return "";
+		}
+
+		StringBuffer secWidth = new StringBuffer("");
+
+		for (int j = 0; j < secVOList.size(); j++) {
+			CodeBasicSecVO secVO = secVOList.get(j);
+			int width = VciBaseUtil.getInt(secVO.getCodeSecLength()) + ((secVO.getPrefixCode() + secVO.getSuffixCode()).length());
+			secWidth.append(width).append("#");
+		}
+		return secWidth.toString().substring(0, secWidth.length() - 1);
+	}
+
+	/**
 	 * 瀵煎嚭鐨勬椂鍊欏皝瑁呭繀杈撳拰鍏抽敭灞炴��
 	 * @param attrVO 灞炴�х殑鏄剧ず瀵硅薄
 	 * @param text 鍗曞厓鏍肩殑鍊�
@@ -489,7 +539,6 @@
 		return text;
 	}
 
-
 	/**
 	 * 鎵归噺鐢宠缂栫爜鏁版嵁
 	 *
@@ -498,7 +547,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);
@@ -518,7 +567,7 @@
 		//鏍¢獙妯℃澘鏄笉鏄渶鏂扮殑
 		checkTemplateSync(sheetDataSetList,templateVO,0);
 		//鍏堜笉鐢ㄧ灞炴�ф槸鍚﹂兘瀛樺湪锛屽厛杞崲涓�涓嬫暟鎹�
-		Map<String,String> errorMap = new HashMap<>();
+		Map<String,String> errorMap = new ConcurrentHashMap<>();
 		String redisUUid=batchImportCodes(orderDTO,templateVO,dataSet,errorMap,true);
 		CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
 		List<String> needRowIndexList = new ArrayList<>();
@@ -532,7 +581,6 @@
 //		return null;
 		return codeImProtRusultVO;
 	}
-
 
 	/***
 	 * 浠庨《灞傛壒閲忕敵璇峰鍏ユ柟娉�
@@ -639,13 +687,12 @@
 
 			});
 
-
 			//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
 			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
 			//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
 			batchCheckRequiredAttrOnOrder(templateVO,allCboList,errorMap);
 			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, allCboList);
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, allCboList,errorMap);
 			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
 			if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
@@ -655,7 +702,7 @@
 			}
 			if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
 				keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+					errorMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex,"") );
 				});
 			}
 			//鍒嗙被娉ㄥ叆
@@ -713,10 +760,8 @@
 			createRedisDatas(uuid + "-ok",codeImprotDataVOS, newErrorMap,true);
 
 		});
+
 		//寰�鐗╁搧鑺傜偣涓婂姞妯℃澘
-
-
-
 		List<String> needRowIndexList=new ArrayList<>();
 		CodeImProtRusultVO codeImProtRusultVO = new CodeImProtRusultVO();
 		if(errorMap.size()>0) {
@@ -774,312 +819,333 @@
 	 */
 	@Override
 	public CodeImProtRusultVO batchImportHistoryData(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涓囨潯鐨勬暟鎹�");
-		}
-		Map<String,List<WriteExcelData>> shetNameMap=new HashMap<>();
-		//鐩镐技椤圭洰鏌ラ噸
-		String uuid=VciBaseUtil.getPk();
-		boolean isCreateUUid=false;
-		boolean isExport=false;
-		for(int i=0;i<sheetDataSetList.size()-1;i++) {
-			if (CollectionUtils.isEmpty(sheetDataSetList) || CollectionUtils.isEmpty(sheetDataSetList.get(i).getRowData())
-				|| sheetDataSetList.get(i).getRowData().size() < 1) {
-				continue;
+		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涓囨潯鐨勬暟鎹�");
 			}
-			//鍘嗗彶瀵煎叆鐨勬椂鍊欎笉澶勭悊缂栫爜
-			//----閫昏緫鍐呭----
-			//1. 鍒嗙被鐨勮矾寰勫彲浠ュ湪椤甸潰涓婇�夋嫨鏄垎绫荤紪鍙疯繕鏄垎绫荤殑鍚嶇О
-			//2. 鍒嗙被鐨勮矾寰勶紝蹇呴』鏄綋鍓嶅鍏ラ�夋嫨鐨勫垎绫荤殑鑺傜偣锛屼互鍙婂叾涓嬬骇鑺傜偣
-			//3. 閫氳繃鏁版嵁瑕佸鍏ョ殑鍒嗙被鍘绘煡鎵惧搴旂殑缂栫爜瑙勫垯
-			//4. 鏁版嵁瀛樺偍鍜屾壒閲忕敵璇蜂竴鏍凤紝
-			//5. 闇�瑕佸崟鐙鐞嗕紒涓氱紪鐮佺殑鍐呭锛�
-			//     5.1 浼佷笟缂栫爜鍦ㄥ綋鍓峞xcel閲屼笉鑳介噸澶�
-			//     5.2 浼佷笟缂栫爜鍦ㄧ郴缁熶腑涓嶈兘閲嶅锛堝彲浠ユ槸宸茬粡鍥炴敹鐨勶級
-			//     5.3 浼佷笟缂栫爜鐨勯暱搴︼紝鍜岀紪鐮佽鍒欑殑闀垮害瑕佸搴斾笂
-			//     5.4 鑾峰彇娴佹按鐮佹鐨勫�硷紝鍘婚櫎濉厖鐨勫瓧绗︼紝鐪嬫祦姘村彿鏄灏戯紝鐒跺悗灏嗘祦姘村彿鍜岀幇鍦ㄧ殑鏈�澶ф祦姘村彿鍒ゆ柇锛屽皬浜庡氨鐩存帴褰曞叆锛屽ぇ浜庡垯淇敼鏈�澶ф祦姘村彿
-			//     5.5 瀛樺偍浼佷笟缂栫爜鍒癮llcode涓�
-
-			//鏌ヨ鍒嗙被鍜屾ā鏉�
+			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);
-
-			//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
-			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);
+			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 (!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);
+				// 鍗曟瀵煎叆鏁伴噺闄愬埗
+				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涓�
+				//鏌ヨ鍒嗙被鍜屾ā鏉�
 
-			//妫�鏌ヨ鍒�
-			Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
-			List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
-			checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
-			//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+				//鍏堟壘鍒版瘡涓�琛岀殑鏍囬锛岀劧鍚庢牴鎹爣棰樻潵鑾峰彇瀵瑰簲鐨勫睘鎬�
+				SheetDataSet dataSet = sheetDataSetList.get(i);
+				List<SheetRowData> rowDataList = dataSet.getRowData();
 
-			//鎴戜滑鏍规嵁鍑洪敊鐨勫垎绫荤殑涓婚敭锛屽幓鎵捐鍙�
-			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, "") + ";鏍规嵁鍒嗙被璺緞瀵瑰簲鐨勫垎绫伙紝娌℃湁璁剧疆缂栫爜瑙勫垯");
+				//鎵剧涓�琛岋紝涓轰簡鎵炬爣棰�
+				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);
 					}
 				});
-			}
-
-			//鍒ゆ柇蹇呰緭椤�
-			batchCheckRequiredAttrOnOrder(templateVO, cboList, errorMap);
-
-			//鏈夐檺鏍¢獙缂栫爜鏄惁瀛樺湪
-			batchCheckIdExistOnOrder(templateVO, cboList, errorMap);
-
-			//boolean
-			reSwitchBooleanAttrOnOrder(attrVOS, cboList);
-
-			// 鏋氫妇鐨勫唴瀹归渶瑕佹牴鎹悕绉拌浆鎹负鏋氫妇鐨勫��
-			batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
-
-			batchSwitchReferAttrOnOrder(attrVOS, cboList, errorMap);
-			//6.澶勭悊鍒嗙被娉ㄥ叆
-			batchSwitchClassifyAttrOnOrder(attrVOS, cboList, classifyFullInfo,true);
-
-			//璁剧疆榛樿鍊�
-			batchSwitchAttrDefault(attrVOS, cboList);
-			//7.澶勭悊缁勫悎瑙勫垯
-			batchSwitchComponentAttrOnOrder(attrVOS, cboList);
-			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
-			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
-			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
-			if (!CollectionUtils.isEmpty(selfRepeatRowIndexList)) {
-				selfRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍦ㄥ綋鍓峞xcel鏂囦欢涓叧閿睘鎬ч噸澶�");
-				});
-			}
-			if (!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)) {
-				keyAttrRepeatRowIndexList.stream().forEach(rowIndex -> {
-					errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅");
-				});
-			}
-			//4.鏍¢獙瑙勫垯
-			batchCheckVerifyOnOrder(attrVOS, cboList, errorMap);
-
-			//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-			batchSwitchDateAttrOnOrder(attrVOS, cboList, errorMap);
-			if (CollectionUtils.isEmpty(ruleOidMap.values())) {
-				throw new VciBaseException("瀵煎叆鐨勬暟鎹墍閫夋嫨鐨勫垎绫婚兘娌℃湁璁剧疆缂栫爜瑙勫垯");
-			}
-			Map<String, CodeRuleVO> ruleVOMap = ruleService.listCodeRuleByIds(ruleOidMap.values(), true).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-			//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
-			Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
-			checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
-			ruleRowIndexMap.keySet().parallelStream().forEach(ruleOid -> {
-				List<String> rowIndexList = ruleRowIndexMap.get(ruleOid);
-				List<ClientBusinessObject> thisCbos = cboList.stream().filter(cbo -> rowIndexList.contains(cbo.getAttributeValue(IMPORT_ROW_INDEX)) && !errorMap.containsKey(cbo.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
-//鎴戜滑闇�瑕佸厛鏌ヨ涓�涓嬶紝鍐呭鏄惁宸茬粡瀛樺湪
-				if(!CollectionUtils.isEmpty(thisCbos)){
-					List<String> existIds = new ArrayList<>();
-					VciBaseUtil.switchCollectionForOracleIn(thisCbos).stream().forEach(cbos -> {
-						List<CodeAllCode> codeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCodeRuleOid, ruleOid)
-							.notIn(CodeAllCode::getId,cbos.stream().map(s -> s.getId()).collect(Collectors.toSet()).toArray(new String[0]))
-							.notIn(CodeAllCode::getLcStatus,CodeAllCodeLC.TASK_BACK.getValue() + "','" + CodeAllCodeLC.OBSOLETED.getValue())
-						);
-						existIds.addAll(Optional.ofNullable(codeAllCodeList).orElseGet(() -> new ArrayList<>()).stream().map(s -> {
-							String id = s.getId();
-							if (StringUtils.isBlank(id)) {
-								id = s.getId();
-							}
-							return id;
-						}).collect(Collectors.toList()));
+				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涓噸澶�;");
 					});
-					List<String> existIdCbos = thisCbos.stream().filter(s -> {
-						String id = s.getId();
-						if (StringUtils.isBlank(id)) {
-							id = s.getAttributeValue("id");
+				}
+				//鎴戜滑闇�瑕佸垽鏂繖浜涘垎绫荤殑妯℃澘鏄笉鏄竴鏍风殑锛屽彧闇�瑕佹牎楠岋紝涓嶇敤鑾峰彇
+				//妫�鏌ュ垎绫荤殑璺緞
+				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, "") + ";鏍规嵁鍒嗙被璺緞瀵瑰簲鐨勫垎绫伙紝娌℃湁璁剧疆缂栫爜瑙勫垯");
 						}
-						return existIds.contains(id);
-					}).map(s -> s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toList());
-					if (!CollectionUtils.isEmpty(existIdCbos)) {
-						thisCbos = thisCbos.stream().filter(s -> {
+					});
+				}
+
+				//鍒ゆ柇蹇呰緭椤�
+				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 !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 ArrayList<>();
-					thisCbos.stream().forEach(clientBusinessObject -> {
-						BaseModel baseModel=new BaseModel();
-						BeanUtil.convert(clientBusinessObject,baseModel);
-						//baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
-						dataCBOList.add(baseModel);
-						dataCBOIdList.add(baseModel);
-					});
-
-					if (!CollectionUtils.isEmpty(thisCbos)) {
-						try {
-							productCodeService.productCodeAndSaveData(classifyFullInfo, finalTemplateVO, ruleVOMap.get(ruleOid), null, dataCBOList);
-						} catch (Throwable e) {
-							log.error("鎵归噺浜х敓缂栫爜鐨勬椂鍊欏嚭閿欎簡", e);
-							thisCbos.stream().forEach(cbo -> {
-								String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
-								errorMap.put(rowIndex, errorMap.getOrDefault(rowIndex, "") + ";绯荤粺閿欒锛屽瓨鍌ㄦ暟鎹殑鏃跺�欏嚭閿欎簡");
+							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 + "銆戝湪绯荤粺涓凡缁忚鍗犵敤");
 							});
-
 						}
 					}
 				});
-				if (errorMap.size() > 0) {
-					isExport = true;
-				}
-				createWriteExcelData(rowDataList, errorMap, new ArrayList<>(), titleRowData, shetNameMap, finalTemplateVO);
-				engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
-			}
-		}
-		String excelFileName="";
-		if(isExport&&!CollectionUtils.isEmpty(shetNameMap)) {
-			excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "閿欒淇℃伅.xls";
-			WriteExcelOption eo = new WriteExcelOption();
-			shetNameMap.forEach((shetName, errorDataList) -> {
-				eo.addSheetDataList(shetName, errorDataList);
-			});
-			try {
-				new File(excelFileName).createNewFile();
-			} catch (IOException e) {
-				throw new VciBaseException(LangBaseUtil.getErrorMsg(e));
-			}
-			ExcelUtil.writeDataToFile(excelFileName, eo);
-		}
-		CodeImProtRusultVO codeImProtRusultVO=new CodeImProtRusultVO();
-		if(StringUtils.isNotBlank(excelFileName)) {
-			codeImProtRusultVO.setFilePath(excelFileName);
-			codeImProtRusultVO.setFileOid("");
-		}
-		if(isCreateUUid){
-			codeImProtRusultVO.setRedisUuid(uuid);
-		}
 
-		return codeImProtRusultVO;
+				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.getMessage());
+			throw e;
+		}
 	}
+
 	/*private void converBaseModels(List<ClientBusinessObject> clientBusinessObjects,List<BaseModel>dataCBOList){
 		clientBusinessObjects.stream().forEach(clientBusinessObject -> {
 			BaseModel baseModel=new BaseModel();
@@ -1093,6 +1159,7 @@
 		});
 
 	}*/
+
 	/***
 	 * 浠巈xecl閲屾瀯寤哄璞�
 	 * @param rowDataList
@@ -1132,7 +1199,6 @@
 	 * @param currentTemplateVO
 	 * @param templateColumnVOMap
 	 */
-
 	private void createTemplate(CodeClassifyTemplateVO currentTemplateVO,Map<String,List<ColumnVO>>templateColumnVOMap){
 
 		List<CodeClassifyTemplateAttrVO> templateAttrVOS = currentTemplateVO.getAttributes().stream().filter(s ->
@@ -1243,7 +1309,6 @@
 
 	}
 
-
 	/***
 	 * 鎵归噺澶勭悊鐢宠鏁版嵁
 	 * @param orderDTO
@@ -1251,140 +1316,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);
-		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.getMessage());
+			throw e;
 		}
 		return uuid;
 	}
@@ -1522,7 +1595,6 @@
 				total += commonsMapper.queryCountBySql(countSql);
 			}
 		}else{
-
 			total = commonsMapper.queryCountBySql(countSql);
 		}
 		List<String> selectFieldList = new ArrayList<>();
@@ -1722,7 +1794,7 @@
 			).collect(Collectors.toList());
 			String fullPath = getFullPath(classifyFullInfo);
 			excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList, codeClassifyTemplateVO,cboList,fullPath,!isImprot);
-			Map<String,String> errorMap=new HashMap<>();
+			Map<String,String> errorMap=new ConcurrentHashMap<>();
 			Map<String/**璺緞**/, CodeClassifyVO> pathMap=new HashMap<>() ;
 			//鏍¢獙缂栫爜瑙勫垯鍜岀爜娈垫槸鍚︽纭�
 			Map<String, List<String>> ruleRowIndexMap = new ConcurrentHashMap<>();
@@ -1743,7 +1815,8 @@
 				Map<String/**鍒嗙被涓婚敭**/, String/**瑙勫垯涓婚敭**/> ruleOidMap = new ConcurrentHashMap<String, String>();
 				List<String> unExistRuleClassifyOidList = new CopyOnWriteArrayList<>();
 				checkRuleOidInHistory(classifyVOMap, ruleOidMap, unExistRuleClassifyOidList);
-				ruleVOMap = ruleService.listCodeRuleByIds(ruleOidMap.values(), true).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+				// TODO	鏀圭敤oid鏌ヨ鐨勶紝杩欏効涓嶈鐢╥d
+				ruleVOMap = ruleService.listCodeRuleByOids(ruleOidMap.values()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
 
 				checkSecLengthInHistory(cboList, classifyVOMap, ruleVOMap, ruleOidMap, errorMap, ruleRowIndexMap);
 			}
@@ -1766,12 +1839,12 @@
 			//鏈�鍚庡紕缁勫悎瑙勫垯
 			batchSwitchComponentAttrOnOrder(attrVOS,cboList);
 			//3.鍒ゆ柇鍏抽敭灞炴��
-			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, codeClassifyTemplateVO, cboList);
+			CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, codeClassifyTemplateVO, cboList,errorMap);
 			Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 			Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
 			if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
 				keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+					errorMap.put(rowIndex,"鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorMap.getOrDefault(rowIndex,""));
 				});
 			}
 			//4.鏍¢獙瑙勫垯
@@ -1900,7 +1973,7 @@
 	 */
 	@Override
 	public void batchSyncApplyCode(CodeOrderDTO orderDTO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs,boolean isCodeOrGroupCode) {
-		Map<String,String> errorMap=new HashMap<>();
+		Map<String,String> errorMap=new ConcurrentHashMap<>();
 		VciBaseUtil.alertNotNull(orderDTO,"缂栫爜鐢宠鐩稿叧鐨勬暟鎹�",orderDTO.getCodeClassifyOid(),"涓婚搴撳垎绫讳富閿�");
 		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
 		//瑙勫垯鐨勪富閿渶瑕佸幓鑾峰彇
@@ -1932,7 +2005,8 @@
 			&& com.alibaba.cloud.commons.lang.StringUtils.isBlank(s.getComponentRule()) && com.alibaba.cloud.commons.lang.StringUtils.isBlank(s.getClassifyInvokeAttr())//缁勫悎瑙勫垯鍜屽垎绫绘敞鍏ョ‘瀹炴病缁欑敤鎴峰鍑哄幓
 		).collect(Collectors.toList());
 		if(!CollectionUtils.isEmpty(unExistAttrVOs)){
-			throw new VciBaseException("銆�" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "銆戣繖浜涘睘鎬у湪excel涓病鏈夋壘鍒�");
+			String message=unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(SERIAL_UNIT_SPACE));
+			throw new VciBaseException("銆�" + message + "銆戣繖浜涘睘鎬у湪excel涓病鏈夋壘鍒�");
 		}
 		List<ClientBusinessObject> cboList = new ArrayList<>();
 		String fullPath = getFullPath(classifyFullInfo);
@@ -1948,20 +2022,34 @@
 
 		//閮借浆鎹㈠畬浜嗐�傞渶瑕佹壒閲忔鏌�
 		//濡傛灉鍑洪敊浜嗭紝鎴戜滑渚濈劧鎵ц鏈夋晥鐨勬暟鎹紝鏃犳晥鐨勬暟鎹啓鍥炲埌excel涓�
+
+		Map<String,String> errorKeyMap=new HashMap<>();
+		//1.鍒嗙被娉ㄥ叆
+		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
+		//boolean
+		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
+		// cboList.stream().forEach(cbo->{
+		//2.鏍¢獙瑙勫垯
+		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
+		//3.鏍¢獙鏋氫妇鏄惁姝g‘
+		batchSwitchEnumAttrOnOrder(attrVOS,cboList,errorMap);
+		//4.鏃堕棿鏍煎紡鐨勯獙璇�
+		//4.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
+		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
+		//5.澶勭悊鍙傜収鐨勬儏鍐�
+		batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
+		//6璁剧疆榛樿鍊�
+		batchSwitchAttrDefault(attrVOS, cboList);
 		//2.鍒ゆ柇蹇呰緭椤广�傘�傞渶瑕佸叏閮ㄧ殑灞炴�э紝濡傛灉鏄繀杈擄紝浣嗘槸琛ㄥ崟閲岄潰涓嶆樉绀虹殑锛屽彧鑳芥槸鍒嗙被娉ㄥ叆鎴栬�呯粍鍚堣鍒�
 		batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
-
-
-		/**
-		 * 鍏抽敭鐔熸倝閿欒鎻愮ず
-		 */
-		Map<String,String> errorKeyMap=new HashMap<>();
-
-
+		//鏈�鍚庡紕缁勫悎瑙勫垯
+		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
 		//3.鍒ゆ柇鍏抽敭灞炴��
-		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
+		CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList,errorKeyMap);
 		Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
 		Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
+
+		Map<String,List<String>>keyAttrOkOidTORepeatOidMap= keyResultVO.getKeyAttrOkOidTORepeatOidMap();
 		if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
 			selfRepeatRowIndexList.stream().forEach(rowIndex->{
                /* //浼犲叆鏁版嵁涔嬮棿鍏抽敭灞炴�х殑鏍¢獙
@@ -1990,23 +2078,13 @@
                 resultDataObjectDetailDO.setMsg(errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
                 resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
                 */
-				errorKeyMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅" );
+				Map<String, List<BaseModel>> indexTODataMap=keyResultVO.getIndexTODataMap();
+				if(indexTODataMap.containsKey(rowIndex)){
+					List<BaseModel> baseModelList= indexTODataMap.get(rowIndex);
+				}
+				errorKeyMap.put(rowIndex, "鍏抽敭灞炴�т笌绯荤粺涓殑閲嶅;" + errorKeyMap.getOrDefault(rowIndex,""));
 			});
 		}
-		//鍒嗙被娉ㄥ叆
-		batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
-		//boolean
-		reSwitchBooleanAttrOnOrder(attrVOS,cboList);
-		// cboList.stream().forEach(cbo->{
-		//4.鏍¢獙瑙勫垯
-		batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
-		//5.鏍¢獙鏋氫妇鏄惁姝g‘
-		batchSwitchEnumAttrOnOrder(attrVOS,cboList,errorMap);
-		//6.鏃堕棿鏍煎紡鐨勯獙璇�
-		//6.鏃堕棿鐨勶紝蹇呴』缁熶竴涓簓yyy-MM-dd HH:mm:ss
-		batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
-		//7.澶勭悊鍙傜収鐨勬儏鍐�
-		batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
 		//鏍¢獙灞炴�ф槸鍚︽纭敊璇俊鎭�
 		if(errorMap.size()>0){
 			String[] newMsg = {""};
@@ -2049,49 +2127,54 @@
 				Map<String, List<BaseModel>> indexTodataMap = keyResultVO.getIndexTODataMap();
 				cboList.stream().forEach(cbo -> {
 					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					String msg = errorKeyMap.get(rowIndex);
 					if (indexTodataMap.containsKey(rowIndex)) {
 						String oid = cbo.getOid();
 						String sourceOid = oid;
 						String code = "";
-						String groupCode="";
 						String errorid = "201";
 						if(codeOidToSystemOidMap.containsKey(oid)){
 							sourceOid=codeOidToSystemOidMap.get(oid);
 						}
 						List<BaseModel> newCboList = indexTodataMap.get(rowIndex);
 						if (!CollectionUtils.isEmpty(newCboList)) {
-							BaseModel newCbo= newCboList.get(0);
-							String lcstatus =newCbo.getLcStatus();
-							String newOid =newCbo.getOid();
-							Date ts =newCbo.getTs();
-							groupCode=newCbo.getData().get("GROUPCODE");
-							code=newCbo.getId();
-							String lastmodifier=newCbo.getLastModifier();
-							if (lcstatus!=null&&!lcstatus.equals(CodeDefaultLC.RELEASED.getValue())) {
-								newCbo.setOid(newOid);
-								newCbo.setLastModifier(lastmodifier);
-								/*if(isCodeOrGroupCode) {
-									newCbo.setId(code);
-								}else{
-									newCbo.getData().put("groupcode",groupCode);
-								}*/
-								newCbo.setTs(ts);
-								cbo.setLastModifier(cbo.getLastModifier());
-								editBoList.add(newCbo);
-							}
-							String mes = errorKeyMap.get(rowIndex);
-							XMLResultDataObjectDetailDO resultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
-							if(isCodeOrGroupCode) {
-								if(StringUtils.isBlank(groupCode)){
-									mes+="锛涚瓑寰呴泦鍥㈢紪鐮佽祴鍊�";
+							//澶勭悊鍏抽敭灞炴�ф煡鍑哄鏉$殑璇濓紝鏍规嵁闆嗘垚璋冪敤鐨勫綋鍓嶅垎绫讳唬鍙峰彇褰撳墠鍒嗙被鐨勭爜鍊笺��
+							Map<String/**缂栫爜**/, BaseModel/**閲嶅缂栫爜鏁版嵁**/> classOidTOBaseModelMap = new HashMap<>();
+								newCboList.stream().forEach(baseModel->{
+									String codeclsfid=baseModel.getData().get(CODE_CLASSIFY_OID_FIELD.toUpperCase(Locale.ROOT));
+									classOidTOBaseModelMap.put(codeclsfid,baseModel);
+								});
+							String codeclsfid= classifyFullInfo.getCurrentClassifyVO().getOid();
+							if(classOidTOBaseModelMap.containsKey(codeclsfid)){
+								BaseModel newCbo= classOidTOBaseModelMap.get(codeclsfid);
+								String lcstatus =newCbo.getLcStatus();
+								String newOid =newCbo.getOid();
+								Date ts =newCbo.getTs();
+								code = StringUtils.isBlank(newCbo.getId())?"":newCbo.getId();
+								if(isCodeOrGroupCode) {
+									code=newCbo.getData().getOrDefault("GROUPCODE","");
+									if(StringUtils.isBlank(code)){
+										errorid="1";
+										msg="锛涚敵璇风殑缂栫爜绫诲瀷涓洪泦鍥㈢爜锛岀瓑寰呴泦鍥㈢紪鐮佽祴鍊�";
+									}
 								}
-								resultDataObjectDetailDO.setCode(groupCode);
+								String lastmodifier=newCbo.getLastModifier();
+								if (lcstatus!=null&&!lcstatus.equals(CodeDefaultLC.RELEASED.getValue())) {
+									newCbo.setOid(newOid);
+									newCbo.setLastModifier(lastmodifier);
+									newCbo.setTs(ts);
+									cbo.setLastModifier(cbo.getLastModifier());
+									editBoList.add(newCbo);
+								}
 							}else{
-								resultDataObjectDetailDO.setCode(code);
+								errorid="205";
+								msg+="锛涚紪鐮佸垯灞炰簬鍏朵粬鍒嗙被銆�";
 							}
+							XMLResultDataObjectDetailDO resultDataObjectDetailDO = new XMLResultDataObjectDetailDO();
+							resultDataObjectDetailDO.setCode(code);
 							resultDataObjectDetailDO.setId(sourceOid);
 							resultDataObjectDetailDO.setErrorid(errorid);
-							resultDataObjectDetailDO.setMsg(mes);
+							resultDataObjectDetailDO.setMsg(msg);
 
 							resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
 						}
@@ -2106,10 +2189,7 @@
 		}
 
 		//  });
-		//璁剧疆榛樿鍊�
-		batchSwitchAttrDefault(attrVOS, cboList);
-		//鏈�鍚庡紕缁勫悎瑙勫垯
-		batchSwitchComponentAttrOnOrder(attrVOS,cboList);
+
 		//瑕佹妸浠ヤ笂鐨勯敊璇殑閮芥姏鍑哄悗锛屽啀缁х画澶勭悊鏃堕棿鍜岀粍鍚堣鍒�
 		List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
 			String rowIndex =cbo.getAttributeValue(IMPORT_ROW_INDEX);
@@ -2125,27 +2205,46 @@
 			needSaveCboList.stream().forEach(clientBusinessObject -> {
 				BaseModel baseModel=new BaseModel();
 				BeanUtil.convert(clientBusinessObject,baseModel);
-			//(VciBaseUtil.objectToMapString(clientBusinessObject));
+				//(VciBaseUtil.objectToMapString(clientBusinessObject));
 				dataCBOList.add(baseModel);
 				allNeedSaveCboList.add(baseModel.getOid());
 			});
 			try {
+				List<String>applyGroupCodeIdList=new ArrayList<>();
 				productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), dataCBOList);
 				//濡傛灉鏄紪鐮佺敓鎴愬け璐ワ紝鍒欑洿鎺ュ氨澶辫触浜嗭紝鍏朵粬鐨勫垽鏂嚭鏉ユ湁閿欒鐨勬垜浠兘缁熶竴杩斿洖鍒癳xcel閲岄潰
 				engineService.batchSaveSelectChar(templateVO, dataCBOList);
 				// if(!isProcess){
 				dataCBOList.stream().forEach(needSaveCbo->{
+
 					XMLResultDataObjectDetailDO resultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
-					resultDataObjectDetailDO.setCode(needSaveCbo.getId());
+					String code=StringUtils.isBlank(needSaveCbo.getId())?" ":needSaveCbo.getId();
+					String groupCode=needSaveCbo.getData().getOrDefault("GROUPCODE"," ");
+					//resultDataObjectDetailDO.setCode(needSaveCbo.getId());
+					String msg="鐢宠缂栫爜鎴愬姛";
 					String oid=needSaveCbo.getOid();
 					String sourceOid=oid;
+					applyGroupCodeIdList.add(oid);
 					if(codeOidToSystemOidMap.containsKey(oid)){
 						sourceOid=codeOidToSystemOidMap.get(oid);
 					}
+					if(isCodeOrGroupCode) {
+						if(StringUtils.isBlank(groupCode)){
+							resultDataObjectDetailDO.setErrorid("1");
+							msg="鐢宠鐨勭紪鐮佺被鍨嬩负闆嗗洟鐮侊紝绛夊緟闆嗗洟缂栫爜璧嬪��";
+						}
+						resultDataObjectDetailDO.setCode(groupCode);
+					}else{
+						resultDataObjectDetailDO.setCode(code);
+						resultDataObjectDetailDO.setErrorid("0");
+					}
 					resultDataObjectDetailDO.setId(sourceOid);
-					resultDataObjectDetailDO.setErrorid("0");
-					resultDataObjectDetailDO.setMsg("鐢宠缂栫爜鎴愬姛");
+
+					resultDataObjectDetailDO.setMsg(msg);
 					resultDataObjectDetailDOs.add(resultDataObjectDetailDO);
+					//澶勭悊浼犻�佺殑鏁版嵁涓叧閿睘鎬ч噸澶嶇殑锛岀洿鎺ユ嬁鍒板凡缁忕敵璇峰埌缂栫爜鐨勬暟鎹紪鐮佺洿鎺ュ皢璧嬬粰鍏抽敭灞炴�ч噸澶嶇殑鏁版嵁
+					LinkedList<XMLResultDataObjectDetailDO> repeatDataObjectDetailDOS=handleApplyDataKeyAttrRepeat(keyAttrOkOidTORepeatOidMap,codeOidToSystemOidMap,needSaveCbo,isCodeOrGroupCode);
+					resultDataObjectDetailDOs.addAll(repeatDataObjectDetailDOS);
 				});
                /* }else{
                     needSaveCboList.stream().forEach(needSaveCbo->{
@@ -2163,6 +2262,13 @@
                     });
 
                 }*/
+				//鏄惁璋冪敤闆嗗洟鎺ュ彛鐢宠鎺ュ彛
+				if(isCodeOrGroupCode){
+					if(!CollectionUtils.isEmpty(applyGroupCodeIdList)) {
+						this.sendApplyGroupcode(applyGroupCodeIdList, classifyFullInfo.getTopClassifyVO().getId(), sysIntegrationPushTypeEnum.ACCPET_APPCODE.getValue());
+					}
+				}
+
 			}catch (Throwable e){
 				e.printStackTrace();
 				needSaveCboList.stream().forEach(needSaveCbo->{
@@ -2185,14 +2291,60 @@
 	}
 
 	/***
+	 *缁欏悓涓�鎵圭敵璇风紪鐮佸瓨鍦ㄥ叧閿睘鎬х殑鏁版嵁璧嬩笂涓�鑷寸紪鐮�
+	 * @param keyAttrOkOidTORepeatOidMap 涓�鎵圭敵璇锋暟鎹叧閿睘鎬т竴鑷寸殑閲嶅鏁版嵁鏄犲皠鍏崇郴
+	 * @param codeOidToSystemOidMap
+	 * @param needSaveCbo
+	 * @param isCodeOrGroupCode
+	 */
+	private LinkedList<XMLResultDataObjectDetailDO> handleApplyDataKeyAttrRepeat(Map<String,List<String>>keyAttrOkOidTORepeatOidMap,Map<String,String> codeOidToSystemOidMap,BaseModel needSaveCbo,boolean isCodeOrGroupCode){
+		LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs=new LinkedList<>();
+		String oid=needSaveCbo.getOid();
+		if(keyAttrOkOidTORepeatOidMap.containsKey(oid)){
+			List<String> repeatOidList= keyAttrOkOidTORepeatOidMap.get(oid);
+			if(!CollectionUtils.isEmpty(repeatOidList)){
+				String sourceNewOid=needSaveCbo.getOid();
+				String sourceOid=sourceNewOid;
+				if(codeOidToSystemOidMap.containsKey(oid)){
+					sourceOid=codeOidToSystemOidMap.get(oid);
+				}
+				String code=StringUtils.isBlank(needSaveCbo.getId())?" ":needSaveCbo.getId();
+				String groupCode=needSaveCbo.getData().getOrDefault("GROUPCODE"," ");
+				String finalSourceOid = sourceOid;
+				repeatOidList.stream().forEach(repeatOid->{
+					if(codeOidToSystemOidMap.containsKey(repeatOid)){
+						XMLResultDataObjectDetailDO repeatresultDataObjectDetailDO=new XMLResultDataObjectDetailDO();
+						String repeatSourceOid=codeOidToSystemOidMap.get(repeatOid);
+						String repeatMsg="姝ゆ暟鎹笌鐢宠鐨勭紪鐮佹暟鎹甶d涓恒��"+ finalSourceOid +"銆戠殑鍏抽敭灞炴�т竴鑷达紝鍒欏彇鐩稿悓缂栫爜";
+						if(isCodeOrGroupCode) {
+							if(StringUtils.isBlank(groupCode)){
+								repeatMsg="鐢宠鐨勭紪鐮佺被鍨嬩负闆嗗洟鐮侊紝绛夊緟闆嗗洟缂栫爜璧嬪��";
+							}
+							repeatresultDataObjectDetailDO.setCode(groupCode);
+						}else{
+							repeatresultDataObjectDetailDO.setCode(code);
+						}
+						repeatresultDataObjectDetailDO.setId(repeatSourceOid);
+						repeatresultDataObjectDetailDO.setErrorid("0");
+						repeatresultDataObjectDetailDO.setMsg(repeatMsg);
+						resultDataObjectDetailDOs.add(repeatresultDataObjectDetailDO);
+					}
+				});
+			}
+		}
+		return  resultDataObjectDetailDOs;
+	}
+
+	/***
 	 * 闆嗘垚鎵归噺鍚屾鏇存柊鎺ュ彛
 	 * @param codeClassifyVO;
 	 * @param dataObjectVO 鏁版嵁淇℃伅
 	 * @param resultDataObjectDetailDOs 閿欒淇℃伅
+	 * @param isCodeOrGroupCode 鏄惁鏇撮泦鍥㈢郴缁熸暟鎹�
 	 */
 	@Transactional(rollbackFor = VciBaseException.class)
 	@Override
-	public void batchSyncEditDatas(CodeClassifyVO codeClassifyVO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs) {
+	public void batchSyncEditDatas(CodeClassifyVO codeClassifyVO, DataObjectVO dataObjectVO, LinkedList<XMLResultDataObjectDetailDO> resultDataObjectDetailDOs,boolean isCodeOrGroupCode) {
 		String errorid="";
 		String msg="";
 		//鏌ヨ鍒嗙被鍜屾ā鏉�
@@ -2217,8 +2369,8 @@
 		List<String> titleRowData = dataObjectVO.getColName();
 		Map<String/**涓枃鍚嶇О**/, String/**鑻辨枃鍚嶇О**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT), (o1, o2) -> o2));
 		getFieldIndexMap(titleRowData, attrNameIdMap, fieldIndexMap);
-		Map<String, String> cboOidMap = new HashMap<>();
-		cboOidMap.put("id", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])) + ")");
+		//Map<String, String> cboOidMap = new HashMap<>();
+		//cboOidMap.put("id", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])) + ")");
 		String tableName ="";
 		try {
 			R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(templateVO.getBtmTypeId());
@@ -2248,15 +2400,26 @@
 		sb.append(" select * from ");
 		sb.append(tableName);
 		sb.append(" where 1=1 ");
-		sb.append(" id in (");
-		sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
-		sb.append(")");
+		sb.append(" and lastr=1 and lastv=1" );
+		if(isCodeOrGroupCode) {
+			sb.append(" and ( groupcode in (");
+			sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
+			sb.append(")");
+			sb.append(" or id in (");
+			sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
+			sb.append("))");
+		}else{
+			sb.append(" and id in (");
+			sb.append(VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])));
+			sb.append(")");
+		}
+
 		List<Map<String,String>> dataMapList=commonsMapper.queryByOnlySqlForMap(sb.toString());
 		List<ClientBusinessObject> cboList=	ChangeMapTOClientBusinessObjects(dataMapList);
 		Map<String, ClientBusinessObject> codeSystemObjectMap = cboList.stream().filter(systeDataObject -> systeDataObject != null && StringUtils.isNotBlank(systeDataObject.getId())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getId(), t -> t));
 		Map<String, String> errorMap = new HashMap<>();
 		List<CodeOrderDTO> codeOrderDTOList = new ArrayList<>();
-		this.getCodeOrderDTOs(codeClassifyVO, templateVO, codeDataMap, codeSystemObjectMap, codeOrderDTOList, errorMap);
+		this.getCodeOrderDTOs(codeClassifyVO, templateVO, codeDataMap, codeSystemObjectMap, codeOrderDTOList, errorMap,isCodeOrGroupCode);
 		// List<CodeClassifyProcessTempVO> codeClassifyProcessTempVOS=codeClassifyProcessTempService.listProcessTemplate(templateVO.getOid(),"code_cls_flow_use_order");
 		boolean isProcess=false;
 		/**  if(!CollectionUtils.isEmpty(codeClassifyProcessTempVOS)){
@@ -2277,8 +2440,9 @@
 			String dataStatus=cbo.getLcStatus();
 			RowDatas rowData=codeDataMap.get(code);
 			String status=rowData.getStatus();
+			String lastModifier= rowData.getEditor();
 			String operation=rowData.getOperation();
-			if (cbo.getTs().compareTo(orderDTO.getTs())==0?true:false) {
+			if (cbo.getTs().compareTo(orderDTO.getTs())==0?false:true) {
 				// throw new VciBaseException("鏁版嵁涓嶆槸鏈�鏂扮殑锛屽彲鑳戒粬浜哄凡缁忎慨鏀癸紝璇峰埛鏂板悗鍐嶈瘯");
 				errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+";鏁版嵁涓嶆槸鏈�鏂扮殑锛屽彲鑳戒粬浜哄凡缁忎慨鏀癸紝璇峰埛鏂板悗鍐嶈瘯");
 			}
@@ -2286,20 +2450,20 @@
                 throw new VciBaseException("鏁版嵁涓嶆槸{0}鐨勭姸鎬侊紝涓嶅厑璁镐慨鏀�", new String[]{CodeDefaultLC.EDITING.getText()});
             }*/
 			if(operation.equals("update")) {
-				//1. 鍒ゆ柇蹇呰緭椤�
-				checkRequiredAttrOnOrder(templateVO, orderDTO, errorMap);
-				//2.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
+				//1.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
 				switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO, errorMap);
-				//3.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
+				//2.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
 				switchComponentAttrOnOrder(templateVO, orderDTO);
-				//4.鏍¢獙瑙勫垯
+				//3.鏍¢獙瑙勫垯
 				checkVerifyOnOrder(templateVO, orderDTO, errorMap);
-				//5.鍒ゆ柇鍏抽敭灞炴��
-				checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO, errorMap);
-				//6.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
+				//4.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
 				checkEnumOnOrder(templateVO, orderDTO, errorMap);
-				//7.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
+				//5.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
 				switchDateAttrOnOrder(templateVO, orderDTO);
+				//6. 鍒ゆ柇蹇呰緭椤�
+				checkRequiredAttrOnOrder(templateVO, orderDTO, errorMap);
+				//7.鍒ゆ柇鍏抽敭灞炴��
+				checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO, errorMap);
 				//榛樿鐨勫唴瀹逛笉鑳藉彉锛屾墍浠ュ彧闇�瑕佹嫹璐濊嚜瀹氫箟鐨勭浉鍏冲睘鎬у嵆鍙�
 				copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, true, errorMap);
 				//浼佷笟鐮佸拰闆嗗洟鐮佺殑涓嶄慨鏀�
@@ -2307,12 +2471,20 @@
 				cbo.setName(orderDTO.getName());
 				try {
 					cbo.setAttributeValueWithNoCheck("description", orderDTO.getDescription());
-					cbo.setAttributeValue("name", orderDTO.getName());
+				//	cbo.setAttributeValue("name", orderDTO.getName());
 					//  if(finalIsProcess){//鍦ㄦ祦绋嬩腑涓嶅厑璁告洿鏀�
 					//     errorMap.put(code,errorMap.getOrDefault(code, errorMap.getOrDefault(code,"")+";鏁版嵁"+code+"鍦ㄦ祦绋嬩腑锛屼笉鍏佽鏇存敼!"));
 					//  }else{
+					Date date=new Date();
 					cbo.setLcStatus(status);
 					cbo.setAttributeValue("lcstatus",status);
+					cbo.setLastModifyTime(date);
+					cbo.setLastModifier(lastModifier);
+					cbo.setLastModifyTime(date);
+					cbo.setAttributeValue("lastmodifier",lastModifier);
+					cbo.setAttributeValue("lastmodifytime",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date));
+					cbo.setTs(date);
+					cbo.setAttributeValue("ts",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(date));
 					//  }
 				} catch (VciBaseException e) {
 					e.printStackTrace();
@@ -2320,7 +2492,7 @@
 
 				List<CodeAllCode>newCodeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
 				if (!CollectionUtils.isEmpty(newCodeAllCodeList)) {
-					CodeAllCode codeCbo = codeAllCodeList.get(0);
+					CodeAllCode codeCbo = newCodeAllCodeList.get(0);
 					log.info("codeCbos code:" + codeCbo.getId());
 					codeCbo.setLcStatus(status);
 					codeAllCodeList.add(codeCbo);
@@ -2339,7 +2511,7 @@
 					List<CodeAllCode>newCodeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
 					log.info("codeCbos size:" + newCodeAllCodeList.size());
 					if (!CollectionUtils.isEmpty(newCodeAllCodeList)) {
-						CodeAllCode codeCbo = codeAllCodeList.get(0);
+						CodeAllCode codeCbo = newCodeAllCodeList.get(0);
 						log.info("codeCbos code:" + codeCbo.getId());
 						codeCbo.setLcStatus(CodeDefaultLC.TASK_BACK.getValue());
 						codeAllCodeList.add(codeCbo);
@@ -2397,9 +2569,19 @@
 			//瀛樺偍鏁版嵁
 			try {
 				engineService.updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(),updateList);
-				codeAllCodeService.saveBatch(codeAllCodeList);
+				codeAllCodeService.saveOrUpdateBatch(codeAllCodeList);
 				if(deleteList.size()>0) {
 					commonsMapper.deleteByTaleAndOid(tableName, VciBaseUtil.array2String(deleteList.toArray(new String[]{})));
+				}
+				//鏄惁璋冪敤闆嗗洟鎺ュ彛鐢宠鎺ュ彛
+				if(isCodeOrGroupCode){
+					List<String> IdList=resultDataObjectDetailDOs.stream().filter(xMLResultDataObjectDetailDO-> com.alibaba.cloud.commons.lang.StringUtils.isNotBlank(xMLResultDataObjectDetailDO.getId())).map(XMLResultDataObjectDetailDO::getId).distinct().collect(Collectors.toList());
+
+
+
+					if(!CollectionUtils.isEmpty(IdList)) {
+						this.sendApplyGroupcode(IdList, classifyFullInfo.getTopClassifyVO().getBtmTypeId(),sysIntegrationPushTypeEnum.ACCPET_EDITCODE.getValue());
+					}
 				}
 				errorid="0";
 				msg="鏇存柊/鐘舵�佹洿鏀�/鍒犻櫎鎴愬姛锛�";
@@ -2448,6 +2630,7 @@
 			});
 		}
 	}
+
 	/**
 	 * 杞崲缁勫悎瑙勫垯鐨勫��
 	 *
@@ -2494,6 +2677,7 @@
 			});
 		}
 	}
+
 	/**
 	 * 鏍¢獙鍏抽敭灞炴��
 	 *
@@ -2522,29 +2706,55 @@
 		});
 
 		//娌℃湁闄愬埗鍒嗙被锛屼絾鏄竴涓ā鏉垮彧鍙兘鍦ㄤ竴涓笟鍔$被鍨嬮噷闈紝鎵�浠ョ洿鎺ユ煡璇㈣繖涓笟鍔$被鍨嬪嵆鍙�
-
 		if (!CollectionUtils.isEmpty(conditionMap)) {
-			final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmTypeId()) + " where 1 = 1 "};
+			String tableName="";
+			R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(templateVO.getBtmTypeId());
+			if(r.isSuccess()) {
+				BtmTypeVO btmTypeVO = r.getData();
+				if (btmTypeVO != null) {
+					tableName = btmTypeVO.getTableName();
+
+				}
+			}
+			if (StringUtils.isBlank(tableName)) {
+				String errormsg="鏍规嵁涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿叧涓氬姟琛�";
+				errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+errormsg);
+				return;
+			}
+			//final String[] sql = {"select count(*) from " + tableName + " t where 1 = 1 "};
+			final String[] sql = {"select t.id from " + tableName + " t where 1 = 1 "};
 			conditionMap.forEach((key, value) -> {
-				sql[0] += " and " + key + " = " + value;
+				if(StringUtils.isBlank(value)||value.equals(QueryOptionConstant.ISNULL)){
+					sql[0] += " and " + key + " is null ";
+				}else{
+					sql[0] += " and " + key + " = " + value;
+				}
+
 			});
 			if (StringUtils.isNotBlank(orderDTO.getOid())) {
 				//淇敼鐨勬椂鍊欙紝闇�瑕佹帓闄よ嚜宸�
-				sql[0] += " and oid != '" + orderDTO.getOid() + "'";
+				sql[0] += " and t.oid != '" + orderDTO.getOid() + "'";
 			} else if (StringUtils.isNotBlank(orderDTO.getCopyFromVersion())) {
-				sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
+				sql[0] += " and t.oid != '" + orderDTO.getCopyFromVersion() + "'";
 			}
-			sql[0] += " and lastR = '1' and lastV = '1' ";
-			if (commonsMapper.queryCountBySql(sql[0]) > 0) {
+			// 涓嶉渶瑕佸弬涓庢牎楠岀殑瑙勫垯oid
+			String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
+			if(Func.isNotBlank(isParticipateCheckOids)){
+				sql[0] += " and codeclsfid not in("+isParticipateCheckOids+")";
+			}
+			sql[0] += " and t.lastR = '1' and t.lastV = '1' ";
+			List<String> repeatData = commonsMapper.selectList(sql[0]);
+			if (!repeatData.isEmpty()) {
 				String ruleInfoMsg = keyRuleVO == null ? "" : "鏌ヨ瑙勫垯锛氬幓闄ょ┖鏍�--{0},蹇界暐澶у皬鍐�--{1},蹇界暐鍏ㄥ崐瑙�--{2},蹇界暐鍏ㄩ儴绌烘牸--{3}";
 				String[] objs = new String[]{trim ? "鏄�" : "鍚�", ignoreCase ? "鏄�" : "鍚�", ignoreWidth ? "鏄�" : "鍚�", trimAll ? "鏄�" : "鍚�"};
-				String defaultValue=";鏍规嵁鎮ㄥ~鍐欑殑鍏抽敭灞炴�х殑鍐呭锛岀粨鍚堝叧閿睘鎬ф煡璇㈣鍒欙紝鍙戠幇杩欎釜鏁版嵁宸茬粡鍦ㄧ郴缁熶腑瀛樺湪浜嗐�傝淇!銆�";
+				String defaultValue=";鏍规嵁鎮ㄥ~鍐欑殑鍏抽敭灞炴�х殑鍐呭锛岀粨鍚堝叧閿睘鎬ф煡璇㈣鍒欙紝鍙戠幇杩欎釜鏁版嵁宸茬粡鍦ㄧ郴缁熶腑瀛樺湪浜�,鏁版嵁鐨勭紪鍙峰涓嬶細"+repeatData.stream().collect(Collectors.joining(","))+"銆傝淇!銆�";
 				String errormsg=defaultValue+ MessageFormat.format(ruleInfoMsg, objs);
 				errorMap.put(orderDTO.getId(),errorMap.getOrDefault(orderDTO.getId(),"")+errormsg);
 				// throw new VciBaseException("鏍规嵁鎮ㄥ~鍐欑殑鍏抽敭灞炴�х殑鍐呭锛岀粨鍚堝叧閿睘鎬ф煡璇㈣鍒欙紝鍙戠幇杩欎釜鏁版嵁宸茬粡鍦ㄧ郴缁熶腑瀛樺湪浜嗐�傝淇!銆�" + ruleInfoMsg, objs);
 			}
 		}
 	}
+
 	/**
 	 * 鏍¢獙鏋氫妇鐨勫唴瀹�
 	 *
@@ -2568,6 +2778,7 @@
 			});
 		}
 	}
+
 	/**
 	 * 杞崲鏃堕棿鐨勬牸寮�
 	 *
@@ -2629,10 +2840,10 @@
 //					if (lifeCycleVO != null) {
 //						cbo.setLcStatus(lifeCycleVO.getStartStatus());
 //					} else {
-						cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 //					}
 				} else {
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}
 
 			}
@@ -2660,6 +2871,7 @@
 			orderDTO.getData().put(attrId, value);
 		}
 	}
+
 	/**
 	 * 浠庣紪鐮佺敵璇蜂俊鎭璞′笂鑾峰彇鏌愪釜灞炴�х殑鍊�
 	 *
@@ -2679,6 +2891,7 @@
 		}
 		return value;
 	}
+
 	/**
 	 * 澶勭悊鍒嗙被娉ㄥ叆鐨勪俊鎭�
 	 *
@@ -2724,6 +2937,7 @@
 			});
 		}
 	}
+
 	/***
 	 *
 	 * @param codeClassifyVO
@@ -2734,13 +2948,19 @@
 	 * @param errorMap
 	 * @return
 	 */
-	private void   getCodeOrderDTOs(CodeClassifyVO codeClassifyVO,CodeClassifyTemplateVO templateVO,Map<String ,RowDatas>codeDataMap,Map<String, ClientBusinessObject> codeSystemObjectMap,List<CodeOrderDTO> codeOrderDTOList,Map<String,String> errorMap){
-		codeDataMap.keySet().forEach(code->{
-			RowDatas rowDatas=codeDataMap.get(code);
-			Map<String, String> data= rowDatas.getFiledValue();
+	private void getCodeOrderDTOs(CodeClassifyVO codeClassifyVO,CodeClassifyTemplateVO templateVO,Map<String ,RowDatas>codeDataMap,Map<String, ClientBusinessObject> codeSystemObjectMap,List<CodeOrderDTO> codeOrderDTOList,Map<String,String> errorMap,boolean isCodeOrGroupCode){
+		codeSystemObjectMap.keySet().forEach(code->{
+			ClientBusinessObject sysDataObject= codeSystemObjectMap.get(code);
+			if(isCodeOrGroupCode){
+				code=sysDataObject.getAttributeValue("GROUPCODE");
+				if(StringUtils.isBlank(code)){
+					code=sysDataObject.getId();
+				}
+			}
 			CodeOrderDTO orderDTO = new CodeOrderDTO();
-			if(codeSystemObjectMap.containsKey(code)){
-				ClientBusinessObject sysDataObject= codeSystemObjectMap.get(code);
+			if(codeDataMap.containsKey(code)){
+				RowDatas rowDatas=codeDataMap.get(code);
+				Map<String, String> data= rowDatas.getFiledValue();
 				orderDTO.setCodeClassifyOid(codeClassifyVO.getOid());//鍒嗙被涓婚敭
 				orderDTO.setOid(sysDataObject.getOid());//鏁版嵁oid
 				orderDTO.setLcStatus(rowDatas.getStatus());//鐘舵��
@@ -2814,7 +3034,7 @@
 						for (int j = 0; j < ruleVO.getSecVOList().size(); j++) {
 							CodeBasicSecVO secVO = ruleVO.getSecVOList().get(j);
 							String length= secValues[j];
-							if(StringUtils.isNotBlank(secVO.getCodeSecLength())&&VciBaseUtil.getInt(length)>VciBaseUtil.getInt(secVO.getCodeSecLength())){
+							if(StringUtils.isNotBlank(secVO.getCodeSecLength())&&VciBaseUtil.getInt(length)>(VciBaseUtil.getInt(secVO.getCodeSecLength())+((secVO.getPrefixCode()+secVO.getSuffixCode()).length()))){
 								errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鐮佹瀹藉害涓庣郴缁熶腑鐨勭紪鐮佽鍒欎笉鍚�" );
 								fined = true;
 								break;
@@ -2846,6 +3066,7 @@
 			}
 		});
 	}
+
 	/**
 	 * excel杞崲涓篶bo鐨勫璞�
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
@@ -2958,6 +3179,7 @@
 		});
 
 	}
+
 	/**
 	 * excel杞崲涓篶bo鐨勫璞�
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
@@ -2992,7 +3214,7 @@
 						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 						cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
 					}
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}else{
 					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
 					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
@@ -3007,6 +3229,7 @@
 		});
 
 	}
+
 	/**
 	 * excel杞崲涓篶bo鐨勫璞�
 	 * @param classifyFullInfo 鍒嗙被鐨勫叏閮ㄤ俊鎭�
@@ -3022,9 +3245,9 @@
 							String fullPath,boolean newCode){
 		rowDataList.stream().forEach(rowData -> {
 			ClientBusinessObject cbo=new ClientBusinessObject();
-			 DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmTypeId());
+			DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmTypeId());
 			rowData.getData().forEach((index,value)->{
-				String field = fieldIndexMap.get(index);
+					String field = fieldIndexMap.get(index);
 				if (StringUtils.isBlank(field)) {
 					throw new VciBaseException("绗�" + (index + 1) + "鍒楃殑鏍囬鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
 				}
@@ -3049,7 +3272,7 @@
 						Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 						cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
 					}
-					cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
+					cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
 				}else{
 					//姝ゆ椂杩樻病鏈夎浆鎹㈣矾寰�
 					//cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
@@ -3095,6 +3318,7 @@
 			}
 		}
 	}
+
 	/**
 	 * 鎵归噺杞崲鏃堕棿閮戒负鎸囧畾鐨勬牸寮�
 	 * @param attrVOS 妯℃澘灞炴��
@@ -3320,6 +3544,7 @@
 		}
 
 	}
+
 	/**
 	 * 鎵归噺妫�鏌ヤ紒涓氱紪鐮佹槸鍚﹀瓨鍦�
 	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
@@ -3381,6 +3606,7 @@
 			});
 		}
 	}
+
 	/***
 	 * 鏍¢獙鍒嗙被瀵瑰簲鐨勬ā鏉夸俊鎭�
 	 * @param titleRowData
@@ -3464,6 +3690,7 @@
 		}
 		return codeClassifyTemplateVOList ;
 	}
+
 	/**
 	 * 浠庡睘鎬т笂鑾峰彇鍙傜収鐨勫唴瀹�
 	 * @param attrVO 灞炴�х殑淇℃伅
@@ -3525,6 +3752,7 @@
 		}
 		return showText;
 	}
+
 	/**
 	 * 澶勭悊鏋氫妇鐨勬樉绀哄璞�
 	 * @param attrVOS 妯℃澘灞炴��
@@ -3573,7 +3801,7 @@
 	 */
 	private void batchCheckRequiredAttrOnOrder(CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,Map<String,String> errorMap){
 		Map<String, CodeClassifyTemplateAttrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(s ->
-			VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeLevel())//涓嶈兘鏄粍鍚堢殑鍜屽垎绫绘敞鍏ョ殑
+			VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule()) && (StringUtils.isBlank(s.getClassifyInvokeLevel())||s.getClassifyInvokeLevel().equals("none"))//涓嶈兘鏄粍鍚堢殑鍜屽垎绫绘敞鍏ョ殑
 		).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
 		//涓嶮dmEngineServiceImpl閲岄潰鐨刢heckRequiredAttrOnOrder 閫昏緫搴旇鐩镐技
 		if(!CollectionUtils.isEmpty(requiredAttrMap)) {
@@ -3581,11 +3809,12 @@
 			if(!CollectionUtils.isEmpty(nullRowIndex)){
 				String checkAttr = requiredAttrMap.values().stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(","));
 				nullRowIndex.stream().forEach(rowIndex->{
-					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鏍¢獙瑙勫垯涓嶉�氳繃锛屾湁鏍¢獙鐨勫睘鎬т负" + checkAttr);
+					errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";鏍¢獙瑙勫垯蹇呭~椤逛笉閫氳繃锛屽鏋滄湁蹇呭~灞炴�т负绌猴紝鍒欏~銆�/銆戜唬鏇�,鏈夋牎楠岀殑灞炴�т负" + checkAttr);
 				});
 			}
 		}
 	}
+
 	/**
 	 * 澶勭悊鍒嗙被娉ㄥ叆
 	 * @param attrVOS 妯℃澘灞炴��
@@ -3615,7 +3844,8 @@
 							}
 						}
 						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());
+						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);
@@ -3647,7 +3877,7 @@
 	 * @param cboList 鎵归噺鐨勬暟鎹�
 	 */
 	private CodeImportResultVO batchCheckKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO,
-														List<ClientBusinessObject> cboList) {
+														List<ClientBusinessObject> cboList,Map<String,String> errorMap) {
 		//涓嶮dmEngineServiceImpl閲岀殑checkKeyAttrOnOrder鐩镐技
 		//鍏堣幏鍙栧叧閿睘鎬х殑瑙勫垯锛屼篃鍒╃敤缁ф壙鐨勬柟寮�
 		CodeKeyAttrRepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
@@ -3665,7 +3895,8 @@
 		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));
+		//resultVO.setSelfRepeatRowIndexList(getSelfRepeatRowIndex(ketAttrMap,cboList,keyRuleVO));
+		getSelfRepeatRowIndex(ketAttrMap,cboList,keyRuleVO,resultVO);
 		if(!CollectionUtils.isEmpty(resultVO.getSelfRepeatRowIndexList())){
 			//鎴戜滑绉婚櫎鏈韩閲嶅鐨勬暟鎹�
 			cboList = cboList.stream().filter(s->!resultVO.getSelfRepeatRowIndexList().contains(s.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
@@ -3673,7 +3904,9 @@
 		//2.鍒ゆ柇鍏抽敭灞炴�у湪绯荤粺閲屾槸鍚﹂噸澶�
 		//鍥犱负鏁版嵁閲忓緢澶э紝鎵�浠ュ緱鎯冲姙娉曞苟琛�
 		//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
-		Map<String,List<BaseModel>> indexTODataMap=new HashMap<>();
+		Map<String,List<BaseModel>> indexTODataMap=new ConcurrentHashMap<>();
+		// 鏌ヨ涓嶉渶瑕佸弬涓庡叧閿睘鎬ф牎楠岀殑闄よ嚜宸变互澶栫殑鎵�鏈夊垎绫籵id
+		final String isParticipateCheckOids = classifyService.selectLeafByParentClassifyOid(classifyFullInfo.getTopClassifyVO().getOid(), classifyFullInfo.getCurrentClassifyVO().getOid());
 		List<ClientBusinessObject> repeatDataMap = cboList.parallelStream().filter(cbo -> {
 			//姣忚閮藉緱鏌ヨ.濡傛灉鍏朵腑鍑虹幇浜嗛敊璇紝鎴戜滑灏辩洿鎺ユ姏鍑哄紓甯革紝鍏朵綑鐨勬樉绀�
 			//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
@@ -3687,22 +3920,30 @@
 				engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
 			});
 			if (!CollectionUtils.isEmpty(ketAttrMap)) {
+				// 娣诲姞涓嶅弬涓庡叧閿睘鎬ф牎楠岀殑鍒嗙被oid鍒ゆ柇
+				if(Func.isNotBlank(isParticipateCheckOids)){
+					conditionMap.put("t.codeclsfid",QueryOptionConstant.NOTIN+isParticipateCheckOids);
+				}
 				CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmTypeId(), templateVO, conditionMap, null);
-				boolean isKeyCheck= commonsMapper.queryCountBySql(sqlBO.getSqlCount()) > 0;
-				if(isKeyCheck){
-					List<Map<String,String>> newDataList=  commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
-					//List<ClientBusinessObject> newCboList=	ChangeMapTOClientBusinessObjects(newDataList);
-					List<BaseModel> newCboList=new ArrayList<>();
+				List<String> repeatData = commonsMapper.selectList(sqlBO.getSqlId());
+				if(!repeatData.isEmpty()){
+					final List<Map<String,String>> newDataList = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
+					//List<ClientBusinessObject> newCboList=ChangeMapTOClientBusinessObjects(newDataList);
+					List<BaseModel> newCboList = new ArrayList<>();
 					newDataList.stream().forEach(stringStringMap -> {
 						BaseModel baseModel=new BaseModel();
 						DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel);
+						baseModel.setData(stringStringMap);
 						newCboList.add(baseModel);
 					});
+					// 娣诲姞閿欒鍊�
+					String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+					errorMap.put(rowIndex, "閲嶅鐨勮褰曠紪鍙蜂负:"+repeatData.stream().collect(Collectors.joining(",")));
 					if(!CollectionUtils.isEmpty(newCboList)) {
 						indexTODataMap.put(cbo.getAttributeValue(IMPORT_ROW_INDEX), newCboList);
 					}
 				}
-				return isKeyCheck;
+				return !repeatData.isEmpty();
 			}else{
 				return false;
 			}
@@ -3730,7 +3971,7 @@
 			if(StringUtils.isBlank(classifyPath)){
 				classifyPath = "#current#";
 			}
-			if ( !pathMap.containsKey(classifyPath)) {
+			if (!pathMap.containsKey(classifyPath)) {
 				String row_index = cbo.getAttributeValue(IMPORT_ROW_INDEX);
 				errorMap.put(row_index,errorMap.getOrDefault(row_index,"") + ";鍒嗙被璺緞涓嶅瓨鍦�");
 			} else {
@@ -3813,9 +4054,11 @@
 				childOidPathMap.put(childPath.getOid(),thisClassifyPath);
 			});
 		}
+		String path=classifyFullInfo.getCurrentClassifyVO().getId();
+		//鏍规嵁瀹㈡埛閫夋嫨鐨勫垎绫昏矾寰勬湭id锛岃繕鏄痭ame纭畾璺緞鎷兼帴
+		childOidPathMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(),fullPath);
 		return childOidPathMap;
 	}
-
 
 	/**
 	 * 鑾峰彇瀵煎叆鐨勫唴瀹逛腑鍏抽敭灞炴�ч噸澶嶇殑琛屽彿
@@ -3824,9 +4067,10 @@
 	 * @param keyRuleVO 鍏抽敭灞炴�ф帶鍒惰鍒�
 	 * @return 閲嶅鐨勮鍙�
 	 */
-	private Set<String> getSelfRepeatRowIndex(Map<String/**灞炴�х殑缂栧彿**/, CodeClassifyTemplateAttrVO> ketAttrMap,
-											  List<ClientBusinessObject> dataList,CodeKeyAttrRepeatVO keyRuleVO){
+	private void getSelfRepeatRowIndex(Map<String/**灞炴�х殑缂栧彿**/, CodeClassifyTemplateAttrVO> ketAttrMap,
+									   List<ClientBusinessObject> dataList,CodeKeyAttrRepeatVO keyRuleVO,CodeImportResultVO resultVO){
 		Set<String> selfRepeatRowIndexList = new CopyOnWriteArraySet<>();
+		Map<String,List<String>> keyAttrOkOidTORepeatOidMap=new HashMap<>();
 		boolean trimAll =keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
 		//鍏ㄩ儴鍘荤┖鐨勪紭鍏堢骇澶т簬鍘荤┖
 		boolean trim =keyRuleVO ==null?false:  VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
@@ -3835,8 +4079,10 @@
 		//蹇呴』灏嗗睘鎬ф寜鐓ч『搴忔帓搴忓ソ
 		List<CodeClassifyTemplateAttrVO> attrVOList = ketAttrMap.values().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
 		Map<String/**琛屽彿**/,String/**鍏抽敭灞炴�х殑缁勫悎鍐呭**/> rowIndexKeyStringMap = new HashMap<>();
+		Map<String/**鍏抽敭灞炴�х殑缁勫悎鍐呭**/,String/**绗竴涓叧閿睘鎬х殑鏁版嵁oid**/> okOidKeyStringMap = new HashMap<>();
 		dataList.parallelStream().forEach(cbo-> {
 			String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
+			String oid=cbo.getOid();
 			StringBuilder sb = new StringBuilder();
 			for (int i = 0; i < attrVOList.size(); i++) {
 				CodeClassifyTemplateAttrVO attrVO = attrVOList.get(i);
@@ -3862,13 +4108,27 @@
 			String keyString = sb.toString();
 			if(rowIndexKeyStringMap.containsValue(keyString) && StringUtils.isNotBlank(keyString)){
 				selfRepeatRowIndexList.add(rowIndex);
+				String okOid=okOidKeyStringMap.getOrDefault(keyString,"");
+				if(StringUtils.isNotBlank(okOid)){
+					List<String>newOidList=new ArrayList<>();
+					newOidList.add(oid);
+					if(keyAttrOkOidTORepeatOidMap.containsKey(okOid)){
+						List<String> oldOidList = keyAttrOkOidTORepeatOidMap.get(okOid);
+						newOidList.addAll(oldOidList);
+
+					}
+					keyAttrOkOidTORepeatOidMap.put(okOid,newOidList);
+				}
 			}else {
+				okOidKeyStringMap.put(sb.toString(),oid);
 				rowIndexKeyStringMap.put(rowIndex, sb.toString());
 			}
 		});
 		//鍥犱负鍙槸鍏抽敭灞炴�ч噸澶嶏紝鎵�浠ユ垜浠笉鑳介噸澶嶇殑澶氭潯閫変竴鏉℃潵鎶ラ敊
-		return selfRepeatRowIndexList;
+		resultVO.setKeyAttrRepeatRowIndexList(selfRepeatRowIndexList);
+		resultVO.setKeyAttrOkOidTORepeatOidMap(keyAttrOkOidTORepeatOidMap);
 	}
+
 	/**
 	 * excel鐨勬爣棰樹笂鑾峰彇瀛楁鎵�鍦ㄧ殑浣嶇疆
 	 * @param titleRowData 鏍囬鐨勫唴瀹�
@@ -3901,7 +4161,7 @@
 			DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject);
 			for (String key:dataMap.keySet()){
 				Object value= dataMap.getOrDefault(key,"");
-				clientBusinessObject.setAttributeValue(key,value.toString());
+				clientBusinessObject.setAttributeValue(key.toLowerCase(Locale.ROOT),value==null?"":value.toString());
 			}
 			clientBusinessObjectList.add(clientBusinessObject);
 		});
@@ -3983,6 +4243,7 @@
 		codeClassifyDatas.addAll(newCodeImprotDataVO);
 		log.info("222");
 	}
+
 	/***
 	 *  @param titleRowData
 	 * @param newTemplateVO
@@ -4028,7 +4289,8 @@
 		codeImprotDataVO.setColNames(colNames);
 		codeImprotDataVO.getDatas().add(filedValueMap);
 	}
-	/***
+
+	/**
 	 * 姝g‘閿欒鏁版嵁redis缂撳瓨
 	 * @param uuid
 	 * @param templateVO
@@ -4329,4 +4591,18 @@
 		}
 	}
 
+	/***
+	 * 鐢宠闆嗗洟缂栫爜
+	 * @param idList
+	 * @param btmName
+	 */
+	public void sendApplyGroupcode(List<String> idList,String btmName,String operationType){
+		String oids=VciBaseUtil.array2String(idList.toArray(new String[]{}));
+		if(operationType.equals(sysIntegrationPushTypeEnum.ACCPET_APPCODE.getValue())) {
+			mdmInterJtClient.applyGroupCode(oids,btmName);
+		}else if(operationType.equals(sysIntegrationPushTypeEnum.ACCPET_EDITCODE)){
+			mdmInterJtClient.receiveEditApply(oids,btmName);
+		}
+	}
+
 }

--
Gitblit v1.9.3