1、主要完成主题库定义的模板分类的接口移植。
2、主要对界面字数多了换行问题进行了修改。
已修改34个文件
已添加4个文件
2354 ■■■■■ 文件已修改
Source/UBCS-WEB/src/const/code/codeSynonym.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codebutton.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/plCodeKeyattrrepeat.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/omd/dict.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/codebutton.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/omd/dict.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClsflowtempEntity.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstempattrEntity.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClstemplateEntity.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeOsbtmtypeattributeEntity.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeOsbtmtypeattributeVO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/PatternUtil.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BooleanEnum.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/BeanUtil.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/ClassUtil.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstempattrController.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeClstemplateController.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstempattrMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClstemplateMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodePhaseattrMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstempattrService.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClstemplateService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeTempphaseService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstempattrServiceImpl.java 691 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java 618 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeTempphaseServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeButtonWrapper.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClsflowtempMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstempattrMapper.xml 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeClstemplateMapper.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodePhaseattrMapper.xml 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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,
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"
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,
Source/UBCS-WEB/src/const/omd/dict.js
@@ -112,6 +112,7 @@
      editDisabled: true,
      search: true,
      span: 24,
      hide: true,
      rules: [
        {
          required: true,
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
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">
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>-->
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;
    /**
     *
     */
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;
    /**
     *
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;
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;
    /**
     * æ‰€å±žä¸šåŠ¡ç±»åž‹
     */
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;
}
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();
    }
    /**
     * æŒ‰ç…§åŠ¨æ€å†…å®¹çš„å‚æ•°å‡ºçŽ°é¡ºåº,将参数放到List中
     *
     * @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);
    }
}
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;
    }
}
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;
            }
        }
    }
}
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);
    }
}
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);
            }
        }
    }
}
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>
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 æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @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 æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PutMapping("/editSave")
    public R<CodeClstempattrVO> editSave(@RequestBody CodeClstempattrDTO codeClassifyTemplateAttrDTO){
        return codeClstempattrService.editSave(codeClassifyTemplateAttrDTO);
    }
    /**
     * åˆ é™¤ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象,oid和ts需要传输
     * @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);
    }
}
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 æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @PostMapping( "/addSave")
    public R<CodeClstemplateVO> addSave(@RequestBody CodeClstemplateDTO codeClassifyTemplateDTO){
        return plCodeClstemplateService.addSave(codeClassifyTemplateDTO);
    }
    /**
     * ä¿®æ”¹ åˆ†ç±»æ¨¡æ¿å¯¹è±¡
     * @param codeClassifyTemplateDTO åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象
     * @return æ‰§è¡Œç»“果,success为true表示成功,msg是失败的提示信息,obj是添加完成后的显示对象
     */
    @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);
    }
}
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);
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);
    /**
     * æ¡ä»¶æŸ¥è¯¢æŽ’序
     *
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);
}
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);
}
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 å½“前分类的oid
     * @return oid,id,name,btmtypeid,btmtypename
     */
    CodeClassify selectBtmOrParentBtm(String oid);
    /**
     * èŽ·å–æ‰€æœ‰ä¸‹çº§æ•°æ®
     * @param oid æ•°æ®ä¸»é”®
     * @return æŸ¥è¯¢ç»“æžœ
     */
    List<CodeClassify> selectAllLevelParents(String oid);
}
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和ts需要传输
     * @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);
}
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);
}
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);
}
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 å½“前分类的oid
     * @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 å½“前分类的oid
     * @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;
    }
}
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,"需要添加的数据对象");
        //将DTO转换为DO
        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,"需要添加的数据对象");
            //将DTO转换为DO
            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());
            }
            //判断传过来的枚举注入是否是jsonArr格式
            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()});
            }
            //判断传过来的参照配置是否是json格式
            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(),"主题库分类的模板属性主键");
        //判断传过来的枚举注入是否是jsonArr格式
        if(StringUtils.isNotBlank(codeClassifyTemplateAttrDTO.getEnumstring())&&!checkKVArr(codeClassifyTemplateAttrDTO.getEnumstring())){
            throw new VciBaseException("枚举注入数据格式错误!");
        }
        //判断传过来的参照配置是否是json格式
        if(StringUtils.isNotBlank(codeClassifyTemplateAttrDTO.getReferbtmid())&&!checkKVObj(codeClassifyTemplateAttrDTO.getReferbtmid())){
            throw new VciBaseException("枚举注入数据格式错误!");
        }
        //检查ts
        CodeClstempattrEntity codeClassifyTemplateAttrDOCopyFromDTO = new CodeClstempattrEntity();
