From f02c15e434ffbc248b55d9d14e104c7d8556062b Mon Sep 17 00:00:00 2001
From: yuxc <653031404@qq.com>
Date: 星期五, 28 四月 2023 11:42:42 +0800
Subject: [PATCH] 1、主要完成主题库定义的模板分类的接口移植。 2、主要对界面字数多了换行问题进行了修改。

---
 Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js                                                               |    1 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java        |    6 
 Source/UBCS-WEB/src/views/omd/dict.vue                                                                              |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java                |   14 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java             |   79 +
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/BeanUtil.java                |  174 ++++
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/PatternUtil.java                 |   50 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml                              |   72 -
 Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml                                                                  |    5 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java        |    6 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java        |   68 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstempattrController.java        |  151 +++
 Source/UBCS-WEB/src/const/omd/dict.js                                                                               |    1 
 Source/UBCS-WEB/src/const/code/codebutton.js                                                                        |    6 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java     |  618 +++++++++++++--
 Source/UBCS-WEB/src/const/code/codeSynonym.js                                                                       |    1 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstemplateEntity.java        |    2 
 Source/UBCS/ubcs-service/ubcs-code/pom.xml                                                                          |    6 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeOsbtmtypeattributeEntity.java |   11 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml                              |    2 
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java             |   20 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml                                 |    8 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java        |   44 +
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BooleanEnum.java          |   16 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java                |    1 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml                                |   79 +
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/ClassUtil.java               |   50 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java                  |    3 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java     |  691 +++++++++++++++++
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java             |   29 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java                   |   11 
 Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeOsbtmtypeattributeVO.java         |    7 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java                |   14 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java       |   36 
 Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml                              |   54 +
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java               |   11 
 Source/UBCS-WEB/src/views/code/codebutton.vue                                                                       |    2 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java                   |    3 
 38 files changed, 2,150 insertions(+), 204 deletions(-)

diff --git a/Source/UBCS-WEB/src/const/code/codeSynonym.js b/Source/UBCS-WEB/src/const/code/codeSynonym.js
index fc8a7c8..038020a 100644
--- a/Source/UBCS-WEB/src/const/code/codeSynonym.js
+++ b/Source/UBCS-WEB/src/const/code/codeSynonym.js
@@ -4,6 +4,7 @@
   tip: false,
   searchShow: true,
   searchMenuSpan: 6,
+  searchLabelWidth:120,
   border: true,
   index: true,
   viewBtn: true,
diff --git a/Source/UBCS-WEB/src/const/code/codebutton.js b/Source/UBCS-WEB/src/const/code/codebutton.js
index df3fc5b..75d3028 100644
--- a/Source/UBCS-WEB/src/const/code/codebutton.js
+++ b/Source/UBCS-WEB/src/const/code/codebutton.js
@@ -2,8 +2,10 @@
   height:'auto',
   calcHeight: 30,
   tip: false,
+  searchLabelWidth:120,
   searchShow: true,
   searchMenuSpan: 6,
+  // searchSpan:8,
   border: true,
   index: true,
   viewBtn: true,
