From 54036dc2ebc591f891f452b3b248594d60fc583e Mon Sep 17 00:00:00 2001
From: xiejun <xj@2023>
Date: 星期三, 29 十一月 2023 09:25:03 +0800
Subject: [PATCH] 1.标准申请功能开发 2.业务数据报错去空格

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java                 |   10 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/系列流水.json       |   39 +
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeCustomSerialDTO.java               |    5 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/标准修订月份小于2的.json |   35 +
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java               |   11 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeBZOperationTypeEnum.java              |  135 +++++
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeAllCode.java                    |    5 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java                      |    8 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/标准申请.json       |   35 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java   |  154 +++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java             |  297 ++++++++++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java   |    3 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java                 |    5 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/标准修订月份大于1的.json |   35 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java                |   16 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBZApplyDTO.java                    |  200 ++++++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java        |  433 +++++++++++++++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java                                |   13 
 18 files changed, 1,402 insertions(+), 37 deletions(-)

diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBZApplyDTO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBZApplyDTO.java
new file mode 100644
index 0000000..64a39c9
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBZApplyDTO.java
@@ -0,0 +1,200 @@
+package com.vci.ubcs.code.dto;
+import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
+import lombok.Data;
+import java.util.List;
+/**
+ * 鏍囧噯鐢宠鍜屼慨璁㈡暟鎹�,鍦ㄥ崟鏉$殑鏃跺�欎娇鐢�
+ * @author xiejun
+ * @date 2023-11-22
+ */
+public class CodeBZApplyDTO extends BaseModelDTO {
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 1980155181507713249L;
+	/***
+	 * 鎿嶄綔绫诲瀷
+	 */
+	private String operationType;
+	/***
+	 * 鏄惁绯诲垪
+	 */
+	private boolean series;
+	/***
+	 *鍙戝竷鏃堕棿
+	 */
+
+	private String releaseTime;
+	/***
+	 * 婧愭爣鍑嗗彿
+	 */
+	private String oldCode;
+
+	/***
+	 * 绯诲垪娴佹按
+	 */
+	private String seriesFlow;
+	/***
+	 * 鏄惁鍙樻洿绯诲垪
+	 */
+	private boolean editSeries;
+
+
+	/**
+	 * 涓婚搴撳垎绫讳富閿�
+	 */
+	private String codeClassifyOid;
+
+	/**
+	 * 妯℃澘鐨勪富閿�
+	 */
+	private String templateOid;
+	/**
+	 * 缂栫爜瑙勫垯鐨勪富閿�
+	 */
+	private String codeRuleOid;
+
+	/**
+	 * 鏄惁鍦ㄦ祦绋嬩腑涓慨鏀�
+	 */
+	private boolean editInProcess;
+
+	/**
+	 * 鐮佹閫夋嫨鐨勪俊鎭�
+	 */
+	private List<CodeOrderSecDTO> secDTOList;
+
+
+	/**
+	 * 鏈�澶ф祦姘村彿
+	 */
+	private int maxSecNum;
+
+	public String getOperationType() {
+		return operationType;
+	}
+
+	public void setOperationType(String operationType) {
+		this.operationType = operationType;
+	}
+
+//	public boolean isSeries() {
+//		return isSeries;
+//	}
+//
+//	public void setSeries(boolean series) {
+//		isSeries = series;
+//	}
+//
+
+
+
+
+	public String getReleaseTime() {
+		return releaseTime;
+	}
+
+	public void setReleaseTime(String releaseTime) {
+		this.releaseTime = releaseTime;
+	}
+
+	public String getOldCode() {
+		return oldCode;
+	}
+
+	public void setOldCode(String oldCode) {
+		this.oldCode = oldCode;
+	}
+
+	public String getSeriesFlow() {
+		return seriesFlow;
+	}
+
+	public void setSeriesFlow(String seriesFlow) {
+		this.seriesFlow = seriesFlow;
+	}
+
+
+
+	public String getCodeClassifyOid() {
+		return codeClassifyOid;
+	}
+
+	public void setCodeClassifyOid(String codeClassifyOid) {
+		this.codeClassifyOid = codeClassifyOid;
+	}
+
+	public String getTemplateOid() {
+		return templateOid;
+	}
+
+	public void setTemplateOid(String templateOid) {
+		this.templateOid = templateOid;
+	}
+
+	public String getCodeRuleOid() {
+		return codeRuleOid;
+	}
+
+	public void setCodeRuleOid(String codeRuleOid) {
+		this.codeRuleOid = codeRuleOid;
+	}
+
+	public boolean isEditInProcess() {
+		return editInProcess;
+	}
+
+	public void setEditInProcess(boolean editInProcess) {
+		this.editInProcess = editInProcess;
+	}
+
+	public List<CodeOrderSecDTO> getSecDTOList() {
+		return secDTOList;
+	}
+
+	public void setSecDTOList(List<CodeOrderSecDTO> secDTOList) {
+		this.secDTOList = secDTOList;
+	}
+
+	public int getMaxSecNum() {
+		return maxSecNum;
+	}
+
+	public void setMaxSecNum(int maxSecNum) {
+		this.maxSecNum = maxSecNum;
+	}
+
+	public boolean isSeries() {
+		return series;
+	}
+
+	public void setSeries(boolean series) {
+		this.series = series;
+	}
+
+	public boolean isEditSeries() {
+		return editSeries;
+	}
+
+	public void setEditSeries(boolean editSeries) {
+		this.editSeries = editSeries;
+	}
+
+	@Override
+	public String toString() {
+		return "CodeBZApplyDTO{" +
+			"operationType='" + operationType + '\'' +
+			", series=" + series +
+			", releaseTime='" + releaseTime + '\'' +
+			", oldCode='" + oldCode + '\'' +
+			", seriesFlow='" + seriesFlow + '\'' +
+			", editSeries=" + editSeries +
+			", codeClassifyOid='" + codeClassifyOid + '\'' +
+			", templateOid='" + templateOid + '\'' +
+			", codeRuleOid='" + codeRuleOid + '\'' +
+			", editInProcess=" + editInProcess +
+			", secDTOList=" + secDTOList +
+			", maxSecNum=" + maxSecNum +
+			'}';
+	}
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeCustomSerialDTO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeCustomSerialDTO.java
index 127eb39..bd57386 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeCustomSerialDTO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeCustomSerialDTO.java
@@ -6,12 +6,15 @@
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import lombok.Data;
 
+import java.util.LinkedList;
 import java.util.List;
 
 @Data
 public class CodeCustomSerialDTO extends BaseModelDTO {
 	//缂栫爜瑙勫垯鐮佹
    private 	List<CodeBasicSecVO> codeBasicSecVOList;
+   //鍚勪釜鐮佹鐨勭爜鍊�
+   private 	List<String> secValueList=new LinkedList();
 	/***
 	 * 缂栫爜瑙勫垯id
 	 */
@@ -21,7 +24,7 @@
 	 */
 	private String currentFlowValue;
 	/***
-	 * 娴佸け渚濊禆
+	 * 娴佹按渚濊禆
 	 */
 	private String serialUnitString;
 	/***
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeAllCode.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeAllCode.java
index 51fd9ec..cc16788 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeAllCode.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeAllCode.java
@@ -87,5 +87,10 @@
 	 * 娌℃湁濉厖鍓嶇殑娴佹按鍙�
 	 */
 	private String unFillSerial;
+	/***
+	 * 鐮佹鍊奸摼鎺�
+	 */
+	private String codeDelimit;
+
 
 }
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\244\247\344\272\2161\347\232\204.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\244\247\344\272\2161\347\232\204.json"
new file mode 100644
index 0000000..f1bdf30
--- /dev/null
+++ "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\244\247\344\272\2161\347\232\204.json"
@@ -0,0 +1,35 @@
+{
+  "operationType": "2",
+  "series": false,
+  "releaseTime": "2024-09-23",
+  "oldCode": "Q/3B1-2023",
+  "seriesFlow": "",
+  "isEditSeries": false,
+  "editInProcess": false,
+  "codeClassifyOid": "1722159168229609472",
+  "templateOid": "1722159635358650369",
+  "codeRuleOid": "1717377846655193088",
+  "editInProcess": "",
+  "secDTOList":[{
+    "secOid":"1717378065371369472",
+    "secValue": "Q/3B"
+  },{
+    "secOid":"1722497248551636992",
+    "secValue": "-"
+  },
+    {
+      "secOid":"1722497450259910656",
+      "secValue": "2023"
+    }
+
+  ],
+  "data":{"name":"鏍囧噯鍚嶇О",
+    "standardFileType":"鏂囦欢绫诲瀷",
+    "codeStandardEditType":"2",
+    "oldcode":"Q/3B1-2023",
+    "isSeries":"false",
+    "reviseSeries":"false",
+    "ImplementationDate":"2023-11-23 19:22:33",
+    "approveDate":"2023-11-23 19:22:33",
+    "releaseDate": "2024-09-23 19:22:33"}
+}
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\260\217\344\272\2162\347\232\204.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\260\217\344\272\2162\347\232\204.json"
new file mode 100644
index 0000000..a332e23
--- /dev/null
+++ "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\344\277\256\350\256\242\346\234\210\344\273\275\345\260\217\344\272\2162\347\232\204.json"
@@ -0,0 +1,35 @@
+{
+  "operationType": "2",
+  "series": false,
+  "releaseTime": "2024-01-23",
+  "oldCode": "Q/3B1-2023",
+  "seriesFlow": "",
+  "isEditSeries": false,
+  "editInProcess": false,
+  "codeClassifyOid": "1722159168229609472",
+  "templateOid": "1722159635358650369",
+  "codeRuleOid": "1717377846655193088",
+  "editInProcess": "",
+  "secDTOList":[{
+    "secOid":"1717378065371369472",
+    "secValue": "Q/3B"
+  },{
+    "secOid":"1722497248551636992",
+    "secValue": "-"
+  },
+    {
+      "secOid":"1722497450259910656",
+      "secValue": "2023"
+    }
+
+  ],
+  "data":{"name":"鏍囧噯鍚嶇О",
+    "standardFileType":"鏂囦欢绫诲瀷",
+    "codeStandardEditType":"2",
+    "oldcode":"Q/3B1-2023",
+    "isSeries":"false",
+    "reviseSeries":"false",
+    "ImplementationDate":"2023-11-23 19:22:33",
+    "approveDate":"2023-11-23 19:22:33",
+    "releaseDate": "2024-01-23 19:22:33"}
+}
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\347\224\263\350\257\267.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\347\224\263\350\257\267.json"
new file mode 100644
index 0000000..7f614c1
--- /dev/null
+++ "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\346\240\207\345\207\206\347\224\263\350\257\267.json"
@@ -0,0 +1,35 @@
+{
+  "operationType": "1",
+  "series": false,
+  "releaseTime": "2023-11-23",
+  "oldCode": "",
+  "seriesFlow": "",
+  "isEditSeries": false,
+  "editInProcess": false,
+  "codeClassifyOid": "1722159168229609472",
+  "templateOid": "1722159635358650369",
+  "codeRuleOid": "1717377846655193088",
+  "editInProcess": "",
+  "secDTOList":[{
+    "secOid":"1717378065371369472",
+    "secValue": "Q/3B"
+  },{
+    "secOid":"1722497248551636992",
+    "secValue": "-"
+  },
+    {
+      "secOid":"1722497450259910656",
+      "secValue": "2023"
+    }
+
+  ],
+  "data":{"name":"鏍囧噯鍚嶇О",
+    "standardFileType":"鏂囦欢绫诲瀷",
+    "codeStandardEditType":"1",
+    "oldcode":"",
+    "isSeries":"false",
+    "reviseSeries":"false",
+    "ImplementationDate":"2023-11-23 19:22:33",
+    "approveDate":"2023-11-23 19:22:33",
+    "releaseDate": "2023-11-23 19:22:33"}
+}
diff --git "a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\347\263\273\345\210\227\346\265\201\346\260\264.json" "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\347\263\273\345\210\227\346\265\201\346\260\264.json"
new file mode 100644
index 0000000..d03c053
--- /dev/null
+++ "b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/webserviceModel/attrmap/\347\263\273\345\210\227\346\265\201\346\260\264.json"
@@ -0,0 +1,39 @@
+{
+  "operationType": "1",
+  "series": true,
+  "releaseTime": "2023-11-23",
+  "oldCode": "",
+  "seriesFlow": "",
+  "isEditSeries": false,
+  "editInProcess": false,
+  "codeClassifyOid": "1722159168229609472",
+  "templateOid": "1722159635358650369",
+  "codeRuleOid": "1717377846655193088",
+  "editInProcess": "",
+  "secDTOList":[{
+    "secOid":"1717378065371369472",
+    "secValue": "Q/3B"
+  },{
+    "secOid":"1722497248551636992",
+    "secValue": "-"
+  },
+    {
+      "secOid":"1722497079235973120",
+      "secValue":"1"
+    },
+    {
+      "secOid":"1722497450259910656",
+      "secValue": "2023"
+    }
+
+  ],
+  "data":{"name":"绯诲垪鏍囧噯鍚嶇О",
+    "standardFileType":"鏂囦欢绫诲瀷",
+    "codeStandardEditType":"1",
+    "oldcode":"",
+    "isSeries":"true",
+    "reviseSeries":"false",
+    "ImplementationDate":"2023-11-23 19:22:33",
+    "approveDate":"2023-11-23 19:22:33",
+    "releaseDate": "2023-11-23 19:22:33"}
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
index cef20db..7b1e981 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
@@ -1332,7 +1332,7 @@
 				}
 				String value = tableField.value();
 				if(net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils.isNotBlank(value)){
-					fieldMap.put(declaredField.getName(), value);
+					fieldMap.put(declaredField.getName(), value.trim());
 				}
 			}
 		}
