ludc
2023-11-17 ac8e8998235f247365280d1a1632115c43b10037
Merge remote-tracking branch 'origin/master'

# Conflicts:
# Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
已修改15个文件
已添加2个文件
485 ■■■■ 文件已修改
Source/UBCS-WEB/src/components/FormTemplate/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTreeform.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java 166 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeBasicSecMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -320,14 +320,16 @@
    },
    getFormData(form) {
      this.form = form;
      //属性码段赋值
      if (this.attrList) {
        this.attrList.forEach(item => {
          if (this.form.hasOwnProperty(item.referAttributeId)) {
            this.codeApplyForm[item.oid] = this.form[item.referAttributeId] ;
            this.codeApplyForm[item.oid] = this.form[item.referAttributeId];
          }
        })
      }
    },
    //属性码段赋值
    attrListForm(attrListForm){
      this.attrList=attrListForm;
    },
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTreeform.vue
@@ -399,7 +399,6 @@
              activeColor: "#13ce66",
              inactiveColor: "#ff4949",
              labelWidth:160,
              value:1,
              dicData: [{
                label: '否',
                value: 0
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue
@@ -867,7 +867,7 @@
  methods: {
    // switch
    switchChange(){
      this.TreeAddform.isParticipateCheck = this.TreeAddform.codeKeyAttrValue ? 1 : 0;
      this.TreeAddform.isParticipateCheck = this.TreeAddform.codeKeyAttrValue === true ? 1 : 0;
      // console.log(this.TreeAddform.isParticipateCheck)
    },
    //存储的业务类型关闭
@@ -1154,10 +1154,14 @@
    },
    //树节点取消事件
    TreeEscHandler() {
      this.TreeAddform = {};
      this.TreeAddFormVisible = false;
      for (let key in this.TreeAddform) {
        if (key !== 'codeKeyAttrValue' && key !== 'isParticipateCheck') {
          this.TreeAddform[key] = "";
        }
      }
      this.TreeAddform.codeKeyAttrValue = true;
      this.TreeAddform.isParticipateCheck = 1;
      this.TreeAddFormVisible = false;
      // å…³é—­å¼¹çª—清空校验
      this.$refs.myForm.clearValidate();
    },
@@ -1371,7 +1375,7 @@
          this.crudOid = ''
        }
        this.TreeList = res3.data.data;
        if(!this.TreeList.isParticipateCheck){
        if(this.TreeList.isParticipateCheck === null || this.TreeList.isParticipateCheck === undefined ||this.TreeList.isParticipateCheck === ""){
          this.$set(this.TreeList,"isParticipateCheck",1)
          return
        }
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
@@ -983,10 +983,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());
                }
            }
@@ -3603,12 +3603,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}")
@@ -2777,10 +2777,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());
                }
            }
@@ -3150,7 +3150,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));
@@ -3208,7 +3208,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));
@@ -4086,7 +4086,6 @@
            }
        }
    }
    private List<ClientBusinessObject> ChangeMapTOClientBusinessObjects(List<Map<String,String>> oldDataMap){
        List<ClientBusinessObject> clientBusinessObjectList=new ArrayList<>();
        oldDataMap.stream().forEach(dataMap->{
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -1,5 +1,7 @@
package com.vci.ubcs.code.service.impl;
import com.vci.ubcs.code.algorithm.CustomSerialEnum;
import com.vci.ubcs.code.dto.CodeCustomSerialDTO;
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
@@ -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,57 @@
                    //    }
                    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 = 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 +204,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 +227,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);
@@ -318,7 +341,16 @@
                    codeAllCodeService.saveBatch(addCodeDOs);
                }
//                try {
                mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList);
                    // æäº¤äº‹åŠ¡
                    //transactionTemplate.getTransactionManager().commit(status);
//                }catch (Exception e){
//                    // å‡ºçŽ°å¼‚å¸¸æ—¶å›žæ»šäº‹åŠ¡
//                    transactionTemplate.getTransactionManager().rollback(status);
//                }
            }
            return codeList;
        }else {
@@ -382,10 +414,12 @@
                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
@@ -414,7 +448,7 @@
                    if(codeAllCode.getId().equals(next.getId())){
                        codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
                        codeAllCode.setLcStatus(next.getLcStatus());
                        iterator.remove();
                        //iterator.remove();
                    }
                }
            }
@@ -499,8 +533,21 @@
                                      Map<String/**码段的主键**/,Map<String/**流水依据**/,CodeSerialValue>> maxSerialValueMap,List<String> thisSecValueList,
                                      Map<String/**码段的主键**/,Map<String/**流水依据**/, Double>> 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<>();
@@ -509,8 +556,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)) {
@@ -520,25 +568,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());
@@ -548,6 +612,7 @@
                }
                String serialString = String.valueOf(thisSerialValue.longValue());
                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() + "}")) {
@@ -555,11 +620,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;
    }
    /**
@@ -759,7 +849,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"/>