From e9ae27404803d0616e06ed21027408a71b4bc19c Mon Sep 17 00:00:00 2001
From: ludc <ludc@vci-tech.com>
Date: 星期三, 05 三月 2025 17:34:02 +0800
Subject: [PATCH] 集成申码接口调整:当码值按照约定传表名为空的业务场景下传null校验问题和码值组装问题。

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java |  716 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 620 insertions(+), 96 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 f58d927..9cb5431 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
@@ -1,5 +1,10 @@
 package com.vci.ubcs.code.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.vci.ubcs.code.algorithm.CustomSerialEnum;
+import com.vci.ubcs.code.annotation.MdmSerialAlgorithm;
+import com.vci.ubcs.code.annotation.MdmSerialAlgorithmMethod;
+import com.vci.ubcs.code.dto.CodeCustomSerialDTO;
 import com.alibaba.nacos.common.utils.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
@@ -27,12 +32,15 @@
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.constant.RegExpConstant;
 import com.vci.ubcs.starter.web.enumpck.OsCodeFillTypeEnum;
+import com.vci.ubcs.starter.web.util.ApplicationContextProvider;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import com.vci.ubcs.starter.web.util.VciDateUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.WebUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -40,12 +48,18 @@
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
+import static com.vci.ubcs.code.enumpack.CodeSecTypeEnum.CODE_SERIAL_SEC;
+
 @Service
 @Slf4j
 public class MdmProductCodeServiceImpl  implements MdmProductCodeService {
@@ -83,7 +97,7 @@
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClassifyTemplateVO templateVO, CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<BaseModel> dataCBOList) throws Exception {
+	public List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClassifyTemplateVO templateVO, CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<BaseModel> dataCBOList,BladeUser user) 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;
@@ -94,18 +108,17 @@
 			// && StringUtils.isNotBlank(cbo.getAttributeValue(CODE_SEC_LENGTH_FIELD))
 		){
 			//鏄巻鍙叉暟鎹鍏�
-			//鍘嗗彶鏁版嵁鎵ц鐨勬椂鍊欙紝杩欎釜绯荤粺浼氬緢鍗�
 			//涓昏鏄负浜嗗綍鍏ユ渶澶ф祦姘村彿鍜宎llcode
 			//SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
 			List<CodeAllCode> allCodeDOList = new CopyOnWriteArrayList<>();
-			Map<String/**娴佹按渚濇嵁**/, Map<String/**鐮佹鐨勪富閿�**/,Double/**鏈�澶ф祦姘村彿**/>> maxSerialMap = new HashMap<>();
+			Map<String/**娴佹按渚濇嵁**/, HashMap<String/**鐮佹鐨勪富閿�**/,String/**鏈�澶ф祦姘村彿**/>> maxSerialMap = new HashMap<>();
 			// TODO 澶氱嚎绋嬫祦寮曞彂鐨勯棶棰樺凡淇敼
 			dataCBOList.parallelStream().forEach(cbo->{
 				log.info("code:----->"+cbo.getId());
 				//VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
 				String code = cbo.getId();
-				List<String> serialUnitList = new ArrayList<>();
-				String seclenghStr=cbo.getData().get(CODE_SEC_LENGTH_FIELD);
+				List<String> serialUnitList = new CopyOnWriteArrayList<>();
+				//String seclenghStr=cbo.getData().get(CODE_SEC_LENGTH_FIELD);
 				String[] secLengths = cbo.getData().get(CODE_SEC_LENGTH_FIELD).split("#");
 				cbo.getData().remove(CODE_SEC_LENGTH_FIELD);//灏嗘key闄ゅ幓
 				cbo.getData().remove(IMPORT_ROW_INDEX);//灏嗘key闄ゅ幓
@@ -113,6 +126,8 @@
 				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));
+				Map<String,Integer> serialSecOidIndexMap=new HashMap<>();
+				LinkedList<String> codeValueList=new LinkedList<>();
 				for (int i = 0; i < secLengths.length; i++) {
 					CodeBasicSecVO secVO = secVOList.get(i);
 					String thisSecValue  = "";
@@ -122,62 +137,87 @@
 						//鏈�鍚�
 						thisSecValue =  seclenghStr.contains("#")?code.substring(VciBaseUtil.getInt(secLengths[i-1]),code.length()):code;
 					}else {*/
-						int start = 0;
-						for (int j = 0; j < i; j++) {
-							start += VciBaseUtil.getInt(secLengths[j]);
-						}
-						thisSecValue = code.substring(start,start+VciBaseUtil.getInt(secLengths[i]));
+					int start = 0;
+					for (int j = 0; j < i; j++) {
+						start += VciBaseUtil.getInt(secLengths[j]);
+					}
+					thisSecValue = code.substring(start,start+VciBaseUtil.getInt(secLengths[i]));
 					//	}
 					if(VciBaseUtil.getBoolean(secVO.getSerialDependFlag())){
 						serialUnitList.add(thisSecValue);
+						serialSecOidIndexMap.put(secVO.getOid(),i);
 					}
-					if(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue().equalsIgnoreCase(secVO.getSecType())){
+					if(CODE_SERIAL_SEC.getValue().equalsIgnoreCase(secVO.getSecType())){
 						serialValueMap.put(secVO.getOid(),thisSecValue);
 					}
+					codeValueList.add(thisSecValue);
 				}
-				String serialUnitString = serialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : serialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
 				List<String> serialUnFileStringList = new ArrayList<>();
+				AtomicReference<String> newSerialUnitString = new AtomicReference<>("");
 				if(!CollectionUtils.isEmpty(serialValueMap)){
+					AtomicInteger index = new AtomicInteger();
 					serialValueMap.forEach((secOid,secValue)->{
 						//瑕佺湅鏄笉鏄ˉ浣嶇殑
 						CodeBasicSecVO secVO = secVOMap.get(secOid);
-						Double serialDb = null;
+						List<String >newSerialUnitList=new ArrayList<>();
+						newSerialUnitList.addAll(serialUnitList);
+						if(index.get() ==0){
+							if(serialSecOidIndexMap.containsKey(secOid)) {
+								int num = serialSecOidIndexMap.get(secOid);
+								newSerialUnitList.set(num, "");
+							}
+						}
+						String serialUnitString = newSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : newSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
+						newSerialUnitString.set(serialUnitString);
+						index.getAndIncrement();
+						String serialDb = "";
 						// 鎴彇鎺夊墠鍚庣紑涔嬪悗鐨勭爜娈�
 						String subSecValue = killPriffixSuffix(secValue, secVO.getPrefixCode(), secVO.getSuffixCode());
 						if(OsCodeFillTypeEnum.NONE.getValue().equalsIgnoreCase(secVO.getCodeFillType())){
 							//涓嶈ˉ鐮�
 							//鎶婃墍鏈変笉鏄暟瀛楃殑鍘绘帀锛屽洜涓哄彲鑳戒細鏄�佹暟鎹紝鏂拌鍒�
-							serialDb = VciBaseUtil.getDouble(killUnNumberChar(subSecValue));
+							//serialDb = VciBaseUtil.getDouble(killUnNumberChar(subSecValue));
+							//serialDb = killUnNumberChar(subSecValue);
+							serialDb=subSecValue;
 						}else {
 							//宸﹀彸濉厖鐨勶紝鎴戜滑闇�瑕�
-							serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(subSecValue,secVO.getCodeFillSeparator(),
-								OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()))));
+							serialDb = killFillChar(subSecValue,secVO.getCodeFillSeparator(),
+								OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()));
 						}
-						Map<String, Double> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>());
-						Double maxValue=serialDb;
-						if(thisUnitMaxMap.containsKey(secOid)){
-							maxValue=  thisUnitMaxMap.getOrDefault(secOid,new Double(-1));
-							if(maxValue<serialDb){
-								maxValue=serialDb;
+						Double newSerialDb = CustomSerialEnum.getDoubleCustomSerialValue(serialDb,secVO.getCustomCodeSerialType());
+						//TODO: 20240822闇�瑕佽繖鍧椾唬鐮佹槸鍚屾鎬х殑锛宮axSerialMap杩欏効浼氬洜涓虹嚎绋嬪彈褰卞搷锛屼慨鏀瑰悗娴嬭瘯澶氭鎬绘暟涓�5000鏉′竴娆″鍏ヨ�楄垂鏃堕棿涓�3鍒�30绉掑乏鍙�
+						synchronized(this) {
+							HashMap<String, String> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>());
+							Double maxValue=newSerialDb;
+							if(thisUnitMaxMap.containsKey(secOid)){
+								String newMaxValue = thisUnitMaxMap.getOrDefault(secOid,"");
+								maxValue = StringUtils.isBlank(newMaxValue)?-1:VciBaseUtil.getDouble(newMaxValue);
+								if(maxValue < newSerialDb){
+									maxValue = newSerialDb;
+								}
 							}
+							String newMaxValue=CustomSerialEnum.getStringCustomSerialValue(maxValue,secVO.getCustomCodeSerialType());
+							serialDb=CustomSerialEnum.getStringCustomSerialValue(newSerialDb,secVO.getCustomCodeSerialType());
+							thisUnitMaxMap.put(secOid,newMaxValue);
+							maxSerialMap.put(serialUnitString,thisUnitMaxMap);
+							serialUnFileStringList.add(String.valueOf(serialDb));
 						}
-						thisUnitMaxMap.put(secOid,maxValue);
-						maxSerialMap.put(serialUnitString,thisUnitMaxMap);
-						serialUnFileStringList.add(String.valueOf(serialDb));
 					});
 				}
 				CodeAllCode allCodeDO = new CodeAllCode();
