xiejun
2023-11-17 566c542d3f1eb0ad9e918bd1fa9586ab1ed7ec86
自定义流水相关开发
已修改12个文件
已添加2个文件
573 ■■■■ 文件已修改
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeCustomSerialDTO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeBasicSec.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeBasicSecVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeSerialAlgorithmVO.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomSerialAlgorithmExample.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomSerialEnum.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeBasicSecMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java
@@ -196,7 +196,10 @@
     * è‡ªå®šä¹‰çš„æµæ°´ç®—法类
     */
    private String customCodeSerialClassText;
    /***
     * è‡ªå®šä¹‰æµæ°´ç±»åž‹
     */
    private String customCodeSerialType;
    /**
     * æ˜¯å¦è‡ªåŠ¨åŒ¹é…åˆ†ç±»å€¼
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeCustomSerialDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
import com.vci.ubcs.code.entity.CodeBasicSec;
import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import java.util.List;
@Data
public class CodeCustomSerialDTO extends BaseModelDTO {
    //编码规则码段
   private     List<CodeBasicSecVO> codeBasicSecVOList;
    /***
     * ç¼–码规则id
     */
    private String codeRuleOid;
    /**
     * å½“前数据流水
     */
    private String currentFlowValue;
    /***
     * æµå¤±ä¾èµ–
     */
    private String serialUnitString;
    /***
     * å½“前流水码段
     */
    private CodeBasicSecVO serialCodeCodeBasicSec;
    private BaseModel baseModel;
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeBasicSec.java
@@ -243,6 +243,10 @@
     */
    private String customCodeSerialClassText;
    /***
     * è‡ªå®šä¹‰æµæ°´ç±»åž‹
     */
    private String customCodeSerialType;
    /**
     * æ˜¯å¦è‡ªåŠ¨åŒ¹é…åˆ†ç±»å€¼
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeBasicSecVO.java
@@ -204,6 +204,11 @@
     */
    private String customCodeSerialClassText;
    /***
     * è‡ªå®šä¹‰æµæ°´ç±»åž‹
     */
    private String customCodeSerialType;
    /**
     * æ˜¯å¦è‡ªåŠ¨åŒ¹é…åˆ†ç±»å€¼
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeSerialAlgorithmVO.java
@@ -8,7 +8,10 @@
 * @date 2022-2-17
 */