@@ -1345,6 +1345,9 @@
 				((!"".equals(existField) && !existField.contains(propertyName.toLowerCase()+","))||"data".equals(propertyName))) {
 				Method readMethod = descriptor.getReadMethod();
 				Object result = readMethod.invoke(bean, new Object[0]);
+				if(result instanceof String){
+					result=((String) result).trim();
+				}
 
 				if (result != null) {
 					if ("data".equals(propertyName)){
@@ -1366,7 +1369,11 @@
 					&& Func.isBlank(String.valueOf(mapData.get(o)))){
 					continue;
 				}
-				returnMap.put(String.valueOf(o).toLowerCase(),mapData.get(o));
+				Object result=mapData.get(o);
+				if(result instanceof String){
+					result=((String) result).trim();
+				}
+				returnMap.put(String.valueOf(o).toLowerCase(),result);
 			}
 		}
 		return returnMap;
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java
index 96da8d6..26d489d 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java
@@ -1,45 +1,161 @@
 package com.vci.ubcs.code.algorithm;
 
-import com.alibaba.nacos.common.utils.StringUtils;
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.vci.ubcs.code.annotation.MdmSerialAlgorithm;
 import com.vci.ubcs.code.annotation.MdmSerialAlgorithmMethod;
 import com.vci.ubcs.code.dto.CodeCustomSerialDTO;