-				DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCodeDO, MdmBtmTypeConstant.CODE_ALL_CODE);
+				DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCodeDO, MdmBtmTypeConstant.CODE_ALL_CODE,user);
 				allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid());
 				allCodeDO.setCodeRuleOid(finalRuleVO.getOid());
 				allCodeDO.setId(cbo.getId());
 				allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid());
 				allCodeDO.setCreateCodeBtm(cbo.getBtmname());
 				allCodeDO.setCreateCodeOid(cbo.getOid());
-				allCodeDO.setSerialUnit(serialUnitString);
+				allCodeDO.setSerialUnit(newSerialUnitString.get());
 				String unFillSerial =serialUnFileStringList.size()==1?serialUnFileStringList.get(0)+ SERIAL_VALUE_SPACE:serialUnFileStringList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE));
 				allCodeDO.setUnFillSerial(unFillSerial);
 				allCodeDO.setLcStatus(cbo.getLcStatus());
+				allCodeDO.setLctid("codeAllCodeLC");
+				allCodeDO.setCodeDelimit(codeValueList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE)));//娣诲姞閾炬帴绗�
 				allCodeDOList.add(allCodeDO);
 			});
 			//澶勭悊鏈�澶х殑娴佹按鍙�
@@ -197,15 +237,15 @@
 					if (!CollectionUtils.isEmpty(serialValueDOS)) {
 						CodeSerialValue serialValueDO = serialValueDOS.get(0);
 						log.info("oldmaxSerial--->"+serialValueDO.getMaxSerial()+"---- newmaxSerial---->"+maxSerial);
-						if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<maxSerial){
+						if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<VciBaseUtil.getDouble(maxSerial)){
 							serialValueDO.setMaxSerial(String.valueOf(maxSerial));
-							DefaultAttrAssimtUtil.updateDefaultAttrAssimt(serialValueDO);
+							DefaultAttrAssimtUtil.updateDefaultAttrAssimt(serialValueDO,user);
 							editSerialValueList.add(serialValueDO);
 						}
 					}else{
 						//娌℃湁
 						CodeSerialValue serialValueDO = new CodeSerialValue();
-						DefaultAttrAssimtUtil.addDefaultAttrAssimt(serialValueDO, MdmBtmTypeConstant.CODE_SERIAL_VALUE);
+						DefaultAttrAssimtUtil.addDefaultAttrAssimt(serialValueDO, MdmBtmTypeConstant.CODE_SERIAL_VALUE,user);
 						serialValueDO.setCodeRuleOid(finalRuleVO.getOid());
 						serialValueDO.setSerialUnit(serialUnit);
 						serialValueDO.setCodeSecOid(secOid);
@@ -226,11 +266,10 @@
 			}
 			//澶勭悊allCode
 			if(!CollectionUtils.isEmpty(allCodeDOList)){
-				// TODO 鍘嗗彶鏁版嵁瀵煎叆鐨勬椂鍊欒繖鍎垮伓灏斾細瑙﹀彂绌烘寚閽堝紓甯�
 				Map<String,List<CodeAllCode>> ruleGroup = allCodeDOList.stream().collect(Collectors.groupingBy(s -> s.getCodeRuleOid()));
 				Map<String, CodeAllCode> codeDOMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getCodeRuleOid() + "${SEP}" + s.getId(), t -> t));
-				List<CodeAllCode> addCodeDOs = new ArrayList<>();
-				List<CodeAllCode> editCodeDOs = new ArrayList<>();
+				List<CodeAllCode> addCodeDOs = new CopyOnWriteArrayList<>();
+				List<CodeAllCode> editCodeDOs = new CopyOnWriteArrayList<>();
 				ruleGroup.forEach((ruleOid,allCodeDOS)->{
 					VciBaseUtil.switchCollectionForOracleIn(allCodeDOS).stream().forEach(codeDOs->{
 						QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
@@ -238,7 +277,6 @@
 						allCodeWrapper.in("id", QueryOptionConstant.IN + "(" +
 							VciBaseUtil.toInSql(codeDOs.stream().map(s->s.getId()).collect(Collectors.toList()).toArray(new String[0])) + ")");
 						List<CodeAllCode> existCodes = codeAllCodeService.selectByWrapper(allCodeWrapper);
-
 
 						if(!CollectionUtils.isEmpty(existCodes)){
 							existCodes.stream().forEach(existCode->{
@@ -275,7 +313,7 @@
 						.collectingAndThen(
 							Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))),
 							ArrayList::new));
-					if( distinctCodeAllCOdes.size() != addCodeDOs.size() ){
+					if(distinctCodeAllCOdes.size() != addCodeDOs.size() ){
 						throw new VciBaseException("缂栫爜鏁版嵁閲嶅锛屾棤娉曚繚瀛橈紝璇锋敞鎰忥紒");
 					}
 					QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
@@ -289,23 +327,31 @@
 					for (CodeAllCode codeAllCode : takeBack) {
 						codeAllCode.setTs(new Date());
 						codeAllCode.setLastModifyTime(new Date());
-						codeAllCode.setLastModifier(AuthUtil.getUserId().toString());
-						Iterator<CodeAllCode> iterator = addCodeDOs.iterator();
+						codeAllCode.setLastModifier(Func.isNotEmpty(user) ? user.getAccount():AuthUtil.getUserAccount());
+						for (int i = 0; i < addCodeDOs.size(); i++) {
+							if(codeAllCode.getId().equals(addCodeDOs.get(i).getId())){
+								codeAllCode.setCreateCodeOid(addCodeDOs.get(i).getCreateCodeOid());
+								codeAllCode.setLcStatus(addCodeDOs.get(i).getLcStatus());
+								addCodeDOs.remove(i);
+							}
+						}
+						/*Iterator<CodeAllCode> iterator = addCodeDOs.iterator();
 						while (iterator.hasNext()){
 							CodeAllCode next = iterator.next();
 							if(codeAllCode.getId().equals(next.getId())){
 								codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
 								codeAllCode.setLcStatus(next.getLcStatus());
+								// TODO: 杩欏効鍏堟殏鏃舵敞閲婃帀锛屾病鐪嬫噦杩欏効涓轰粈涔堣杩欐牱鍋氾紝瀵艰嚧鎶ラ敊
 								iterator.remove();
 							}
-						}
+						}*/
 					}
 					if(takeBack.size()>0){
 						codeAllCodeService.updateBatchById(takeBack);
 					}
+
 					codeAllCodeService.saveBatch(addCodeDOs);
 				}
-
 				mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList);
 			}
 			return codeList;
@@ -318,10 +364,14 @@
 			List<CodeBasicSecVO> attrSecVOList = new ArrayList<>();
 			for (int i = 0; i < secVOList.size(); i++) {
 				CodeBasicSecVO secVO = secVOList.get(i);
-				switchSecValue(secVO, secValueMap, classifyFullInfoBO, serialSecVOList, attrSecVOList, serialUnitList, secValueList);
+				try{
+					switchSecValue(secVO, secValueMap, classifyFullInfoBO, serialSecVOList, attrSecVOList, serialUnitList, secValueList);
+				}catch (Exception e){
+					throw new ServiceException("鐮佸�艰浆鎹㈡椂鍑虹幇閿欒锛屽師鍥狅細"+e.getMessage());
+				}
 			}
 			//澶勭悊灞炴�х爜娈靛拰娴佹按鐮佹
-			Map<String/**娴佹按鐮佹鐨勪富閿�**/, Map<String/**娴佹按渚濇嵁**/, Double>> lastMaxSerialValueMap = new HashMap<>();
+			Map<String/**娴佹按鐮佹鐨勪富閿�**/, Map<String/**娴佹按渚濇嵁**/, String>> lastMaxSerialValueMap = new HashMap<>();
 			List<CodeAllCode> allCodeDOList = new ArrayList<>();
 
 			//宸茬粡瀛樺偍鐨勬渶澶ф祦姘村彿鐨勫唴瀹�
@@ -346,7 +396,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, finalRuleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
+				switchSerialSecValue(cbo,serialSecVOList, attrSevIsSerialDepend, finalRuleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
 
 				//缁勮缂栫爜鐨勫��
 				cbo.setId(thisSecValueList.stream().collect(Collectors.joining()));
@@ -355,34 +405,33 @@
 				//鎶婄爜娈甸噷闈㈤兘鎵句竴涓嬫祦姘村彿
 				for (int j = 0; j < serialSecVOList.size(); j++) {
 					CodeBasicSecVO secVO = serialSecVOList.get(j);
-					Double serialValue = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()).getOrDefault(serialUnitString, 0d);
+					String serialValue = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()).getOrDefault(serialUnitString, "");
 					if (serialValue != null) {
-						sb.append(String.valueOf(serialValue.longValue())).append(SERIAL_VALUE_SPACE);
+						sb.append(serialValue).append(SERIAL_VALUE_SPACE);
 					}
 				}