//        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDOCopyFromDTO);
//        boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOCopyFromDTO);
        //检查ts
//        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("当前数据不是最新,请刷新后再修改!");
        }
        //将DTO转换为DO
        CodeClstempattrEntity codeClassifyTemplateAttrDO = baseMapper.selectById(codeClassifyTemplateAttrDTO.getOid());
        revisionModelUtil.copyFromDTOIgnore(codeClassifyTemplateAttrDTO,codeClassifyTemplateAttrDO);
        baseMapper.updateById(codeClassifyTemplateAttrDO);
        return R.data(codeClassifyTemplateAttrDO2VO(codeClassifyTemplateAttrDO));
    }
    /**
     * åˆ é™¤ä¸»é¢˜åº“分类的模板属性
     * @param codeClassifyTemplateAttrDTO ä¸»é¢˜åº“分类的模板属性数据传输对象,oid和ts需要传输
     * @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为true为可以删除,false表示有数据引用,obj为true表示有下级
     */
    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);
        //把默认的属性也添加到boAttrs
        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);
        //这个模板下已经有的属性
        //把默认的属性也添加到boAttrs
        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);
        //所有id=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("操作成功!");
    }
}
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);
        //检查ts
        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 åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象,oid和ts需要传输
     * @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
//        //升版后不能使用insert方法,因为那个永远是新增一条数据,
//        //上方先从dto转给do,然后把升版的初始化的属性拷贝给do,最后再从do拷贝到cbo上
        //modify by weidy@2022-2-27
        //升版后不能使用insert方法,因为那个永远是新增一条数据,
        //上方先从dto转给do,然后把升版的初始化的属性拷贝给do,最后再从do拷贝到cbo上
//        WebUtil.copyValueToCboFromObj(clientBusinessObject_template_insert,codeClassifyTemplateDO);
//        //升版过后的模板oid
//        String templateNewOid = codeClassifyTemplateDO.getOid();
//
//        //需要复制的模板属性
//        //查询老模板下边的所有属性,赋值新模板oid
        //升版过后的模板oid
        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保存的时候没有能够自动update源数据的isLastR
//        //batchCBOTemplate.getCreateCbos().add(clientBusinessObject_template_insert);
//        //使用saveRevisionBuisnessObject可以解决这个问题,这里先暂时执行两次保存
        //batchCBO保存的时候没有能够自动update源数据的isLastR
        //batchCBOTemplate.getCreateCbos().add(clientBusinessObject_template_insert);
        //使用saveRevisionBuisnessObject可以解决这个问题,这里先暂时执行两次保存
//        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,复制过来的新的分类oid
        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,模板阶段老oid:模板属性新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>();
        //没有传分类id,不执行查询逻辑,直接返回
//        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,"需要添加的数据对象");
        //将DTO转换为DO
        CodeClstemplateEntity codeClassifyTemplateDO = new CodeClstemplateEntity();
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDTO,codeClassifyTemplateDO);
        //查询分类以及上级分类的业务类型btmtypeid、btmtypename
        List<CodeClassify> codeClassifyDOList = codeClassifyService.selectAllLevelParents(codeClassifyTemplateDTO.getCodeClassifyOid());
        //所有分类都没有业务类型,返回提示
        if(codeClassifyDOList.size()==0){
            return R.fail("添加模板添加失败,分类和上级分类都没有关联业务类型!");
        }
        //设置btmtypeid和name
        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(),"分类模板对象主键");
        //检查ts
        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("当前数据不是最新,请刷新后再修改!");
            }
            //将DTO转换为DO
            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));
    }
}
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;
    }
}
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;
    }
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>
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"/>
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>
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>
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>