+import com.vci.ubcs.code.entity.CodeAllCode;
+import com.vci.ubcs.code.enumpack.CodeBZOperationTypeEnum;
+import com.vci.ubcs.code.service.ICodeAllCodeService;
 import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import io.reactivex.internal.util.LinkedArrayList;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.management.StringValueExp;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
 
 /****
  * 鑷畾涔夌綏椹祦姘寸畻娉曡嚜瀹氫箟绫�
  */
 @MdmSerialAlgorithm(text = "鑷畾涔夌綏椹祦姘�",serialType="custom_serial_roman",description = "鑷畾涔夌綏椹祦姘寸畻娉�")
+@Component
 public class CustomRomanSerialAlgorithmExample {
+	/**
+	 * 缂栫爜瑙勫垯鐨勬湇鍔�
+	 */
+	@Autowired
+	private ICodeAllCodeService codeAllCodeService;
+	/***
+	 * 鎿嶄綔绫诲瀷
+	 */
+	@Value("${bzApply.operationType:operationType}")
+	private String operationType;
+	/***
+	 * 鏄惁绯诲垪
+	 */
+	@Value("${bzApply.isSeries:isSeries}")
+	private String isSeries;
+
+	/***
+	 * 鏄惁鍙樻洿绯诲垪
+	 */
+	@Value("${bzApply.isEditSeries:isEditSeries}")
+	private String isEditSeries;
+	/***
+	 * 婧愭爣鍑嗗彿
+	 */
+	@Value("${bzApply.oldCode:oldCode}")
+	private String oldCode;
+	/***
+	 *鍙戝竷鏃堕棿
+	 */
+	@Value("${bzApply.releaseTime:releaseTime}")
+	private String releaseTime;
+	/***
+	 * 鎺у埗鏄惁鍐欏叆鍊肩殑鐮佹鍚嶇О
+	 */
+	@Value("${bzApply.yearSecName:骞翠唬鍙穧")
+	private String yearSecName;
 	/**
 	 * 鐢熸垚缃楅┈娴佹按鍙风殑鏂规硶
 	 * @return 娴佹按鍙风殑淇℃伅
 	 */
 	@MdmSerialAlgorithmMethod
 	public String serialGenerate(CodeCustomSerialDTO codeCustomSerialDTO){
-		//
-		codeCustomSerialDTO.getSerialUnitString();
-		CodeBasicSecVO secVO= codeCustomSerialDTO.getSerialCodeCodeBasicSec();
-		String currentFlowValue=codeCustomSerialDTO.getCurrentFlowValue();
+//		boolean isSeriesValue=false;
+		boolean isCrete=false;//鏄惁鎴愪骇缃楅┈椤哄簭鍙�
+		String romanValue="";
+		List<CodeBasicSecVO> codeBasicSecVOList= codeCustomSerialDTO.getCodeBasicSecVOList();
+		int yearSecValue=0;//骞翠唬鍙�
+		List<String> secValueList=codeCustomSerialDTO.getSecValueList();
+		String serialUnitString=codeCustomSerialDTO.getSerialUnitString();
+		//婧愭爣鍑嗙被鍨�
+		boolean isSeriesValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(isSeries)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(isSeries))&&codeCustomSerialDTO.getBaseModel().getData().get(isEditSeries).equals("true")?true:false;
+		//鏄惁鍙樻洿绯诲垪
+		boolean isEditSeriesValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(isEditSeries)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(isEditSeries))&&codeCustomSerialDTO.getBaseModel().getData().get(isEditSeries).equals("true")?true:false;
+		//濡傛灉鏍囦慨璁负鏍囧噯锛屽師鏈夎〃鍑嗙郴鍒楀彿涓嶅彉锛屽垯姣旇緝骞翠唬鍙凤紝濡傛灉骞翠唬鍙疯法骞达紙娆″勾1鏈堝悗鍒欎负璺ㄥ勾锛�
+		String operationTypeValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(operationType)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(operationType))?codeCustomSerialDTO.getBaseModel().getData().get(operationType):"";
+		//鍙戝竷鏃堕棿
+		String releaseTimeValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(releaseTime)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(releaseTime))?codeCustomSerialDTO.getBaseModel().getData().get(releaseTime):"";
+		if(operationTypeValue.equals(CodeBZOperationTypeEnum.CODE_BZ_AMENDMENT.getValue())){//濡傛灉鏄慨璁�
+			//婧愭爣鍑嗗彿
+			String oldCodeValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(oldCode)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(oldCode))?codeCustomSerialDTO.getBaseModel().getData().get(oldCode):"";
+			if(StringUtils.isNotBlank(oldCodeValue)){
+				//杩橀渶瑕佷慨鏀筧llCode鐨勭敓鍛藉懆鏈�
+				QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
+				allCodeWrapper.in("id", VciBaseUtil.str2List(oldCodeValue));
+				List<CodeAllCode>codeAllcodeList=codeAllCodeService.selectByWrapper(allCodeWrapper);
+				if(!CollectionUtils.isEmpty(codeAllcodeList)){
+					String codeDelimit=codeAllcodeList.get(0).getCodeDelimit();
+					String[] secValues= StringUtils.splitByWholeSeparatorPreserveAllTokens(codeDelimit,SERIAL_VALUE_SPACE);
+					int yearIndex=0;
+					if((!isSeriesValue&&!isEditSeriesValue)||(isSeriesValue&&isSeriesValue)){//濡傛灉鏄爣鍑嗕慨璁负鏍囧噯锛屾垨鑰呯郴鍒椾慨璁负绯诲垪鏃跺�欙紝鍒欏垽鏂勾浠e彿
+						for (int i=0;i<codeBasicSecVOList.size();i++){
+							CodeBasicSecVO codeBasicSecVO=codeBasicSecVOList.get(i);
+							if(codeBasicSecVO.getName().equals(yearSecName)){
+								yearSecValue=Integer.parseInt((secValues[i]));
+								yearIndex=i;
+							}
+						}
+						//鍒欒幏鍙栧勾浠e彿姣旇緝锛屽鏋滃勾浠e彿璺ㄥ勾鍒欓渶瑕佷笉闇�瑕佸鍔犵綏椹祦姘达紝鐩存帴鏀瑰勾浠e彿锛屽鏋滀笉璺ㄥ勾鍒欏鍔犳祦姘�
+						if(StringUtils.isNotBlank(releaseTimeValue)){//鍙戝竷鏃堕棿
+						 String[] yearMoths=	StringUtils.splitByWholeSeparatorPreserveAllTokens(releaseTimeValue,"-");
+						 String[] serialUnitStrings=StringUtils.splitByWholeSeparatorPreserveAllTokens(serialUnitString,SERIAL_UNIT_SPACE);
+						 List<String>serialUnitStringList=new ArrayList<>();
+						 serialUnitStringList= Arrays.asList(serialUnitStrings);
+						 int newYear=0;
+							int month=0;
+						  if(yearMoths.length>2){
+							  newYear=Integer.parseInt(yearMoths[0]);
+							  month=Integer.parseInt(yearMoths[1]);
+						  }
+						  if(newYear>yearSecValue&&month>1){
+							  secValueList.set(yearIndex,String.valueOf(newYear));
+							  serialUnitStringList.set(yearIndex, String.valueOf(newYear));
+							  codeCustomSerialDTO.setSecValueList(secValueList);
+							  String newSerialUnitString = serialUnitStringList.size() == 0 ? EMPTY_SERIAL_UNIT : serialUnitStringList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
+							  codeCustomSerialDTO.setSerialUnitString(newSerialUnitString);
+						  }else{
+							  isCrete=true;
+						  }
+						}
+					}
+				}
+			}
 