+				String codeDelimiter=thisSecValueList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE));
 				//瑕佸瓨鍌ㄦ渶鍚庣殑鍏ㄩ儴allcode
-				wrapperAllCode(classifyFullInfoBO, finalRuleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString());
+				wrapperAllCode(classifyFullInfoBO, finalRuleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString(),codeDelimiter);
 			}
 			//澶勭悊鏈�澶ф祦姘�
 			saveSerialValue( finalRuleVO, lastMaxSerialValueMap, maxSerialValueMap);
 
 			allCodeDOList.stream().forEach(
-				allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode");allCode.setLctid("codeAllCodeLC");}
+				allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode",user);allCode.setLctid("codeAllCodeLC");}
 			);
-
 
 			Map<String, String> statusMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus()));
 			allCodeDOList.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> {
 				s.setLcStatus(statusMap.get(s.getOid()));
 			});
 
-
 			//閫氳繃ID鏉ヨ繘琛屽幓閲�
 			List<CodeAllCode> distinctCodeAllCOdes = allCodeDOList.stream().collect(Collectors
 				.collectingAndThen(
 					Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))),
 					ArrayList::new));
-			if( distinctCodeAllCOdes.size() != allCodeDOList.size() ){
+			if(distinctCodeAllCOdes.size() != allCodeDOList.size() ){
 				throw new ServiceException("缂栫爜鏁版嵁閲嶅锛屾棤娉曚繚瀛橈紝璇锋敞鎰忥紒");
 			}
 			QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
@@ -397,34 +446,29 @@
 			for (CodeAllCode codeAllCode : takeBack) {
 				codeAllCode.setTs(new Date());
 				codeAllCode.setLastModifyTime(new Date());
-				codeAllCode.setLastModifier(AuthUtil.getUserId().toString());
-				Iterator<CodeAllCode> iterator = allCodeDOList.iterator();
-				while (iterator.hasNext()){
+				codeAllCode.setLastModifier(Func.isNotEmpty(user) ? user.getAccount():AuthUtil.getUserAccount());
+				for (int i = 0; i < allCodeDOList.size(); i++) {
+					if(codeAllCode.getId().equals(allCodeDOList.get(i).getId())){
+						codeAllCode.setCreateCodeOid(allCodeDOList.get(i).getCreateCodeOid());
+						codeAllCode.setLcStatus(allCodeDOList.get(i).getLcStatus());
+						allCodeDOList.remove(i);
+					}
+				}
+				/*while (iterator.hasNext()){
 					CodeAllCode next = iterator.next();
 					if(codeAllCode.getId().equals(next.getId())){
 						codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
 						codeAllCode.setLcStatus(next.getLcStatus());
-						iterator.remove();
+						//iterator.remove();
 					}
-				}
+				}*/
 			}
 			if(takeBack.size()>0){
 				codeAllCodeService.updateBatchById(takeBack);
 			}
 			codeAllCodeService.saveBatch(allCodeDOList);
-//			iCodeWupinService.saveBatch(dataCBOList);
 			mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList);
-//			batchCBO.getCreateCbos().stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmName())).forEach(s -> {
-//				s.setLcStatus(statusMap.get(s.getOid()));
-//				try {
-//					s.setAttributeValue("lcstatus",statusMap.get(s.getOid()));
-//				} catch (VCIError e) {
-//					e.printStackTrace();
-//				}
-//			});
 		}
-		// WebUtil.setPersistence(true);
-		// boService.persistenceBatch(batchCBO);
 		return codeList;
 	}
 
