From d2d00b57e1a8ab328e2e94049cd9149ababe7e0c Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期五, 10 十一月 2023 08:52:48 +0800
Subject: [PATCH] 修改历史数据导入时开始多线程分批并行执行insert

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java |   24 +++++++++++++-----------
 1 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
index a5058b7..f58d927 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -41,6 +41,7 @@
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
@@ -81,11 +82,11 @@
 	private FormulaServiceImpl formulaService;
 
 	@Override
-	@Transactional(rollbackFor = VciBaseException.class)
+	@Transactional(rollbackFor = Exception.class)
 	public List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClassifyTemplateVO templateVO, CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<BaseModel> dataCBOList) throws Exception {
 		dataCBOList = dataCBOList.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList());
 		List<String> codeList = new ArrayList<>();
-
+		final CodeRuleVO finalRuleVO = ruleVO;
 		/*****
 		 * 淇濊瘉骞跺彂鐨勬椂鍊欙紝鏈�澶ф祦姘村彿閮藉鐨勶紝浣嗘槸杩欑鍔犻攣鏈夊紛绔�
 		 */
@@ -96,7 +97,7 @@
 			//鍘嗗彶鏁版嵁鎵ц鐨勬椂鍊欙紝杩欎釜绯荤粺浼氬緢鍗�
 			//涓昏鏄负浜嗗綍鍏ユ渶澶ф祦姘村彿鍜宎llcode
 			//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
-			List<CodeAllCode> allCodeDOList = new ArrayList<>();
+			List<CodeAllCode> allCodeDOList = new CopyOnWriteArrayList<>();
 			Map<String/**娴佹按渚濇嵁**/, Map<String/**鐮佹鐨勪富閿�**/,Double/**鏈�澶ф祦姘村彿**/>> maxSerialMap = new HashMap<>();
 			// TODO 澶氱嚎绋嬫祦寮曞彂鐨勯棶棰樺凡淇敼
 			dataCBOList.parallelStream().forEach(cbo->{
@@ -109,7 +110,7 @@
 				cbo.getData().remove(CODE_SEC_LENGTH_FIELD);//灏嗘key闄ゅ幓
 				cbo.getData().remove(IMPORT_ROW_INDEX);//灏嗘key闄ゅ幓
 				cbo.getData().remove("codeclassifyid");//灏嗘key闄ゅ幓
-				List<CodeBasicSecVO> secVOList = ruleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
+				List<CodeBasicSecVO> secVOList = finalRuleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
 				Map<String/**鐮佹鐨勪富閿�**/,String/**鐮佹鐨勫��**/> serialValueMap = new HashMap<>();
 				Map<String, CodeBasicSecVO> secVOMap = secVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
 				for (int i = 0; i < secLengths.length; i++) {
@@ -168,7 +169,7 @@
 				CodeAllCode allCodeDO = new CodeAllCode();
 				DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCodeDO, MdmBtmTypeConstant.CODE_ALL_CODE);
 				allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid());
-				allCodeDO.setCodeRuleOid(ruleVO.getOid());
+				allCodeDO.setCodeRuleOid(finalRuleVO.getOid());
 				allCodeDO.setId(cbo.getId());
 				allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid());
 				allCodeDO.setCreateCodeBtm(cbo.getBtmname());
@@ -186,7 +187,7 @@
 			maxSerialMap.forEach((serialUnit,secOidMaxMap)->{
 				secOidMaxMap.forEach((secOid,maxSerial)->{
 					QueryWrapper<CodeSerialValue> queryWrapper = new QueryWrapper<>();
-					queryWrapper.eq("codeRuleOid", ruleVO.getOid());
+					queryWrapper.eq("codeRuleOid", finalRuleVO.getOid());
 					queryWrapper.eq("serialUnit", serialUnit);
 					//杩欎釜瀛楁鏄负浜嗚В鍐冲涓祦姘寸殑闂
 					queryWrapper.eq("codeSecOid", secOid);
@@ -205,7 +206,7 @@
 						//娌℃湁
 						CodeSerialValue serialValueDO = new CodeSerialValue();
 						DefaultAttrAssimtUtil.addDefaultAttrAssimt(serialValueDO, MdmBtmTypeConstant.CODE_SERIAL_VALUE);
-						serialValueDO.setCodeRuleOid(ruleVO.getOid());
+						serialValueDO.setCodeRuleOid(finalRuleVO.getOid());
 						serialValueDO.setSerialUnit(serialUnit);
 						serialValueDO.setCodeSecOid(secOid);
 						serialValueDO.setMaxSerial(maxSerial.toString());
@@ -304,11 +305,12 @@
 					}
 					codeAllCodeService.saveBatch(addCodeDOs);
 				}
+
 				mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList);
 			}
 			return codeList;
 		}else {
-			List<CodeBasicSecVO> secVOList = ruleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
+			List<CodeBasicSecVO> secVOList = finalRuleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
 			List<String> serialUnitList = new LinkedList<>();
 			List<String> secValueList = new ArrayList<>();
 			Map<String, String> secValueMap = secDTOList.stream().collect(Collectors.toMap(s -> s.getSecOid(), s -> s.getSecValue()==null?"":s.getSecValue()));
@@ -344,7 +346,7 @@
 				switchAttrSecValue(attrSecVOList, cbo, thisSecValueList, attrSevIsSerialDepend, thisSerialUnitList);
 
 				String serialUnitString = thisSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : thisSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
-				switchSerialSecValue(serialSecVOList, attrSevIsSerialDepend, ruleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
+				switchSerialSecValue(serialSecVOList, attrSevIsSerialDepend, finalRuleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
 
 				//缁勮缂栫爜鐨勫��
 				cbo.setId(thisSecValueList.stream().collect(Collectors.joining()));
@@ -359,10 +361,10 @@
 					}
 				}
 				//瑕佸瓨鍌ㄦ渶鍚庣殑鍏ㄩ儴allcode
-				wrapperAllCode(classifyFullInfoBO, ruleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString());
+				wrapperAllCode(classifyFullInfoBO, finalRuleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString());
 			}
 			//澶勭悊鏈�澶ф祦姘�
-			saveSerialValue( ruleVO, lastMaxSerialValueMap, maxSerialValueMap);
+			saveSerialValue( finalRuleVO, lastMaxSerialValueMap, maxSerialValueMap);
 
 			allCodeDOList.stream().forEach(
 				allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode");allCode.setLctid("codeAllCodeLC");}

--
Gitblit v1.9.3