public class CodeSerialAlgorithmVO extends BaseModel {
    /***
     *
     */
    private String serialType;
    /**
     * ç®—法编号
     */
@@ -61,8 +64,15 @@
        this.description = description;
    }
    public String getSerialType() {
        return serialType;
    }
    @Override
    public void setSerialType(String serialType) {
        this.serialType = serialType;
    }
    @Override
    public String toString() {
        return "CodeSerialAlgorithmVO{" +
                "id='" + id + '\'' +
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomRomanSerialAlgorithmExample.java
@@ -1,34 +1,46 @@
package com.vci.ubcs.code.algorithm;
import com.alibaba.nacos.common.utils.StringUtils;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithm;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithmMethod;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.code.dto.CodeCustomSerialDTO;
import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import java.util.List;
/****
 * è‡ªå®šä¹‰ç½—马流水算法自定义类
 */
@MdmSerialAlgorithm(text = "自定义罗马流水",description = "自定义罗马流水算法")
@MdmSerialAlgorithm(text = "自定义罗马流水",serialType="custom_serial_roman",description = "自定义罗马流水算法")
public class CustomRomanSerialAlgorithmExample {
    /**
     * ç”Ÿæˆç½—马流水号的方法
     * @return æµæ°´å·çš„信息
     */
    @MdmSerialAlgorithmMethod
    public String serialGenerate(BaseModel data, CodeRuleVO codeRuleVO, List<CodeOrderSecDTO> secDTOList){
    public String serialGenerate(CodeCustomSerialDTO codeCustomSerialDTO){
        //
        codeCustomSerialDTO.getSerialUnitString();
        CodeBasicSecVO secVO= codeCustomSerialDTO.getSerialCodeCodeBasicSec();
        String currentFlowValue=codeCustomSerialDTO.getCurrentFlowValue();
        Double newThisSerialValue = 0d;
        if(StringUtils.isBlank(currentFlowValue)){
            //第一个编码
            newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
        }else {
            //流水号肯定是数字
            //将罗马流水转为数字流水
            int arabicValue=VciBaseUtil.convertRomanToArabic(currentFlowValue);
            newThisSerialValue = (double)(arabicValue + secVO.getSerialStep()) ;
        }
        //要看是否超过最大的流水值
        if (newThisSerialValue >= secVO.getCodeFillLimit()) {
            throw new VciBaseException("流水号已经超过允许的最大流水值{0}", new String[]{secVO.getCodeFillLimit().toString()});
        }
        //将数字流水转为罗马流水
        String romanValue=VciBaseUtil.convertArabicToRoman(5);
        //将罗马流水转为数字流水
        int arabicValue=VciBaseUtil.convertRomanToArabic(romanValue);
        return "";
        String romanValue=VciBaseUtil.convertArabicToRoman(newThisSerialValue.intValue());
        return romanValue;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomSerialAlgorithmExample.java
@@ -2,6 +2,7 @@
import com.vci.ubcs.code.annotation.MdmSerialAlgorithm;
import com.vci.ubcs.code.annotation.MdmSerialAlgorithmMethod;
import com.vci.ubcs.code.dto.CodeCustomSerialDTO;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
@@ -11,7 +12,7 @@
/**
 * æµæ°´ç®—法的示例
 */
@MdmSerialAlgorithm(text = "流水算法的示例",description = "请不要使用这个类,这个类只是示例,用于查看如何编写流水算法")
@MdmSerialAlgorithm(text = "流水算法的示例",serialType="",description = "请不要使用这个类,这个类只是示例,用于查看如何编写流水算法")
public class CustomSerialAlgorithmExample {
    /**
@@ -19,7 +20,7 @@
     * @return æµæ°´å·çš„信息
     */
    @MdmSerialAlgorithmMethod
    public String serialGenerate(BaseModel data, CodeRuleVO codeRuleVO, List<CodeOrderSecDTO> secDTOList){
    public String serialGenerate(CodeCustomSerialDTO codeCustomSerialDTO){
        return "";
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/algorithm/CustomSerialEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,162 @@
package com.vci.ubcs.code.algorithm;
import com.vci.ubcs.starter.annotation.VciEnum;
import com.vci.ubcs.starter.web.enumpck.BaseEnum;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
/***
 * è‡ªå®šä¹‰æµæ°´æžšä¸¾
 */
@VciEnum(name ="customSerialEnum",text = "自定义流水类型",description = "")
public enum CustomSerialEnum implements BaseEnum {
    /**
     * ç¼–辑中
     */
    ROMAN("custom_serial_roman","罗马流水");
    /**
     * æžšä¸¾çš„值
     */
    private String value;
    /**
     * æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     */
    private String text;
    /**
     * æž„造函数
     *
     * @param value å€¼
     * @param text  æ˜¾ç¤ºæ–‡æœ¬
     */
    private CustomSerialEnum(String value, String text) {
        this.value = value;
        this.text = text;
    }
    /**
     * èŽ·å–æžšä¸¾å€¼
     *
     * @return æžšä¸¾å€¼
     */
    @Override
    public String getValue() {
        return value;
    }
    /**
     * è®¾ç½®æžšä¸¾å€¼
     *
     * @param value æžšä¸¾å€¼
     */
    public void setValue(String value) {
        this.value = value;
    }
    /**
     * èŽ·å–æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     *
     * @return æ˜¾ç¤ºæ–‡æœ¬
     */
    @Override
    public String getText() {
        return text;
    }
    /**
     * è®¾ç½®æ˜¾ç¤ºæ–‡æœ¬
     *
     * @param text æ˜¾ç¤ºæ–‡æœ¬
     */
    public void setText(String text) {
        this.text = text;
    }
    /**
     * æ ¹æ®æžšä¸¾ç±»åž‹åˆ¤æ–­åº”该返回什么样类型的流水
     * æš‚时加了罗马类型,如果后续有其他流水类型则需要在此处理
     * @return æžšä¸¾å€¼
     */
    public static Double getDoubleCustomSerialValue(String value,String customCodeSerialType) {
        Double serialValue=null;
        for (CustomSerialEnum wenum : CustomSerialEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(customCodeSerialType)) {//如果为罗马
                int newValue = VciBaseUtil.convertRomanToArabic(value);
                serialValue = new Double(newValue);
                break;
            } else {
                serialValue=Double.parseDouble(value);
                break;
            }
        }
        return serialValue;
    }
    /**
     * æ ¹æ®æžšä¸¾ç±»åž‹åˆ¤æ–­åº”该返回什么样类型的流水
     * æš‚时加了罗马类型,如果后续有其他流水类型则需要在此处理
     * @return æžšä¸¾å€¼
     */
    public static String getStringCustomSerialValue(Double value,String customCodeSerialType) {
        String serialValue=String.valueOf(value);
        for (CustomSerialEnum wenum : CustomSerialEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(customCodeSerialType)) {//如果为罗马
                String newValue=VciBaseUtil.convertArabicToRoman(value.intValue());
                serialValue=newValue;
                break;
            }else{
                break;
            }
        }
        return serialValue;
    }
    /**
     * æ ¹æ®åç§°èŽ·å–å¯¹åº”çš„æžšä¸¾å€¼
     *
     * @param text åç§°
     * @return æžšä¸¾å€¼
     */
    public static String getValueByText(String text) {
        for (CustomSerialEnum wenum : CustomSerialEnum.values()) {
            if (wenum.getText().equalsIgnoreCase(text)) {
                return wenum.getValue();
            }
        }
        return "";
    }
    /**
     * æ ¹æ®æžšä¸¾å€¼èŽ·å–åç§°
     *
     * @param value æžšä¸¾å€¼
     * @return åç§°
     */
    public static String getTextByValue(String value) {
        for (CustomSerialEnum wenum : CustomSerialEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(value)) {
                return wenum.getText();
            }
        }
        return "";
    }
    /**
     * æ ¹æ®æžšä¸¾å€¼èŽ·å–æžšä¸¾å¯¹è±¡
     *
     * @param value æžšä¸¾å€¼
     * @return æžšä¸¾å¯¹è±¡ï¼Œä¸å­˜åœ¨æ—¶å€™è¿”回null
     */
    public static CustomSerialEnum forValue(String value) {
        for (CustomSerialEnum wenum : CustomSerialEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(value)) {
                return wenum;
            }
        }
        return null;
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/annotation/MdmSerialAlgorithm.java
@@ -34,4 +34,6 @@
     * @return æè¿°
     */
    String description() default "";
    String serialType() default "";
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeSerialAlgorithmServiceImpl.java
@@ -49,6 +49,7 @@
                        algorithmVO.setName(serialAlgorithm.text());
                        algorithmVO.setDescription(serialAlgorithm.description());
                        algorithmVO.setId(serialAlgorithm.value());
                        algorithmVO.setSerialType(serialAlgorithm.serialType());
                        if(StringUtils.isBlank(algorithmVO.getId())){
                            algorithmVO.setId(beanName);
                        }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -976,10 +976,10 @@
//                        cbo.setLcStatus("Editing");
////                        cbo.setLcStatus(lifeCycleVO.getStartStatus());
//                    } else {
                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                    cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
//                    }
                } else {
                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                    cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
                }
            }
@@ -3595,12 +3595,15 @@
        for (int i = 0; i < threadSafeMaps.size(); i += MAX_IMPORT_NUM) {
            final int startIndex = i;
            final int endIndex = Math.min(i + MAX_IMPORT_NUM, threadSafeMaps.size());
            executor.execute(() -> {
                List<Map<String, String>> subList = threadSafeMaps.subList(startIndex, endIndex);
                // è°ƒç”¨æ’入数据库的方法
                commonsMapper.insertByBaseModel(tableName, threadSafeMaps.get(0), subList);
            });
            try {
                executor.execute(() -> {
                    List<Map<String, String>> subList = threadSafeMaps.subList(startIndex, endIndex);
                    // è°ƒç”¨æ’入数据库的方法
                    commonsMapper.insertByBaseModel(tableName, threadSafeMaps.get(0), subList);
                });
            }catch (Throwable e){
                throw new ServiceException(e.getMessage());
            }
        }
        // å…³é—­çº¿ç¨‹æ± 
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -97,7 +97,7 @@
    @Value("${batchadd.exportattr.type:基本信息}")
    public String BATCHADD_EXCEPORT_ATTR_TYPE;
    @Value("${batchadd.redis.time:6000000}")
    public int BATCHADD_REDIS_TIME;
    @Value("${batchadd.import_data_limit:5001}")
@@ -2765,10 +2765,10 @@
//                    if (lifeCycleVO != null) {
//                        cbo.setLcStatus(lifeCycleVO.getStartStatus());
//                    } else {
                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                    cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
//                    }
                } else {
                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                    cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
                }
            }
@@ -3134,7 +3134,7 @@
                        Integer userSecret = VciBaseUtil.getCurrentUserSecret();
                        cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
                    }
                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                    cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
                }else{
                    //此时还没有转换路径
                    //cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
@@ -3191,7 +3191,7 @@
                        Integer userSecret = VciBaseUtil.getCurrentUserSecret();
                        cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
                    }
                    cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                    cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
                }else{
                    //此时还没有转换路径
                    //cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
@@ -3817,7 +3817,7 @@
        //2.判断关键属性在系统里是否重复
        //因为数据量很大,所以得想办法并行
        //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
        Map<String,List<BaseModel>> indexTODataMap=new HashMap<>();
        Map<String,List<BaseModel>> indexTODataMap=new ConcurrentHashMap<>();
        List<ClientBusinessObject> repeatDataMap = cboList.parallelStream().filter(cbo -> {
            //每行都得查询.如果其中出现了错误,我们就直接抛出异常,其余的显示
            //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -2,7 +2,9 @@
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vci.ubcs.code.algorithm.CustomSerialEnum;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.dto.CodeCustomSerialDTO;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.entity.CodeAllCode;
import com.vci.ubcs.code.entity.CodeClassifyValue;
@@ -36,15 +38,16 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
@@ -105,7 +108,7 @@
            //主要是为了录入最大流水号和allcode
            //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
            List<CodeAllCode> allCodeDOList = new CopyOnWriteArrayList<>();
            Map<String/**流水依据**/, Map<String/**码段的主键**/,Double/**最大流水号**/>> maxSerialMap = new HashMap<>();
            Map<String/**流水依据**/, ConcurrentHashMap<String/**码段的主键**/,String/**最大流水号**/>> maxSerialMap = new ConcurrentHashMap<>();
            // TODO å¤šçº¿ç¨‹æµå¼•发的问题已修改
            dataCBOList.parallelStream().forEach(cbo->{
                log.info("code:----->"+cbo.getId());
@@ -120,6 +123,7 @@
                List<CodeBasicSecVO> secVOList = finalRuleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
                Map<String/**码段的主键**/,String/**码段的值**/> serialValueMap = new HashMap<>();
                Map<String, CodeBasicSecVO> secVOMap = secVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
                Map<String,Integer> serialSecOidIndexMap=new HashMap<>();
                for (int i = 0; i < secLengths.length; i++) {
                    CodeBasicSecVO secVO = secVOList.get(i);
                    String thisSecValue  = "";
@@ -137,38 +141,59 @@
                    //    }
                    if(VciBaseUtil.getBoolean(secVO.getSerialDependFlag())){
                        serialUnitList.add(thisSecValue);
                        serialSecOidIndexMap.put(secVO.getOid(),i);
                    }
                    if(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue().equalsIgnoreCase(secVO.getSecType())){
                        serialValueMap.put(secVO.getOid(),thisSecValue);
                    }
                }
                String serialUnitString = serialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : serialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
                List<String> serialUnFileStringList = new ArrayList<>();
                AtomicReference<String> newSerialUnitString = new AtomicReference<>("");
                if(!CollectionUtils.isEmpty(serialValueMap)){
                    AtomicInteger index= new AtomicInteger();
                    serialValueMap.forEach((secOid,secValue)->{
                        //要看是不是补位的
                        CodeBasicSecVO secVO = secVOMap.get(secOid);
                        Double serialDb = null;
                        List<String >newSerialUnitList=new ArrayList<>();
                        newSerialUnitList.addAll(serialUnitList);
                        if(index.get() ==0){
                            if(serialSecOidIndexMap.containsKey(secOid)) {
                                int num = serialSecOidIndexMap.get(secOid);
                                newSerialUnitList.set(num, "");
                            }
                        }
                        String serialUnitString = newSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : newSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
                        newSerialUnitString.set(serialUnitString);
                        index.getAndIncrement();
                        String serialDb = "";
                        // æˆªå–掉前后缀之后的码段
                        String subSecValue = killPriffixSuffix(secValue, secVO.getPrefixCode(), secVO.getSuffixCode());
                        if(OsCodeFillTypeEnum.NONE.getValue().equalsIgnoreCase(secVO.getCodeFillType())){
                            //不补码
                            //把所有不是数字的去掉,因为可能会是老数据,新规则
                            serialDb = VciBaseUtil.getDouble(killUnNumberChar(subSecValue));
                        //    serialDb = VciBaseUtil.getDouble(killUnNumberChar(subSecValue));
                            //serialDb = killUnNumberChar(subSecValue);
                            serialDb=subSecValue;
                        }else {
                            //左右填充的,我们需要
                            serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(subSecValue,secVO.getCodeFillSeparator(),
                                OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()))));
                            /*serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(subSecValue,secVO.getCodeFillSeparator(),
                                OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()))));*/
                            serialDb = killFillChar(subSecValue,secVO.getCodeFillSeparator(),
                                OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()));
                        }
                        Map<String, Double> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>());
                        Double maxValue=serialDb;
                        Double newSerialDb= CustomSerialEnum.getDoubleCustomSerialValue(secValue,secVO.getCustomCodeSerialType());
                        ConcurrentHashMap<String, String> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new ConcurrentHashMap<>());
                        Double maxValue=newSerialDb;
                        if(thisUnitMaxMap.containsKey(secOid)){
                            maxValue=  thisUnitMaxMap.getOrDefault(secOid,new Double(-1));
                            if(maxValue<serialDb){
                                maxValue=serialDb;
                            String     newMaxValue=  thisUnitMaxMap.getOrDefault(secOid,"");
                            maxValue=StringUtils.isBlank(newMaxValue)?-1:VciBaseUtil.getDouble(newMaxValue);
                            if(maxValue<newSerialDb){
                                maxValue=newSerialDb;
                            }
                        }
                        thisUnitMaxMap.put(secOid,maxValue);
                        String newMaxValue=CustomSerialEnum.getStringCustomSerialValue(maxValue,secVO.getCustomCodeSerialType());
                        serialDb=CustomSerialEnum.getStringCustomSerialValue(newSerialDb,secVO.getCustomCodeSerialType());
                        thisUnitMaxMap.put(secOid,newMaxValue);
                        maxSerialMap.put(serialUnitString,thisUnitMaxMap);
                        serialUnFileStringList.add(String.valueOf(serialDb));
                    });
@@ -181,7 +206,7 @@
                allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid());
                allCodeDO.setCreateCodeBtm(cbo.getBtmname());
                allCodeDO.setCreateCodeOid(cbo.getOid());
                allCodeDO.setSerialUnit(serialUnitString);
                allCodeDO.setSerialUnit(newSerialUnitString.get());
                String unFillSerial =serialUnFileStringList.size()==1?serialUnFileStringList.get(0)+ SERIAL_VALUE_SPACE:serialUnFileStringList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE));
                allCodeDO.setUnFillSerial(unFillSerial);
                allCodeDO.setLcStatus(cbo.getLcStatus());