@@ -241,7 +243,7 @@
     {
       label: "鐘舵��",
       type: "select",
-      dicUrl: "/api/ubcs-omd/dict-biz/dictionary?code=codeLcstatus",
+      dicUrl: "/api/ubcs-omd/dict/dictionary?code=codeLcstatus",
       props: {
         label: "dictValue",
         value: "dictKey"
@@ -294,7 +296,7 @@
       label: "鎸夐挳鐨勪綅缃�",
       type: "select",
       weight :'140px',
-      dicUrl: "/api/ubcs-omd/dict-biz/dictionary?code=codeButtonPosition",
+      dicUrl: "/api/ubcs-omd/dict/dictionary?code=codeButtonPosition",
       props: {
         label: "dictValue",
         value: "dictKey"
diff --git a/Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js b/Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js
index fb5da2d..819f401 100644
--- a/Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js
+++ b/Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js
@@ -4,6 +4,7 @@
   tip: false,
   searchShow: true,
   searchMenuSpan: 6,
+  searchLabelWidth:120,
   border: true,
   index: true,
   viewBtn: true,
diff --git a/Source/UBCS-WEB/src/const/omd/dict.js b/Source/UBCS-WEB/src/const/omd/dict.js
index e4ef858..d6c8c32 100644
--- a/Source/UBCS-WEB/src/const/omd/dict.js
+++ b/Source/UBCS-WEB/src/const/omd/dict.js
@@ -112,6 +112,7 @@
       editDisabled: true,
       search: true,
       span: 24,
+      hide: true,
       rules: [
         {
           required: true,
diff --git a/Source/UBCS-WEB/src/views/code/codebutton.vue b/Source/UBCS-WEB/src/views/code/codebutton.vue
index fb5dd5e..4dd6593 100644
--- a/Source/UBCS-WEB/src/views/code/codebutton.vue
+++ b/Source/UBCS-WEB/src/views/code/codebutton.vue
@@ -25,7 +25,7 @@
                    plain
                    @click="enableOrgDuty(true)">鍚� 鐢�
         </el-button>
-        <el-button type="primary"
+        <el-button type="warning"
                    size="small"
                    icon="el-icon-star-off"
                    plain
diff --git a/Source/UBCS-WEB/src/views/omd/dict.vue b/Source/UBCS-WEB/src/views/omd/dict.vue
index b17df8b..9476deb 100644
--- a/Source/UBCS-WEB/src/views/omd/dict.vue
+++ b/Source/UBCS-WEB/src/views/omd/dict.vue
@@ -49,7 +49,7 @@
         <el-tag>{{ row.isSealed === 0 ? '鍚�' : '鏄�' }}</el-tag>
       </template>
     </avue-crud>
-    <el-dialog :title="`[${dictValue}]鏋氫妇閰嶇疆`"
+    <el-dialog :title="`[${dictValue}]鏋氫妇椤归厤缃甡"
                append-to-body
                :visible.sync="box"
                width="1000px">
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml b/Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml
index c341358..a1095d2 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml
@@ -12,6 +12,11 @@
     <name>${project.artifactId}</name>
     <version>${bladex.project.version}</version>
     <dependencies>
+        <dependency>
+            <groupId>com.github.jsqlparser</groupId>
+            <artifactId>jsqlparser</artifactId>
+            <version>4.2</version>
+        </dependency>
 
 <!--        <dependency>-->
 <!--            <groupId>com.thoughtworks.xstream</groupId>-->
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java
index 1675e12..acf3e5c 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java
@@ -16,6 +16,7 @@
  */
 package com.vci.ubcs.code.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import com.vci.ubcs.starter.revision.model.BaseModel;
@@ -37,11 +38,6 @@
 public class CodeClsflowtempEntity extends BaseModel {
 
 
-	/**
-	 *
-	 */
-	@ApiModelProperty(value = "")
-	private String islastr;
 	/**
 	 *
 	 */
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java
index 057e533..27ca9c7 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java
@@ -16,6 +16,7 @@
  */
 package com.vci.ubcs.code.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import lombok.Data;
@@ -201,12 +202,12 @@
 	 *
 	 */
 	@ApiModelProperty(value = "")
-	private Short precisionlength;
+	private Integer precisionlength;
 	/**
 	 *
 	 */
 	@ApiModelProperty(value = "")
-	private Short scalelength;
+	private Integer scalelength;
 	/**
 	 *
 	 */
@@ -271,6 +272,7 @@
 	 *
 	 */
 	@ApiModelProperty(value = "")
+	@TableField("\"EXPLAIN\"")
 	private String explain;
 	/**
 	 *
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstemplateEntity.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstemplateEntity.java
index 882d72d..e6e5c35 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstemplateEntity.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstemplateEntity.java
@@ -16,6 +16,7 @@
  */
 package com.vci.ubcs.code.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.vci.ubcs.starter.annotation.Transient;
 import com.vci.ubcs.starter.revision.model.BaseModel;
@@ -56,6 +57,7 @@
 	/**
 	 * 涓婚搴撳垎绫讳富閿樉绀烘枃鏈�
 	 */
+	@TableField(exist = false)
 	@Transient(referColumn = "codeClassifyOid.name")
 	private String codeClassifyOidName;
 
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeOsbtmtypeattributeEntity.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeOsbtmtypeattributeEntity.java
index 1182bea..4c0a4df 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeOsbtmtypeattributeEntity.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeOsbtmtypeattributeEntity.java
@@ -16,7 +16,11 @@
  */
 package com.vci.ubcs.code.entity;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -41,6 +45,13 @@
 	 */
 	private static final long serialVersionUID = -4431848943790920077L;
 
+
+	@JsonSerialize(
+		using = ToStringSerializer.class
+	)
+	@ApiModelProperty("涓婚敭id")
+	@TableId(value = "OID",type = IdType.ASSIGN_UUID)
+	private String oid;
 	/**
 	 * 鎵�灞炰笟鍔$被鍨�
 	 */
diff --git a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeOsbtmtypeattributeVO.java b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeOsbtmtypeattributeVO.java
index 05b1140..54018df 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeOsbtmtypeattributeVO.java
+++ b/Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeOsbtmtypeattributeVO.java
@@ -32,4 +32,11 @@
 public class CodeOsbtmtypeattributeVO extends CodeOsbtmtypeattributeEntity {
 	private static final long serialVersionUID = 1L;
 
+	public String id;
+	public String name;
+	public String attrDataType;
+	public String attributeLength;
+	public String referBtmTypeId;
+	public String referBtmTypeName;
+
 }
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/PatternUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/PatternUtil.java
new file mode 100644
index 0000000..b40a46a
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/PatternUtil.java
@@ -0,0 +1,50 @@
+package com.vci.ubcs.starter.util;
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class PatternUtil {
+
+	//*${xxx}*
+	public static Pattern dynamic = Pattern.compile(".*\\$\\{([a-z]+)\\}.*");
+	public static Pattern dynamicLimitCount = Pattern.compile("\\$\\{([a-z]+)\\}");
+	/**
+	 * 鍒ゆ柇鍐呭涓槸鍚﹀寘鍚姩鎬佸弬鏁�(${key}褰㈠紡鐨�)
+	 *
+	 * @param content 瑕佸垽鏂殑鍐呭
+	 * @return
+	 */
+	public static boolean isContainsDynamicParameter(String content) {
+		if(StringUtils.isBlank(content)){
+			return false;
+		}
+		return dynamic.matcher(content).matches();
+	}
+
+	/**
+	 * 鎸夌収鍔ㄦ�佸唴瀹圭殑鍙傛暟鍑虹幇椤哄簭,灏嗗弬鏁版斁鍒癓ist涓�
+	 *
+	 * @param content
+	 * @return
+	 */
+	public static List<String> getKeyListByContent(String content) {
+		if(StringUtils.isBlank(content)){
+			return new ArrayList<>();
+		}
+		Set<String> paramSet = new LinkedHashSet<>();
+		Matcher m = dynamicLimitCount.matcher(content);
+		while (m.find()) {
+			paramSet.add(m.group(1));
+		}
+		return new ArrayList<>(paramSet);
+	}
+
+
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BooleanEnum.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BooleanEnum.java
new file mode 100644
index 0000000..3e5837e
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BooleanEnum.java
@@ -0,0 +1,16 @@
+package com.vci.ubcs.starter.web.enumpck;
+
+public enum BooleanEnum {
+	TRUE("true"),
+	FASLE("false");
+
+	private final String value;
+
+	private BooleanEnum(String value) {
+		this.value = value;
+	}
+
+	public String getValue() {
+		return this.value;
+	}
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/BeanUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/BeanUtil.java
new file mode 100644
index 0000000..9df9508
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/BeanUtil.java
@@ -0,0 +1,174 @@
+package com.vci.ubcs.starter.web.util;
+
+
+import com.vci.ubcs.starter.web.toolmodel.DateConverter;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.cglib.core.Converter;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+public class BeanUtil {
+	private static final ConcurrentMap<String, BeanCopier> beanCopierMap = new ConcurrentHashMap();
+
+	public BeanUtil() {
+	}
+
+	public static BeanCopier getBeanCopier(Class<?> source, Class<?> target, boolean useConverter) {
+		String beanCopierKey = generateBeanKey(source, target);
+		if (beanCopierMap.containsKey(beanCopierKey)) {
+			return (BeanCopier)beanCopierMap.get(beanCopierKey);
+		} else {
+			BeanCopier beanCopier = BeanCopier.create(source, target, useConverter);
+			beanCopierMap.putIfAbsent(beanCopierKey, beanCopier);
+			return (BeanCopier)beanCopierMap.get(beanCopierKey);
+		}
+	}
+
+	public static String generateBeanKey(Class<?> source, Class<?> target) {
+		return source.getName() + "@" + target.getName();
+	}
+
+	public static void convert(Object source, Object target, boolean useConvert) {
+		if (source != null && target != null) {
+			BeanCopier beanCopier = getBeanCopier(source.getClass(), target.getClass(), useConvert);
+			beanCopier.copy(source, target, useConvert ? new DeepCopyConverter(target) : null);
+		}
+
+	}
+
+	public static void convert(Object source, Object target) {
+		convert(source, target, true);
+	}
+
+	public static class DeepCopyConverter implements Converter {
+		private Object target;
+
+		public DeepCopyConverter(Object target) {
+			this.target = target;
+		}
+
+		public Object convert(Object value, Class targetClazz, Object methodName) {
+			if (value instanceof List) {
+				List values = (List)value;
+				List retList = new ArrayList(values.size());
+				this.copyForCollection(values, retList, methodName);
+				return retList;
+			} else {
+				if (value instanceof Set) {
+					Set values = (Set)value;
+					Set retSet = new HashSet();
+					this.copyForCollection(values, retSet, methodName);
+				} else if (value instanceof Vector) {
+					Vector values = (Vector)value;
+					Vector retVector = new Vector();
+					this.copyForCollection(values, retVector, methodName);
+				} else if (value instanceof Map) {
+					Map values = (Map)value;
+					Map retMap = new HashMap();
+					Iterator var6 = values.keySet().iterator();
+
+					while(var6.hasNext()) {
+						Object key = var6.next();
+						Object mapValue = values.get(key);
+						String tempFieldName = methodName.toString().replace("set", "");
+						String fieldName = tempFieldName.substring(0, 1).toLowerCase() + tempFieldName.substring(1);
+						Class clazz = ClassUtil.getElementType(this.target.getClass(), fieldName);
+						Object targetAttr = null;
+
+						try {
+							targetAttr = clazz.newInstance();
+						} catch (Throwable var15) {
+						}
+
+						BeanUtil.convert(mapValue, targetAttr);
+						retMap.put(key, targetAttr);
+					}
+				} else if (!ClassUtil.isPrimitive(targetClazz)) {
+					Object targetAttr = null;
+
+					try {
+						targetAttr = targetClazz.newInstance();
+					} catch (Throwable var14) {
+					}
+
+					BeanUtil.convert(value, targetAttr);
+					return targetAttr;
+				}
+
+				if (value instanceof Boolean && targetClazz.equals(String.class)) {
+					return String.valueOf(value);
+				} else if (!(value instanceof String) || !targetClazz.equals(Boolean.class) && !targetClazz.equals(Boolean.TYPE)) {
+					if (value instanceof Date && targetClazz.equals(String.class)) {
+						return VciDateUtil.date2Str((Date)value, "yyyy-MM-dd HH:mm:ss.SSS");
+					} else if (value instanceof String && targetClazz.equals(Date.class)) {
+						DateConverter dateConverter = new DateConverter();
+						dateConverter.setAsText((String)value);
+						return dateConverter.getValue();
+					} else {
+						return value;
+					}
+				} else {
+					return "true".equalsIgnoreCase((String)value) ? true : false;
+				}
+			}
+		}
+
+		private void copyForCollection(Collection<?> sourceCollection, Collection targetCollection, Object methodName) {
+			Iterator var4 = sourceCollection.iterator();
+
+			while(true) {
+				while(var4.hasNext()) {
+					Object source = var4.next();
+					if (source instanceof Collection) {
+						List<Object> targetValues = new ArrayList();
+						this.copyForCollection((Collection)source, targetValues, methodName);
+						targetCollection.add(targetValues);
+					} else {
+						String tempFieldName;
+						String fieldName;
+						Class clazz;
+						Object targetAttr;
+						if (!(source instanceof Map)) {
+							tempFieldName = methodName.toString().replace("set", "");
+							fieldName = tempFieldName.substring(0, 1).toLowerCase() + tempFieldName.substring(1);
+							clazz = ClassUtil.getElementType(this.target.getClass(), fieldName);
+							targetAttr = null;
+
+							try {
+								targetAttr = clazz.newInstance();
+							} catch (Throwable var13) {
+							}
+
+							BeanUtil.convert(source, targetAttr);
+							targetCollection.add(targetAttr);
+						} else {
+							tempFieldName = methodName.toString().replace("set", "");
+							fieldName = tempFieldName.substring(0, 1).toLowerCase() + tempFieldName.substring(1);
+							clazz = ClassUtil.getElementType(this.target.getClass(), fieldName);
+							targetAttr = null;
+
+							try {
+								targetAttr = clazz.newInstance();
+							} catch (Throwable var14) {
+							}
+
+							Map map = (Map)source;
+							Iterator var11 = map.keySet().iterator();
+
+							while(var11.hasNext()) {
+								Object key = var11.next();
+								VciBaseUtil.setValueForField(key.toString(), targetAttr, VciBaseUtil.getStringValueFromObject(map.get(key)));
+							}
+
+							targetCollection.add(targetAttr);
+						}
+					}
+				}
+
+				return;
+			}
+		}
+	}
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/ClassUtil.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/ClassUtil.java
new file mode 100644
index 0000000..353cace
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/ClassUtil.java
@@ -0,0 +1,50 @@
+package com.vci.ubcs.starter.web.util;
+
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ClassUtil {
+	private static final Map<Class<?>, Class<?>> primitiveMap = new HashMap(9);
+
+	public ClassUtil() {
+	}
+
+	public static boolean isPrimitive(Class<?> clazz) {
+		return primitiveMap.containsKey(clazz) ? true : clazz.isPrimitive();
+	}
+
+	public static Class<?> getElementType(Class<?> tartget, String fieldName) {
+		Class<?> elementTypeClass = null;
+
+		try {
+			Type type = VciBaseUtil.getFieldForObject(fieldName, tartget).getGenericType();
+			ParameterizedType t = (ParameterizedType)type;
+			String classStr = t.getActualTypeArguments()[0].toString().replace("class ", "");
+			if (classStr.contains("<")) {
+				classStr = classStr.substring(classStr.lastIndexOf("<") + 1, classStr.indexOf(">"));
+			}
+
+			elementTypeClass = Thread.currentThread().getContextClassLoader().loadClass(classStr);
+			return elementTypeClass;
+		} catch (SecurityException | ClassNotFoundException var6) {
+			throw new RuntimeException("get fieldName[" + fieldName + "] error", var6);
+		}
+	}
+
+	static {
+		primitiveMap.put(String.class, String.class);
+		primitiveMap.put(Boolean.class, Boolean.TYPE);
+		primitiveMap.put(Byte.class, Byte.TYPE);
+		primitiveMap.put(Character.class, Character.TYPE);
+		primitiveMap.put(Double.class, Double.TYPE);
+		primitiveMap.put(Float.class, Float.TYPE);
+		primitiveMap.put(Integer.class, Integer.TYPE);
+		primitiveMap.put(Long.class, Long.TYPE);
+		primitiveMap.put(Short.class, Short.TYPE);
+		primitiveMap.put(Date.class, Date.class);
+	}
+}
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 4cc6e8d..6f45676 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
@@ -9,6 +9,7 @@
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
 import com.vci.ubcs.starter.web.pagemodel.SessionInfo;
 import com.vci.ubcs.starter.web.toolmodel.DateConverter;
 import org.slf4j.Logger;
@@ -135,6 +136,11 @@
 				return 0.0D;
 			}
 		}
+	}
+
+
+	public static boolean getBoolean(String s) {
+		return BooleanEnum.TRUE.getValue().equals(s);
 	}
 
 	public static String removeComma(String s) {
@@ -1199,5 +1205,19 @@
 
 	}
 
+	public static void setValueForField(String fieldName, Object obj, String value) {
+		try {
+			Field field = getFieldForObject(fieldName, obj);
+			if (field != null) {
+				setValueForField(field, obj, value);
+			}
+		} catch (Exception var4) {
+			if (log.isErrorEnabled()) {
+				log.error("璁剧疆灞炴�х殑鍊煎嚭閿欎簡閿欒", var4);
+			}
+		}
+
+	}
+
 }
 
diff --git a/Source/UBCS/ubcs-service/ubcs-code/pom.xml b/Source/UBCS/ubcs-service/ubcs-code/pom.xml
index 457db9e..a4f1521 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/pom.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/pom.xml
@@ -62,6 +62,12 @@
             <artifactId>orai18n</artifactId>
             <version>${orai18n.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.vci.ubcs</groupId>
+            <artifactId>ubcs-dict-api</artifactId>
+            <version>3.0.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstempattrController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstempattrController.java
index 2ac1921..533194c 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstempattrController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstempattrController.java
@@ -18,10 +18,15 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.vci.ubcs.code.dto.CodeClstempattrDTO;
 import com.vci.ubcs.code.entity.CodeClstempattrEntity;
 import com.vci.ubcs.code.service.ICodeClstempattrService;
 import com.vci.ubcs.code.vo.CodeClstempattrVO;
+import com.vci.ubcs.code.vo.CodeOsbtmtypeattributeVO;
 import com.vci.ubcs.code.wrapper.CodeClstempattrWrapper;
+import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
+import com.vci.ubcs.starter.web.pagemodel.DataGrid;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -31,9 +36,12 @@
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * 缂栫爜搴撳畾涔�-妯℃澘灞炴�� 鎺у埗鍣�
@@ -43,11 +51,11 @@
  */
 @RestController
 @AllArgsConstructor
-@RequestMapping("/CodeClstempattr")
+@RequestMapping("/codeClassifyTempAttrController")
 @Api(value = "缂栫爜搴撳畾涔�-妯℃澘灞炴��", tags = "缂栫爜搴撳畾涔�-妯℃澘灞炴�ф帴鍙�")
 public class CodeClstempattrController extends BladeController {
 
-	private final ICodeClstempattrService CodeClstempattrService;
+	private final ICodeClstempattrService codeClstempattrService;
 
 	/**
 	 * 缂栫爜搴撳畾涔�-妯℃澘灞炴�� 璇︽儏
@@ -56,7 +64,7 @@
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "璇︽儏", notes = "浼犲叆CodeClstempattr")
 	public R<CodeClstempattrVO> detail(CodeClstempattrEntity CodeClstempattr) {
-		CodeClstempattrEntity detail = CodeClstempattrService.getOne(Condition.getQueryWrapper(CodeClstempattr));
+		CodeClstempattrEntity detail = codeClstempattrService.getOne(Condition.getQueryWrapper(CodeClstempattr));
 		return R.data(CodeClstempattrWrapper.build().entityVO(detail));
 	}
 	/**
@@ -66,7 +74,7 @@
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "鍒嗛〉", notes = "浼犲叆CodeClstempattr")
 	public R<IPage<CodeClstempattrVO>> list(CodeClstempattrEntity CodeClstempattr, Query query) {
-		IPage<CodeClstempattrEntity> pages = CodeClstempattrService.page(Condition.getPage(query), Condition.getQueryWrapper(CodeClstempattr));
+		IPage<CodeClstempattrEntity> pages = codeClstempattrService.page(Condition.getPage(query), Condition.getQueryWrapper(CodeClstempattr));
 		return R.data(CodeClstempattrWrapper.build().pageVO(pages));
 	}
 
@@ -77,7 +85,7 @@
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "鍒嗛〉", notes = "浼犲叆CodeClstempattr")
 	public R<IPage<CodeClstempattrVO>> page(CodeClstempattrVO CodeClstempattr, Query query) {
-		IPage<CodeClstempattrVO> pages = CodeClstempattrService.selectCodeClstempattrPage(Condition.getPage(query), CodeClstempattr);
+		IPage<CodeClstempattrVO> pages = codeClstempattrService.selectCodeClstempattrPage(Condition.getPage(query), CodeClstempattr);
 		return R.data(pages);
 	}
 
@@ -88,7 +96,7 @@
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "鏂板", notes = "浼犲叆CodeClstempattr")
 	public R save(@Valid @RequestBody CodeClstempattrEntity CodeClstempattr) {
-		return R.status(CodeClstempattrService.save(CodeClstempattr));
+		return R.status(codeClstempattrService.save(CodeClstempattr));
 	}
 
 	/**
@@ -98,7 +106,7 @@
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "淇敼", notes = "浼犲叆CodeClstempattr")
 	public R update(@Valid @RequestBody CodeClstempattrEntity CodeClstempattr) {
-		return R.status(CodeClstempattrService.updateById(CodeClstempattr));
+		return R.status(codeClstempattrService.updateById(CodeClstempattr));
 	}
 
 	/**
@@ -108,7 +116,7 @@
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "鏂板鎴栦慨鏀�", notes = "浼犲叆CodeClstempattr")
 	public R submit(@Valid @RequestBody CodeClstempattrEntity CodeClstempattr) {
-		return R.status(CodeClstempattrService.saveOrUpdate(CodeClstempattr));
+		return R.status(codeClstempattrService.saveOrUpdate(CodeClstempattr));
 	}
 
 	/**
@@ -118,8 +126,133 @@
 	@ApiOperationSupport(order = 7)
 	@ApiOperation(value = "閫昏緫鍒犻櫎", notes = "浼犲叆ids")
 	public R remove(@ApiParam(value = "涓婚敭闆嗗悎", required = true) @RequestParam String ids) {
-		return R.status(CodeClstempattrService.removeBatchByIds(Func.toLongList(ids)));
+		return R.status(codeClstempattrService.removeBatchByIds(Func.toLongList(ids)));
 	}
 
+	/**
+	 * 涓婚搴撳垎绫荤殑妯℃澘灞炴�у垪琛�
+	 * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞″垪琛�
+	 */
+	@GetMapping("/gridCodeClassifyTemplateAttr")
+	public DataGrid<CodeClstempattrVO> gridCodeClassifyTemplateAttr(BaseQueryObject baseQueryObject){
+		if(baseQueryObject == null){
+			baseQueryObject = new BaseQueryObject();
+		}
+		return codeClstempattrService.gridCodeClassifyTemplateAttr(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+	}
+
+	/**
+	 * 澧炲姞 涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞�
+	 * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+	 */
+	@PostMapping( "/addSave")
+	public R<CodeClstempattrVO> addSave(@RequestBody CodeClstempattrDTO codeClassifyTemplateAttrDTO){
+		CodeClstempattrVO codeClassifyTemplateAttrVO = codeClstempattrService.addSave(codeClassifyTemplateAttrDTO);
+		return R.data(codeClassifyTemplateAttrVO);
+	}
+
+	/**
+	 * 鎵归噺淇濆瓨鍒楄〃鏁版嵁
+	 * @param list
+	 * @return
+	 */
+	@PostMapping( "/batchAddSave")
+	public R<List<CodeClstempattrVO>> batchAddSaves(@RequestBody List<CodeClstempattrDTO> list){
+		if(CollectionUtils.isEmpty(list)){
+			return R.fail("鍒楄〃涓嶈兘涓虹┖!");
+		}
+		List<CodeClstempattrVO> codeClassifyTemplateAttrVOs = codeClstempattrService.batchAddSave(list);
+		return R.data(codeClassifyTemplateAttrVOs);
+	}
+
+	/**
+	 * 淇敼 涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞�
+	 * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+	 */
+	@PutMapping("/editSave")
+	public R<CodeClstempattrVO> editSave(@RequestBody CodeClstempattrDTO codeClassifyTemplateAttrDTO){
+		return codeClstempattrService.editSave(codeClassifyTemplateAttrDTO);
+	}
+
+	/**
+	 * 鍒犻櫎涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+	 * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+	 */
+	@DeleteMapping( "/deleteData")
+	public R delCodeClassifyTemplateAttr(@RequestBody CodeClstempattrDTO codeClassifyTemplateAttrDTO) {
+		return codeClstempattrService.deleteCodeClassifyTemplateAttr(codeClassifyTemplateAttrDTO);
+	}
+
+	/**
+	 * 涓婚敭鑾峰彇涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param oid 涓婚敭
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞�
+	 */
+	@GetMapping("/getObjectByOid")
+	public R<CodeClstempattrVO> getObjectByOid(String oid){
+		CodeClstempattrVO codeClassifyTemplateAttrVO = codeClstempattrService.getObjectByOid(oid);
+		return R.data(codeClassifyTemplateAttrVO);
+	}
+
+
+	/**
+	 * 涓婚敭鎵归噺鑾峰彇涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param oids 涓婚敭锛屽涓互閫楀彿鍒嗛殧锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞�
+	 */
+	@GetMapping("/listDataByOids")
+	public R listCodeClassifyTemplateAttrByOids(String oids){
+		Collection<CodeClstempattrVO> voCollection =  codeClstempattrService.listCodeClassifyTemplateAttrByOids(VciBaseUtil.str2List(oids));
+//		BaseResult baseResult = BaseResult.success();
+//		baseResult.setData(voCollection);
+		return  R.data(voCollection);
+	}
+
+	/**
+	 * 鍙傜収涓婚搴撳垎绫荤殑妯℃澘灞炴�у垪琛�
+	 * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+	 */
+	@GetMapping("/refDataGrid")
+	public DataGrid<CodeClstempattrVO> refDataGridCodeClassifyTemplateAttr(BaseQueryObject baseQueryObject){
+		if(baseQueryObject == null){
+			baseQueryObject = new BaseQueryObject();
+		}
+		return codeClstempattrService.refDataGridCodeClassifyTemplateAttr(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+	}
+
+	/**
+	 * 鏌ヨ杩欎釜涓氬姟绫诲瀷涓嬬殑鎵�鏈夊睘鎬�,鎺掗櫎鎺夎繖涓ā鏉垮凡缁忓瓨鍦ㄧ殑灞炴��
+	 * @param baseQueryObject
+	 * @return
+	 */
+	@GetMapping("/codeClassifyTemplateAttrByBtm")
+	public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtm(BaseQueryObject baseQueryObject){
+		return codeClstempattrService.codeClassifyTemplateAttrByBtm(baseQueryObject);
+	}
+
+	/**
+	 * 鏌ヨ杩欎釜涓氬姟绫诲瀷涓嬨�佽繖涓ā鏉垮凡缁忓瓨鍦ㄧ殑灞炴��
+	 * @param baseQueryObject
+	 * @return
+	 */
+	@GetMapping("/codeClassifyTemplateAttrByBtmHave")
+	public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtmHave(BaseQueryObject baseQueryObject){
+		return codeClstempattrService.codeClassifyTemplateAttrByBtmHave(baseQueryObject);
+	}
+
+	/**
+	 * 鍚屾鍒板叾浠栨ā鏉�
+	 * @param codeClassifyAttrDTO   id 鑻辨枃鍚嶇О
+	 * @return 鎵ц缁撴灉
+	 */
+	@PostMapping( "/copyto")
+	public R copyto(@RequestBody CodeClstempattrDTO codeClassifyAttrDTO) {
+		return codeClstempattrService.copyto(codeClassifyAttrDTO);
+	}
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java
index 4f61b25..db94cd2 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java
@@ -25,8 +25,9 @@
 import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
 import com.vci.ubcs.code.service.ICodeClstemplateService;
 import com.vci.ubcs.code.vo.CodeClstemplateVO;
-import com.vci.ubcs.starter.revision.model.TreeQueryObject;
 import com.vci.ubcs.code.wrapper.PlCodeClstemplateWrapper;
+import com.vci.ubcs.starter.revision.model.TreeQueryObject;
+import com.vci.ubcs.starter.web.pagemodel.DataGrid;
 import com.vci.ubcs.starter.web.pagemodel.Tree;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import io.swagger.annotations.Api;
@@ -142,16 +143,37 @@
 		return  plCodeClstemplateService.treeCodeClassifyTemplate(treeQueryObject);
 	}
 
-//	/**
-//	 * 鍒嗙被妯℃澘鍒楄〃
-//	 * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄
-//	 * @return 鏄剧ず瀵硅薄
-//	 */
-//	@GetMapping("/gridCodeClassifyTemplate")
-//	public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(BaseQueryObject baseQueryObject){
-//
-//		return  plCodeClstemplateService.gridCodeClassifyTemplate(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
-//	}
+	/**
+	 * 鍒嗙被妯℃澘鍒楄〃
+	 * @param plCodeClstemplate 鍩虹鏌ヨ瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@GetMapping("/gridCodeClassifyTemplate")
+	public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(CodeClstemplateVO plCodeClstemplate, Query query){
+
+		return  plCodeClstemplateService.gridCodeClassifyTemplate(plCodeClstemplate,query);
+
+	}
+
+	/**
+	 * 澧炲姞 鍒嗙被妯℃澘瀵硅薄
+	 * @param codeClassifyTemplateDTO 鍒嗙被妯℃澘瀵硅薄鏁版嵁浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+	 */
+	@PostMapping( "/addSave")
+	public R<CodeClstemplateVO> addSave(@RequestBody CodeClstemplateDTO codeClassifyTemplateDTO){
+		return plCodeClstemplateService.addSave(codeClassifyTemplateDTO);
+	}
+
+	/**
+	 * 淇敼 鍒嗙被妯℃澘瀵硅薄
+	 * @param codeClassifyTemplateDTO 鍒嗙被妯℃澘瀵硅薄鏁版嵁浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+	 */
+	@PutMapping("/editSave")
+	public R<CodeClstemplateVO> editSave(@RequestBody CodeClstemplateDTO codeClassifyTemplateDTO){
+		return plCodeClstemplateService.editSave(codeClassifyTemplateDTO);
+	}
 
 
 	/**
@@ -234,7 +256,7 @@
 	 * @return
 	 */
 	@PostMapping( "/editDate")
-	public R editDate( CodeClstemplateDTO codeClassifyDTO) {
+	public R editDate(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
 		return plCodeClstemplateService.updateLcStatus(codeClassifyDTO.getOid(),CodeClassifyTemplateLC.EDITING.getValue());
 	}
 
@@ -248,4 +270,26 @@
 
 		return plCodeClstemplateService.Upgrade(codeClassifyDTO);
 	}
+
+	@GetMapping( "/upgrade1")
+	public R upgrade1(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
+		return Upgrade(codeClassifyDTO);
+	}
+
+	/**
+	 * 鍏嬮殕
+	 * @param codeClassifyDTO
+	 * @return oid妯℃澘oid
+	 */
+	@PostMapping( "/copy")
+	public R copyTemplate(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
+
+		return plCodeClstemplateService.copyTemplate(codeClassifyDTO);
+	}
+
+	@GetMapping( "/copyTemplate1")
+	public R copyTemplate1(@RequestBody CodeClstemplateDTO codeClassifyDTO) {
+
+		return copyTemplate(codeClassifyDTO);
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java
index a363528..ce03874 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java
@@ -81,6 +81,9 @@
 	@MapKey("oid")
 	List<Map<String,Object>> selectAllLevelParentByOid(@Param("oid") String oid);
 
+	@MapKey("oid")
+	List<Map<String,Object>> selectAllLevelParents(@Param("oid") String oid);
+
 
 	@MapKey("oid")
 	List<Map<String,Object>> selectByFieldPath(@Param("fieldPath") String fieldPath);
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java
index 4b111c0..38fb156 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java
@@ -39,6 +39,7 @@
 	 */
 	List<CodeClstempattrVO> selectCodeClstempattrPage(IPage page, CodeClstempattrVO CodeClstempattr);
 
+
 	/**
 	 * 鏉′欢鏌ヨ鎺掑簭
 	 *
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java
index 5e87d10..7d2b7d2 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java
@@ -20,9 +20,11 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.vci.ubcs.code.entity.CodeClstemplateEntity;
 import com.vci.ubcs.code.vo.CodeClstemplateVO;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 缂栫爜搴撳畾涔�-妯℃澘绠$悊 Mapper 鎺ュ彛
@@ -57,5 +59,17 @@
 	 */
 	int countAllLevelChildOid(@Param("oid") String oid);
 
+	/**
+	 * 鏍¢獙鏄惁鏈変笅绾ц妭鐐癸紝涓嶆牎楠屾槸鍚﹀叧鑱斾簡鏁版嵁
+	 *
+	 * @param nameoid
+	 * @return
+	 */
+//	@MapKey("REVISIONSEQ")
+	Map<String,Object> getNextRevision(@Param("nameoid") String nameoid);
 
+
+
+	List<CodeClstemplateEntity> selectCodeClassifyTemplateDOByTree(@Param("codeclassifyoid") String codeclassifyoid,
+														  @Param("lcstatus") String lcstatus);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java
index 7765694..b6c6d1b 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java
@@ -41,4 +41,7 @@
 
 
 	List<CodePhaseattrEntity> selectByPhasea(String oid);
+
+	List<CodePhaseattrEntity> selectByPhaseaIds(String oids);
+	List<CodePhaseattrEntity> listLinkAttrDOByTemplateAttrDOS(String id,String codeClassifyTemplateOid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
index a9fc3a5..1e46c34 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
@@ -198,4 +198,18 @@
 	 * @return 涓婚搴撴樉绀烘爲
 	 */
 	List<Tree> treeTopCodeClassify(TreeQueryObject treeQueryObject);
+
+	/**
+	 * 鑾峰彇杩欎釜鍒嗙被涓嬬殑涓氬姟绫诲瀷锛屽綋鍓嶆病鏈夊氨鑾峰彇涓婄骇鐨勭涓�涓笟鍔$被鍨�
+	 * @param oid 褰撳墠鍒嗙被鐨刼id
+	 * @return oid,id,name,btmtypeid,btmtypename
+	 */
+	CodeClassify selectBtmOrParentBtm(String oid);
+
+	/**
+	 * 鑾峰彇鎵�鏈変笅绾ф暟鎹�
+	 * @param oid 鏁版嵁涓婚敭
+	 * @return 鏌ヨ缁撴灉
+	 */
+	List<CodeClassify> selectAllLevelParents(String oid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java
index 27c01d0..42150b7 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java
@@ -18,11 +18,18 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.code.dto.CodeClstempattrDTO;
 import com.vci.ubcs.code.entity.CodeClstempattrEntity;
 import com.vci.ubcs.code.vo.CodeClstempattrVO;
+import com.vci.ubcs.code.vo.CodeOsbtmtypeattributeVO;
+import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
+import com.vci.ubcs.starter.web.pagemodel.DataGrid;
+import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+import org.springblade.core.tool.api.R;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 缂栫爜搴撳畾涔�-妯℃澘灞炴�� 鏈嶅姟绫�
@@ -61,5 +68,77 @@
 	 * @return 鏄剧ず瀵硅薄
 	 */
 	CodeClstempattrVO codeClassifyTemplateAttrDO2VO(CodeClstempattrEntity codeClassifyTemplateAttrDO);
+	/**
+	 * 鏌ヨ鎵�鏈夌殑涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉鍜屾帓搴�
+	 * @return 鎵ц缁撴灉
+	 */
+    DataGrid<CodeClstempattrVO> gridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper);
 
+
+	/**
+	 * 澧炲姞涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞�
+	 * @return 鎵ц缁撴灉
+	 */
+	CodeClstempattrVO addSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO);
+
+	List<CodeClstempattrVO> batchAddSave(List<CodeClstempattrDTO> list);
+
+	/**
+	 * 淇敼涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞�
+	 * @return 鎵ц缁撴灉
+	 */
+	R<CodeClstempattrVO> editSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO);
+
+	/**
+	 * 鍒犻櫎涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+	 * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+	 */
+	R deleteCodeClassifyTemplateAttr(CodeClstempattrDTO codeClassifyTemplateAttrDTO);
+
+	/**
+	 * 涓婚敭鑾峰彇涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param oid 涓婚敭
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞�
+	 */
+	CodeClstempattrVO getObjectByOid(String oid);
+
+	/**
+	 * 涓婚敭鎵归噺鑾峰彇涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞�
+	 */
+	Collection<CodeClstempattrVO> listCodeClassifyTemplateAttrByOids(Collection<String> oidCollections);
+
+	/**
+	 * 鍙傜収涓婚搴撳垎绫荤殑妯℃澘灞炴�у垪琛�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉鍜屾帓搴�
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+	 */
+	DataGrid<CodeClstempattrVO> refDataGridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper);
+
+	/**
+	 * 鏌ヨ杩欎釜妯℃澘锛屼笟鍔$被鍨嬩笅鐨勬墍鏈夋湭閫夋嫨鐨勫睘鎬�
+	 * @param baseQueryObject
+	 * @return
+	 */
+	DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtm(BaseQueryObject baseQueryObject);
+	/**
+	 * 鏌ヨ杩欎釜妯℃澘锛屼笟鍔$被鍨嬩笅宸查�夋嫨鐨勫睘鎬�
+	 * @param baseQueryObject
+	 * @return
+	 */
+	DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtmHave(BaseQueryObject baseQueryObject);
+
+	/**
+	 * 鍚屾鍒板叾浠栨ā鏉�
+	 * @param codeClassifyAttrDTO oid
+	 * @return
+	 */
+	R copyto(CodeClstempattrDTO codeClassifyAttrDTO);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
index 71898f2..6ab44e2 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java
@@ -22,11 +22,14 @@
 import com.vci.ubcs.code.entity.CodeClstemplateEntity;
 import com.vci.ubcs.code.vo.CodeClstemplateVO;
 import com.vci.ubcs.starter.revision.model.TreeQueryObject;
+import com.vci.ubcs.starter.web.pagemodel.DataGrid;
 import com.vci.ubcs.starter.web.pagemodel.Tree;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 缂栫爜搴撳畾涔�-妯℃澘绠$悊 鏈嶅姟绫�
@@ -154,4 +157,30 @@
 	 * 鍗囩増
 	 */
 	R Upgrade(CodeClstemplateDTO codeClassifyDTO);
+	/**
+	 * 妯℃澘鍏嬮殕
+	 */
+	R copyTemplate(CodeClstemplateDTO codeClassifyDTO);
+
+	/**
+	 * 鍒嗙被妯℃澘鍒楄〃
+	 * @param plCodeClstemplate 鏌ヨ鏉′欢
+	 * @param query 鍒嗛〉瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(CodeClstemplateVO plCodeClstemplate, Query query);
+
+	/**
+	 * 澧炲姞鍒嗙被妯℃澘瀵硅薄
+	 * @param codeClassifyTemplateDTO 鍒嗙被妯℃澘瀵硅薄鏁版嵁浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉
+	 */
+	R<CodeClstemplateVO> addSave(CodeClstemplateDTO codeClassifyTemplateDTO);
+
+	/**
+	 * 淇敼鍒嗙被妯℃澘瀵硅薄
+	 * @param codeClassifyTemplateDTO 鍒嗙被妯℃澘瀵硅薄鏁版嵁浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉
+	 */
+	R<CodeClstemplateVO> editSave(CodeClstemplateDTO codeClassifyTemplateDTO);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java
index 2ee891a..549ab9d 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java
@@ -18,8 +18,12 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.vci.ubcs.code.entity.CodeClstempattrEntity;
 import com.vci.ubcs.code.entity.CodeTempphaseEntity;
+import com.vci.ubcs.code.vo.CodePhaseattrVO;
 import com.vci.ubcs.code.vo.CodeTempphaseVO;
+
+import java.util.List;
 
 /**
  * 缂栫爜搴撳畾涔�-妯℃澘闃舵 鏈嶅姟绫�
@@ -45,4 +49,11 @@
 	 * @return 鍙楀奖鍝嶇殑鏁版嵁
 	 */
 	int codeTemplateDeleteTrigger(String classifyTemplateOid);
+
+	/**
+	 * 妯℃澘淇敼瑙﹀彂鍔熻兘
+	 * @param codeClassifyTemplateAttrDOInsert 灞炴�х殑鏁版嵁瀵硅薄
+	 * @return 鍙楀奖鍝嶇殑鏁版嵁
+	 */
+	List<CodeClstempattrEntity> codeTemplateAttrModifyTrigger(List<CodeClstempattrEntity> codeClassifyTemplateAttrDOInsert);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
index 6547785..3481b1b 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -5,8 +5,6 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
-import com.vci.ubcs.starter.revision.model.TreeQueryObject;
-import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
 import com.vci.ubcs.code.entity.CodeClassify;
 import com.vci.ubcs.code.entity.CodeClstemplateEntity;
 import com.vci.ubcs.code.entity.CodeOsbtmtypeEntity;
@@ -25,13 +23,15 @@
 import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
 import com.vci.ubcs.code.vo.pagemodel.CodeKeyAttrRepeatRuleVO;
 import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
-import com.vci.ubcs.starter.revision.model.TreeQueryObject;
+import com.vci.ubcs.core.log.exception.ServiceException;
 import com.vci.ubcs.starter.bo.WriteExcelData;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.poi.bo.ReadExcelOption;
 import com.vci.ubcs.starter.poi.bo.WriteExcelOption;
 import com.vci.ubcs.starter.poi.constant.ExcelLangCodeConstant;
 import com.vci.ubcs.starter.poi.util.ExcelUtil;
+import com.vci.ubcs.starter.revision.model.TreeQueryObject;
+import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
 import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
 import com.vci.ubcs.starter.util.LocalFileUtil;
 import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
@@ -40,7 +40,6 @@
 import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
 import com.vci.ubcs.starter.web.util.LangBaseUtil;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
-import org.springblade.core.log.exception.ServiceException;
 import org.apache.poi.hssf.util.HSSFColor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -985,4 +984,41 @@
 		return treeCodeClassify(treeQueryObject);
 	}
 
+	/**
+	 * 鑾峰彇杩欎釜鍒嗙被涓嬬殑涓氬姟绫诲瀷锛屽綋鍓嶆病鏈夊氨鑾峰彇涓婄骇鐨勭涓�涓笟鍔$被鍨�
+	 * @param oid 褰撳墠鍒嗙被鐨刼id
+	 * @return oid,id,name,btmtypeid,btmtypename锛屾病鏈夊氨杩斿洖null
+	 */
+	@Override
+	public CodeClassify selectBtmOrParentBtm(String oid){
+		List<CodeClassify> oidList = selectAllLevelParents(oid);
+		return oidList.size()==0?null:oidList.get(0);
+	}
+
+	/**
+	 * 鑾峰彇鎵�鏈夊眰绾т笂绾у叧鑱斾笟鍔$被鍨嬫暟鎹�
+	 * @param oid 褰撳墠鍒嗙被鐨刼id
+	 * @return oid,id,name,btmtypeid,btmtypename
+	 */
+	@Override
+	public List<CodeClassify> selectAllLevelParents(String oid){
+//		String sql = "select oid,id,name,btmtypeid,btmtypename from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY) + " where btmtypeid is not null start with oid= :oid connect by prior PARENTCODECLASSIFYOID=oid ";
+//		Map< String,String> conditionMap = new HashMap< String,String>();
+//		conditionMap.put("oid",oid);
+//		List<Map> dataList = boService.queryBySqlForMap(sql,conditionMap);
+		List<Map<String, Object>> dataList = codeClassifyMapper.selectAllLevelParents(oid);
+		List<CodeClassify> oidList = new ArrayList<CodeClassify>();
+		if(!CollectionUtils.isEmpty(dataList)){
+			for(Map data:dataList){
+				CodeClassify codeClassifyDO = new CodeClassify();
+				codeClassifyDO.setOid(VciBaseUtil.getStringValueFromObject(data.get("OID")));
+				codeClassifyDO.setId(VciBaseUtil.getStringValueFromObject(data.get("ID")));
+				codeClassifyDO.setName(VciBaseUtil.getStringValueFromObject(data.get("NAME")));
+				codeClassifyDO.setBtmTypeId(VciBaseUtil.getStringValueFromObject(data.get("BTMTYPEID")));
+				codeClassifyDO.setBtmTypeName(VciBaseUtil.getStringValueFromObject(data.get("BTMTYPENAME")));
+				oidList.add(codeClassifyDO);
+			}
+		}
+		return oidList;
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java
index 404f4d4..ccc9518 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java
@@ -16,23 +16,47 @@
  */
 package com.vci.ubcs.code.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
+import com.vci.ubcs.code.dto.CodeClstempattrDTO;
 import com.vci.ubcs.code.entity.CodeClstempattrEntity;
+import com.vci.ubcs.code.entity.CodeClstemplateEntity;
+import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
 import com.vci.ubcs.code.mapper.CodeClstempattrMapper;
+import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
+import com.vci.ubcs.code.mapper.CodeOsbtmtypeattributeMapper;
 import com.vci.ubcs.code.service.ICodeClstempattrService;
+import com.vci.ubcs.code.service.ICodeTempphaseService;
 import com.vci.ubcs.code.vo.CodeClstempattrVO;
-
+import com.vci.ubcs.code.vo.CodeOsbtmtypeattributeVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
+import com.vci.ubcs.starter.util.PatternUtil;
 import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.ubcs.starter.web.pagemodel.*;
 import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import com.vci.ubcs.starter.web.util.VciDateUtil;
+import com.vci.ubcs.system.entity.DictBiz;
+import com.vci.ubcs.system.feign.IDictBizClient;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanMap;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.*;
 
 /**
  * 缂栫爜搴撳畾涔�-妯℃澘灞炴�� 鏈嶅姟瀹炵幇绫�
@@ -45,6 +69,22 @@
 
 	@Resource
 	CodeClstempattrMapper codeClstempattrMapper;
+//	@Resource
+//	ICodeTempphaseService codeTempphaseService;
+	@Resource
+	IDictBizClient iDictBizClient;
+	@Resource
+	CodeClstemplateMapper codeClstemplateMapper;
+	@Resource
+	CodeOsbtmtypeattributeMapper codeOsbtmtypeattributeMapper;
+	@Resource
+	ICodeTempphaseService codeTempphaseService;
+
+	/**
+	 * 瀵硅薄鐨勬搷浣�
+	 */
+	@Autowired(required = false)
+	private RevisionModelUtil revisionModelUtil;
 
 	@Override
 	public IPage<CodeClstempattrVO> selectCodeClstempattrPage(IPage<CodeClstempattrVO> page, CodeClstempattrVO CodeClstempattr) {
@@ -112,4 +152,647 @@
 		}
 		return vo;
 	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉鍜屾帓搴�
+	 * @return 鎵ц缁撴灉
+	 */
+    @Override
+    public DataGrid<CodeClstempattrVO> gridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper) {
+		DataGrid<CodeClstempattrVO> dataGrid=new DataGrid<CodeClstempattrVO>();
+		//娌℃湁浼犻�掑弬鏁帮紝灏变笉鎵ц鏌ヨ閫昏緫
+		if(conditionMap.size()==0){
+			dataGrid.setData(new ArrayList<>());
+			dataGrid.setTotal(0);
+			return dataGrid;
+		}
+
+		if (pageHelper == null) {
+			pageHelper = new PageHelper(-1);
+		}
+		pageHelper.addDefaultAsc("ordernum");
+//		IPage iPage = new IPage();
+		Query query = new Query();
+		query.setAscs("ordernum");
+//		query.setSize(100);
+		if(pageHelper.getLimit() != -1){
+			query.setSize(pageHelper.getLimit());
+			query.setCurrent(pageHelper.getPage());
+		}
+//		Condition.getPage(query)
+		CodeClstempattrVO codeClstempattrVO = new CodeClstempattrVO();
+//		BeanUtil.toBean(map,codeClstempattrVO);
+//		BeanUtil
+		BeanMap beanMap = BeanMap.create(codeClstempattrVO);
+
+		beanMap.putAll(conditionMap);
+//		Condition.getQueryWrapper(
+		IPage<CodeClstempattrEntity> doList = baseMapper.
+			selectPage(Condition.getPage(query), Condition.getQueryWrapper(codeClstempattrVO));
+
+
+		if (!CollectionUtils.isEmpty(doList.getRecords())) {
+//			CodeClstempattrEntity codeClstempattrEntity = new CodeClstempattrEntity();
+//			BeanUtils.copyProperties(conditionMap, codeClstempattrEntity);
+//			List<CodeClstempattrEntity> codeClstempattrEntities = new ArrayList<>();
+//			BeanUtils.copyProperties(doList,codeClstempattrEntities);
+//			codeClstempattrEntities.addAll(doList);
+			dataGrid.setData(codeClassifyTemplateAttrDO2VOs(doList.getRecords()));
+			dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(baseMapper.selectCount(Condition.getQueryWrapper(codeClstempattrVO)))));
+		}
+		return dataGrid;
+    }
+
+	/**
+	 * 澧炲姞涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞�
+	 * @return 鎵ц缁撴灉
+	 */
+	@Override
+	public CodeClstempattrVO addSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO){
+		VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+		//灏咲TO杞崲涓篋O
+		CodeClstempattrEntity codeClassifyTemplateAttrDO = new CodeClstempattrEntity();
+		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
+		baseMapper.insert(codeClassifyTemplateAttrDO);
+		return codeClassifyTemplateAttrDO2VO(codeClassifyTemplateAttrDO);
+	}
+
+
+	/**
+	 * 鎵归噺娣诲姞
+	 * @param codeClassifyTemplateAttrDTOs 鏁版嵁浼犺緭瀵硅薄
+	 * @return 淇濆瓨鍚庣殑鏄剧ず瀵硅薄
+	 */
+	@Override
+	@Transactional
+	public List<CodeClstempattrVO> batchAddSave(List<CodeClstempattrDTO> codeClassifyTemplateAttrDTOs) {
+		if(CollectionUtils.isEmpty(codeClassifyTemplateAttrDTOs)){
+			return new ArrayList<>();
+		}
+
+		//鍙栨墍鏈夊睘鎬х殑鑻辨枃鍚嶇О锛岀涓変釜楠岃瘉闇�瑕佺敤鍒�
+		Map<String,CodeClstempattrDTO> attrDTOMap =codeClassifyTemplateAttrDTOs.stream().collect(Collectors.toMap(s->s.getId().toLowerCase(Locale.ROOT), t->t));
+
+		//鎵惧睘鎬т腑鏂囧悕瀛楅噸澶�
+		Map<String, Long> nameCountMap = codeClassifyTemplateAttrDTOs.stream().collect(Collectors.groupingBy(s -> s.getName(), Collectors.counting()));
+		List<String> repeatNameList = nameCountMap.keySet().stream().filter(s -> nameCountMap.get(s) > 1).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(repeatNameList)){
+			throw new VciBaseException("妯℃澘灞炴�т腑鏂囧悕绉般�恵0}銆戦噸澶�",new String[]{ repeatNameList.stream().collect(Collectors.joining(","))});
+		}
+		//鎵惧睘鎬ц嫳鏂囧悕瀛楅噸澶�
+		Map<String, Long> idCountMap = codeClassifyTemplateAttrDTOs.stream().collect(Collectors.groupingBy(s -> s.getId().toLowerCase(Locale.ROOT), Collectors.counting()));
+		List<String> repeatIdList = idCountMap.keySet().stream().filter(s -> idCountMap.get(s) > 1).collect(Collectors.toList());
+		if(!CollectionUtils.isEmpty(repeatIdList)){
+			throw new VciBaseException("妯℃澘灞炴�ц嫳鏂囧悕绉般�恵0}銆戦噸澶�",new String[]{ repeatIdList.stream().collect(Collectors.joining(","))});
+		}
+
+		//妯℃澘oid
+		String CLASSIFYTEMPLATEOID = null;
+		//杞崲
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOInsert = new ArrayList<CodeClstempattrEntity>();
+		List<String> prefix = new ArrayList<>();
+		List<String> suffix = new ArrayList<>();
+		List<String> dateFormates = new ArrayList<>();
+		for (CodeClstempattrEntity codeClassifyTemplateAttrDTO:codeClassifyTemplateAttrDTOs){
+			VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+			//灏咲TO杞崲涓篋O
+			CodeClstempattrEntity codeClassifyTemplateAttrDO = new CodeClstempattrEntity();
+			BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
+			codeClassifyTemplateAttrDOInsert.add(codeClassifyTemplateAttrDO);
+
+			if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getPrefixvalue())){
+				prefix.add(codeClassifyTemplateAttrDO.getPrefixvalue());
+			}
+			if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getSuffixvalue())){
+				suffix.add(codeClassifyTemplateAttrDO.getSuffixvalue());
+			}
+			if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getCodedateformat())){
+				dateFormates.add(codeClassifyTemplateAttrDO.getCodedateformat());
+			}
+			//鍒ゆ柇浼犺繃鏉ョ殑鏋氫妇娉ㄥ叆鏄惁鏄痡sonArr鏍煎紡
+			if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getEnumstring())&&!checkKVArr(codeClassifyTemplateAttrDO.getEnumstring())){
+				throw new VciBaseException("{0}{1}灞炴�х殑鏋氫妇娉ㄥ叆鏁版嵁鏍煎紡閿欒!",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
+			}
+			//鍒嗙被娉ㄥ叆
+			if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getClassifyinvokeattr())
+				&& !CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(codeClassifyTemplateAttrDO.getClassifyinvokelevel())
+				&& VciBaseUtil.getInt(codeClassifyTemplateAttrDO.getClassifyinvokelevel()) < 0){
+				throw new VciBaseException("{0}{1}灞炴�х殑鏄垎绫绘敞鍏ワ紝浣嗘槸娉ㄥ叆灞傜骇涓嶈兘灏忎簬0!",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
+			}
+
+			//鍒ゆ柇浼犺繃鏉ョ殑鍙傜収閰嶇疆鏄惁鏄痡son鏍煎紡
+			if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getReferconfig())&&!checkKVObj(codeClassifyTemplateAttrDO.getReferconfig())){
+				throw new VciBaseException("{0}{1}灞炴�х殑鍙傜収閰嶇疆鏁版嵁鏍煎紡閿欒!",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
+			}
+			if(StringUtils.isNotBlank(codeClassifyTemplateAttrDO.getCodedateformat()) && !checkDateFormat(codeClassifyTemplateAttrDO.getCodedateformat())){
+				throw new VciBaseException("{0}{1}灞炴�х殑鏃堕棿鏍煎紡涓嶇鍚堣姹�",new String[]{codeClassifyTemplateAttrDO.getId(),codeClassifyTemplateAttrDO.getName()});
+			}
+			//濡傛灉鏄粍鍚堣鍒欙紝閲岄潰浣跨敤鐨勫睘鎬т笉鑳界己澶憋紝涔熼兘寰楁樉绀�
+			String componentrule = codeClassifyTemplateAttrDTO.getComponentrule();
+			boolean isContainsDynamicParameter = PatternUtil.isContainsDynamicParameter(componentrule);
+			if(isContainsDynamicParameter){
+				List<String> userdAttrList =  PatternUtil.getKeyListByContent(componentrule);//鍖呭惈鐨勬墍鏈�${xxx}涓殑xxx
+				if(!CollectionUtils.isEmpty(userdAttrList)){
+					String unExistAttr = userdAttrList.stream().filter(s -> !attrDTOMap.containsKey(s.toLowerCase(Locale.ROOT))).collect(Collectors.joining(","));
+					if(StringUtils.isNotBlank(unExistAttr)){
+						throw new VciBaseException("{0}灞炴�ф槸缁勫悎瑙勫垯锛屼絾鏄鍒欓噷鍖呭惈鐨勫睘鎬{1}]鍦ㄥ綋鍓嶆ā鏉夸腑涓嶅瓨鍦�!",new String[]{codeClassifyTemplateAttrDO.getName(), unExistAttr});
+					}
+					//瑕佺湅鐪嬭〃鍗曟槸鍚︽樉绀�
+					String unFormDisplayAttr = userdAttrList.stream().filter(s -> !VciBaseUtil.getBoolean(attrDTOMap.getOrDefault(s.toLowerCase(Locale.ROOT),
+						new CodeClstempattrDTO()).getFormdisplayflag())).collect(Collectors.joining(","));
+					if(StringUtils.isNotBlank(unFormDisplayAttr)){
+						throw new VciBaseException("{0}灞炴�ф槸缁勫悎瑙勫垯锛屼絾鏄鍒欓噷鍖呭惈鐨勫睘鎬{1}]鍦ㄥ綋鍓嶆ā鏉夸腑娌℃湁璁剧疆 琛ㄥ崟鏄剧ず ",new String[]{codeClassifyTemplateAttrDO.getName(),unFormDisplayAttr});
+					}
+				}
+			}
+
+			if(CLASSIFYTEMPLATEOID==null){
+				CLASSIFYTEMPLATEOID = codeClassifyTemplateAttrDTO.getClassifytemplateoid();
+			}
+
+		}
+
+		//鎵ц鏁版嵁淇濆瓨鎿嶄綔
+//		WebUtil.setPersistence(false);//涓嶆墽琛屼繚瀛�
+
+		//鍏堥兘鍒犱簡
+//		VciQueryWrapperForDO deleteAttrWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
+//		deleteAttrWrapper.addQueryMap("CLASSIFYTEMPLATEOID",CLASSIFYTEMPLATEOID);
+		Map<String,Object> condition = new HashMap<>();
+		condition.put("CLASSIFYTEMPLATEOID",CLASSIFYTEMPLATEOID);
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDODelete = baseMapper.selectByMap(condition);
+
+		//oids
+		List<String> oids = new ArrayList<String>();
+		for (CodeClstempattrEntity codeClassifyTemplateAttrDO:codeClassifyTemplateAttrDODelete){
+			oids.add(codeClassifyTemplateAttrDO.getOid());
+		}
+//		BatchCBO batchCBOTemplateDelete = new BatchCBO();
+		if(!CollectionUtils.isEmpty(oids)){
+			baseMapper.deleteBatchIds(oids);
+		}
+
+		//鍐嶆柊澧�
+		if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOInsert)){
+			this.saveBatch(codeClassifyTemplateAttrDOInsert);
+		}
+
+		//璋冪敤闃舵
+		if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOInsert)){
+			 codeTempphaseService.codeTemplateAttrModifyTrigger(codeClassifyTemplateAttrDOInsert);
+
+		}
+
+
+//		SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
+		//澶勭悊鍙緭鍙�夌殑瀛楃
+		if(!CollectionUtils.isEmpty(prefix)){
+			for (String s : prefix) {
+				DictBiz dictBiz = new DictBiz();
+				dictBiz.setCode(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR);
+				dictBiz.setDictKey(s);
+				dictBiz.setDictValue("prefix");
+				iDictBizClient.getCheck(dictBiz) ;
+			}
+//				.saveBySameNamespaceAndFlag(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR,"prefix",prefix,sessionInfo);
+		}
+		if(!CollectionUtils.isEmpty(suffix)){
+			for (String s : suffix) {
+				DictBiz dictBiz = new DictBiz();
+				dictBiz.setCode(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR);
+				dictBiz.setDictKey(s);
+				dictBiz.setDictValue("suffix");
+				iDictBizClient.getCheck(dictBiz) ;
+			}
+//			charService.saveBySameNamespaceAndFlag(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR,"suffix",suffix,sessionInfo);
+		}
+		if(!CollectionUtils.isEmpty(dateFormates)){
+			for (String s : dateFormates) {
+				DictBiz dictBiz = new DictBiz();
+				dictBiz.setCode(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR);
+				dictBiz.setDictKey(s);
+				dictBiz.setDictValue("dateFormates");
+				iDictBizClient.getCheck(dictBiz) ;
+			}
+//			charService.saveBySameNamespaceAndFlag(MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR,"dateFormates",dateFormates,sessionInfo);
+		}
+
+//		WebUtil.setPersistence(true);//鎵ц淇濆瓨
+//		boService.persistenceBatch(batchCBOTemplateDelete);//涓�璧锋墽琛屼繚瀛�
+		return codeClassifyTemplateAttrDO2VOs(codeClassifyTemplateAttrDOInsert);
+	}
+
+	public boolean checkKVArr(String kvString){
+		boolean isKV = true;
+		try {
+			JSONObject.parseArray(kvString, KeyValue.class);
+		}catch (Exception e){
+			isKV=false;
+		}
+		return isKV;
+	}
+	public boolean checkKVObj(String kvString){
+		boolean isKV = true;
+		try {
+			JSONObject.parseObject(kvString, UIFormReferVO.class);
+		}catch (Exception e){
+			isKV=false;
+		}
+		return isKV;
+	}
+
+	/**
+	 * 鏍¢獙鏃堕棿鏍煎紡
+	 * @param dateFormat 鏃堕棿鏍煎紡
+	 * @return true琛ㄧず鏍¢獙閫氳繃
+	 */
+	public boolean checkDateFormat(String dateFormat){
+		try{
+			VciDateUtil.date2Str(new Date(),dateFormat);
+			return  true;
+		}catch (Throwable e){
+			return false;
+		}
+	}
+
+
+	/**
+	 * 淇敼涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞�
+	 * @return 鎵ц缁撴灉
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+	 */
+	@Override
+	public R editSave(CodeClstempattrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
+		VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"鏁版嵁瀵硅薄",codeClassifyTemplateAttrDTO.getOid(),"涓婚搴撳垎绫荤殑妯℃澘灞炴�т富閿�");
+
+		//鍒ゆ柇浼犺繃鏉ョ殑鏋氫妇娉ㄥ叆鏄惁鏄痡sonArr鏍煎紡
+		if(StringUtils.isNotBlank(codeClassifyTemplateAttrDTO.getEnumstring())&&!checkKVArr(codeClassifyTemplateAttrDTO.getEnumstring())){
+			throw new VciBaseException("鏋氫妇娉ㄥ叆鏁版嵁鏍煎紡閿欒!");
+		}
+
+		//鍒ゆ柇浼犺繃鏉ョ殑鍙傜収閰嶇疆鏄惁鏄痡son鏍煎紡
+		if(StringUtils.isNotBlank(codeClassifyTemplateAttrDTO.getReferbtmid())&&!checkKVObj(codeClassifyTemplateAttrDTO.getReferbtmid())){
+			throw new VciBaseException("鏋氫妇娉ㄥ叆鏁版嵁鏍煎紡閿欒!");
+		}
+
+
+		//妫�鏌s
+		CodeClstempattrEntity codeClassifyTemplateAttrDOCopyFromDTO = new CodeClstempattrEntity();
+//		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDOCopyFromDTO);
+//		boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOCopyFromDTO);
+
+		//妫�鏌s
+//		Map<String,Object> condition = new HashMap<>(2);
+//		condition.put("oid",codeClassifyTemplateAttrDTO.getOid());
+//		condition.put("ts",codeClassifyTemplateAttrDTO.getTs());
+		CodeClstempattrEntity detail = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
+		if(!detail.getTs().toString().equals(codeClassifyTemplateAttrDTO.getTs().toString())){//涓嶆槸鏈�鏂扮殑涓嶈鏀�
+			return R.fail("褰撳墠鏁版嵁涓嶆槸鏈�鏂帮紝璇峰埛鏂板悗鍐嶄慨鏀癸紒");
+		}
+
+		//灏咲TO杞崲涓篋O
+		CodeClstempattrEntity codeClassifyTemplateAttrDO = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
+		revisionModelUtil.copyFromDTOIgnore(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
+		baseMapper.updateById(codeClassifyTemplateAttrDO);
+		return R.data(codeClassifyTemplateAttrDO2VO(codeClassifyTemplateAttrDO));
+	}
+
+	/**
+	 * 鍒犻櫎涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param codeClassifyTemplateAttrDTO 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+	 * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+	 */
+	@Override
+	public R deleteCodeClassifyTemplateAttr(CodeClstempattrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
+		VciBaseUtil.alertNotNull(codeClassifyTemplateAttrDTO,"涓婚搴撳垎绫荤殑妯℃澘灞炴�ф暟鎹璞�",codeClassifyTemplateAttrDTO.getOid(),"涓婚搴撳垎绫荤殑妯℃澘灞炴�х殑涓婚敭");
+		CodeClstempattrEntity codeClassifyTemplateAttrDO = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
+		R baseResult = checkIsCanDeleteForDO(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
+		if(baseResult.isSuccess()) {
+		}else{
+			return baseResult;
+		}
+		//鎵ц鍒犻櫎鎿嶄綔
+		int deleteNum = baseMapper.deleteById(codeClassifyTemplateAttrDO.getOid());
+		return deleteNum>0?R.success(DELETE_SUCCESS):R.fail(DELETE_FAIL);
+	}
+
+	/**
+	 * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+	 * @param codeClassifyTemplateAttrDTO 鏁版嵁浼犺緭瀵硅薄
+	 * @param codeClassifyTemplateAttrDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+	 * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+	 */
+	private R checkIsCanDeleteForDO(CodeClstempattrDTO codeClassifyTemplateAttrDTO, CodeClstempattrEntity codeClassifyTemplateAttrDO) {
+//		boService.checkTs(codeClassifyTemplateAttrDO);
+//		Map<String,Object> condition = new HashMap<>(2);
+//		condition.put("oid",codeClassifyTemplateAttrDTO.getOid());
+//		condition.put("ts",codeClassifyTemplateAttrDTO.getTs());
+		CodeClstempattrEntity detail = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
+//		.selectOne(Condition.getQueryWrapper(condition,CodeClstempattrEntity.class));
+
+		if(!detail.getTs().toString().equals(codeClassifyTemplateAttrDTO.getTs().toString())){//涓嶆槸鏈�鏂扮殑涓嶈鏀�
+			return R.fail("褰撳墠鏁版嵁涓嶆槸鏈�鏂帮紝璇峰埛鏂板悗鍐嶄慨鏀癸紒");
+		}
+		if(!checkIsLinked(codeClassifyTemplateAttrDO.getOid())) {
+			return R.success("鍙互鍒犻櫎锛�");
+		}else{
+			return R.fail(DATA_LINKED_NOT_DELETE);
+		}
+	}
+
+	/**
+	 * 鏍¢獙鏄惁琚紩鐢�
+	 * @param oid 涓婚敭
+	 * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	private boolean checkIsLinked(String oid) throws VciBaseException{
+		//TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+		return false;
+	}
+
+	/**
+	 * 涓婚敭鑾峰彇涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param oid 涓婚敭
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞�
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+	 */
+	@Override
+	public  CodeClstempattrVO getObjectByOid(String oid) throws VciBaseException{
+		return codeClassifyTemplateAttrDO2VO(selectByOid(oid));
+	}
+	/**
+	 * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+	 * @param oid 涓婚敭
+	 * @return  鏁版嵁瀵硅薄
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	private CodeClstempattrEntity selectByOid(String oid) throws VciBaseException{
+		VciBaseUtil.alertNotNull(oid,"涓婚敭");
+		CodeClstempattrEntity codeClassifyTemplateAttrDO = baseMapper.selectById(oid.trim());
+		if(codeClassifyTemplateAttrDO == null || StringUtils.isBlank(codeClassifyTemplateAttrDO.getOid())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		return codeClassifyTemplateAttrDO;
+	}
+
+	/**
+	 * 涓婚敭鎵归噺鑾峰彇涓婚搴撳垎绫荤殑妯℃澘灞炴��
+	 * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞�
+	 * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+	 */
+	@Override
+	public Collection<CodeClstempattrVO> listCodeClassifyTemplateAttrByOids(Collection<String> oidCollections) {
+		VciBaseUtil.alertNotNull(oidCollections,"鏁版嵁瀵硅薄涓婚敭闆嗗悎");
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = listCodeClassifyTemplateAttrDOByOidCollections(oidCollections);
+		return codeClassifyTemplateAttrDO2VOs(codeClassifyTemplateAttrDOList);
+	}
+
+	/**
+	 * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+	 * @param oidCollections 涓婚敭鐨勯泦鍚�
+	 * @return 鏁版嵁瀵硅薄鍒楄〃
+	 */
+	private List<CodeClstempattrEntity> listCodeClassifyTemplateAttrDOByOidCollections(Collection<String> oidCollections){
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = new ArrayList<CodeClstempattrEntity>();
+		if(!CollectionUtils.isEmpty(oidCollections)){
+			Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+			for(Collection<String> oids: oidCollectionsList){
+				List<CodeClstempattrEntity> tempDOList = baseMapper.selectBatchIds(oids);
+				if(!CollectionUtils.isEmpty(tempDOList)){
+					codeClassifyTemplateAttrDOList.addAll(tempDOList);
+				}
+			}
+		}
+		return  codeClassifyTemplateAttrDOList;
+	}
+
+	/**
+	 * 鍙傜収涓婚搴撳垎绫荤殑妯℃澘灞炴�у垪琛�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉鍜屾帓搴�
+	 * @return 涓婚搴撳垎绫荤殑妯℃澘灞炴�ф樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+	 * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public DataGrid<CodeClstempattrVO> refDataGridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+		if(conditionMap == null){
+			conditionMap = new HashMap<String, String>();
+		}
+		return gridCodeClassifyTemplateAttr(conditionMap,pageHelper);
+	}
+
+	/**
+	 * 鏌ヨ杩欎釜妯℃澘锛屼笟鍔$被鍨嬩笅鐨勬墍鏈夋湭閫夋嫨鐨勫睘鎬�
+	 * @param baseQueryObject
+	 * @return
+	 */
+	@Override
+	public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtm(BaseQueryObject baseQueryObject){
+		if(baseQueryObject.getConditionMap() == null){
+			baseQueryObject.setConditionMap(new HashMap<>());
+		}
+		DataGrid<CodeOsbtmtypeattributeVO> dataGrid=new DataGrid<CodeOsbtmtypeattributeVO>();
+		//妯℃澘oid
+		String templateAttrOid = baseQueryObject.getConditionMap().get("oid");
+		String name = baseQueryObject.getConditionMap().getOrDefault("name","");
+		String id = baseQueryObject.getConditionMap().getOrDefault("id","");
+
+		//娌℃湁oid涓嶆墽琛岄�昏緫
+		if(StringUtils.isBlank(templateAttrOid)){
+			dataGrid.setData(new ArrayList<>());
+			dataGrid.setTotal(0);
+			return dataGrid;
+		}
+
+		//鏌ヨ妯℃澘瀵硅薄
+		CodeClstemplateEntity codeClassifyTemplateDO = codeClstemplateMapper.selectById(templateAttrOid);
+
+		//杩欎釜涓氬姟绫诲瀷涓嬬殑鎵�鏈夊睘鎬�
+		List<CodeOsbtmtypeattributeVO> boAttrs = (List<CodeOsbtmtypeattributeVO>) codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());// this.btmService.listAttributeByBtmId(codeClassifyTemplateDO.getBtmTypeId());
+//		codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());
+//		BeanUtils.copyProperties(codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId()),boAttrs);
+		//鎶婇粯璁ょ殑灞炴�т篃娣诲姞鍒癰oAttrs
+		if(boAttrs == null){
+			boAttrs = new ArrayList<>();
+		}
+		if(!false){
+//			List<CodeOsbtmtypeattributeVO> finalBoAttrs = boAttrs;
+//			attributeService.getDefaultAttributeVOs().stream().forEach(attr-> {
+//				CodeOsbtmtypeattributeVO attributeVO = new CodeOsbtmtypeattributeVO();
+//				BeanUtil.convert(attr, attributeVO);
+//				if ("id".equalsIgnoreCase(attributeVO.getId())) {
+//					attributeVO.setName("浼佷笟缂栫爜");
+//				}
+//				if ("name".equalsIgnoreCase(attributeVO.getId())) {
+//					attributeVO.setName("闆嗗洟鐮�");
+//				}
+//				attributeVO.setAttrDataType(attr.getAttributeDataType());
+//				attributeVO.setAttributeLength(attr.getAttrLength());
+//				attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
+//				attributeVO.setReferBtmTypeName(attr.getBtmTypeName());
+//				finalBoAttrs.add(attributeVO);
+//			});
+//			boAttrs = finalBoAttrs;
+			Object o = null;
+		}
+
+		//杩欎釜妯℃澘涓嬪凡缁忔湁鐨勫睘鎬�
+//		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
+//		queryWrapper.addQueryMap("CLASSIFYTEMPLATEOID",templateAttrOid);
+		Map<String,Object> condition = new HashMap<>(1);
+		condition.put("CLASSIFYTEMPLATEOID",templateAttrOid);
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = codeClstempattrMapper.selectByMap(condition);
+
+		List<String> btmOids = new ArrayList<String>();
+		for (CodeClstempattrEntity codeClassifyTemplateAttrDO:codeClassifyTemplateAttrDOList){
+			btmOids.add(codeClassifyTemplateAttrDO.getId());
+		}
+
+		//杩囨护鎺夊凡缁忓瓨鍦ㄧ殑灞炴��
+		List<CodeOsbtmtypeattributeVO> boAttrss = new ArrayList<CodeOsbtmtypeattributeVO>();
+
+		for (CodeOsbtmtypeattributeVO osBtmTypeAttributeVO:boAttrs){
+			if(!btmOids.contains(osBtmTypeAttributeVO.getId())){
+				//鐪嬬湅鏄笉鏄湁妯$硦鏌ヨ
+				boolean inSearch = true;
+				if(StringUtils.isNotBlank(name) && !osBtmTypeAttributeVO.getName().contains(name.replace("*",""))){
+					inSearch = false;
+				}
+				if(StringUtils.isNotBlank(id) && !osBtmTypeAttributeVO.getId().contains(id.replace("*",""))){
+					inSearch = false;
+				}
+				if(inSearch) {
+					boAttrss.add(osBtmTypeAttributeVO);
+				}
+			}
+		}
+		dataGrid.setData(boAttrss);
+		dataGrid.setTotal(boAttrss.size());
+		return dataGrid;
+	}
+
+
+
+	/**
+	 * 鏌ヨ杩欎釜妯℃澘锛屼笟鍔$被鍨嬩笅宸查�夋嫨鐨勫睘鎬�
+	 * @param baseQueryObject
+	 * @return
+	 */
+	@Override
+	public DataGrid<CodeOsbtmtypeattributeVO> codeClassifyTemplateAttrByBtmHave(BaseQueryObject baseQueryObject){
+		DataGrid<CodeOsbtmtypeattributeVO> dataGrid=new DataGrid<CodeOsbtmtypeattributeVO>();
+		//妯℃澘oid
+		String templateAttrOid = baseQueryObject.getConditionMap().get("oid");
+
+		//娌℃湁oid涓嶆墽琛岄�昏緫
+		if(StringUtils.isBlank(templateAttrOid)){
+			dataGrid.setData(new ArrayList<>());
+			dataGrid.setTotal(0);
+			return dataGrid;
+		}
+
+		//鏌ヨ妯℃澘瀵硅薄
+		CodeClstemplateEntity codeClassifyTemplateDO = codeClstemplateMapper.selectById(templateAttrOid);
+
+		//杩欎釜涓氬姟绫诲瀷涓嬬殑鎵�鏈夊睘鎬�
+		List<CodeOsbtmtypeattributeVO> boAttrs = (List<CodeOsbtmtypeattributeVO>) codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());//this.btmService.listAttributeByBtmIdHasDefault(codeClassifyTemplateDO.getBtmTypeId());
+//		codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());
+//		BeanUtils.copyProperties(codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId()),boAttrs);
+		//杩欎釜妯℃澘涓嬪凡缁忔湁鐨勫睘鎬�
+		//鎶婇粯璁ょ殑灞炴�т篃娣诲姞鍒癰oAttrs
+		if(boAttrs == null){
+			boAttrs = new ArrayList<>();
+		}
+//		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
+//		queryWrapper.addQueryMap("CLASSIFYTEMPLATEOID",templateAttrOid);
+
+//		Map<String,Object> condition = new HashMap<>(1);
+//		condition.put("CLASSIFYTEMPLATEOID",templateAttrOid);
+
+		QueryWrapper<CodeClstempattrEntity> wrapper=new QueryWrapper<>();
+		wrapper.eq("CLASSIFYTEMPLATEOID",templateAttrOid);
+
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = codeClstempattrMapper.selectList(wrapper);
+		List<String> btmOids = new ArrayList<String>();
+		for (CodeClstempattrEntity codeClassifyTemplateAttrDO:codeClassifyTemplateAttrDOList){
+			btmOids.add(codeClassifyTemplateAttrDO.getId());
+		}
+
+		//杩囨护鎺夐櫎浜嗚嚜韬殑鍒殑灞炴��
+		List<CodeOsbtmtypeattributeVO> boAttrss = new ArrayList<CodeOsbtmtypeattributeVO>();
+
+		for (CodeOsbtmtypeattributeVO osBtmTypeAttributeVO:boAttrs){
+			if(btmOids.contains(osBtmTypeAttributeVO.getId())){
+				boAttrss.add(osBtmTypeAttributeVO);
+			}
+		}
+		dataGrid.setData(boAttrss);
+		dataGrid.setTotal(boAttrss.size());
+		return dataGrid;
+	}
+
+
+	/**
+	 * 鍚屾鍒板叾浠栨ā鏉�
+	 * @param codeClassifyTemplateAttrDTO oid
+	 * @return
+	 */
+	@Override
+	public R copyto(CodeClstempattrDTO codeClassifyTemplateAttrDTO) throws VciBaseException{
+
+		String templateAttrOid = codeClassifyTemplateAttrDTO.getOid();
+
+		//鏌ヨ鍑烘潵瑕佸鍒剁殑瀵硅薄
+		CodeClstempattrEntity codeClassifyTemplateAttrDO = selectByOid(templateAttrOid);
+		String id = codeClassifyTemplateAttrDO.getId();//鑻辨枃鍚嶇О
+		String classfyTemplateOid = codeClassifyTemplateAttrDO.getClassifytemplateoid();
+
+		//鏌ヨ鍏朵粬id=id鐨勬ā鏉垮睘鎬�
+//		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
+//		queryWrapper.addQueryMap("id",id);
+//		Map<String,Object> condition = new HashMap<>(1);
+//		condition.put("id",id);
+		QueryWrapper<CodeClstempattrEntity> wrapper=new QueryWrapper<>();
+		wrapper.eq("id",id);
+		//鎵�鏈塱d=id鐨勬ā鏉垮睘鎬�
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList =codeClstempattrMapper.selectList(wrapper);
+
+		//瑕佸垹闄ょ殑妯℃澘灞炴�х殑oids
+		List<String> deleteOids = new ArrayList<String>();
+		//瑕佷慨鏀圭殑妯℃澘灞炴�у璞�
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOListInsert = new ArrayList<CodeClstempattrEntity>();
+		for (CodeClstempattrEntity codeClassifyTemplateAttrDOi:codeClassifyTemplateAttrDOList){
+			String oid = codeClassifyTemplateAttrDOi.getOid();
+			String templateOldOid = codeClassifyTemplateAttrDOi.getClassifytemplateoid();
+
+			CodeClstempattrEntity codeClassifyTemplateAttrDOInsert = new CodeClstempattrEntity();
+			BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDO,codeClassifyTemplateAttrDOInsert);
+			codeClassifyTemplateAttrDOInsert.setOid(oid);
+			codeClassifyTemplateAttrDOInsert.setClassifytemplateoid(templateOldOid);
+			codeClassifyTemplateAttrDOListInsert.add(codeClassifyTemplateAttrDOInsert);
+
+			deleteOids.add(codeClassifyTemplateAttrDOi.getOid());
+		}
+
+//		WebUtil.setPersistence(false);//涓嶆墽琛屼繚瀛�
+
+		//鍒犻櫎
+//		BatchCBO batchCBOTemplateAttrDelete = codeClassifyTemplateAttrDOissifyTemplateAttrMapper.batchDeleteByOids(deleteOids);
+		codeClstempattrMapper.deleteBatchIds(deleteOids);
+		//鍐嶆柊澧�
+//		BatchCBO batchCBOTemplateAttrInsert = codeClassifyTemplateAttrMapper.batchInsert(codeClassifyTemplateAttrDOListInsert);
+//		batchCBOTemplateAttrDelete.copyFromOther(batchCBOTemplateAttrInsert);
+		this.saveBatch(codeClassifyTemplateAttrDOListInsert);
+
+//		WebUtil.setPersistence(true);//鎵ц淇濆瓨
+//		boService.persistenceBatch(batchCBOTemplateAttrDelete);//涓�璧锋墽琛屼繚瀛�
+
+		return R.success("鎿嶄綔鎴愬姛锛�");
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
index c2f8b5e..1271459 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
@@ -20,36 +20,37 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vci.ubcs.code.dto.CodeClstemplateDTO;
-import com.vci.ubcs.code.entity.CodeClstempattrEntity;
-import com.vci.ubcs.code.entity.CodeClstemplateEntity;
+import com.vci.ubcs.code.entity.*;
 import com.vci.ubcs.code.enumpack.CodeClassifyTemplateLC;
 import com.vci.ubcs.code.enumpack.FrameworkDataLCStatus;