@@ -476,6 +520,118 @@
 	/**
 	 * 杞崲娴佹按鐮佹鐨勫��
 	 * @param serialSecVOList 娴佹按鐮佹
+	 * @param secDTOS;娴佹按鍊�
+	 * @param attrSevIsSerialDepend 鏄惁鏈夊睘鎬х爜娈靛弬涓庢祦姘�
+	 * @param ruleVO 瑙勫垯鐨勫唴瀹�
+	 * @param serialUnitMap 娴佹按渚濇嵁
+	 * @param maxSerialValueMap 鏈�澶х殑娴佹按鍙�
+	 * @param thisSecValueList 鏈鐨勭爜鍊�
+	 * @param lastMaxSerialValueMap 灏佽鍚�
+	 * @param firstData 鏄惁涓虹涓�鏉℃暟鎹�
+	 */
+	private void switchSerialSecValueBZ(BaseModel cbo,List<CodeOrderSecDTO> secDTOS, List<CodeBasicSecVO> serialSecVOList,boolean attrSevIsSerialDepend,
+									  CodeRuleVO ruleVO,Map<String,String> serialUnitMap,
+									  Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/,CodeSerialValue>> maxSerialValueMap,List<String> thisSecValueList,
+									  Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/, String>> lastMaxSerialValueMap,boolean firstData){
+		if (!CollectionUtils.isEmpty(serialSecVOList)) {
+			Map<String/**鐮佹oid**/, String/**鐮佹鐮佸��**/> attrNameIdMap = secDTOS.stream().collect(Collectors.toMap(s -> s.getSecOid(), t -> t.getSecValue().toLowerCase(Locale.ROOT),(o1, o2)->o2));
+			Map<String,String> secIdserialValueMap=new LinkedHashMap<>();
+			for (int j = 0; j < serialSecVOList.size(); j++) {
+				AtomicReference<String> serialUnitString= new AtomicReference<>("");
+				CodeBasicSecVO secVO = serialSecVOList.get(j);
+				String secVOValue="";
+				if(attrNameIdMap.containsKey(secVO.getOid())){
+					secVOValue=attrNameIdMap.get(secVO.getOid());
+					if(StringUtils.isNotBlank(secVOValue)){
+						continue;
+					}
+				}
+				if(serialUnitMap.containsKey(secVO.getOid())){
+					serialUnitString.set(serialUnitMap.get(secVO.getOid()));
+					secIdserialValueMap.forEach((key,vaule)->{
+						serialUnitString.set(serialUnitString.get().replace("${"+key+"}", vaule));
+					});
+					if (attrSevIsSerialDepend || firstData) {
+						QueryWrapper<CodeSerialValue> codeSerialWrapper = new QueryWrapper<>();
+						codeSerialWrapper.eq("codeRuleOid", ruleVO.getOid());
+						codeSerialWrapper.eq("serialUnit", serialUnitString.get());
+						codeSerialWrapper.eq("codeSecOid", secVO.getOid());
+						List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(codeSerialWrapper);
+						if (!CollectionUtils.isEmpty(serialValueDOS)) {
+							Map<String, CodeSerialValue> unitSerialMap = maxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
+							CodeSerialValue serialValueDO = serialValueDOS.get(0);
+							unitSerialMap.put(serialValueDO.getSerialUnit(),serialValueDO);
+							maxSerialValueMap.put(secVO.getOid(), unitSerialMap);
+						}
+					}
+					String serialString="";
+					String thisSerialValue = "";
+					String startValue = null;
+					if (maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString.get())) {
+						startValue = maxSerialValueMap.get(secVO.getOid()).get(serialUnitString.get()).getMaxSerial();
+					}
+					if (lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString.get())) {
+						//璇存槑澶氫釜鐢宠锛屼箣鍓嶅凡缁忓姞浜嗘祦姘村彿浜�
+						startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(serialUnitString.get());
+					}
+					if(StringUtils.isNotBlank(secVO.getCustomCodeSerialClass())){//鑷畾涔夋祦姘村鐞�
+						String currentFlowValue=startValue;
+						CodeCustomSerialDTO codeCustomSerialDTO=new CodeCustomSerialDTO();
+						codeCustomSerialDTO.setSerialUnitString(serialUnitString.get());
+						codeCustomSerialDTO.setSerialCodeCodeBasicSec(secVO);
+						codeCustomSerialDTO.setCurrentFlowValue(startValue);
+						codeCustomSerialDTO.setCodeBasicSecVOList(ruleVO.getSecVOList());
+						codeCustomSerialDTO.setCodeRuleOid(ruleVO.getOid());
+						codeCustomSerialDTO.setBaseModel(cbo);
+						codeCustomSerialDTO.setSerialUnitString(serialUnitString.get());
+						codeCustomSerialDTO.setSecValueList(thisSecValueList);
+						thisSerialValue=customCodeSerial(secVO.getCustomCodeSerialClass(),codeCustomSerialDTO);
+						serialUnitString.set(codeCustomSerialDTO.getSerialUnitString());
+						log.info(secVO.getCustomCodeSerialClassText()+"---->"+thisSerialValue);
+					}else {
+						Double newThisSerialValue = 0d;
+						if (startValue == null) {
+							//绗竴涓紪鐮�
+							newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
+						} else {
+							//娴佹按鍙疯偗瀹氭槸鏁板瓧
+							newThisSerialValue = Double.parseDouble(startValue) + (j + 1) * secVO.getSerialStep();
+						}
+						//瑕佺湅鏄惁瓒呰繃鏈�澶х殑娴佹按鍊�
+						if (newThisSerialValue >= secVO.getCodeFillLimit()) {
+							throw new VciBaseException("娴佹按鍙峰凡缁忚秴杩囧厑璁哥殑鏈�澶ф祦姘村�納0}", new String[]{secVO.getCodeFillLimit().toString()});
+						}
+						thisSerialValue=String.valueOf(newThisSerialValue.intValue());
+					}
+					//瑕佺湅琛ヤ綅鐨勫唴瀹�
+					Integer fillLength = VciBaseUtil.getInt(secVO.getCodeFillLength());
+					if (fillLength == 0 || fillLength > VciBaseUtil.getInt(secVO.getCodeSecLength())) {
+						//闃叉鍦ㄦ坊鍔犵殑鍦版柟娌℃湁鎺у埗姝g‘
+						fillLength = VciBaseUtil.getInt(secVO.getCodeSecLength());
+					}
+					serialString = thisSerialValue;
+					serialString = fillString(fillLength, OsCodeFillTypeEnum.forValue(secVO.getCodeFillType()), serialString, secVO.getCodeFillSeparator());
+					for (int z = 0; z < thisSecValueList.size(); z++) {
+						String secValue = thisSecValueList.get(z);
+						if (secValue.equalsIgnoreCase("${" + secVO.getOid() + "}")) {
+							// TODO: 娴佹按鐢熸垚鐮佸�煎悗鎷兼帴鍓嶅悗缂�
+							thisSecValueList.set(z, joinPreffixAndSuffix(secVO, serialString));
+						}
+					}
+					secIdserialValueMap.put(secVO.getOid(),thisSerialValue);//璁板綍娴佹按鐮佹褰撳墠鐨勫��
+					if(StringUtils.isNotBlank(thisSerialValue)) {
+						Map<String, String> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
+						unitSerialMap.put(serialUnitString.get(), String.valueOf(thisSerialValue));
+						lastMaxSerialValueMap.put(secVO.getOid(), unitSerialMap);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * 杞崲娴佹按鐮佹鐨勫��
+	 * @param serialSecVOList 娴佹按鐮佹
 	 * @param attrSevIsSerialDepend 鏄惁鏈夊睘鎬х爜娈靛弬涓庢祦姘�
 	 * @param ruleVO 瑙勫垯鐨勫唴瀹�
 	 * @param serialUnitString 娴佹按渚濇嵁
@@ -484,13 +640,26 @@
 	 * @param lastMaxSerialValueMap 灏佽鍚�
 	 * @param firstData 鏄惁涓虹涓�鏉℃暟鎹�
 	 */
-	private void switchSerialSecValue(List<CodeBasicSecVO> serialSecVOList,boolean attrSevIsSerialDepend,
+	private void switchSerialSecValue(BaseModel cbo, List<CodeBasicSecVO> serialSecVOList,boolean attrSevIsSerialDepend,
 									  CodeRuleVO ruleVO,String serialUnitString,
 									  Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/,CodeSerialValue>> maxSerialValueMap,List<String> thisSecValueList,
-									  Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/, Double>> lastMaxSerialValueMap,boolean firstData){
+									  Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/, String>> lastMaxSerialValueMap,boolean firstData){
 		if (!CollectionUtils.isEmpty(serialSecVOList)) {
+			Map<String,String> secIdserialValueMap=new LinkedHashMap<>();
 			for (int j = 0; j < serialSecVOList.size(); j++) {
 				CodeBasicSecVO secVO = serialSecVOList.get(j);
+				String secVOValue="";
+				AtomicReference<String> newSerialUnitString= new AtomicReference<>(serialUnitString);
+				if(j==0){
+					secVOValue="";
+					newSerialUnitString.set(serialUnitString.replace("${" + secVO.getOid() + "}", secVOValue));
+				}else{
+					CodeBasicSecVO upSecVO =serialSecVOList.get(j-1);
+					secIdserialValueMap.forEach((key,vaule)->{
+						newSerialUnitString.set(serialUnitString.replace("${"+key+"}", vaule));
+					});
+				}
+
 				if (attrSevIsSerialDepend || firstData) {
 					//濡傛灉灞炴�х爜娈典篃鏄緷璧栵紝鍒欐瘡娆¢兘瑕佹煡璇紝濡傛灉灞炴�х爜娈典笉鏄緷璧栵紝鍒欏彧鏌ヨ涓�娆�
 //					Map<String, String> conditionMap = new HashMap<>();
@@ -499,8 +668,9 @@
 //					//杩欎釜瀛楁鏄负浜嗚В鍐冲涓祦姘寸殑闂
 //					conditionMap.put("codeSecOid", secVO.getOid());
 					QueryWrapper<CodeSerialValue> codeSerialWrapper = new QueryWrapper<>();
+
 					codeSerialWrapper.eq("codeRuleOid", ruleVO.getOid());
-					codeSerialWrapper.eq("serialUnit", serialUnitString);
+					codeSerialWrapper.eq("serialUnit", newSerialUnitString.get());
 					codeSerialWrapper.eq("codeSecOid", secVO.getOid());
 					List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(codeSerialWrapper);
 					if (!CollectionUtils.isEmpty(serialValueDOS)) {
@@ -510,25 +680,44 @@
 						maxSerialValueMap.put(secVO.getOid(), unitSerialMap);
 					}
 				}
-				Double startValue = null;
-				if(maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString)){
-					startValue = VciBaseUtil.getDouble(maxSerialValueMap.get(secVO.getOid()).get(serialUnitString).getMaxSerial());
+				String serialString="";
+				String thisSerialValue = "";
+				String startValue = null;
+				if (maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(newSerialUnitString.get())) {
+					startValue = maxSerialValueMap.get(secVO.getOid()).get(newSerialUnitString.get()).getMaxSerial();
 				}
-				if(lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString)){
+				if (lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(newSerialUnitString.get())) {
 					//璇存槑澶氫釜鐢宠锛屼箣鍓嶅凡缁忓姞浜嗘祦姘村彿浜�
-					startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(serialUnitString);
+					startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(newSerialUnitString.get());
 				}
-				Double thisSerialValue = 0d;
-				if (startValue == null) {
-					//绗竴涓紪鐮�
-					thisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
-				} else {
-					//娴佹按鍙疯偗瀹氭槸鏁板瓧
-					thisSerialValue = startValue + (j + 1) * secVO.getSerialStep();
-				}
-				//瑕佺湅鏄惁瓒呰繃鏈�澶х殑娴佹按鍊�
-				if (thisSerialValue >= secVO.getCodeFillLimit()) {
-					throw new VciBaseException("娴佹按鍙峰凡缁忚秴杩囧厑璁哥殑鏈�澶ф祦姘村�納0}",new String[]{secVO.getCodeFillLimit().toString()});
+				if(StringUtils.isNotBlank(secVO.getCustomCodeSerialClass())){//鑷畾涔夋祦姘村鐞�
+					String currentFlowValue=startValue;
+					CodeCustomSerialDTO codeCustomSerialDTO=new CodeCustomSerialDTO();
+					codeCustomSerialDTO.setSerialUnitString(newSerialUnitString.get());
+					codeCustomSerialDTO.setSerialCodeCodeBasicSec(secVO);
+					codeCustomSerialDTO.setCurrentFlowValue(startValue);
+					codeCustomSerialDTO.setCodeBasicSecVOList(ruleVO.getSecVOList());
+					codeCustomSerialDTO.setCodeRuleOid(ruleVO.getOid());
+					codeCustomSerialDTO.setBaseModel(cbo);
+					codeCustomSerialDTO.setSerialUnitString(newSerialUnitString.get());
+					codeCustomSerialDTO.setSecValueList(thisSecValueList);
+					thisSerialValue=customCodeSerial(secVO.getCustomCodeSerialClass(),codeCustomSerialDTO);
+					newSerialUnitString.set(codeCustomSerialDTO.getSerialUnitString());
+					log.info(secVO.getCustomCodeSerialClassText()+"---->"+thisSerialValue);
+				}else {
+					Double newThisSerialValue = 0d;
+					if (startValue == null) {
+						//绗竴涓紪鐮�
+						newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
+					} else {
+						//娴佹按鍙疯偗瀹氭槸鏁板瓧
+						newThisSerialValue = Double.parseDouble(startValue) + (j + 1) * secVO.getSerialStep();
+					}
+					//瑕佺湅鏄惁瓒呰繃鏈�澶х殑娴佹按鍊�
+					if (newThisSerialValue >= secVO.getCodeFillLimit()) {
+						throw new VciBaseException("娴佹按鍙峰凡缁忚秴杩囧厑璁哥殑鏈�澶ф祦姘村�納0}", new String[]{secVO.getCodeFillLimit().toString()});
+					}
+					thisSerialValue=String.valueOf(newThisSerialValue.intValue());
 				}
 				//瑕佺湅琛ヤ綅鐨勫唴瀹�
 				Integer fillLength = VciBaseUtil.getInt(secVO.getCodeFillLength());
@@ -536,8 +725,9 @@
 					//闃叉鍦ㄦ坊鍔犵殑鍦版柟娌℃湁鎺у埗姝g‘
 					fillLength = VciBaseUtil.getInt(secVO.getCodeSecLength());
 				}
-				String serialString = String.valueOf(thisSerialValue.longValue());
+				serialString = thisSerialValue;
 				serialString = fillString(fillLength, OsCodeFillTypeEnum.forValue(secVO.getCodeFillType()), serialString, secVO.getCodeFillSeparator());
+
 				for (int z = 0; z < thisSecValueList.size(); z++) {
 					String secValue = thisSecValueList.get(z);
 					if (secValue.equalsIgnoreCase("${" + secVO.getOid() + "}")) {
@@ -545,11 +735,62 @@
 						thisSecValueList.set(z, joinPreffixAndSuffix(secVO, serialString));
 					}
 				}
-				Map<String, Double> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
-				unitSerialMap.put(serialUnitString, thisSerialValue);
+				secIdserialValueMap.put(secVO.getOid(),thisSerialValue);//璁板綍娴佹按鐮佹褰撳墠鐨勫��
+				Map<String, String> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
+				unitSerialMap.put(newSerialUnitString.get(), String.valueOf(thisSerialValue));
 				lastMaxSerialValueMap.put(secVO.getOid(),unitSerialMap);
 			}
 		}
+	}
+
+	private String customCodeSerial(String beanName, CodeCustomSerialDTO codeCustomSerialDTO){
+		AtomicReference<String> result = new AtomicReference<>("");
+		//BusAnnotationUtil.callForAnnotation(FlowNotifyWeb.class, FlowNotifyBefore.class,noticeInfo);
+		//鍦ㄧ櫥褰曚箣鍓嶏紝鐪嬬湅鏄惁鏈夋彃浠�
+		Map<String, Object> beanMap = ApplicationContextProvider.getApplicationContext().getBeansWithAnnotation(MdmSerialAlgorithm.class);
+		if (!CollectionUtils.isEmpty(beanMap)) {
+			if(beanMap.containsKey(beanName)){
+				Object v=beanMap.get(beanName);
+				Method[] methods = v.getClass().getDeclaredMethods();
+				if (methods != null && methods.length > 0) {
+					for (Method method : methods) {
+						if (method.isAnnotationPresent(MdmSerialAlgorithmMethod.class)) {
+							try {
+								Object  o=	method.invoke(v, codeCustomSerialDTO);
+								result.set(Func.isEmpty(o) ?"":o.toString());
+							} catch (Throwable e) {
+								if (log.isErrorEnabled()) {
+									log.error("璋冪敤鎻掍欢鍑洪敊", e);
+								}
+								throw new VciBaseException("璋冪敤鎻掍欢鍑洪敊,{0},{1}", new String[]{v.getClass().getName(), method.getName()}, e);
+							}
+						}
+					}
+				}
+			}
+		}
+		/*
+		String result = "";
+		try {
+			Class classInstance=Class.forName(className);
+			Object obj =classInstance.newInstance();
+			Method method= classInstance.getMethod("serialGenerate",CodeCustomSerialDTO.class);
+			method.setAccessible(Boolean.TRUE);
+			//method.invoke(obj);
+			Object  o= method.invoke(obj,codeCustomSerialDTO);
+			result= Func.isEmpty(o) ?"":o.toString();
+		} catch (ClassNotFoundException e) {
+			throw new VciBaseException("鏈壘鍒拌嚜瀹氫箟娴佹按绠楁硶绫绘枃浠�");
+		} catch (InvocationTargetException e) {
+			throw new VciBaseException("鎵ц鑷畾涔夋祦姘寸畻娉曞鐞嗘柟娉曞嚭鐜板紓甯�");
+		} catch (NoSuchMethodException e) {
+			throw new VciBaseException("鏈壘鍒拌嚜瀹氫箟娴佹按绠楁硶澶勭悊鏂规硶");
+		} catch (IllegalAccessException e) {
+			throw new VciBaseException("鎵ц鑷畾涔夋祦姘寸畻娉曞鐞嗘柟娉曞嚭鐜板紓甯�");
+		} catch (InstantiationException e) {
+			e.printStackTrace();
+		}*/
+		return result.get();
 	}
 
 	/**
@@ -581,6 +822,10 @@
 			case CODE_CLASSIFY_SEC:
 				//鍒嗙被鐮佹鐨勶紝涔熸槸浠庡墠绔�夋嫨浜嗙爜鍊煎嵆鍙紝涓嶈鐮佸�肩殑闀垮害鏄灏�
 				CodeClassifyValue codeClassifyValueDO= codeClassifyValueMapper.selectById(secValue);
+				//褰撶爜鍊间负绌烘垨#NaN?鏃跺嵆琛ㄧず浣滀负绌哄瓧绗︿覆杩涜鎷兼帴
+				if(Func.isBlank(codeClassifyValueDO.getId()) || codeClassifyValueDO.getId().equals("#NaN?")){
+					codeClassifyValueDO.setId("");
+				}
 				if(codeClassifyValueDO!=null) {
 					secValue = joinPreffixAndSuffix(secVO, codeClassifyValueDO.getId());
 				}
@@ -651,7 +896,7 @@
 			case CODE_VARIABLE_SEC:
 				//鍙彉鐮佹锛屾槸鍦ㄩ〉闈笂杈撳叆鍐呭
 				if (secValue.length() > VciBaseUtil.getInt(secVO.getCodeSecLength())) {
-					throw new VciBaseException("銆恵0}銆戣繖涓爜娈垫槸鍙彉鐮佹锛屼絾鏄幇鍦ㄨ緭鍏ョ殑鐮佸�肩殑闀垮害({1})瓒呰繃浜嗚瀹氱殑闀垮害{2}", new String[]{secVO.getName(), String.valueOf(secValue.length()), secVO.getCodeSecLength()});
+					throw new ServiceException(String.format("銆恵%s}銆戣繖涓爜娈垫槸鍙彉鐮佹锛屼絾鏄幇鍦ㄨ緭鍏ョ殑鐮佸�肩殑闀垮害({%s})瓒呰繃浜嗚瀹氱殑闀垮害{%s}", secVO.getName(), secValue.length(), secVO.getCodeSecLength()));
 				}
 				OsCodeFillTypeEnum fillTypeEnum = OsCodeFillTypeEnum.forValue(secVO.getCodeFillType());
 				secValue = fillString(VciBaseUtil.getInt(secVO.getCodeSecLength()), fillTypeEnum, secValue, secVO.getCodeFillSeparator());
@@ -672,20 +917,20 @@
 
 	/**
 	 * 鎷兼帴鍓嶅悗缂�
-	 * @param secVO
-	 * @param secValue
+	 * @param secVO 鐮佹
+	 * @param secValue 鐮佸��
 	 * @return
 	 */
-	private String joinPreffixAndSuffix(CodeBasicSecVO secVO, String secValue){
+	public String joinPreffixAndSuffix(CodeBasicSecVO secVO, String secValue){
 		StringBuilder joinSecValue = new StringBuilder();
 		// 鎷兼帴鍓嶇紑
-		if (Func.isNotEmpty(secVO.getPrefixCode())) {
+		if (Func.isNotEmpty(secVO.getPrefixCode()) && Func.isNotEmpty(secValue)) {
 			joinSecValue = joinSecValue.append(secVO.getPrefixCode());
 		}
 		// 鍦ㄤ腑闂存嫾鎺ュ��
 		joinSecValue.append(secValue);
 		// 鎷兼帴鍚庣紑
-		if(Func.isNotEmpty(secVO.getSuffixCode())){
+		if(Func.isNotEmpty(secVO.getSuffixCode()) && Func.isNotEmpty(secValue)){
 			joinSecValue = joinSecValue.append(secVO.getSuffixCode());
 		}
 		return joinSecValue.toString();
@@ -724,10 +969,11 @@
 	 * @param cbo 涓氬姟鏁版嵁
 	 * @param templateVO 妯℃澘鐨勪俊鎭�
 	 * @param allCodeDOList 鎵�鏈夌殑鐮佸�肩殑瀵硅薄鍒楄〃
+	 * @param codeDelimiter 鐮佸�煎垎鍓茬
 	 */
 	private void wrapperAllCode(CodeClassifyFullInfoBO classifyFullInfoBO, CodeRuleVO ruleVO,
                                 BaseModel cbo, CodeClassifyTemplateVO templateVO,
-                                List<CodeAllCode> allCodeDOList, String serialUnitString, String serialValueString){
+                                List<CodeAllCode> allCodeDOList, String serialUnitString, String serialValueString,String codeDelimiter){
 		CodeAllCode allCodeDO = new CodeAllCode();
 		DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCodeDO, MdmBtmTypeConstant.CODE_ALL_CODE);
 		allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid());
@@ -739,6 +985,7 @@
 		allCodeDO.setSerialUnit(serialUnitString);
 		allCodeDO.setUnFillSerial(serialValueString);
 		allCodeDO.setLcStatus(cbo.getLcStatus());
+		allCodeDO.setCodeDelimit(codeDelimiter);
 		allCodeDOList.add(allCodeDO);
 	}
 
@@ -749,7 +996,7 @@
 	 * @param maxSerialValueMap 渚濇嵁瀛樺偍鐨勬渶澶ф祦姘寸殑鍐呭
 	 */
 	private void saveSerialValue(CodeRuleVO ruleVO,
-								 Map<String/**鐮佹鐨勪富閿�**/,Map<String, Double>> lastMaxSerialValueMap,
+								 Map<String/**鐮佹鐨勪富閿�**/,Map<String, String>> lastMaxSerialValueMap,
 								 Map<String/**鐮佹鐨勪富閿�**/,Map<String, CodeSerialValue>> maxSerialValueMap){
 		List<CodeSerialValue> editSerialValueDOList = new ArrayList<>();
 		List<CodeSerialValue> addSerialValueDOList = new ArrayList<>();
@@ -902,6 +1149,283 @@
 		return updateFlag.get();
 	}
 
+	/***
+	 *
+	 * @param classifyFullInfoBO 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
+	 * @param ruleVO 缂栫爜瑙勫垯鐨勬樉绀哄璞�
+	 * @param secDTOList 鍚勪釜鐮佹鐨勫��
+	 * @param dataCBOList 涓氬姟鏁版嵁
+	 * @return
+	 * @throws Exception
+	 */
+	@Override
+	public List<String> productCodeAndSaveDataBZ(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;
+
+		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()));
+		List<CodeBasicSecVO> serialSecVOList = new ArrayList<>();
+		List<CodeBasicSecVO> attrSecVOList = new ArrayList<>();
+		Map<String,String> secOdserialUnitMap=new HashMap<>();
+		LinkedHashMap<String,String> newSecValueMap=new LinkedHashMap<>();
+		for (int i = 0; i < secVOList.size(); i++) {
+			CodeBasicSecVO secVO = secVOList.get(i);
+			String secValue="";
+			String secOid=secVO.getOid();
+			if(secValueMap.containsKey(secOid)){
+				secValue=secValueMap.get(secOid);
+			}
+			newSecValueMap.put(secOid,secValue);
+			switchSecValueBZ(secVO, secValueMap, classifyFullInfoBO, serialSecVOList, attrSecVOList, serialUnitList, secValueList);
+			//鍒嗘瀛樺偍娴佹按渚濊禆
+			if(secVO.getSecType().equals(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue())){
+				int finalI = i;
+				final int[] index = {0};
+				List<String> newSerialUnitList= serialUnitList.stream().filter(secValueStr -> {
+					return index[0]++< finalI;//闄ゅ幓娴佹按鐨�
+				}).collect(Collectors.toList());
+				String serialUnitString = newSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : newSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
+				secOdserialUnitMap.put(secVO.getOid(),serialUnitString);
+			}
+		}
+		//澶勭悊灞炴�х爜娈靛拰娴佹按鐮佹
+		Map<String/**娴佹按鐮佹鐨勪富閿�**/, Map<String/**娴佹按渚濇嵁**/, String>> lastMaxSerialValueMap = new HashMap<>();
+		List<CodeAllCode> allCodeDOList = new ArrayList<>();
+		//宸茬粡瀛樺偍鐨勬渶澶ф祦姘村彿鐨勫唴瀹�
+		Map<String/**鐮佹鐨勪富閿�**/, Map<String, CodeSerialValue>> maxSerialValueMap = new HashMap<>();
+		for (int i = 0; i < dataCBOList.size(); i++) {
+			BaseModel cbo = dataCBOList.get(i);
+			cbo.getData().remove(CODE_SEC_LENGTH_FIELD);//灏嗘key闄ゅ幓
+			cbo.getData().remove(IMPORT_ROW_INDEX);//灏嗘key闄ゅ幓
+			cbo.getData().remove("codeclassifyid");//灏嗘key闄ゅ幓
+			List<String> thisSecValueList = new LinkedList<>();
+			for (int j = 0; j < secValueList.size(); j++) {
+				thisSecValueList.add(secValueList.get(j));
+			}
+			List<String> thisSerialUnitList = new LinkedList<>();
+			//鍥犱负娴佹按渚濇嵁姣忔鍙兘涓嶄竴鏍凤紝鎵�浠ユ瘡娆¢兘鎷疯礉涓�浠�
+			for (int j = 0; j < serialUnitList.size(); j++) {
+				thisSerialUnitList.add(serialUnitList.get(j));
+			}
+			//鍏堢湅鐪嬫湁娌℃湁灞炴�х殑鐮佹
+			boolean attrSevIsSerialDepend = CollectionUtils.isEmpty(attrSecVOList) ? false : (attrSecVOList.stream().anyMatch(s -> VciBaseUtil.getBoolean(s.getSerialDependFlag())));
+			switchAttrSecValue(attrSecVOList, cbo, thisSecValueList, attrSevIsSerialDepend, thisSerialUnitList);
+
+			switchSerialSecValueBZ(cbo,secDTOList,serialSecVOList, attrSevIsSerialDepend, finalRuleVO, secOdserialUnitMap, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
+
+			//缁勮缂栫爜鐨勫��
+			cbo.setId(thisSecValueList.stream().collect(Collectors.joining()));
+			codeList.add(cbo.getId());
+			StringBuilder sb = new StringBuilder();
+			//鎶婄爜娈甸噷闈㈤兘鎵句竴涓嬫祦姘村彿
+			AtomicReference<String> serialUnitString= new AtomicReference<>("");
+			for (int j = 0; j < serialSecVOList.size(); j++) {
+				CodeBasicSecVO secVO = serialSecVOList.get(j);
+				if(lastMaxSerialValueMap.containsKey(secVO.getOid())){//姝や负鏈�鍚庨渶瑕佸瓨鍏ユ祦姘翠緷璧栫殑鏈�澶ф祦姘�
+					Map<String/**娴佹按渚濇嵁**/, String> serialValueMap = lastMaxSerialValueMap.get(secVO.getOid());
+					serialValueMap.forEach((maxSerialUnitString,serialValue)->{
+						if(StringUtils.isNotBlank(serialValue)){
+							serialUnitString.set(maxSerialUnitString);
+							sb.append(serialValue).append(SERIAL_VALUE_SPACE);
+						}
+					});
+				}else{
+					if(secValueMap.containsKey(secVO.getOid())) {//浼佷笟鏍囧噯澶勭悊淇椤哄簭鍙峰凡缁忓瓨鍦ㄧ殑鏁版嵁鍒欎笉闇�瑕佸姩娴佹按渚濊禆琛ㄧ殑鏁版嵁
+						serialUnitString.set(secOdserialUnitMap.get(secVO.getOid()));
+						sb.append(secValueMap.get(secVO.getOid())).append(SERIAL_VALUE_SPACE);
+					}
+				}
+			}
+			String codeDelimiter=thisSecValueList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE));
+			//瑕佸瓨鍌ㄦ渶鍚庣殑鍏ㄩ儴allcode
+			wrapperAllCode(classifyFullInfoBO, finalRuleVO, cbo, templateVO, allCodeDOList, serialUnitString.get(), sb.toString(),codeDelimiter);
+		}
+		//澶勭悊鏈�澶ф祦姘�
+		saveSerialValue( finalRuleVO, lastMaxSerialValueMap, maxSerialValueMap);
+
+		allCodeDOList.stream().forEach(
+			allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode");allCode.setLctid("codeAllCodeLC");}
+		);
+
+		Map<String, String> statusMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus()));
+		allCodeDOList.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> {
+			s.setLcStatus(statusMap.get(s.getOid()));
+		});
+		//閫氳繃ID鏉ヨ繘琛屽幓閲�
+		List<CodeAllCode> distinctCodeAllCOdes = allCodeDOList.stream().collect(Collectors
+			.collectingAndThen(
+				Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))),
+				ArrayList::new));
+		if( distinctCodeAllCOdes.size() != allCodeDOList.size() ){
+			throw new ServiceException("缂栫爜鏁版嵁閲嶅锛屾棤娉曚繚瀛橈紝璇锋敞鎰忥紒");
+		}
+		QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
+		wrapper.eq("CREATECODEBTM",allCodeDOList.get(0).getCreateCodeBtm());
+		wrapper.in("ID",allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
+		List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
+		List<CodeAllCode> takeBack = codeAllCodes.stream().filter(e -> e.getLcStatus().equals("TakeBack")).collect(Collectors.toList());
+		if(codeAllCodes.size()>takeBack.size()){
+			throw new ServiceException("鐢熸垚缂栫爜鏁版嵁ID宸叉湁鍘嗗彶璁板綍,璇风‘璁ゅ涓嬬敓鎴愮殑ID鏁版嵁锛�"+ allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
+		}
+		for (CodeAllCode codeAllCode : takeBack) {
+			codeAllCode.setTs(new Date());
+			codeAllCode.setLastModifyTime(new Date());
+			codeAllCode.setLastModifier(AuthUtil.getUserId().toString());
+			Iterator<CodeAllCode> iterator = allCodeDOList.iterator();
+			for (int i = 0; i < allCodeDOList.size(); i++) {
+				if(codeAllCode.getId().equals(allCodeDOList.get(i).getId())){
+					codeAllCode.setCreateCodeOid(allCodeDOList.get(i).getCreateCodeOid());
+					codeAllCode.setLcStatus(allCodeDOList.get(i).getLcStatus());
+					allCodeDOList.remove(i);
+				}
+			}
+			/*while (iterator.hasNext()){
+				CodeAllCode next = iterator.next();
+				if(codeAllCode.getId().equals(next.getId())){
+					codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
+					codeAllCode.setLcStatus(next.getLcStatus());
+					//iterator.remove();
+				}
+			}*/
+		}
+		if(takeBack.size()>0){
+			codeAllCodeService.updateBatchById(takeBack);
+		}
+		codeAllCodeService.saveBatch(allCodeDOList);
+		mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList);
+		return codeList;
+	}
+
+	/**
+	 * 杞崲鐮佸�肩殑鍐呭
+	 * @param secVO 鐮佹鐨勫唴瀹�
+	 * @param secValueMap 鐮佸�肩殑鍐呭锛宬ey鏄爜娈电殑涓婚敭锛寁alue鏄爜鍊�
+	 * @param classifyFullInfoBO 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param serialSecVOList 娴佹按鐮佹
+	 * @param attrSecVOList 灞炴�х爜娈�
+	 * @param serialUnitList 娴佹按渚濇嵁
+	 * @param secValueList 鐮佸�煎垪琛�
+	 */
+	private void switchSecValueBZ(CodeBasicSecVO secVO,Map<String,String> secValueMap,
+								CodeClassifyFullInfoBO classifyFullInfoBO,List<CodeBasicSecVO> serialSecVOList,
+								List<CodeBasicSecVO> attrSecVOList, List<String> serialUnitList,
+								List<String> secValueList ){
+		CodeSecTypeEnum secType = CodeSecTypeEnum.forValue(secVO.getSecType());
+		String secValue = secValueMap.getOrDefault(secVO.getOid(), "");
+		switch (secType) {
+			case CODE_FIXED_SEC:
+				secValue = joinPreffixAndSuffix(secVO, secValue);
+				//鍥哄畾鐮佹鐨勶紝鐩存帴鐢ㄧ爜鍊�,涓嶈鐮佸�肩殑闀垮害鏄灏戯紝鍥犱负鍙彉闀垮害鍜屽浐瀹氶暱搴︽槸鎺у埗鍦ㄧ爜娈电鐞嗛噷闈㈢殑鐮佸�煎畾涔夌殑
+				break;
+			case CODE_DATE_SEC:
+				//鏃堕棿鐮佹锛岄渶瑕佸皢褰撳墠鏃堕棿渚濇嵁鏃堕棿鏍煎紡杩涜杞崲.
+				//鏃堕棿鐮佹涓嶆秹鍙婂埌鏄惁琛ヤ綅
+				secValue =joinPreffixAndSuffix(secVO, VciDateUtil.date2Str(new Date(), secVO.getCodeDateFormatStr()));
+				break;
+			case CODE_CLASSIFY_SEC:
+				//鍒嗙被鐮佹鐨勶紝涔熸槸浠庡墠绔�夋嫨浜嗙爜鍊煎嵆鍙紝涓嶈鐮佸�肩殑闀垮害鏄灏�
+				CodeClassifyValue codeClassifyValueDO= codeClassifyValueMapper.selectById(secValue);
+				if(Func.isBlank(codeClassifyValueDO.getId()) || codeClassifyValueDO.getId().equals("#NaN?")){
+					codeClassifyValueDO.setId("");
+				}
+				if(codeClassifyValueDO!=null) {
+					secValue = joinPreffixAndSuffix(secVO, codeClassifyValueDO.getId());
+				}
+				break;
+			case CODE_LEVEL_SEC:
+				//灞傜骇鐮佹锛岄渶瑕佷粠鍒嗙被涓婅幏鍙栫浉搴旂殑淇℃伅
+				if (CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(secVO.getCodeLevelType())) {
+					//鏈�灏忓眰锛屽洜涓烘垜浠彧鑳藉湪鍙跺瓙鑺傜偣涓婄敵璇风紪鐮侊紝鎵�浠ヨ繖涓氨鏄綋鍓嶅垎绫荤殑
+					if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType()) || CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
+						//灏辨槸褰撳墠鍒嗙被鐨�
+						secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+					} else {
+						//鎴戜滑闇�瑕佷粠椤跺眰寮�濮嬫壘鍒板綋鍓嶅垎绫讳负姝�
+						secValue = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
+					}
+				} else {
+					//鎸囧畾灞傦紝鎴戜滑闇�瑕侀�氳繃涓婄骇鐨勬潵鑾峰彇
+					if (CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
+						//璇存槑褰撳墠宸茬粡鏄渶楂樼殑浜�
+						secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+					} else {
+						//杩欎釜鎴戜滑闇�瑕佺湅鐪�,灞傜骇鏄笉鏄ぇ浜庝簡鏈�澶у眰绾х殑鏁�
+						List<CodeClassifyVO> parentClassifyVOList = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).collect(Collectors.toList());
+						if (secVO.getCodeLevelValue() > (parentClassifyVOList.size() + 1)) {
+							//鎸囧畾鐨勫眰绾ф瘮褰撳墠鐨勫眰绾ц繕澶т簡锛屾墍浠ュ彧鑳借幏鍙栧綋鍓嶅眰绾т簡
+							if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType())) {
+								secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
+							} else {
+								secValue = parentClassifyVOList.stream().map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
+							}
+						} else {
+							//鎴戜滑鑾峰彇鍏朵腑鎸囧畾灞傜殑鍐呭
+							if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType())) {
+								CodeClassifyVO classifyVO = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() == secVO.getCodeLevelValue().intValue()).findFirst().orElseGet(() -> null);
+								if (classifyVO != null) {
+									secValue = classifyVO.getId();
+								}
+							} else {
+								//灏忎簬绛変簬鐨勫叏閮ㄦ嬁鍑烘潵
+								secValue = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() <= secVO.getCodeLevelValue().intValue()).sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining());
+							}
+						}
+					}
+				}
+				//鐪嬬湅闀垮害鏄惁闇�瑕佹埅鏂�
+				if (!CodeCutTypeEnum.NONE.getValue().equalsIgnoreCase(secVO.getValueCutType()) &&
+					secVO.getValueCutLength() != null && secVO.getValueCutLength() > 0 && secValue.length() > secVO.getValueCutLength()) {
+					if (CodeCutTypeEnum.RIGHT.getValue().equalsIgnoreCase(secVO.getValueCutType())) {
+						//宸︽埅鍙栨槸浠庡乏杈瑰壀鎺夛紝鍙虫埅鍙栨槸浠庡彸杈瑰壀鎺�--淇濈暀宸﹁竟
+						secValue = secValue.substring(0, secVO.getValueCutLength());
+					} else {
+						secValue = secValue.substring(secValue.length() - secVO.getValueCutLength());
+					}
+				}
+				secValue = joinPreffixAndSuffix(secVO,secValue);
+				break;
+			case CODE_REFER_SEC:
+				//寮曠敤鐨勫湪椤甸潰涓婂凡缁忛�夋嫨浜嗭紝鎵�浠ョ洿鎺ヤ娇鐢ㄥ墠绔笂浼犻�掔殑鍊�
+				//寮曠敤灏辨槸鍙傜収锛屽彲鑳芥槸鍏朵粬鐨勫垎绫伙紙涓氬姟绫诲瀷锛変笅鐨勬暟鎹紝鎵�浠ュ彧鍦ㄩ〉闈笂閫夋嫨
+				secValue = joinPreffixAndSuffix(secVO,secValue);
+				break;
+			case CODE_ATTR_SEC:
+				//灞炴�т笌寮曠敤鐨勫尯鍒槸锛屽睘鎬ф槸褰撳墠鏁版嵁閲岀殑灞炴�э紝鑰屽紩鐢ㄥ彲鑳芥槸寮曠敤鍏朵粬鐨勫垎绫荤殑锛堜笟鍔$被鍨嬶級
+				//鍥犱负鍙兘鏄壒閲忕殑鏁版嵁鐨勬搷浣滐紝鎵�浠ユ垜浠繖閲屼笉鑳界洿鎺ュ鐞嗗睘鎬э紝闇�瑕佸悗杈逛竴杈瑰鐞�
+				secValue = "${attr_" + secVO.getOid() + "}";
+				attrSecVOList.add(secVO);
+				break;
+			case CODE_VARIABLE_SEC:
+				//鍙彉鐮佹锛屾槸鍦ㄩ〉闈笂杈撳叆鍐呭
+				if (secValue.length() > VciBaseUtil.getInt(secVO.getCodeSecLength())) {
+					throw new VciBaseException("銆恵0}銆戣繖涓爜娈垫槸鍙彉鐮佹锛屼絾鏄幇鍦ㄨ緭鍏ョ殑鐮佸�肩殑闀垮害({1})瓒呰繃浜嗚瀹氱殑闀垮害{2}", new String[]{secVO.getName(), String.valueOf(secValue.length()), secVO.getCodeSecLength()});
+				}
+				OsCodeFillTypeEnum fillTypeEnum = OsCodeFillTypeEnum.forValue(secVO.getCodeFillType());
+				secValue = fillString(VciBaseUtil.getInt(secVO.getCodeSecLength()), fillTypeEnum, secValue, secVO.getCodeFillSeparator());
+				secValue = joinPreffixAndSuffix(secVO,secValue);
+				break;
+			case CODE_SERIAL_SEC:
+				//娴佹按鐮佹
+				serialSecVOList.add(secVO);
+				if(secValueMap.containsKey(secVO.getOid())){
+					secValue=secValueMap.get(secVO.getOid());
+				}else{
+					secValue = "${" + secVO.getOid() + "}";
+				}
+			default:
+				break;
+		}
+		if (VciBaseUtil.getBoolean(secVO.getSerialDependFlag())) {
+			serialUnitList.add(secValue);
+		}
+		secValueList.add(secValue);
+	}
+
 	/**
 	 * 浣跨敤CBO澶勭悊缁勫悎瑙勫垯鐨勫唴瀹�
 	 * @param cbo 鏁版嵁鐨勫唴瀹�
@@ -917,7 +1441,7 @@
 		}
 		Map<String, String> map = new HashMap<String, String>();
 		for (String i : dataMap.keySet()) {
-			map.put(i, String.valueOf(dataMap.get(i)));
+			map.put(i, String.valueOf(dataMap.get(i)).trim());
 		}
 //		WebUtil.copyValueToMapFromCbos(cbo,dataMap);
 		return formulaService.getValueByFormula(map,rule);

--
Gitblit v1.9.3