@@ -204,7 +229,7 @@
                    if (!CollectionUtils.isEmpty(serialValueDOS)) {
                        CodeSerialValue serialValueDO = serialValueDOS.get(0);
                        log.info("oldmaxSerial--->"+serialValueDO.getMaxSerial()+"---- newmaxSerial---->"+maxSerial);
                        if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<maxSerial){
                        if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<VciBaseUtil.getDouble(maxSerial)){
                            serialValueDO.setMaxSerial(String.valueOf(maxSerial));
                            DefaultAttrAssimtUtil.updateDefaultAttrAssimt(serialValueDO);
                            editSerialValueList.add(serialValueDO);
@@ -295,7 +320,7 @@
                    List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
                    List<CodeAllCode> takeBack = codeAllCodes.stream().filter(e -> e.getLcStatus().equals("TakeBack")).collect(Collectors.toList());
                    if(codeAllCodes.size()>takeBack.size()){
                        throw new ServiceException("生成编码数据ID已有历史记录,请确认如下生成的ID数据:"+ addCodeDOs.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
                        throw new ServiceException("生成编码数据ID已有历史记录,请确认如下生成的ID数据:"+ codeAllCodes.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
                    }
                    for (CodeAllCode codeAllCode : takeBack) {
                        codeAllCode.setTs(new Date());
@@ -320,13 +345,6 @@
//                try {
                mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList);
                    // æäº¤äº‹åŠ¡
                    //transactionTemplate.getTransactionManager().commit(status);
//                }catch (Exception e){
//                    // å‡ºçŽ°å¼‚å¸¸æ—¶å›žæ»šäº‹åŠ¡
//                    transactionTemplate.getTransactionManager().rollback(status);
//                }
            }
            return codeList;
        }else {
@@ -341,7 +359,7 @@
                switchSecValue(secVO, secValueMap, classifyFullInfoBO, serialSecVOList, attrSecVOList, serialUnitList, secValueList);
            }
            //处理属性码段和流水码段
            Map<String/**流水码段的主键**/, Map<String/**流水依据**/, Double>> lastMaxSerialValueMap = new HashMap<>();
            Map<String/**流水码段的主键**/, Map<String/**流水依据**/, String>> lastMaxSerialValueMap = new HashMap<>();
            List<CodeAllCode> allCodeDOList = new ArrayList<>();
            //已经存储的最大流水号的内容
@@ -366,7 +384,7 @@
                switchAttrSecValue(attrSecVOList, cbo, thisSecValueList, attrSevIsSerialDepend, thisSerialUnitList);
                String serialUnitString = thisSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : thisSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
                switchSerialSecValue(serialSecVOList, attrSevIsSerialDepend, finalRuleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
                switchSerialSecValue(cbo,serialSecVOList, attrSevIsSerialDepend, finalRuleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0);
                //组装编码的值
                cbo.setId(thisSecValueList.stream().collect(Collectors.joining()));
@@ -375,9 +393,9 @@
                //把码段里面都找一下流水号
                for (int j = 0; j < serialSecVOList.size(); j++) {
                    CodeBasicSecVO secVO = serialSecVOList.get(j);
                    Double serialValue = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()).getOrDefault(serialUnitString, 0d);
                    String serialValue = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()).getOrDefault(serialUnitString, "");
                    if (serialValue != null) {
                        sb.append(String.valueOf(serialValue.longValue())).append(SERIAL_VALUE_SPACE);
                        sb.append(serialValue).append(SERIAL_VALUE_SPACE);
                    }
                }
                //要存储最后的全部allcode