-import com.vci.ubcs.code.mapper.CodeClstempattrMapper;
-import com.vci.ubcs.code.mapper.CodeClstemplateMapper;
+import com.vci.ubcs.code.mapper.*;
+import com.vci.ubcs.code.service.ICodeClassifyService;
 import com.vci.ubcs.code.service.ICodeClstemplateService;
 import com.vci.ubcs.code.vo.CodeClstempattrVO;
 import com.vci.ubcs.code.vo.CodeClstemplateVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.revision.model.TreeQueryObject;
-
-
 import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
 import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
+import com.vci.ubcs.starter.web.pagemodel.DataGrid;
 import com.vci.ubcs.starter.web.pagemodel.Tree;
 import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.*;
 import java.util.stream.Collectors;
 
-import static com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_RELEASED;
-import static com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant.LC_STATUS;
+import static com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant.*;
 import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.*;
 import static com.vci.ubcs.code.service.impl.CodeClassifyServiceImpl.PARENT_FIELD_NAME;
 
@@ -83,6 +84,23 @@
 	private CodeTempbuttonServiceImpl codeTempbuttonServiceImpl;
 	@Autowired(required = false)
 	private CodeClsflowtempServiceImpl codeClsflowtempServiceImpl;
+	@Autowired(required = false)
+	private CodeClsflowtempMapper codeClsflowtempMapper;
+	@Autowired(required = false)
+	private CodeTempphaseMapper codeTempphaseMapper;
+	@Autowired(required = false)
+	private CodeTempbuttonMapper codeTempbuttonMapper;
+	@Autowired(required = false)
+	private CodePhaseattrMapper codePhaseattrMapper;
+	@Autowired(required = false)
+	private ICodeClassifyService codeClassifyService;
+	@Autowired(required = false)
+	private CodeClstemplateMapper codeClstemplateMapper;
+	@Autowired(required = false)
+	private CodePhaseattrServiceImpl codePhaseattrServiceImpl;
+
+
+
 	@Override
 	public IPage<CodeClstemplateVO> selectPlCodeClstemplatePage(IPage<CodeClstemplateVO> page, CodeClstemplateVO plCodeClstemplate) {
 		return page.setRecords(baseMapper.selectPlCodeClstemplatePage(page, plCodeClstemplate));
@@ -119,8 +137,12 @@
 //		VciParentQueryOption parentQueryOption = new VciParentQueryOption();
 //		parentQueryOption.setParentFieldName(PARENT_FIELD_NAME);
 //		queryWrapperForDO.parentQueryChild(treeQueryObject,parentQueryOption);
-		CodeClstemplateEntity codeClstemplateEntity = new CodeClstemplateEntity();
-		return baseMapper.selectList(Condition.getQueryWrapper(codeClstemplateEntity));
+//		CodeClstemplateEntity codeClstemplateEntity = new CodeClstemplateEntity();
+//		codeClstemplateEntity.set
+		return baseMapper.selectCodeClassifyTemplateDOByTree(
+			treeQueryObject.getConditionMap().get("codeclassifyoid"),
+			treeQueryObject.getConditionMap().get("lcStatus"));
+//		return baseMapper.selectList(Condition.getQueryWrapper(codeClstemplateEntity));
 //		return codeClassifyTemplateMapper.selectByWrapper(queryWrapperForDO);
 	}
 