-		Double newThisSerialValue = 0d;
-		if(StringUtils.isBlank(currentFlowValue)){
-			//绗竴涓紪鐮�
-			newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
-		}else {
-			//娴佹按鍙疯偗瀹氭槸鏁板瓧
-			//灏嗙綏椹祦姘磋浆涓烘暟瀛楁祦姘�
-			int arabicValue=VciBaseUtil.convertRomanToArabic(currentFlowValue);
-			newThisSerialValue = (double)(arabicValue + secVO.getSerialStep()) ;
 		}
-		//瑕佺湅鏄惁瓒呰繃鏈�澶х殑娴佹按鍊�
-		if (newThisSerialValue >= secVO.getCodeFillLimit()) {
-			throw new VciBaseException("娴佹按鍙峰凡缁忚秴杩囧厑璁哥殑鏈�澶ф祦姘村�納0}", new String[]{secVO.getCodeFillLimit().toString()});
+
+		if(isCrete){
+			CodeBasicSecVO secVO= codeCustomSerialDTO.getSerialCodeCodeBasicSec();
+			String currentFlowValue=codeCustomSerialDTO.getCurrentFlowValue();
+			Double newThisSerialValue = 0d;
+			if(StringUtils.isBlank(currentFlowValue)){
+				//绗竴涓紪鐮�
+				newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
+			}else {
+				//娴佹按鍙疯偗瀹氭槸鏁板瓧
+				//灏嗙綏椹祦姘磋浆涓烘暟瀛楁祦姘�
+				int arabicValue=VciBaseUtil.convertRomanToArabic(currentFlowValue);
+				newThisSerialValue = (double)(arabicValue + secVO.getSerialStep()) ;
+			}
+			//瑕佺湅鏄惁瓒呰繃鏈�澶х殑娴佹按鍊�
+			if (newThisSerialValue >= secVO.getCodeFillLimit()) {
+				throw new VciBaseException("娴佹按鍙峰凡缁忚秴杩囧厑璁哥殑鏈�澶ф祦姘村�納0}", new String[]{secVO.getCodeFillLimit().toString()});
+			}
+			//灏嗘暟瀛楁祦姘磋浆涓虹綏椹祦姘�
+			romanValue=VciBaseUtil.convertArabicToRoman(newThisSerialValue.intValue());
 		}
-		//灏嗘暟瀛楁祦姘磋浆涓虹綏椹祦姘�
-		String romanValue=VciBaseUtil.convertArabicToRoman(newThisSerialValue.intValue());
+
 		return romanValue;
 	}
 
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java
new file mode 100644
index 0000000..8322537
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/Test.java
@@ -0,0 +1,13 @@
+package com.vci.ubcs.code.algorithm;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Test {
+
+	public static void main(String[] args) {
+		String []res={"5","6","7","8","3"};
+		List<String> newList=Arrays.asList(res);
+		System.out.println(res);
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java
index 2440ee1..c4d9e71 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java
@@ -1,5 +1,6 @@
 package com.vci.ubcs.code.annotation;
 
+import org.springframework.core.annotation.AliasFor;
 import org.springframework.stereotype.Component;
 
 import java.lang.annotation.ElementType;
@@ -18,9 +19,13 @@
 public @interface MdmSerialAlgorithm {
 
     /**
+	 * bean鐨勫悕绉�
      * 鍊硷紝瀹為檯灏辨槸杩欎釜娉ㄨВ鎵�鍦ㄧ殑绫荤殑鍏ㄨ矾寰�
      * @return 鍊�
      */
+	@AliasFor(
+		annotation = Component.class
+	)
     String value() default "";
 
     /**
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
index 0b83f96..97cb6df 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
@@ -6,10 +6,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.vci.ubcs.code.applyjtcodeservice.vo.BaseModelVO;
-import com.vci.ubcs.code.dto.CodeDeleteBatchDTO;
-import com.vci.ubcs.code.dto.CodeExportAttrDTO;
-import com.vci.ubcs.code.dto.CodeOrderDTO;
-import com.vci.ubcs.code.dto.CodeOrderSecDTO;
+import com.vci.ubcs.code.dto.*;
 import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
 import com.vci.ubcs.code.service.MdmEngineService;
 import com.vci.ubcs.code.service.MdmIOService;
@@ -746,4 +743,15 @@
 	public R processChangeStatus(@RequestBody FlowStatusDTO flowDTO){
 		return engineService.processChangeStatus(flowDTO);
 	}
+
+	/**
+	 * 鏍囧噯鐢宠鍜屼慨璁㈢敤
+	 * @param codeBZApplyDTO 缂栫爜鐢宠鐩稿叧鐨勪俊鎭紝闇�瑕佹湁灞炴�у拰鐮佹鐩稿叧鐨勪俊鎭�
+	 * @return 鎵ц缁撴灉
+	 */
+	@PostMapping("/addSaveBZ")
+	@VciBusinessLog(operateName = "鐢宠鍗曚釜缂栫爜")
+	public R addSaveBZ (@RequestBody CodeBZApplyDTO codeBZApplyDTO) throws Exception {
+		return R.success(engineService.addSaveBZ(codeBZApplyDTO));
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeBZOperationTypeEnum.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeBZOperationTypeEnum.java
new file mode 100644
index 0000000..38bfc60
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/enumpack/CodeBZOperationTypeEnum.java
@@ -0,0 +1,135 @@
+package com.vci.ubcs.code.enumpack;
+
+import com.vci.ubcs.starter.web.enumpck.BaseEnum;
+
+/***
+ * 鏍囧噯鎿嶄綔绫诲瀷
+ */
+public enum CodeBZOperationTypeEnum implements BaseEnum {
+	/**
+	 * 鍒跺畾
+	 */
+	CODE_BZ_FORMULATE("1","鍒跺畾"),
+	/**
+	 * 淇
+	 */
+	CODE_BZ_AMENDMENT("2","淇"),
+	/***
+	 * 鏇存敼
+	 */
+	CODE_BZ_EDIT("3","鏇存敼"),
+
+	/***
+	 * 浣滃簾
+	 */
+	CODE_BZ_DISABLE("4","浣滃簾"),
+	/***
+	 * 澶囨煡
+	 */
+	CODE_BZ_FOR_REFERENCE("5"," 澶囨煡");
+
+
+	/**
+	 * 鏋氫妇鐨勫��
+	 */
+	private String value;
+
+	/**
+	 * 鏋氫妇鏄剧ず鏂囨湰
+	 */
+	private String text;
+
+	/**
+	 * 鑾峰彇鏋氫妇鍊�
+	 *
+	 * @return 鏋氫妇鍊�
+	 */
+	@Override
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * 璁剧疆鏋氫妇鍊�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 */
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	/**
+	 * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+	 *
+	 * @return 鏄剧ず鏂囨湰
+	 */
+	@Override
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * 璁剧疆鏄剧ず鏂囨湰
+	 *
+	 * @param text 鏄剧ず鏂囨湰
+	 */
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	/**
+	 * 鏋勯�犲嚱鏁�
+	 *
+	 * @param value 鍊�
+	 * @param text  鏄剧ず鏂囨湰
+	 */
+	private CodeBZOperationTypeEnum(String value, String text) {
+		this.value = value;
+		this.text = text;
+	}
+
+	/**
+	 * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+	 *
+	 * @param text 鍚嶇О
+	 * @return 鏋氫妇鍊�
+	 */
+	public static String getValueByText(String text) {
+		for (CodeBZOperationTypeEnum wenum : CodeBZOperationTypeEnum.values()) {
+			if (wenum.getText().equalsIgnoreCase(text)) {
+				return wenum.getValue();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 * @return 鍚嶇О
+	 */
+	public static String getTextByValue(String value) {
+		for (CodeBZOperationTypeEnum wenum : CodeBZOperationTypeEnum.values()) {
+			if (wenum.getValue().equalsIgnoreCase(value)) {
+				return wenum.getText();
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+	 *
+	 * @param value 鏋氫妇鍊�
+	 * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+	 */
+	public static CodeBZOperationTypeEnum forValue(String value) {
+		for (CodeBZOperationTypeEnum wenum : CodeBZOperationTypeEnum.values()) {
+			if (wenum.getValue().equalsIgnoreCase(value)) {
+				return wenum;
+			}
+		}
+		return null;
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
index 97af6e2..edc073b 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
@@ -5,6 +5,7 @@
 import com.vci.ubcs.code.applyjtcodeservice.vo.BaseModelVO;
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
+import com.vci.ubcs.code.dto.CodeBZApplyDTO;
 import com.vci.ubcs.code.dto.CodeDeleteBatchDTO;
 import com.vci.ubcs.code.dto.CodeOrderDTO;
 import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
@@ -493,4 +494,11 @@
 	 * @param parameter 浼犲叆鏁版嵁,classifyGroupCode:閰嶇疆鐨勪腑鐨勫垎绫婚《鑺傜偣锛宱id锛氶�夋嫨鑺傜偣鐨刼id
 	 */
 	R checkGroupCode(Map<String, String> parameter);
+
+	/**
+	 * 鏍囧噯鐢宠鍜屼慨璁㈢敤
+	 * @param codeBZApplyDTO 缂栫爜鐢宠鐩稿叧鐨勪俊鎭紝闇�瑕佹湁灞炴�у拰鐮佹鐩稿叧鐨勪俊鎭�
+	 * @return 鎵ц缁撴灉
+	 */
+	String addSaveBZ(CodeBZApplyDTO codeBZApplyDTO) throws Exception;
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java
index a7bd471..42517a8 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmProductCodeService.java
@@ -30,4 +30,14 @@
      */
 	Boolean recycleCode(String btmId, Collection<String> businessOidCollection);
 
+	/**
+	 * 鐢熸垚缂栫爜--骞朵笖淇濆瓨鏁版嵁-鏂规硶鍔犻攣锛屽洜姝や笉鑳借繑鍥瀊atchCBO
+	 * @param classifyFullInfoBO 鍒嗙被鐨勫叏閮ㄤ俊鎭�
+	 * @param templateVO 妯℃澘鐨勬樉绀哄璞�
+	 * @param ruleVO 缂栫爜瑙勫垯鐨勬樉绀哄璞�
+	 * @param secDTOList 鍚勪釜鐮佹鐨勫��
+	 * @param dataCBOList 涓氬姟鏁版嵁
+	 */
+	List<String> productCodeAndSaveDataBZ(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClassifyTemplateVO templateVO,
+										CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<BaseModel> dataCBOList) throws Exception;
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java
index ca73465..5a78596 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java
@@ -40,7 +40,8 @@
                     //Advised advised = (Advised)bean;
 					Class<?> targetClass = AopUtils.getTargetClass(bean);
 					//Class<?> targetClass = advised.getTargetSource().getTargetClass();
-                    algorithmVO.setClassFullName(targetClass.getName());
+                  //  algorithmVO.setClassFullName(targetClass.getName());
+					algorithmVO.setClassFullName(beanName);
                     MdmSerialAlgorithm serialAlgorithm = targetClass.getDeclaredAnnotation(MdmSerialAlgorithm.class);
                     if(serialAlgorithm==null){
                         serialAlgorithm = targetClass.getAnnotation(MdmSerialAlgorithm.class);
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
index c596095..76d26b5 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -9,8 +9,10 @@
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
 import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
+import com.vci.ubcs.code.dto.CodeBZApplyDTO;
 import com.vci.ubcs.code.dto.CodeDeleteBatchDTO;
 import com.vci.ubcs.code.dto.CodeOrderDTO;
+import com.vci.ubcs.code.dto.CodeOrderSecDTO;
 import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
 import com.vci.ubcs.code.entity.*;
 import com.vci.ubcs.code.enumpack.*;
@@ -22,6 +24,7 @@
 import com.vci.ubcs.code.vo.pagemodel.UITablePageVO;
 import com.vci.ubcs.code.vo.pagemodel.*;
 import com.vci.ubcs.code.wrapper.BaseMdodelWrapper;
+import com.vci.ubcs.code.wrapper.CodeAllcodeWrapper;
 import com.vci.ubcs.flow.core.dto.FlowStatusDTO;
 import com.vci.ubcs.flow.core.feign.IMDMIFlowAttrClient;
 import com.vci.ubcs.flow.core.vo.ProcessStageAttrVO;
@@ -115,6 +118,49 @@
 	 */
 	@Value("${batchadd.is_thread_import:false}")
 	private boolean IS_THREAD_IMPORT;
+
+	/***
+	 * 鎿嶄綔绫诲瀷
+	 */
+	@Value("${bzApply.operationType:operationType}")
+	private String operationType;
+	/***
+	 * 鏄惁绯诲垪
+	 */
+	@Value("${bzApply.isSeries:isSeries}")
+	private String isSeries;
+	/***
+	 *鍙戝竷鏃堕棿
+	 */
+	@Value("${bzApply.releaseTime:releaseTime}")
+	private String releaseTime;
+	/***
+	 * 婧愭爣鍑嗗彿
+	 */
+	@Value("${bzApply.oldCode:oldCode}")
+	private String oldCode;
+
+	/***
+	 * 绯诲垪娴佹按
+	 */
+	@Value("${bzApply.seriesFlow:seriesFlow}")
+	private String seriesFlow;
+	/***
+	 * 鏄惁鍙樻洿绯诲垪
+	 */
+	@Value("${bzApply.isEditSeries:isEditSeries}")
+	private String isEditSeries;
+	/***
+	 * 鎺у埗鏄惁鍐欏叆鍊肩殑鐮佹鍚嶇О
+	 */
+	@Value("${bzApply.secName:绯诲垪鍙穧")
+	private String secName;
+
+	/***
+	 * 鎺у埗鏄惁鍐欏叆鍊肩殑鐮佹鍚嶇О
+	 */
+	@Value("${bzApply.yearSecName:骞翠唬鍙穧")
+	private String yearSecName;
 
     /**
      * 妯℃澘鐨勬湇鍔�
@@ -822,6 +868,255 @@
 		return R.data("false");
 	}
 
+	/***
+	 *
+	 * @param codeBZApplyDTO 缂栫爜鐢宠鐩稿叧鐨勪俊鎭紝闇�瑕佹湁灞炴�у拰鐮佹鐩稿叧鐨勪俊鎭�
+	 * @return
+	 * @throws Exception
+	 */
+	@Override
+	public String addSaveBZ(CodeBZApplyDTO codeBZApplyDTO) throws Exception {
+		return addSaveBZCode(codeBZApplyDTO,true);
+	}
+
+	/**
+	 * 鏍囧噯鐢宠鍜屼慨璁㈢敤
+	 *
+	 * @param codeBZApplyDTO 缂栫爜鐢宠鐩稿叧鐨勪俊鎭紝闇�瑕佹湁灞炴�у拰鐮佹鐩稿叧鐨勪俊鎭�
+	 * @param authUser
+	 * @return
+	 */
+	private String addSaveBZCode(CodeBZApplyDTO codeBZApplyDTO, boolean authUser) throws Exception {
+		String code="";
+		VciBaseUtil.alertNotNull(codeBZApplyDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭",
+			codeBZApplyDTO.getTemplateOid(), "妯℃澘鐨勪富閿�", codeBZApplyDTO.getCodeRuleOid(), "缂栫爜瑙勫垯鐨勪富閿�");
+		//鎿嶄綔绫诲瀷
+		if(StringUtils.isBlank(codeBZApplyDTO.getOperationType())){
+			String operationTypeValue=codeBZApplyDTO.getData().get(operationType);
+			codeBZApplyDTO.setOperationType(operationTypeValue);
+		}
+		//鏄惁绯诲垪
+		if(!codeBZApplyDTO.isSeries()){
+			boolean isSeriesValue=codeBZApplyDTO.getData().get(isSeries).equals("true")?true:false;
+			codeBZApplyDTO.setSeries(isSeriesValue);
+		}
+		//鍘熸爣鍑嗗彿
+		if(StringUtils.isBlank(codeBZApplyDTO.getOldCode())){
+			String oldCodeValue=codeBZApplyDTO.getData().get(oldCode);
+			codeBZApplyDTO.setOldCode(oldCodeValue);
+		}
+		//绯诲垪娴佹按
+		if(StringUtils.isBlank(codeBZApplyDTO.getSeriesFlow())){
+			String seriesFlowValue=codeBZApplyDTO.getData().get(seriesFlow);
+			codeBZApplyDTO.setSeriesFlow(seriesFlowValue);
+		}
+		//鍙戝竷鏃堕棿
+		if(StringUtils.isBlank(codeBZApplyDTO.getReleaseTime())){
+			String releaseTimeValue=codeBZApplyDTO.getData().get(releaseTime);
+			codeBZApplyDTO.setReleaseTime(releaseTimeValue);
+		}
+		//鏄惁鍙樻洿绯诲垪
+		if(!codeBZApplyDTO.isEditSeries()){
+			boolean isEditSeriesValue=codeBZApplyDTO.getData().get(isEditSeries).equals("true")?true:false;
+			codeBZApplyDTO.setEditSeries(isEditSeriesValue);
+		}
+		VciBaseUtil.alertNotNull(codeBZApplyDTO.getOperationType(), "鎿嶄綔绫诲瀷",
+			codeBZApplyDTO.isSeries(), "鏄惁绯诲垪", codeBZApplyDTO.getReleaseTime(), "鍙戝竷鏃堕棿");
+
+		if(codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_FORMULATE.getValue())){//鍒跺畾
+			code=	addsaveDataBZ(codeBZApplyDTO,authUser);
+		}else if(codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_AMENDMENT.getValue())){//淇
+			VciBaseUtil.alertNotNull(codeBZApplyDTO.getOldCode(), "婧愭爣鍑嗗彿");
+			code=	amendmentDataBZ(codeBZApplyDTO,authUser);
+			createChangeOder(code,codeBZApplyDTO,authUser);
+		}else if(codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_EDIT.getValue())){//鏇存敼
+			code=	amendmentDataBZ(codeBZApplyDTO,authUser);
+			createChangeOder(code,codeBZApplyDTO,authUser);
+		}else if(codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_DISABLE.getValue())) {//浣滃簾
+			code=	amendmentDataBZ(codeBZApplyDTO,authUser);
+			createChangeOder(code,codeBZApplyDTO,authUser);
+		}else if(codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_AMENDMENT.getValue())) {//澶囨煡
+			code=	amendmentDataBZ(codeBZApplyDTO,authUser);
+			createChangeOder(code,codeBZApplyDTO,authUser);
+		}
+		return code;
+	}
+
+	/***
+	 * 淇
+	 * @param codeBZApplyDTO
+	 * @param authUser
+	 * @return
+	 */
+	private String amendmentDataBZ(CodeBZApplyDTO codeBZApplyDTO, boolean authUser) throws Exception {
+		CodeOrderDTO orderDTO=new CodeOrderDTO();
+		BeanUtil.convert(codeBZApplyDTO,orderDTO);
+		CodeRuleVO ruleVO = ruleService.getObjectHasSecByOid(codeBZApplyDTO.getCodeRuleOid());
+		Map<String, CodeBasicSecVO> codeCodeBasicSecMap = ruleVO.getSecVOList().stream().filter(s -> StringUtils.isNotBlank(s.getOid())).collect(Collectors.toMap(s -> s.getOid().toLowerCase(Locale.ROOT), t -> t));
+		VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勫睘鎬у拰鐮佹鐨勫唴瀹归兘涓虹┖", orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭",
+			orderDTO.getTemplateOid(), "妯℃澘鐨勪富閿�", orderDTO.getCodeRuleOid(), "缂栫爜瑙勫垯鐨勪富閿�");
+		String oldCode=codeBZApplyDTO.getOldCode();//婧愭爣鍑嗙紪鐮�
+		String releaseTime=codeBZApplyDTO.getReleaseTime();
+		List<CodeOrderSecDTO> secDTOS=	orderDTO.getSecDTOList();
+		LinkedList<CodeOrderSecDTO> newSecDTOList=new LinkedList<>();
+		changeCodeOrderSecDTO(ruleVO,secDTOS,oldCode,newSecDTOList);//鏍规嵁瑕佹眰閲嶆柊绠楃爜娈电爜鍊�
+		if(!codeBZApplyDTO.isEditSeries()){//鍙樻洿涓烘爣鍑�
+			if(!codeBZApplyDTO.isSeries()){//濡傛灉鏄〃鍑嗭紝鍒欓渶瑕佸皢绯诲垪濂芥祦姘寸疆涓簄ull
+				//鍥犱负鏄爣鍑嗗垯鎺у埗鐮佹涓殑绯诲垪娴佹按鐮佹鍊间负绌�
+				newSecDTOList.stream().forEach(codeOrderSecDTO -> {
+					if(codeCodeBasicSecMap.containsKey(codeOrderSecDTO.getSecOid())&&codeCodeBasicSecMap.get(codeOrderSecDTO.getSecOid()).getName().equals(secName)){
+						codeOrderSecDTO.setSecValue("");
+					}
+				});
+			}
+			orderDTO.setSecDTOList(newSecDTOList);
+			return createDataBZ(orderDTO,ruleVO,authUser);
+		}else{//鍙樻洿涓虹郴鍒�.鍒欐寜鐓ч�昏緫鍘诲鐞�
+
+
+		}
+		return "";
+	}
+	private String createDataBZ(CodeOrderDTO orderDTO,	CodeRuleVO ruleVO,boolean authUser) throws Exception {
+		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+		CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
+		//1.鍒ゆ柇瑙勫垯涓櫎浜嗘祦姘寸爜娈碉紝鏄惁鏈夊叾浠栫爜娈�
+		checkSecValueOnOrder(ruleVO, orderDTO);
+		//2.鍒ゆ柇蹇呰緭椤�
+		checkRequiredAttrOnOrder(templateVO, orderDTO);
+		//3.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
+		switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
+		//4.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
+		switchComponentAttrOnOrder(templateVO, orderDTO);
+		//5.鏍¢獙瑙勫垯
+		checkVerifyOnOrder(templateVO, orderDTO);
+		//6.鍏抽敭灞炴��
+		checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
+		//7.鏋氫妇杞崲
+		checkEnumOnOrder(templateVO, orderDTO);
+		//8.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
+		switchDateAttrOnOrder(templateVO, orderDTO);
+		//9.鐢熸垚缂栫爜鐨勪俊鎭� 锛屽垵濮嬪寲涓氬姟绫诲瀷锛氱紦瀛樺厛鍙栨秷锛屽洜涓虹増鏈鍒欎細鍑虹幇鍙樺姩鐨勬儏鍐垫墍浠ユ棤娉曚娇鐢ㄧ紦瀛�
+		// BaseModel cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmTypeId());
+		BaseModel cbo = createBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId().trim().toLowerCase());
+		//榛樿鐨勫睘鎬ч兘涓嶇敤浠庡墠绔嫹璐�
+		//璁剧疆缂栫爜闇�瑕佺殑榛樿灞炴�х殑鍐呭
+		copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, false);
+		cbo.setOid(VciBaseUtil.getPk());
+		cbo.setRevisionOid(VciBaseUtil.getPk());
+		cbo.setNameOid(VciBaseUtil.getPk());
+		cbo.setCreateTime(new Date());
+		cbo.setLastModifyTime(new Date());
+		//cbo.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));銆�
+		if(authUser) {
+			// 瑕佹眰鏄剧ず璐﹀彿锛屾墍浠ュ仛浜嗘洿鏀�
+			cbo.setCreator(String.valueOf(AuthUtil.getUser().getAccount()));
+			cbo.setLastModifier(String.valueOf(AuthUtil.getUser().getAccount()));
+		}else{
+			cbo.setCreator(orderDTO.getCreator());
+			cbo.setLastModifier(orderDTO.getLastModifier());
+		}
+		cbo.setTenantId(AuthUtil.getTenantId());
+		if(StringUtils.isNotBlank(orderDTO.getLcStatus())||StringUtils.isNotBlank(orderDTO.getData().get("lcStatus"))){
+			cbo.setLcStatus(StringUtils.isNotBlank(orderDTO.getLcStatus())?orderDTO.getLcStatus():orderDTO.getData().get("lcStatus"));
+		}
+		//TODO:鍥犱负榛樿鐨勫睘鎬ч兘涓嶆嫹璐濓紝鐩墠闆嗗洟鐮佸彨name锛屽苟娌℃湁浠嶥TO鎷疯礉鍒癱bo閲屻�傚鍔犱竴涓崟鐙鐞嗭紝浠ュ悗鍐嶇湅瑕佷笉瑕佽皟鏁�
+		cbo.setName(orderDTO.getName() == null ? "" : orderDTO.getName());
+		//end -- modify by lihang @20220407
+		List<BaseModel> cboList = new ArrayList<>();
+		//澶囨敞
+		cbo.setDescription(orderDTO.getDescription());
+		cboList.add(cbo);
+		List<String> codeList = productCodeService.productCodeAndSaveDataBZ(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), cboList);
+		batchSaveSelectChar(templateVO, cboList);
+		return codeList.size() > 0 ? codeList.get(0) : "";
+
+	}
+	/***
+	 * 鏍规嵁缂栧彿鑾峰彇鐮佹鐮佸��
+	 * @param secDTOList
+	 */
+	private void changeCodeOrderSecDTO(CodeRuleVO ruleVO,List<CodeOrderSecDTO> secDTOList,String oldCode,LinkedList<CodeOrderSecDTO> newSecDTOList) throws Exception {
+
+		//杩橀渶瑕佷慨鏀筧llCode鐨勭敓鍛藉懆鏈�
+		QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
+		allCodeWrapper.in("id", VciBaseUtil.str2List(oldCode));
+		Map<String,String> secDTOMap=secDTOList.stream().collect(Collectors.toMap(s -> s.getSecOid(), t -> t.getSecValue(),(o1, o2)->o2));
+		List<CodeAllCode>codeAllcodeList=codeAllCodeService.selectByWrapper(allCodeWrapper);
+		if(!CollectionUtils.isEmpty(codeAllcodeList)){
+			String codeDelimit=codeAllcodeList.get(0).getCodeDelimit();
+			String[] secValues=StringUtils.splitByWholeSeparatorPreserveAllTokens(codeDelimit,SERIAL_VALUE_SPACE);
+			//VciBaseUtil.str2List()
+			for (int i=0; i<ruleVO.getSecVOList().size();i++){
+				CodeBasicSecVO codeBasicSecVO=ruleVO.getSecVOList().get(i);
+				CodeOrderSecDTO codeOrderSecDTO=new CodeOrderSecDTO();
+				String secValue=secValues[i];
+				boolean isRoman=VciBaseUtil.isRoman(secValue);
+				if(isRoman){
+					continue;
+				}
+				if(secDTOMap.containsKey(codeBasicSecVO.getOid())){
+					secValue=	secDTOMap.get(codeBasicSecVO.getOid())	;
+				}
+				if(StringUtils.isNotBlank(secValue)) {
+					codeOrderSecDTO.setSecOid(codeBasicSecVO.getOid());
+					codeOrderSecDTO.setSecValue(secValue);
+					newSecDTOList.add(codeOrderSecDTO);
+				}
+			}
+		}else{
+			throw new Exception("鏍规嵁鍘熸爣鍑嗙紪鍙凤紝鍦ㄧ郴缁熶腑鏈煡璇㈠埌鐩稿簲鐨勪俊鎭�");
+		}
+	}
+	/***
+	 * 鍒跺畾锛屽垯涓嶉渶瑕佷骇鐢熸洿鏀瑰崟鐩存帴鐢熸垚缂栫爜
+	 * @param codeBZApplyDTO
+	 * @param authUser
+	 * @return
+	 */
+	private String addsaveDataBZ(CodeBZApplyDTO codeBZApplyDTO, boolean authUser) throws Exception {
+		String code="";
+		CodeOrderDTO orderDTO=new CodeOrderDTO();
+		BeanUtil.convert(codeBZApplyDTO,orderDTO);
+		CodeRuleVO ruleVO = ruleService.getObjectHasSecByOid(codeBZApplyDTO.getCodeRuleOid());
+		Map<String, CodeBasicSecVO> codeCodeBasicSecMap = ruleVO.getSecVOList().stream().filter(s -> StringUtils.isNotBlank(s.getOid())).collect(Collectors.toMap(s -> s.getOid(), t -> t));
+		//鏄惁鏄爣鍑�,涓嶆槸鏍囧噯鐨勪笉浼氬幓绠�
+		if(!codeBZApplyDTO.isSeries()){
+			//鍥犱负鏄爣鍑嗗垯鎺у埗鐮佹涓殑绯诲垪娴佹按鐮佹鍊间负绌�
+			orderDTO.getSecDTOList().stream().forEach(codeOrderSecDTO -> {
+				if(codeCodeBasicSecMap.containsKey(codeOrderSecDTO.getSecOid())&&codeCodeBasicSecMap.get(codeOrderSecDTO.getSecOid()).getName().equals(secName)){
+					codeOrderSecDTO.setSecValue("");
+				}
+			});
+		}
+		VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勫睘鎬у拰鐮佹鐨勫唴瀹归兘涓虹┖", orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭",
+			orderDTO.getTemplateOid(), "妯℃澘鐨勪富閿�", orderDTO.getCodeRuleOid(), "缂栫爜瑙勫垯鐨勪富閿�");
+		return createDataBZ(orderDTO,ruleVO,authUser);
+	}
+
+	/***
+	 * 鏇存敼鍗曠殑鍒涘缓
+	 * @param code
+	 * @param codeBZApplyDTO
+	 * @param authUser
+	 * @return
+	 */
+	private String createChangeOder(String code,CodeBZApplyDTO codeBZApplyDTO, boolean authUser){
+
+		return "";
+
+	}
+	/***
+	 * 闆嗘垚鍙彉鐮佹鐢宠鎺ュ彛
+	 * @param codeBZApplyDTO 鐢宠鐨勪俊鎭紝闇�瑕佸寘鍚睘鎬х殑鍐呭鍜岀爜娈电浉鍏崇殑鍐呭
+	 * @param    authUser 鏄惁鐢ㄧ櫥褰曠敤鎴疯褰�
+	 * @return
+	 * @throws Exception
+	 */
+	public String addSaveBZCodeNotauthUser(CodeBZApplyDTO codeBZApplyDTO, boolean authUser) throws Exception {
+		return	addSaveBZCode(codeBZApplyDTO,authUser);
+	}
+
 	/**
      * 灏佽鍏抽敭灞炴�х殑鏌ヨ璇彞
      *
@@ -873,7 +1168,7 @@
                     //涓嶅拷鐣ュぇ灏忓啓銆佷笉鍘荤┖銆佷笉蹇界暐鍏ㄥ崐瑙�
                     temp = "%s";
                 }
-				queryKey = String.format(temp, "nvl("+ "t." + attrId +",'/')");
+                queryKey = String.format(temp, "nvl("+ "t." + attrId +",'/')");
                 queryValue = String.format(temp, "'" + (trim ? value.trim() : value) + "'");
                 conditionMap.put(queryKey, queryValue);
             } else {
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 4014bcf..5220c0c 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,6 +1,8 @@
 package com.vci.ubcs.code.service.impl;
 
 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;
@@ -29,6 +31,7 @@
 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;
@@ -42,16 +45,16 @@
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.lang.reflect.InvocationTargetException;
 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 {
@@ -123,6 +126,7 @@
 				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  = "";
@@ -142,9 +146,10 @@
 						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);
 				}
 				List<String> serialUnFileStringList = new ArrayList<>();
 				AtomicReference<String> newSerialUnitString = new AtomicReference<>("");
@@ -207,6 +212,7 @@
 				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.setCodeDelimit(codeValueList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE)));//娣诲姞閾炬帴绗�
 				allCodeDOList.add(allCodeDO);
 			});
 			//澶勭悊鏈�澶х殑娴佹按鍙�
@@ -403,8 +409,9 @@
 						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);
@@ -515,6 +522,122 @@
 		}
 	}
 
+
+
+	/**
+	 * 杞崲娴佹按鐮佹鐨勫��
+	 * @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 娴佹按鐮佹
@@ -585,7 +708,10 @@
 					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;
@@ -626,7 +752,33 @@
 		}
 	}
 
-	private String customCodeSerial(String className, CodeCustomSerialDTO codeCustomSerialDTO){
+	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);
@@ -646,8 +798,8 @@
 			throw new VciBaseException("鎵ц鑷畾涔夋祦姘寸畻娉曞鐞嗘柟娉曞嚭鐜板紓甯�");
 		} catch (InstantiationException e) {
 			e.printStackTrace();
-		}
-		return result;
+		}*/
+		return result.get();
 	}
 
 	/**
@@ -822,10 +974,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());
@@ -837,6 +990,7 @@
 		allCodeDO.setSerialUnit(serialUnitString);
 		allCodeDO.setUnFillSerial(serialValueString);
 		allCodeDO.setLcStatus(cbo.getLcStatus());
+		allCodeDO.setCodeDelimit(codeDelimiter);
 		allCodeDOList.add(allCodeDO);
 	}
 
@@ -1000,6 +1154,267 @@
 		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())){
+				List<String> newSerialUnitList= serialUnitList.stream().filter(secValueStr -> {
+					return  !secValueStr.equals("${"+secVO.getOid()+"}");
+				}).collect(Collectors.toList());
+				String serialUnitString = serialUnitList.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);
+						}
+					});
+				}
+			}
+			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();
+			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(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 鏁版嵁鐨勫唴瀹�
@@ -1015,7 +1430,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