@@ -386,54 +404,57 @@
            //处理最大流水
            saveSerialValue( finalRuleVO, lastMaxSerialValueMap, maxSerialValueMap);
            allCodeDOList.stream().forEach(
                allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode");allCode.setLctid("codeAllCodeLC");}
            );
            Map<String, String> statusMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus()));
            allCodeDOList.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> {
                allCodeDOList.stream().forEach(
                    allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode");allCode.setLctid("codeAllCodeLC");}
                );
                Map<String, String> statusMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus()));
                allCodeDOList.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> {
                s.setLcStatus(statusMap.get(s.getOid()));
            });
                });
                //通过ID来进行去重
                List<CodeAllCode> distinctCodeAllCOdes = allCodeDOList.stream().collect(Collectors
                    .collectingAndThen(
                        Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))),
                        ArrayList::new));
                if( distinctCodeAllCOdes.size() != allCodeDOList.size() ){
                    throw new ServiceException("编码数据重复,无法保存,请注意!");
                }
                QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
                wrapper.eq("CREATECODEBTM",allCodeDOList.get(0).getCreateCodeBtm());
                wrapper.in("ID",allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
                List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
                List<CodeAllCode> takeBack = codeAllCodes.stream().filter(e -> e.getLcStatus().equals("TakeBack")).collect(Collectors.toList());
                if(codeAllCodes.size()>takeBack.size()){
                    throw new ServiceException("生成编码数据ID已有历史记录,请确认如下生成的ID数据:"+ codeAllCodes.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
                }
            //通过ID来进行去重
            List<CodeAllCode> distinctCodeAllCOdes = allCodeDOList.stream().collect(Collectors
                .collectingAndThen(
                    Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))),
                    ArrayList::new));
            if( distinctCodeAllCOdes.size() != allCodeDOList.size() ){
                throw new ServiceException("编码数据重复,无法保存,请注意!");
            }
            QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
            wrapper.eq("CREATECODEBTM",allCodeDOList.get(0).getCreateCodeBtm());
            wrapper.in("ID",allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
            List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
            List<CodeAllCode> takeBack = codeAllCodes.stream().filter(e -> e.getLcStatus().equals("TakeBack")).collect(Collectors.toList());
            if(codeAllCodes.size()>takeBack.size()){
                throw new ServiceException("生成编码数据ID已有历史记录,请确认如下生成的ID数据:"+ allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
            }
            for (CodeAllCode codeAllCode : takeBack) {
                codeAllCode.setTs(new Date());
                codeAllCode.setLastModifyTime(new Date());
                codeAllCode.setLastModifier(AuthUtil.getUserId().toString());
                Iterator<CodeAllCode> iterator = allCodeDOList.iterator();
                while (iterator.hasNext()){
                    CodeAllCode next = iterator.next();
                    if(codeAllCode.getId().equals(next.getId())){
                        codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
                        codeAllCode.setLcStatus(next.getLcStatus());
                        iterator.remove();
                for (CodeAllCode codeAllCode : takeBack) {
                    codeAllCode.setTs(new Date());
                    codeAllCode.setLastModifyTime(new Date());
                    codeAllCode.setLastModifier(AuthUtil.getUserId().toString());
                    Iterator<CodeAllCode> iterator = allCodeDOList.iterator();
                    while (iterator.hasNext()){
                        CodeAllCode next = iterator.next();
                        if(codeAllCode.getId().equals(next.getId())){
                            codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
                            codeAllCode.setLcStatus(next.getLcStatus());
                            iterator.remove();
                        }
                    }
                }
            }
            if(takeBack.size()>0){
                codeAllCodeService.updateBatchById(takeBack);
            }
            codeAllCodeService.saveBatch(allCodeDOList);
//            iCodeWupinService.saveBatch(dataCBOList);
            mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList);
                mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(), dataCBOList);
                if(takeBack.size()>0){
                    codeAllCodeService.updateBatchById(takeBack);
                }
                codeAllCodeService.saveBatch(allCodeDOList);
//                iCodeWupinService.saveBatch(dataCBOList);
                // æäº¤äº‹åŠ¡
            //    transactionTemplate.getTransactionManager().commit(status);
            //}catch (Exception e){
                // å‡ºçŽ°å¼‚å¸¸æ—¶å›žæ»šäº‹åŠ¡
            //    transactionTemplate.getTransactionManager().rollback(status);
            //    throw e;
            //}
//            batchCBO.getCreateCbos().stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmName())).forEach(s -> {
//                s.setLcStatus(statusMap.get(s.getOid()));
//                try {
@@ -504,13 +525,27 @@
     * @param lastMaxSerialValueMap å°è£…后
     * @param firstData æ˜¯å¦ä¸ºç¬¬ä¸€æ¡æ•°æ®
     */
    private void switchSerialSecValue(List<CodeBasicSecVO> serialSecVOList,boolean attrSevIsSerialDepend,
    private void switchSerialSecValue(BaseModel cbo, List<CodeBasicSecVO> serialSecVOList,boolean attrSevIsSerialDepend,
                                      CodeRuleVO ruleVO,String serialUnitString,
                                      Map<String/**码段的主键**/,Map<String/**流水依据**/,CodeSerialValue>> maxSerialValueMap,List<String> thisSecValueList,
                                      Map<String/**码段的主键**/,Map<String/**流水依据**/, Double>> lastMaxSerialValueMap,boolean firstData){
                                      Map<String/**码段的主键**/,Map<String/**流水依据**/, String>> lastMaxSerialValueMap,boolean firstData){
        if (!CollectionUtils.isEmpty(serialSecVOList)) {
            Map<String,String> secIdserialValueMap=new LinkedHashMap<>();
            for (int j = 0; j < serialSecVOList.size(); j++) {
                CodeBasicSecVO secVO = serialSecVOList.get(j);
                String secVOValue="";
                AtomicReference<String> newSerialUnitString= new AtomicReference<>(serialUnitString);
                if(j==0){
                    secVOValue="";
                    newSerialUnitString.set(serialUnitString.replace("${" + secVO.getOid() + "}", secVOValue));
                }else{
                    CodeBasicSecVO upSecVO =serialSecVOList.get(j-1);
                    secIdserialValueMap.forEach((key,vaule)->{
                        newSerialUnitString.set(serialUnitString.replace("${"+key+"}", vaule));
                    });
                }
                if (attrSevIsSerialDepend || firstData) {
                    //如果属性码段也是依赖,则每次都要查询,如果属性码段不是依赖,则只查询一次
//                    Map<String, String> conditionMap = new HashMap<>();
@@ -519,8 +554,9 @@
//                    //这个字段是为了解决多个流水的问题
//                    conditionMap.put("codeSecOid", secVO.getOid());
                    QueryWrapper<CodeSerialValue> codeSerialWrapper = new QueryWrapper<>();
                    codeSerialWrapper.eq("codeRuleOid", ruleVO.getOid());
                    codeSerialWrapper.eq("serialUnit", serialUnitString);
                    codeSerialWrapper.eq("serialUnit", newSerialUnitString.get());
                    codeSerialWrapper.eq("codeSecOid", secVO.getOid());
                    List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(codeSerialWrapper);
                    if (!CollectionUtils.isEmpty(serialValueDOS)) {
@@ -530,25 +566,41 @@
                        maxSerialValueMap.put(secVO.getOid(), unitSerialMap);
                    }
                }
                Double startValue = null;
                if(maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString)){
                    startValue = VciBaseUtil.getDouble(maxSerialValueMap.get(secVO.getOid()).get(serialUnitString).getMaxSerial());
                String serialString="";
                String thisSerialValue = "";
                String startValue = null;
                if (maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(newSerialUnitString.get())) {
                    startValue = maxSerialValueMap.get(secVO.getOid()).get(newSerialUnitString.get()).getMaxSerial();
                }
                if(lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString)){
                if (lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(newSerialUnitString.get())) {
                    //说明多个申请,之前已经加了流水号了
                    startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(serialUnitString);
                    startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(newSerialUnitString.get());
                }
                Double thisSerialValue = 0d;
                if (startValue == null) {
                    //第一个编码
                    thisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
                } else {
                    //流水号肯定是数字
                    thisSerialValue = startValue + (j + 1) * secVO.getSerialStep();
                }
                //要看是否超过最大的流水值
                if (thisSerialValue >= secVO.getCodeFillLimit()) {
                    throw new VciBaseException("流水号已经超过允许的最大流水值{0}",new String[]{secVO.getCodeFillLimit().toString()});
                if(StringUtils.isNotBlank(secVO.getCustomCodeSerialClass())){//自定义流水处理
                    String currentFlowValue=startValue;
                    CodeCustomSerialDTO codeCustomSerialDTO=new CodeCustomSerialDTO();
                    codeCustomSerialDTO.setSerialUnitString(newSerialUnitString.get());
                    codeCustomSerialDTO.setSerialCodeCodeBasicSec(secVO);
                    codeCustomSerialDTO.setCurrentFlowValue(startValue);
                    codeCustomSerialDTO.setCodeBasicSecVOList(ruleVO.getSecVOList());
                    codeCustomSerialDTO.setCodeRuleOid(ruleVO.getOid());
                    codeCustomSerialDTO.setBaseModel(cbo);
                    thisSerialValue=customCodeSerial(secVO.getCustomCodeSerialClass(),codeCustomSerialDTO);
                    log.info(secVO.getCustomCodeSerialClassText()+"---->"+thisSerialValue);
                }else {
                    Double newThisSerialValue = 0d;
                    if (startValue == null) {
                        //第一个编码
                        newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart());
                    } else {
                        //流水号肯定是数字
                        newThisSerialValue = Double.parseDouble(startValue) + (j + 1) * secVO.getSerialStep();
                    }
                    //要看是否超过最大的流水值
                    if (newThisSerialValue >= secVO.getCodeFillLimit()) {
                        throw new VciBaseException("流水号已经超过允许的最大流水值{0}", new String[]{secVO.getCodeFillLimit().toString()});
                    }
                    thisSerialValue=String.valueOf(newThisSerialValue.intValue());
                }
                //要看补位的内容
                Integer fillLength = VciBaseUtil.getInt(secVO.getCodeFillLength());
@@ -556,8 +608,9 @@
                    //防止在添加的地方没有控制正确
                    fillLength = VciBaseUtil.getInt(secVO.getCodeSecLength());
                }
                String serialString = String.valueOf(thisSerialValue.longValue());
                serialString = thisSerialValue;
                serialString = fillString(fillLength, OsCodeFillTypeEnum.forValue(secVO.getCodeFillType()), serialString, secVO.getCodeFillSeparator());
                for (int z = 0; z < thisSecValueList.size(); z++) {
                    String secValue = thisSecValueList.get(z);
                    if (secValue.equalsIgnoreCase("${" + secVO.getOid() + "}")) {
@@ -565,13 +618,36 @@
                        thisSecValueList.set(z, joinPreffixAndSuffix(secVO, serialString));
                    }
                }
                Map<String, Double> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
                unitSerialMap.put(serialUnitString, thisSerialValue);
                secIdserialValueMap.put(secVO.getOid(),thisSerialValue);//记录流水码段当前的值
                Map<String, String> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>());
                unitSerialMap.put(newSerialUnitString.get(), String.valueOf(thisSerialValue));
                lastMaxSerialValueMap.put(secVO.getOid(),unitSerialMap);
            }
        }
    }
     private String customCodeSerial(String className, CodeCustomSerialDTO codeCustomSerialDTO){
        String result = "";
        try {
            Class classInstance=Class.forName(className);
            Object obj =classInstance.newInstance();
            Method method= classInstance.getMethod("serialGenerate",CodeCustomSerialDTO.class);
            method.setAccessible(Boolean.TRUE);
            //method.invoke(obj);
            Object  o= method.invoke(obj,codeCustomSerialDTO);
            result= Func.isEmpty(o) ?"":o.toString();
        } catch (ClassNotFoundException e) {
            throw new VciBaseException("未找到自定义流水算法类文件");
        } catch (InvocationTargetException e) {
            throw new VciBaseException("执行自定义流水算法处理方法出现异常");
        } catch (NoSuchMethodException e) {
            throw new VciBaseException("未找到自定义流水算法处理方法");
        } catch (IllegalAccessException e) {
            throw new VciBaseException("执行自定义流水算法处理方法出现异常");
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * è½¬æ¢ç å€¼çš„内容
     * @param secVO ç æ®µçš„内容
@@ -769,7 +845,7 @@
     * @param maxSerialValueMap ä¾æ®å­˜å‚¨çš„æœ€å¤§æµæ°´çš„内容
     */
    private void saveSerialValue(CodeRuleVO ruleVO,
                                 Map<String/**码段的主键**/,Map<String, Double>> lastMaxSerialValueMap,
                                 Map<String/**码段的主键**/,Map<String, String>> lastMaxSerialValueMap,
                                 Map<String/**码段的主键**/,Map<String, CodeSerialValue>> maxSerialValueMap){
        List<CodeSerialValue> editSerialValueDOList = new ArrayList<>();
        List<CodeSerialValue> addSerialValueDOList = new ArrayList<>();
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeBasicSecMapper.xml
@@ -56,6 +56,7 @@
        <result property="codeFillFlag" column="CODEFILLFLAG" jdbcType="VARCHAR"/>
        <result property="customCodeSerialClass" column="CUSTOMCODESERIALCLASS" jdbcType="VARCHAR"/>
        <result property="customCodeSerialClassText" column="CUSTOMCODESERIALCLASSTEXT" jdbcType="VARCHAR"/>
        <result property="customCodeSerialType" column="CUSTOMCODESERIALTYPE" jdbcType="VARCHAR"/>
        <result property="matchClassifyValueFlag" column="MATCHCLASSIFYVALUEFLAG" jdbcType="VARCHAR"/>
        <result property="parentClassifySecOid" column="PARENTCLASSIFYSECOID" jdbcType="VARCHAR"/>
        <result property="parentClassifySecText" column="b__name" jdbcType="VARCHAR"/>