@@ -210,19 +232,20 @@
 		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClstemplateDTO,codeClassifyTemplateDOCopyFromDTO);
 
 		//妫�鏌s
-		Map<String,Object> condition = new HashMap<>(2);
-		condition.put("oid",codeClstemplateDTO.getOid());
-		condition.put("ts",codeClstemplateDTO.getTs());
+//		Map<String,Object> condition = new HashMap<>(2);
+//		condition.put("oid",codeClstemplateDTO.getOid());
+//		condition.put("ts",codeClstemplateDTO.getTs());
 		CodeClstemplateEntity detail = baseMapper
-			.selectOne(Condition.getQueryWrapper(condition,CodeClstemplateEntity.class));
-		if(detail == null){//涓嶆槸鏈�鏂扮殑涓嶈鏀�
+			.selectById(codeClstemplateDTO.getOid());
+
+		if(!detail.getTs().toString().equals(codeClstemplateDTO.getTs().toString())){//涓嶆槸鏈�鏂扮殑涓嶈鏀�
 			return R.fail("褰撳墠鏁版嵁涓嶆槸鏈�鏂帮紝璇峰埛鏂板悗鍐嶄慨鏀癸紒");
 		}
 		//鏍¢獙涓嬬骇鏄惁鏈夊紩鐢�
 		if(checkChildIsLinked(codeClstemplateEntity.getOid())){
 			return R.fail(DATA_CASCADE_LINKED_NOT_DELETE);
 		}
-		return R.status(checkHasChild(codeClstemplateEntity.getOid()));
+		return R.success(String.valueOf(checkHasChild(codeClstemplateEntity.getOid())));
 	}
 
 	/**
@@ -273,6 +296,7 @@
 	 * @param codeClstemplateDTO 鍒嗙被妯℃澘瀵硅薄鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
 	 * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
 	 */
+	@Transactional
 	@Override
 	public R deleteCodeClassifyTemplate(CodeClstemplateDTO codeClstemplateDTO) {
 		checkIsCanDelete(codeClstemplateDTO);
@@ -362,8 +386,8 @@
 	 * 鍙傜収鏍� 鍒嗙被妯℃澘瀵硅薄
 	 * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄
 	 * @return 鍒嗙被妯℃澘瀵硅薄鏄剧ず鏍�
-	 * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
 	 */
+	@Transactional
 	@Override
 	public List<Tree> referTree(TreeQueryObject treeQueryObject) {
 		if(treeQueryObject == null){
@@ -418,6 +442,7 @@
 	 * @param lcStatus
 	 * @return
 	 */
+	@Transactional
 	@Override
 	public R updateLcStatus( String oid, String lcStatus){
 		CodeClstemplateEntity codeClassifyTemplateDO = baseMapper.selectById(oid);
@@ -440,6 +465,7 @@
 	 * 鍗囩増
 	 * @param codeClassifyDTO
 	 */
+	@Transactional
 	@Override
 	public R Upgrade(CodeClstemplateDTO codeClassifyDTO) {
 
@@ -454,93 +480,95 @@
 		//闇�瑕佹柊澧炵殑鍗囩骇妯℃澘
 //		ClientBusinessObject clientBusinessObject_template = boService.selectCBOByOid(codeClassifyDTO.getOid(), "codeclstemplate");
 		CodeClstemplateEntity codeCls_template = baseMapper.selectById(templateOldOid);
-		CodeClstemplateEntity codeCls_template_insert = null;
+		CodeClstemplateEntity codeCls_template_insert = new CodeClstemplateEntity();
 //			ClientBusinessObject clientBusinessObject_template_insert = null;
 //		try {
-////			clientBusinessObject_template_insert = clientBusinessObjectOperation.reviseBusinessObject(clientBusinessObject_template, "");
-////			codeCls_template_insert.setOid((new ObjectUtility()).getNewObjectID36());
-////			toBo.setRevisionid((new ObjectUtility()).getNewObjectID36());
-//			codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
-//			codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
-////			codeCls_template_insert.setIsLast(1);
-////			codeCls_template_insert.setIsFirstr(0);
-////			codeCls_template_insert.setIsFirstv(1);
-////			codeCls_template_insert.setIsLastV(1);
-//			codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
-//			codeCls_template_insert.setCreateTime(new Date());
-//			codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
-//			codeCls_template_insert.setLastModifyTime(new Date());
-//			codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
-//			codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
-//			RevisionValueObject rvObj = this.getNextRevision(fromBo.getBtmName(), fromBo.getNameoid(), item.revRuleName, item.revInput, revisionVal);
-//			codeCls_template_insert.setRevisionSeq(rvObj.getRevisionSeq());
-//			codeCls_template_insert.setRevisionValue(rvObj.getRevisionVal());
+//			clientBusinessObject_template_insert = clientBusinessObjectOperation.reviseBusinessObject(clientBusinessObject_template, "");
+			codeCls_template_insert.setOid(VciBaseUtil.getPk());
+			codeCls_template_insert.setRevisionOid(VciBaseUtil.getPk());
+			codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
+			codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
+			codeCls_template_insert.setLastR(String.valueOf(1));
+			codeCls_template_insert.setFirstR(String.valueOf(0));
+			codeCls_template_insert.setFirstV(String.valueOf(1));
+			codeCls_template_insert.setLastV(String.valueOf(1));
+			codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
+			codeCls_template_insert.setCreateTime(new Date());
+			codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
+			codeCls_template_insert.setLastModifyTime(new Date());
+			codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
+			codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
+			Map rvObj = baseMapper.getNextRevision(codeCls_template.getNameOid());
+			codeCls_template_insert.setRevisionSeq(Integer.parseInt(rvObj.get("REVISIONSEQ").toString()));
+			codeCls_template_insert.setRevisionValue(rvObj.get("REVISIONVAL").toString());
 //			VersionValueObject versionObj = this.getVersionValue(item.verRuleName);
-//			codeCls_template_insert.setVersionSeq(versionObj.getVersionSeq());
-//			codeCls_template_insert.setVersionValue(versionObj.getVersionVal());
-//			codeCls_template_insert.setLctId(codeCls_template.getLctId());
-//			codeCls_template_insert.setLcStatus(this.getLcFirstStatus(item.lifeCycle));
-//			codeCls_template_insert.setId(codeCls_template.getId());
-//			codeCls_template_insert.setName(codeCls_template.getName());
-//			codeCls_template_insert.setDescription(codeCls_template.getDescription());
-//			codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
-////			codeCls_template_insert.setCheckinBy(userName);
-//			codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
+			codeCls_template_insert.setVersionSeq(Integer.parseInt(rvObj.get("VERSIONSEQ").toString()));
+			codeCls_template_insert.setVersionValue(rvObj.get("VERSIONVAL").toString());
+			codeCls_template_insert.setLctid(codeCls_template.getLctid());
+			codeCls_template_insert.setLcStatus("Editing");
+			codeCls_template_insert.setId(codeCls_template.getId());
+			codeCls_template_insert.setName(codeCls_template.getName());
+			codeCls_template_insert.setDescription(codeCls_template.getDescription());
+			codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
+//			codeCls_template_insert.setCheckinBy(userName);
+			codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
 //		}catch (VCIError e){
 //			e.printStackTrace();
 //			logger.error("===============>鍒嗙被妯℃澘-鍗囩増澶嶅埗鍑洪敊oid锛� "+templateOldOid+",mes"+e.error_message);
 //			return BaseResult.error("鍗囩増鍑洪敊");
 //		}
-//
-//
-//		CodeClassifyTemplateDO codeClassifyTemplateDO = new CodeClassifyTemplateDO();
+		int insertCount = baseMapper.insert(codeCls_template_insert);
+//		CodeClstemplateEntity codeClassifyTemplateDO = new CodeClstemplateEntity();
 //		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyDTO,codeClassifyTemplateDO);
 //		WebUtil.copyValueToObjectFromCbos(clientBusinessObject_template_insert,codeClassifyTemplateDO);
-//		//modify by weidy@2022-2-27
-//		//鍗囩増鍚庝笉鑳戒娇鐢╥nsert鏂规硶锛屽洜涓洪偅涓案杩滄槸鏂板涓�鏉℃暟鎹紝
-//		//涓婃柟鍏堜粠dto杞粰do锛岀劧鍚庢妸鍗囩増鐨勫垵濮嬪寲鐨勫睘鎬ф嫹璐濈粰do锛屾渶鍚庡啀浠巇o鎷疯礉鍒癱bo涓�
+		//modify by weidy@2022-2-27
+		//鍗囩増鍚庝笉鑳戒娇鐢╥nsert鏂规硶锛屽洜涓洪偅涓案杩滄槸鏂板涓�鏉℃暟鎹紝
+		//涓婃柟鍏堜粠dto杞粰do锛岀劧鍚庢妸鍗囩増鐨勫垵濮嬪寲鐨勫睘鎬ф嫹璐濈粰do锛屾渶鍚庡啀浠巇o鎷疯礉鍒癱bo涓�
 //		WebUtil.copyValueToCboFromObj(clientBusinessObject_template_insert,codeClassifyTemplateDO);
-//		//鍗囩増杩囧悗鐨勬ā鏉縪id
-//		String templateNewOid = codeClassifyTemplateDO.getOid();
-//
-//		//闇�瑕佸鍒剁殑妯℃澘灞炴��
-//		//鏌ヨ鑰佹ā鏉夸笅杈圭殑鎵�鏈夊睘鎬э紝璧嬪�兼柊妯℃澘oid
+		//鍗囩増杩囧悗鐨勬ā鏉縪id
+		String templateNewOid = codeCls_template_insert.getOid();
+
+		//闇�瑕佸鍒剁殑妯℃澘灞炴��
+		//鏌ヨ鑰佹ā鏉夸笅杈圭殑鎵�鏈夊睘鎬э紝璧嬪�兼柊妯℃澘oid
 //		VciQueryWrapperForDO codeClassifyTemplateAttrQuery = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
 //		codeClassifyTemplateAttrQuery.addQueryMap("classifyTemplateOid",templateOldOid);
+		Map<String,Object> condition = new HashMap<>(1);
+		condition.put("classifyTemplateOid",templateOldOid);
+		List<CodeClstempattrEntity> codeClstempattrEntities = codeClstempattrMapper.selectByMap(condition);
 //		List<CodeClassifyTemplateAttrDO> codeClassifyTemplateAttrDOList = codeClassifyTemplateAttrDaoI.selectByWrapper(codeClassifyTemplateAttrQuery);
-//		for (CodeClassifyTemplateAttrDO codeClassifyTemplateAttrDO :codeClassifyTemplateAttrDOList){
+		for (CodeClstempattrEntity codeClassifyTemplateAttrDO :codeClstempattrEntities){
 //			String attrOid = VciBaseUtil.getPk();
-//			codeClassifyTemplateAttrDO.setOid(attrOid);
-//			codeClassifyTemplateAttrDO.setClassifyTemplateOid(templateNewOid);
-//		}
-//
-//		//澶嶅埗妯℃澘娴佺▼
-//		List<CodeClassifyProcessTempDO>  codeClassifyProcessTempDOList = copyTemplateProcess(templateOldOid,templateNewOid);
-//
-//		//澶嶅埗妯℃澘闃舵锛岄樁娈靛睘鎬�
-//		Map phase_attrMap = copyTemplatePhase_attr(templateOldOid,templateNewOid);
-//
-//		List<CodeTemplatePhaseDO> codeClassifyPhaseDOList = (ArrayList<CodeTemplatePhaseDO>)phase_attrMap.get("phase");//妯℃澘闃舵
-//		List<CodePhaseAttrDO> codePhaseAttrDOList = (ArrayList<CodePhaseAttrDO>)phase_attrMap.get("phaseAttr");//闃舵灞炴��
-//
-//		//澶嶅埗妯℃澘鎸夐挳
-//		List<CodeClassifyTemplateButtonDO> codeClassifyTemplateButtonDOList = copyTemplateButton(templateOldOid,templateNewOid);
-//
-//		//涓�璧蜂繚瀛樻暟鎹�
+			codeClassifyTemplateAttrDO.setOid(null);
+			codeClassifyTemplateAttrDO.setClassifytemplateoid(templateNewOid);
+			codeClstempattrMapper.insert(codeClassifyTemplateAttrDO);
+		}
+
+		//澶嶅埗妯℃澘娴佺▼
+		List<CodeClsflowtempEntity>  codeClassifyProcessTempDOList = copyTemplateProcess(templateOldOid,templateNewOid);
+		//澶嶅埗妯℃澘闃舵锛岄樁娈靛睘鎬�
+		Map phase_attrMap = copyTemplatePhase_attr(templateOldOid,templateNewOid);
+
+		List<CodeTempphaseEntity> codeClassifyPhaseDOList = (ArrayList<CodeTempphaseEntity>)phase_attrMap.get("phase");//妯℃澘闃舵
+		List<CodePhaseattrEntity> codePhaseAttrDOList = (ArrayList<CodePhaseattrEntity>)phase_attrMap.get("phaseAttr");//闃舵灞炴��
+
+		//澶嶅埗妯℃澘鎸夐挳
+		List<CodeTempbuttonEntity> codeClassifyTemplateButtonDOList = copyTemplateButton(templateOldOid,templateNewOid);
+
+		//涓�璧蜂繚瀛樻暟鎹�
 //		WebUtil.setPersistence(false);//涓嶆墽琛屼繚瀛�
-//		//淇濆瓨妯℃澘
+		//淇濆瓨妯℃澘
 //		BatchCBO batchCBOTemplate = new BatchCBO();
-//		//batchCBO淇濆瓨鐨勬椂鍊欐病鏈夎兘澶熻嚜鍔╱pdate婧愭暟鎹殑isLastR
-//		//batchCBOTemplate.getCreateCbos().add(clientBusinessObject_template_insert);
-//		//浣跨敤saveRevisionBuisnessObject鍙互瑙e喅杩欎釜闂锛岃繖閲屽厛鏆傛椂鎵ц涓ゆ淇濆瓨
+		//batchCBO淇濆瓨鐨勬椂鍊欐病鏈夎兘澶熻嚜鍔╱pdate婧愭暟鎹殑isLastR
+		//batchCBOTemplate.getCreateCbos().add(clientBusinessObject_template_insert);
+		//浣跨敤saveRevisionBuisnessObject鍙互瑙e喅杩欎釜闂锛岃繖閲屽厛鏆傛椂鎵ц涓ゆ淇濆瓨
 //		try {
 //			clientBusinessObjectOperation.saveRevisionBuinessObject(clientBusinessObject_template_insert);
 //		} catch (VCIError vciError) {
 //			throw new VciBaseException("鍗囩増淇濆瓨鍑洪敊浜�",new String[0],vciError);
 //		}
-//		// end --modify by lihang @20220408
-//		//codeClassifyTemplateMapper.insert(codeClassifyTemplateDO);
-//		//淇濆瓨妯℃澘灞炴��
+		// end --modify by lihang @20220408
+		//codeClassifyTemplateMapper.insert(codeClassifyTemplateDO);
+		//淇濆瓨妯℃澘灞炴��
 //		if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOList)){
 //			BatchCBO batchCBOTemplateAttr = codeClassifyTemplateAttrDaoI.batchInsert(codeClassifyTemplateAttrDOList);
 //			batchCBOTemplate.copyFromOther(batchCBOTemplateAttr);
@@ -572,8 +600,432 @@
 //		WebUtil.setPersistence(true);//鎵ц淇濆瓨
 //
 //		boService.persistenceBatch(batchCBOTemplate);//涓�璧锋墽琛屼繚瀛�
-//
+
 //		return BaseResult.success("鍗囩増鎴愬姛锛�");
 		return R.success("鍗囩増鎴愬姛锛�");
 	}
+
+	@Override
+	@Transactional
+	public R copyTemplate(CodeClstemplateDTO codeClassifyDTO) {
+		//鏃х殑妯℃澘oid
+		String oldOid = codeClassifyDTO.getOid();
+		//鏂扮殑妯℃澘oid
+		String newOid = VciBaseUtil.getPk();
+		//鍒嗙被oid,澶嶅埗杩囨潵鐨勬柊鐨勫垎绫籵id
+		String codeClassifyOid = codeClassifyDTO.getCodeClassifyOid();
+
+		//澶嶅埗妯℃澘
+		CodeClstemplateEntity codeClassifyTemplateDO_old = baseMapper.selectById(oldOid);//鏃фā鏉�
+
+		//楠岃瘉锛屼笟鍔$被鍨嬫槸涓嶆槸涓�鑷�
+		CodeClassify codeClassifyDO_old = codeClassifyService.selectBtmOrParentBtm(codeClassifyTemplateDO_old.getCodeClassifyOid());
+		if(codeClassifyDO_old==null){
+			return R.fail("澶嶅埗鐨勬ā鏉挎墍灞炲垎绫讳互鍙婁笂绾ф病鏈変笟鍔$被鍨嬶紝璇烽噸鏂伴�夋嫨!");
+		}
+
+		//鎵惧綋鍓嶅垎绫讳笅鐨勪笟鍔$被鍨�
+		CodeClassify codeClassifyDO_new = codeClassifyService.selectBtmOrParentBtm(codeClassifyOid);
+		if(codeClassifyDO_new==null){
+			return R.fail("褰撳墠鍒嗙被娌℃湁涓氬姟绫诲瀷锛岃閲嶆柊閫夋嫨!");
+		}
+
+		if(!codeClassifyDO_old.getBtmTypeId().equals(codeClassifyDO_new.getBtmTypeId())){
+			return R.fail("閫夋嫨鐨勫垎绫诲拰褰撳墠鍒嗙被涓氬姟绫诲瀷涓嶄竴鑷达紝璇烽噸鏂伴�夋嫨!");
+		}
+
+		codeClassifyTemplateDO_old.setId(codeClassifyDTO.getId());//鑻辨枃鍚嶇О
+		codeClassifyTemplateDO_old.setName(codeClassifyDTO.getName());//涓枃鍚嶇О
+		codeClassifyTemplateDO_old.setDescription(codeClassifyDTO.getDescription());//鎻忚堪
+		codeClassifyTemplateDO_old.setCodeClassifyOid(codeClassifyOid);//鍒嗙被oid
+		codeClassifyTemplateDO_old.setOid(newOid);
+		List<CodeClstemplateEntity> codeClassifyTemplateDOList = new ArrayList<CodeClstemplateEntity>();
+		codeClassifyTemplateDOList.add(codeClassifyTemplateDO_old);
+
+		//澶嶅埗妯℃澘灞炴��
+		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = copyTemplateAttr(oldOid,newOid);
+
+		//澶嶅埗妯℃澘娴佺▼
+		List<CodeClsflowtempEntity> codeClassifyProcessTempDOList = copyTemplateProcess(oldOid,newOid);
+
+		//澶嶅埗妯℃澘闃舵锛岄樁娈靛睘鎬�
+		Map  phase_attrMap = copyTemplatePhase_attr(oldOid,newOid);
+
+		List<CodeTempphaseEntity> codeClassifyPhaseDOList = (ArrayList<CodeTempphaseEntity>)phase_attrMap.get("phase");//妯℃澘闃舵
+		List<CodePhaseattrEntity> codePhaseAttrDOList = (ArrayList<CodePhaseattrEntity>)phase_attrMap.get("phaseAttr");//闃舵灞炴��
+
+		//澶嶅埗妯℃澘鎸夐挳
+		List<CodeTempbuttonEntity> codeClassifyTemplateButtonDOList = copyTemplateButton(oldOid,newOid);
+
+//		baseMapper.insert(codeClassifyTemplateDOList);
+		this.saveBatch(codeClassifyTemplateDOList);
+		codeTempbuttonServiceImpl.saveBatch(codeClassifyTemplateButtonDOList);
+		codeClsflowtempServiceImpl.saveBatch(codeClassifyProcessTempDOList);
+		codeClstempattrService.saveBatch(codeClassifyTemplateAttrDOList);
+		codeTempphaseServiceImpl.saveBatch(codeClassifyPhaseDOList);
+		codePhaseattrServiceImpl.saveBatch(codePhaseAttrDOList);
+		//涓�璧蜂繚瀛樻暟鎹�
+//		WebUtil.setPersistence(false);//涓嶆墽琛屼繚瀛�
+//		//淇濆瓨妯℃澘
+//		BatchCBO batchCBOTemplate = codeClassifyTemplateMapper.batchInsert(codeClassifyTemplateDOList);
+//		//淇濆瓨妯℃澘灞炴��
+//		if(!CollectionUtils.isEmpty(codeClassifyTemplateAttrDOList)) {
+//			BatchCBO batchCBOTemplateAttr = codeClassifyTemplateAttrDaoI.batchInsert(codeClassifyTemplateAttrDOList);
+//			batchCBOTemplate.copyFromOther(batchCBOTemplateAttr);
+//		}
+//
+//		//淇濆瓨妯℃澘娴佺▼
+//		if(!CollectionUtils.isEmpty(codeClassifyProcessTempDOList)) {
+//			BatchCBO batchCBOTemplateProcessAttr = codeClassifyProcessTempDaoI.batchInsert(codeClassifyProcessTempDOList);
+//			batchCBOTemplate.copyFromOther(batchCBOTemplateProcessAttr);
+//		}
+//
+//		//妯℃澘闃舵
+//		if(!CollectionUtils.isEmpty(codeClassifyPhaseDOList)) {
+//			BatchCBO batchCBOTemplatePhaseAttr = codeTemplatePhaseDaoI.batchInsert(codeClassifyPhaseDOList);
+//			batchCBOTemplate.copyFromOther(batchCBOTemplatePhaseAttr);
+//		}
+//
+//		//妯℃澘闃舵灞炴��
+//		if(!CollectionUtils.isEmpty(codePhaseAttrDOList)) {
+//			BatchCBO batchCBOTemplatePhaseAttrAttr = codePhaseAttrDaoI.batchInsert(codePhaseAttrDOList);
+//			batchCBOTemplate.copyFromOther(batchCBOTemplatePhaseAttrAttr);
+//		}
+//
+//		//妯℃澘鎸夐挳
+//		if(!CollectionUtils.isEmpty(codeClassifyTemplateButtonDOList)) {
+//			BatchCBO batchCBOTemplateButtonAttr = codeClassifyTemplateButtonDaoI.batchInsert(codeClassifyTemplateButtonDOList);
+//			batchCBOTemplate.copyFromOther(batchCBOTemplateButtonAttr);
+//		}
+//
+//
+//		WebUtil.setPersistence(true);//鎵ц淇濆瓨
+//
+//		boService.persistenceBatch(batchCBOTemplate);//涓�璧锋墽琛屼繚瀛�
+		return R.success("澶嶅埗鎴愬姛锛�");
+	}
+
+
+	private HashMap<String,Object> getVersionValue(int verRuleName) {
+		HashMap<String,Object> obj = new HashMap<>(2);
+		obj.put("VersionSeq",1);
+		if (verRuleName == 0) {
+			obj.put("VersionVal","1");
+		} else if (verRuleName == 1) {
+			obj.put("VersionVal","a");
+		} else if (verRuleName == 2) {
+			obj.put("VersionVal","0");
+		}
+
+		return obj;
+	}
+
+	/**
+	 * 澶嶅埗妯℃澘娴佺▼
+	 */
+	public List<CodeClsflowtempEntity> copyTemplateProcess(String templateOldOid,String templateNewOid){
+//		VciQueryWrapperForDO processWrapper = new VciQueryWrapperForDO(CodeClassifyProcessTempDO.class);
+//		processWrapper.addQueryMap("classifyTemplateOid",templateOldOid);
+		Map<String,Object> condition = new HashMap<>(1);
+		condition.put("classifyTemplateOid",templateOldOid);
+		List<CodeClsflowtempEntity> codeClsflowtempEntities = codeClsflowtempMapper.selectByMap(condition);
+//		List<CodeClassifyProcessTempDO>  codeClassifyProcessTempDOList = codeClassifyProcessTempDaoI.selectByWrapper(processWrapper);//瑕佷繚瀛樼殑鏂扮殑妯℃澘娴佺▼
+		for (CodeClsflowtempEntity codeClassifyProcessTempDO:codeClsflowtempEntities){
+//			String newOid = VciBaseUtil.getPk();
+			codeClassifyProcessTempDO.setOid(null);
+			//codeClassifyProcessTempDO.setCodeClassifyOid(templateNewOid);
+			codeClassifyProcessTempDO.setClassifytemplateoid(templateNewOid);
+//			codeClsflowtempMapper.insert(codeClassifyProcessTempDO);
+			//modify by lihang - @20220406 璁剧疆妯℃澘涓婚敭浣嶇疆鍑洪敊锛屽鑷村崌鐗堢殑妯℃澘涓殑娴佺▼鏄┖鐨勩��
+		}
+		return codeClsflowtempEntities;
+	}
+
+
+	/**
+	 * 澶嶅埗妯℃澘闃舵锛屾ā鏉垮睘鎬�
+	 * @param templateOldOid
+	 * @param templateNewOid
+	 * @return map phase:(List<CodeTemplatePhaseDO>) phaseAttr:(List<CodePhaseAttrDO>)
+	 */
+	public Map copyTemplatePhase_attr(String templateOldOid,String templateNewOid){
+		//妯℃澘闃舵
+//		VciQueryWrapperForDO phaseWrapper = new VciQueryWrapperForDO(CodeTemplatePhaseDO.class);
+//		phaseWrapper.addQueryMap("codeClassifyTemplateOid",templateOldOid);
+		Map<String,Object> condition = new HashMap<>(1);
+		condition.put("codeclassifyTemplateOid",templateOldOid);
+		List<CodeTempphaseEntity> codeTempphaseEntities = codeTempphaseMapper.selectByMap(condition);
+//		List<CodeTemplatePhaseDO>  codeClassifyPhaseDOList = codeTemplatePhaseDaoI.selectByWrapper(phaseWrapper);//瑕佷繚瀛樼殑鏂扮殑妯℃澘娴佺▼
+		Map<String,String> phaseKeyMap = new HashMap<String,String>();//闇�瑕佸鍒剁殑妯℃澘闃舵灞炴��,key:value,妯℃澘闃舵鑰乷id:妯℃澘灞炴�ф柊oid
+		List<String> phaseOidList = new ArrayList<String>();
+		for (CodeTempphaseEntity codeTemplatePhaseDO:codeTempphaseEntities){
+			String oldoid = codeTemplatePhaseDO.getOid();
+			String newOid = VciBaseUtil.getPk();
+			codeTemplatePhaseDO.setOid(newOid);
+			codeTemplatePhaseDO.setCodeclassifytemplateoid(templateNewOid);
+			phaseKeyMap.put(oldoid,newOid);
+			phaseOidList.add(oldoid);
+		}
+
+		//妯℃澘闃舵鐨勫睘鎬�
+		List<CodePhaseattrEntity> codePhaseAttrDOList = new ArrayList<CodePhaseattrEntity>();
+
+		if(!CollectionUtils.isEmpty(phaseOidList)){//size()==0涓嬭竟鏂规硶浼氭姤閿�
+//			Map<String,String> conditionMap =  new HashMap<>();
+//			conditionMap.put("codephaseoid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(phaseOidList.toArray(new String[0])) + ")");
+//			codePhaseAttrDOList = codePhaseAttrDaoI.selectByCondition(conditionMap,new PageHelper(-1));
+			codePhaseAttrDOList = codePhaseattrMapper.selectByPhaseaIds(VciBaseUtil.toInSql(phaseOidList.toArray(new String[0])));
+		}
+		for (CodePhaseattrEntity codePhaseAttrDO:codePhaseAttrDOList){
+			String oldPhaseoid = codePhaseAttrDO.getCodephaseoid();
+//			String newOid = VciBaseUtil.getPk();
+			codePhaseAttrDO.setOid(null);
+			codePhaseAttrDO.setCodephaseoid(phaseKeyMap.get(oldPhaseoid));
+//			codePhaseattrMapper.insert(codePhaseAttrDO);
+		}
+		Map phaseMap = new HashMap();
+		phaseMap.put("phase",codeTempphaseEntities);
+		phaseMap.put("phaseAttr",codePhaseAttrDOList);
+		return phaseMap;
+	}
+
+	/**
+	 * 澶嶅埗妯℃澘鎸夐挳
+	 */
+	public List<CodeTempbuttonEntity> copyTemplateButton(String templateOldOid,String templateNewOid){
+
+		Map<String,Object> condition = new HashMap<>(1);
+		condition.put("classifyTemplateOid",templateOldOid);
+//		VciQueryWrapperForDO buttonWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateButtonDO.class);
+//		buttonWrapper.addQueryMap("classifyTemplateOid",templateOldOid);
+		List<CodeTempbuttonEntity> codeTempbuttonEntities = codeTempbuttonMapper.selectByMap(condition);
+//		List<CodeClassifyTemplateButtonDO> codeClassifyTemplateButtonDOList = codeClassifyTemplateButtonDaoI.selectByWrapper(buttonWrapper);
+		for (CodeTempbuttonEntity codeClassifyTemplateButtonDO:codeTempbuttonEntities){
+//			String newOid = VciBaseUtil.getPk();
+			codeClassifyTemplateButtonDO.setOid(null);
+			codeClassifyTemplateButtonDO.setClassifytemplateoid(templateNewOid);
+		}
+		return codeTempbuttonEntities;
+	}
+
+
+	/**
+	 * 澶嶅埗妯℃澘灞炴��
+	 */
+	public List<CodeClstempattrEntity> copyTemplateAttr(String templateOldOid,String templateNewOid){
+
+//		VciQueryWrapperForDO codeClassifyTemplateAttrQuery = new VciQueryWrapperForDO(CodeClassifyTemplateAttrDO.class);
+//		codeClassifyTemplateAttrQuery.addQueryMap("classifyTemplateOid",templateOldOid);
+
+		Map<String,Object> condition = new HashMap<>(1);
+		condition.put("classifyTemplateOid",templateOldOid);
+
+//		List<CodeClstempattrEntity> codeClassifyTemplateAttrDOList = codeClassifyTemplateAttrDaoI.selectByWrapper(codeClassifyTemplateAttrQuery);
+		List<CodeClstempattrEntity> codeClstempattrEntities = codeClstempattrMapper.selectByMap(condition);
+
+		for (CodeClstempattrEntity codeClassifyTemplateAttrDO :codeClstempattrEntities){
+//			String attrOid = VciBaseUtil.getPk();
+			codeClassifyTemplateAttrDO.setOid(null);
+			codeClassifyTemplateAttrDO.setClassifytemplateoid(templateNewOid);
+//			codeClstempattrMapper.insert(codeClassifyTemplateAttrDO);
+		}
+		return codeClstempattrEntities;
+	}
+
+
+	/**
+	 * 鍒嗙被妯℃澘鍒楄〃
+	 *
+	 * @param plCodeClstemplate 鏌ヨ鏉′欢
+	 * @param query   鍒嗛〉瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public DataGrid<CodeClstemplateVO> gridCodeClassifyTemplate(CodeClstemplateVO plCodeClstemplate, Query query) throws VciBaseException {
+		DataGrid<CodeClstemplateVO> dataGrid=new DataGrid<CodeClstemplateVO>();
+		//娌℃湁浼犲垎绫籭d锛屼笉鎵ц鏌ヨ閫昏緫锛岀洿鎺ヨ繑鍥�
+//		if(conditionMap.size()==0){
+//			dataGrid.setData(new ArrayList<>());
+//			dataGrid.setTotal(0);
+//			return dataGrid;
+//		}
+//		if (pageHelper == null) {
+//			pageHelper = new PageHelper(-1);
+//		}
+//		pageHelper.addDefaultDesc("revisionSeq");
+
+
+
+		List<CodeClstemplateVO> doList = codeClstemplateMapper.selectPlCodeClstemplatePage(Condition.getPage(query), plCodeClstemplate);
+		if (!CollectionUtils.isEmpty(doList)) {
+//			QueryWrapper<CodeClstemplateVO> codeClstemplateVOQueryWrapper = new QueryWrapper<>();
+//			codeClstemplateVOQueryWrapper.allEq(plCodeClstemplate);
+			List<CodeClstemplateEntity> codeClstemplateEntity = new ArrayList<>();
+			BeanUtils.copyProperties(doList,codeClstemplateEntity);
+			dataGrid.setData(codeClassifyTemplateDO2VOs(codeClstemplateEntity));
+			dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(codeClstemplateMapper.selectCount(Condition.getQueryWrapper(plCodeClstemplate)))));
+		}
+		return dataGrid;
+	}
+
+
+	/**
+	 * 澧炲姞鍒嗙被妯℃澘瀵硅薄
+	 * @param codeClassifyTemplateDTO 鍒嗙被妯℃澘瀵硅薄鏁版嵁浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+	 */
+	@Override
+	public R<CodeClstemplateVO> addSave(CodeClstemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
+		VciBaseUtil.alertNotNull(codeClassifyTemplateDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+		//灏咲TO杞崲涓篋O
+		CodeClstemplateEntity codeClassifyTemplateDO = new CodeClstemplateEntity();
+		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDTO,codeClassifyTemplateDO);
+
+		//鏌ヨ鍒嗙被浠ュ強涓婄骇鍒嗙被鐨勪笟鍔$被鍨媌tmtypeid銆乥tmtypename
+		List<CodeClassify> codeClassifyDOList = codeClassifyService.selectAllLevelParents(codeClassifyTemplateDTO.getCodeClassifyOid());
+
+		//鎵�鏈夊垎绫婚兘娌℃湁涓氬姟绫诲瀷锛岃繑鍥炴彁绀�
+		if(codeClassifyDOList.size()==0){
+			return R.fail("娣诲姞妯℃澘娣诲姞澶辫触,鍒嗙被鍜屼笂绾у垎绫婚兘娌℃湁鍏宠仈涓氬姟绫诲瀷锛�");
+		}
+
+		//璁剧疆btmtypeid鍜宯ame
+		CodeClassify codeClassifyDO = codeClassifyDOList.get(0);
+		codeClassifyTemplateDO.setBtmTypeId(codeClassifyDO.getBtmTypeId());
+		codeClassifyTemplateDO.setBtmTypeName(codeClassifyDO.getBtmTypeName());
+		codeClassifyTemplateDO.setLcStatus(FRAMEWORK_RELEASE_EDITING);
+		codeClassifyTemplateDO.setTs(new Date());
+		codeClassifyTemplateDO.setOwner(AuthUtil.getUser().getUserName());
+		codeClassifyTemplateDO.setLctid("codeClsTempLc");
+		codeClassifyTemplateDO.setVersionValue("1");
+		codeClassifyTemplateDO.setVersionSeq(1);
+		codeClassifyTemplateDO.setRevisionValue("1");
+		codeClassifyTemplateDO.setRevisionSeq(1);
+		codeClassifyTemplateDO.setVersionRule("0");
+		codeClassifyTemplateDO.setRevisionRule("numberversionrule");
+		codeClassifyTemplateDO.setLastModifyTime(new Date());
+		codeClassifyTemplateDO.setLastModifier(AuthUtil.getUser().getUserName());
+		codeClassifyTemplateDO.setCreator(AuthUtil.getUser().getUserName());
+		codeClassifyTemplateDO.setCreateTime(new Date());
+		codeClassifyTemplateDO.setLastV("1");
+		codeClassifyTemplateDO.setLastR("1");
+		codeClassifyTemplateDO.setFirstV("1");
+		codeClassifyTemplateDO.setFirstR("1");
+		codeClassifyTemplateDO.setBtmname("codeclstemplate");
+
+		baseMapper.insert(codeClassifyTemplateDO);
+		//榛樿娣诲姞妯℃澘灞炴��
+//        List<CodeClassifyTemplateAttrDO> attrDOList = new ArrayList<>();
+
+//        CodeClassifyTemplateAttrDO codeAttr = new CodeClassifyTemplateAttrDO();
+//        codeAttr.setId("id");
+//        codeAttr.setName("浼佷笟缂栫爜");
+//        codeAttr.setAttributeDataType("VTString");
+//        codeAttr.setAttrTableWidth(150);
+//        codeAttr.setOrderNum(1);
+//        codeAttr.setFormDisplayFlag(BooleanEnum.TRUE.getValue());
+//        codeAttr.setTableDisplayFlag(BooleanEnum.TRUE.getValue());
+//        codeAttr.setClassifyTemplateOid(codeClassifyTemplateDO.getOid());
+//        attrDOList.add(codeAttr);
+//
+//
+//        CodeClassifyTemplateAttrDO groupAttr = new CodeClassifyTemplateAttrDO();
+//        groupAttr.setId("name");
+//        groupAttr.setName("闆嗗洟鐮�");
+//        groupAttr.setAttributeDataType("VTString");
+//        groupAttr.setAttrTableWidth(150);
+//        groupAttr.setOrderNum(2);
+//        groupAttr.setFormDisplayFlag(BooleanEnum.TRUE.getValue());
+//        groupAttr.setTableDisplayFlag(BooleanEnum.TRUE.getValue());
+//        groupAttr.setClassifyTemplateOid(codeClassifyTemplateDO.getOid());
+//        attrDOList.add(groupAttr);
+//
+//        CodeClassifyTemplateAttrDO descAttr = new CodeClassifyTemplateAttrDO();
+//        descAttr.setId("description");
+//        descAttr.setName("鎻忚堪");
+//        descAttr.setAttrTableWidth(150);
+//        descAttr.setAttributeDataType("VTString");
+//        descAttr.setOrderNum(3);
+//        descAttr.setFormDisplayFlag(BooleanEnum.TRUE.getValue());
+//        descAttr.setTableDisplayFlag(BooleanEnum.TRUE.getValue());
+//        descAttr.setClassifyTemplateOid(codeClassifyTemplateDO.getOid());
+//        attrDOList.add(descAttr);
+//
+//        CodeClassifyTemplateAttrDO statusAttr = new CodeClassifyTemplateAttrDO();
+//        statusAttr.setId("lcstatus");
+//        statusAttr.setName("鐘舵��");
+//        statusAttr.setAttrTableWidth(70);
+//        statusAttr.setOrderNum(4);
+//        statusAttr.setFormDisplayFlag(BooleanEnum.TRUE.getValue());
+//        statusAttr.setTableDisplayFlag(BooleanEnum.TRUE.getValue());
+//        statusAttr.setAttributeDataType("VTString");
+//        statusAttr.setClassifyTemplateOid(codeClassifyTemplateDO.getOid());
+//        attrDOList.add(statusAttr);
+//
+//
+//        CodeClassifyTemplateAttrDO secAttr = new CodeClassifyTemplateAttrDO();
+//        secAttr.setId("secretgrade");
+//        secAttr.setName("瀵嗙骇");
+//        secAttr.setAttrTableWidth(70);
+//        secAttr.setAttributeDataType(VciFieldTypeEnum.VTInteger.name());
+//        secAttr.setEnumId("Enumsecretgrade");
+//        secAttr.setEnumName("瀵嗙骇");
+//        secAttr.setOrderNum(4);
+//        secAttr.setFormDisplayFlag(BooleanEnum.TRUE.getValue());
+//        secAttr.setTableDisplayFlag(BooleanEnum.TRUE.getValue());
+//        secAttr.setClassifyTemplateOid(codeClassifyTemplateDO.getOid());
+//        attrDOList.add(secAttr);
+
+		return R.data(codeClassifyTemplateDO2VO(codeClassifyTemplateDO));
+	}
+
+	/**
+	 * 淇敼鍒嗙被妯℃澘瀵硅薄
+	 * @param codeClassifyTemplateDTO 鍒嗙被妯℃澘瀵硅薄鏁版嵁浼犺緭瀵硅薄
+	 * @return 鎵ц缁撴灉
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+	 */
+	@Override
+	public R editSave(CodeClstemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
+		VciBaseUtil.alertNotNull(codeClassifyTemplateDTO,"鏁版嵁瀵硅薄",codeClassifyTemplateDTO.getOid(),"鍒嗙被妯℃澘瀵硅薄涓婚敭");
+		//妫�鏌s
+		CodeClstemplateEntity codeClassifyTemplateDOCopyFromDTO = new CodeClstemplateEntity();
+		BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDTO,codeClassifyTemplateDOCopyFromDTO);
+		CodeClstemplateEntity codeClassifyTemplateDO = null;
+		if(codeClassifyTemplateDOCopyFromDTO.getOid() == null){
+			baseMapper.insert(codeClassifyTemplateDOCopyFromDTO);
+			return R.data(codeClassifyTemplateDOCopyFromDTO);
+		}else{
+//			Map<String,Object> condition = new HashMap<>(2);
+//			condition.put("oid",codeClassifyTemplateDOCopyFromDTO.getOid());
+//			condition.put("ts",codeClassifyTemplateDOCopyFromDTO.getTs());
+			CodeClstemplateEntity detail = baseMapper
+				.selectById(codeClassifyTemplateDOCopyFromDTO.getOid());
+	//		boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
+			if(detail.getTs().compareTo(codeClassifyTemplateDOCopyFromDTO.getTs()) != 0){//涓嶆槸鏈�鏂扮殑涓嶈鏀�
+				return R.fail("褰撳墠鏁版嵁涓嶆槸鏈�鏂帮紝璇峰埛鏂板悗鍐嶄慨鏀癸紒");
+			}
+
+			//灏咲TO杞崲涓篋O
+			codeClassifyTemplateDO = selectByOid(codeClassifyTemplateDTO.getOid());
+			String lcstatus = codeClassifyTemplateDO.getLcStatus();
+			String versionvalue = codeClassifyTemplateDO.getVersionValue();
+
+			//鍙湁缂栬緫涓墠鑳戒慨鏀�
+			if(!CodeClassifyTemplateLC.EDITING.getValue().equals(codeClassifyTemplateDO.getLcStatus())){
+				return R.fail("鍙湁缂栬緫涓殑锛屾ā鏉挎墠鑳戒慨鏀癸紒");
+			}
+			revisionModelUtil.copyFromDTOIgnore(codeClassifyTemplateDTO,codeClassifyTemplateDO);
+			//涓嶄慨鏀圭増鏈彿鍜岀姸鎬�
+			codeClassifyTemplateDO.setLcStatus(lcstatus);
+			codeClassifyTemplateDO.setVersionValue(versionvalue);
+			codeClassifyTemplateDO.setTs(new Date());
+			codeClassifyTemplateDO.setLastModifier(AuthUtil.getUser().getUserName());
+			codeClassifyTemplateDO.setLastModifyTime(new Date());
+			baseMapper.updateById(codeClassifyTemplateDO);
+		}
+		return R.data(codeClassifyTemplateDO2VO(codeClassifyTemplateDO));
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java
index 07bd3f5..5cd0156 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java
@@ -18,12 +18,14 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vci.ubcs.code.entity.CodeClstempattrEntity;
 import com.vci.ubcs.code.entity.CodePhaseattrEntity;
 import com.vci.ubcs.code.entity.CodeTempphaseEntity;
 import com.vci.ubcs.code.mapper.CodePhaseattrMapper;
 import com.vci.ubcs.code.mapper.CodeTempphaseMapper;
 import com.vci.ubcs.code.service.ICodeTempphaseService;
 import com.vci.ubcs.code.vo.CodeTempphaseVO;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -45,6 +47,8 @@
 
 	@Autowired(required = false)
 	private CodePhaseattrMapper codePhaseattrMapper;
+	@Autowired(required = false)
+	private CodePhaseattrServiceImpl codePhaseattrServiceImpl;
 
 	@Override
 	public IPage<CodeTempphaseVO> selectCodeTempphasePage(IPage<CodeTempphaseVO> page, CodeTempphaseVO CodeTempphase) {
@@ -61,7 +65,7 @@
 	public int codeTemplateDeleteTrigger(String templateOid) {
 		int updateCount = 0;
 		Map<String,Object> condition = new HashMap<>(1);
-		condition.put("classifyTemplateOid",templateOid);
+		condition.put("codeclassifytemplateoid",templateOid);
 		List<CodeTempphaseEntity> codeTempphaseEntities = baseMapper.selectByMap(condition);
 		if(!CollectionUtils.isEmpty(codeTempphaseEntities)) {
 			updateCount += baseMapper.deleteBatchIds(codeTempphaseEntities.stream().map(CodeTempphaseEntity::getOid).collect(Collectors.toList()));
@@ -74,5 +78,35 @@
 		}
 		return updateCount;
 	}
+	/**
+	 * 妯℃澘淇敼瑙﹀彂鍔熻兘
+	 * @param attrDOList 灞炴�х殑鏁版嵁瀵硅薄
+	 * @return 鍙楀奖鍝嶇殑鏁版嵁
+	 */
+	@Override
+	public List<CodeClstempattrEntity> codeTemplateAttrModifyTrigger(List<CodeClstempattrEntity> attrDOList){
+		//灞炴�т慨鏀圭殑鏃跺�欙紝闇�瑕佸悓姝ヤ慨鏀瑰搴斿睘鎬х殑鍚嶇О
+//		BatchCBO batchCBO = new BatchCBO();
+		List<CodePhaseattrEntity> phaseAttrDOS =codePhaseattrMapper.listLinkAttrDOByTemplateAttrDOS(VciBaseUtil.toInSql(attrDOList.stream()
+			.map(CodeClstempattrEntity::getId).collect(Collectors.toList()).toArray(new String[0])),attrDOList.get(0).getClassifytemplateoid());
+		if(!CollectionUtils.isEmpty(phaseAttrDOS)){
+			//璇存槑鏈夊睘鎬�,鎴戜滑鍘绘浛鎹竴涓�
+			Map<String, CodeClstempattrEntity> attrDOMap = attrDOList.stream().collect(Collectors.toMap(s -> s.getId(), t -> t));
+			phaseAttrDOS.stream().forEach(phaseAttrDO->{
+				if(attrDOMap.containsKey(phaseAttrDO.getId())){
+					CodeClstempattrEntity attrDO = attrDOMap.get(phaseAttrDO.getId());
+					phaseAttrDO.setId(attrDO.getId());
+					phaseAttrDO.setName(attrDO.getName());
+					phaseAttrDO.setAttributegroup(attrDO.getAttributegroup());
+				}
+			});
+//			codePhaseattrMapper.
+			codePhaseattrServiceImpl.saveBatch(phaseAttrDOS);
+//			BatchCBO updateCBO =
+//			codePhaseAttrMapper.batchUpdate(phaseAttrDOS);
+//			batchCBO.copyFromOther(updateCBO);
+		}
+		return attrDOList;
+	}
 
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java
index 08d3bb8..b82e17f 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java
@@ -18,14 +18,9 @@
 
 import com.vci.ubcs.code.entity.CodeButtonEntity;
 import com.vci.ubcs.code.vo.CodeButtonVO;
-import com.vci.ubcs.system.cache.DictBizCache;
-import com.vci.ubcs.system.cache.DictCache;
-import com.vci.ubcs.system.enums.DictEnum;
+import com.vci.ubcs.omd.cache.DictCache;
 import org.springblade.core.mp.support.BaseEntityWrapper;
-import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.tool.utils.BeanUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springframework.boot.autoconfigure.security.SecurityProperties;
 
 import java.util.List;
 import java.util.Objects;
@@ -45,8 +40,8 @@
 	@Override
 	public CodeButtonVO entityVO(CodeButtonEntity codebutton) {
 		CodeButtonVO codebuttonVO = Objects.requireNonNull(BeanUtil.copy(codebutton, CodeButtonVO.class));
-		codebuttonVO.setUsedpositiontypeName(DictBizCache.getValue("codeButtonPosition", codebutton.getUsedpositiontype()));
-		codebuttonVO.setLcstatusName(DictBizCache.getValue("codeLcstatus", codebutton.getLcstatus()));
+		codebuttonVO.setUsedpositiontypeName(DictCache.getValue("codeButtonPosition", codebutton.getUsedpositiontype()));
+		codebuttonVO.setLcstatusName(DictCache.getValue("codeLcstatus", codebutton.getLcstatus()));
 		return codebuttonVO;
 	}
 
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml
index b77a539..f1fa535 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml
@@ -153,4 +153,12 @@
         where a.paths = #{fieldPath}
     </select>
 
+    <select id="selectAllLevelParents" resultType="java.util.HashMap">
+        select oid, id, name, btmtypeid, btmtypename
+            from PL_CODE_CLASSIFY
+            where btmtypeid is not null
+                start with oid = #{oid}
+            connect by prior PARENTCODECLASSIFYOID = oid
+    </select>
+
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml
index ec46665..ca09a93 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml
@@ -8,7 +8,7 @@
         <result column="REVISIONOID" property="revisionOid"/>
         <result column="NAMEOID" property="nameOid"/>
         <result column="BTMNAME" property="btmname"/>
-        <result column="ISLASTR" property="islastr"/>
+        <result column="LASTR" property="lastR"/>
         <result column="FIRSTR" property="firstR"/>
         <result column="LASTV" property="lastV"/>
         <result column="FIRSTV" property="firstV"/>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml
index 38e31b7..39256e3 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml
@@ -85,79 +85,17 @@
 
 
     <select id="selectCodeClstempattrPage" resultMap="CodeClstempattrResultMap">
-        select * from PL_CODE_CLSTEMPATTR where is_deleted = 0
+        select * from PL_CODE_CLSTEMPATTR where 1=1
     </select>
 
     <select id="selectByClassifytemplateoid" resultMap="CodeClstempattrResultMap">
         select * from PL_CODE_CLSTEMPATTR where classifytemplateoid in (${classifytemplateoid})
     </select>
 
-    <select id="selectRefByOid" resultType="com.vci.ubcs.code.entity.CodeClstempattrEntity">
-        select codeclstempattr0.EXPLAIN                as explain,
-               codeclstempattr0.SAMEREPEATATTRFLAG     as samerepeatattrflag,
-               codeclstempattr0.LASTMODIFIER           as lastmodifier,
-               codeclstempattr0.ATTRTABLEWIDTH         as attrtablewidth,
-               codeclstempattr0.CONTROLLENGTH          as controllength,
-               codeclstempattr0.CLASSIFYTEMPLATEOID    as classifytemplateoid,
-               codeclstempattr0.VERIFYRULE             as verifyrule,
-               codeclstempattr0.ENUMNAME               as enumname,
-               codeclstempattr0.TABLEDISPLAYFLAG       as tabledisplayflag,
-               codeclstempattr0.PARENTQUERYATTR        as parentqueryattr,
-               codeclstempattr0.ID                     as id,
-               codeclstempattr0.FILTERSOURCEATTRNAME   as filtersourceattrname,
-               codeclstempattr0.VALUEAREA              as valuearea,
-               codeclstempattr0.TABLEDISPLAYSTYLE      as tabledisplaystyle,
-               codeclstempattr0.TABLEDISPLAYJS         as tabledisplayjs,
-               codeclstempattr0.FORMDISPLAYFLAG        as formdisplayflag,
-               codeclstempattr0.DEFAULTVALUE           as defaultvalue,
-               codeclstempattr0.FORMHREF               as formhref,
-               codeclstempattr0.BTMNAME                as btmname,
-               codeclstempattr0.READONLYFLAG           as readonlyflag,
-               codeclstempattr0.NAME                   as name,
-               codeclstempattr0.COMPONENTRULE          as componentrule,
-               codeclstempattr0.SORTATTRFLAG           as sortattrflag,
-               codeclstempattr0.REFERBTMNAME           as referbtmname,
-               codeclstempattr0.ENUMID                 as enumid,
-               codeclstempattr0.FORMDISPLAYSTYLE       as formdisplaystyle,
-               codeclstempattr0.SCALELENGTH            as scalelength,
-               codeclstempattr0.PARENTNAME             as parentname,
-               codeclstempattr0.PRECISIONLENGTH        as precisionlength,
-               codeclstempattr0.PREFIXVALUE            as prefixvalue,
-               codeclstempattr0.FILTERSOURCEATTR       as filtersourceattr,
-               codeclstempattr0.TEXTAREAFLAG           as textareaflag,
-               codeclstempattr0.BARCODEFLAG            as barcodeflag,
-               codeclstempattr0.DESCRIPTION            as description,
-               codeclstempattr0.KEYATTRFLAG            as keyattrflag,
-               codeclstempattr0.QRCODEFLAG             as qrcodeflag,
-               codeclstempattr0.OID                    as oid,
-               codeclstempattr0.CLASSIFYINVOKELEVEL    as classifyinvokelevel,
-               codeclstempattr0.CLASSIFYINVOKEATTRNAME as classifyinvokeattrname,
-               codeclstempattr0.CLASSIFYINVOKEATTR     as classifyinvokeattr,
-               codeclstempattr0.REFERBTMID             as referbtmid,
-               codeclstempattr0.CLASSIFYINVOKEEDITFLAG as classifyinvokeeditflag,
-               codeclstempattr0.CODEDATEFORMAT         as codedateformat,
-               codeclstempattr0.SENIORQUERYATTRFLAG    as seniorqueryattrflag,
-               codeclstempattr0.OWNER                  as owner,
-               codeclstempattr0.ATTRIBUTEDATATYPE      as attributedatatype,
-               codeclstempattr0.CREATOR                as creator,
-               codeclstempattr0.CREATETIME             as createtime,
-               codeclstempattr0.ENUMEDITFLAG           as enumeditflag,
-               codeclstempattr0.ATTRIBUTEGROUP         as attributegroup,
-               codeclstempattr0.PARENTCODE             as parentcode,
-               codeclstempattr0.SUFFIXVALUE            as suffixvalue,
-               codeclstempattr0.ORDERNUM               as ordernum,
-               codeclstempattr0.REFERCONFIG            as referconfig,
-               codeclstempattr0.REQUIREFLAG            as requireflag,
-               codeclstempattr0.LIBRARYIDENTIFICATION  as libraryidentification,
-               codeclstempattr0.ENUMSTRING             as enumstring,
-               codeclstempattr0.IMAGEFLAG              as imageflag,
-               codeclstempattr0.LASTMODIFYTIME         as lastmodifytime,
-               codeclstempattr0.TABLEHREF              as tablehref,
-               codeclstempattr0.QUERYATTRFLAG          as queryattrflag,
-               codeclstempattr0.TS                     as ts,
-               classifytemplateoid.name                as classifyTemplateOidName
-        from platformbtm_codeclstempattr codeclstempattr0
-                 left join platformbtm_codeclstemplate classifytemplateoid
+    <select id="selectRefByOid" resultMap="CodeClstempattrResultMap">
+        select  codeclstempattr0.OID                    as oid
+        from PL_CODE_CLSTEMPATTR codeclstempattr0
+                 left join PL_CODE_CLSTEMPLATE classifytemplateoid
                            on codeclstempattr0.classifyTemplateOid = classifytemplateoid.oid
         where codeclstempattr0.classifytemplateoid = #{oid}
     </select>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml
index 521b9e1..d5e83b0 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml
@@ -37,7 +37,7 @@
 
 
     <select id="selectPlCodeClstemplatePage" resultMap="plCodeClstemplateResultMap">
-        select * from PL_CODE_CLSTEMPLATE where is_deleted = 0
+        select * from PL_CODE_CLSTEMPLATE where is_deleted = 0 order by revisionSeq
     </select>
 
     <select id="selectAllLevelChildOid" resultType="java.lang.String" >
@@ -45,7 +45,57 @@
     </select>
 
     <select id="countAllLevelChildOid" resultType="java.lang.Integer" >
-        select count(OID) countsize from platformbtm_codeclstemplate START WITH codeClassifyOid = #{oid} CONNECT BY PRIOR codeClassifyOid = OID
+        select count(OID) countsize from PL_CODE_CLSTEMPLATE START WITH codeClassifyOid = #{oid} CONNECT BY PRIOR codeClassifyOid = OID
+    </select>
+    <select id="getNextRevision" resultType="map" >
+        select max(revisionSeq) + 1 revisionSeq,
+               max(revisionSeq) + 1 revisionVal,
+               max(VersionSeq) + 1 VersionSeq,
+               max(VersionSeq) + 1 VersionVal
+        from PL_CODE_CLSTEMPLATE
+        where nameoid = #{nameoid}
+    </select>
+
+    <select id="selectCodeClassifyTemplateDOByTree" resultMap="plCodeClstemplateResultMap">
+        SELECT codeclstemplate0.CODECLASSIFYOID AS codeclassifyoid,
+               codeclstemplate0.LASTMODIFIER    AS lastmodifier,
+               codeclstemplate0.REVISIONSEQ     AS revisionseq,
+               codeclstemplate0.VERSIONVALUE    AS versionvalue,
+               codeclstemplate0.DESCRIPTION     AS description,
+               codeclstemplate0.OID             AS oid,
+               codeclstemplate0.VERSIONSEQ      AS versionseq,
+               --codeclstemplate0.CHECKINBY       AS checkinby,
+               codeclstemplate0.BTMTYPENAME     AS btmtypename,
+               codeclstemplate0.REVISIONRULE    AS revisionrule,
+               codeclstemplate0.ID              AS id,
+               codeclstemplate0.OWNER           AS owner,
+               --codeclstemplate0.CHECKOUTBY      AS checkoutby,
+               codeclstemplate0.BTMTYPEID       AS btmtypeid,
+               codeclstemplate0.CREATOR         AS creator,
+               codeclstemplate0.CREATETIME      AS createtime,
+               codeclstemplate0.FIRSTV        AS isfirstv,
+               codeclstemplate0.REVISIONOID     AS revisionoid,
+               codeclstemplate0.BTMNAME         AS btmname,
+               --codeclstemplate0.CHECKOUTTIME    AS checkouttime,
+               codeclstemplate0.REVISIONVALUE   AS revisionvalue,
+               codeclstemplate0.VERSIONRULE     AS versionrule,
+               codeclstemplate0.NAME            AS name,
+               codeclstemplate0.LASTR         AS islastr,
+               codeclstemplate0.LASTMODIFYTIME  AS lastmodifytime,
+               codeclstemplate0.COPYFROMVERSION AS copyfromversion,
+               codeclstemplate0.NAMEOID         AS nameoid,
+               codeclstemplate0.LCSTATUS        AS lcstatus,
+               codeclstemplate0.LASTV         AS islastv,
+               --codeclstemplate0.CHECKINTIME     AS checkintime,
+               codeclstemplate0.FIRSTR        AS isfirstr,
+               codeclstemplate0.TS              AS ts,
+               codeclassifyoid.name             AS codeClassifyOidName
+        FROM PL_CODE_CLSTEMPLATE codeclstemplate0
+                 LEFT JOIN PL_CODE_CLASSIFY codeclassifyoid
+                           ON codeclstemplate0.codeClassifyOid = codeclassifyoid.oid
+        WHERE codeclstemplate0.codeclassifyoid = #{codeclassifyoid}
+          and codeclstemplate0.lcstatus = #{lcstatus}
+          AND (codeclstemplate0.lastr = '1' AND codeclstemplate0.lastv = '1')
     </select>
 
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml
index 1c54776..d69dd21 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml
@@ -70,12 +70,87 @@
                checkintime,
                codephaseoid,
                isfirstr
-        from platformbtm_codephaseattr
+        from PL_CODE_PHASEATTR
         where codephaseoid in
               (select oid
-               from platformbtm_codetempphase
+               from PL_CODE_TEMPPHASE
                where codeClassifyTemplateOid = #{oid})
     </select>
 
+    <select id="selectByPhaseaIds" resultType="com.vci.ubcs.code.entity.CodePhaseattrEntity">
+        select lastmodifier,
+               revisionseq,
+               versionvalue,
+               description,
+               oid,
+               versionseq,
+               checkinby,
+               revisionrule,
+               lctid,
+               id,
+               owner,
+               checkoutby,
+               creator,
+               createtime,
+               isfirstv,
+               attributegroup,
+               revisionoid,
+               btmname,
+               checkouttime,
+               revisionvalue,
+               versionrule,
+               name,
+               islastr,
+               lastmodifytime,
+               copyfromversion,
+               nameoid,
+               lcstatus,
+               islastv,
+               checkintime,
+               codephaseoid,
+               isfirstr
+        from PL_CODE_PHASEATTR
+        where codephaseoid in
+              (#{oids})
+    </select>
+
+    <select id="listLinkAttrDOByTemplateAttrDOS" resultType="com.vci.ubcs.code.entity.CodePhaseattrEntity">
+
+        SELECT lastmodifier,
+               revisionseq,
+               versionvalue,
+               description,
+               oid,
+               versionseq, /*checkinby,*/
+               revisionrule,
+               lctid,
+               id,
+               owner, /*checkoutby, */
+               creator,
+               createtime, /*is*/
+               firstv,
+               attributegroup,
+               revisionoid,
+               btmname, /*checkouttime,*/
+               revisionvalue,
+               versionrule,
+               name, /*is*/
+               lastr,
+               lastmodifytime,
+               copyfromversion,
+               nameoid,
+               lcstatus, /*is*/
+               lastv, /*checkintime,*/
+               codephaseoid,
+            /*is*/
+               firstr,
+               ts
+        FROM PL_CODE_PHASEATTR
+            where ID IN (#{id})
+          AND codephaseoid in
+              (select oid
+               from PL_CODE_TEMPPHASE
+               where codeClassifyTemplateOid =#{codeClassifyTemplateOid})
+    </select>
 
 </mapper>

--
Gitblit v1.9.3