package com.vci.ubcs.code.algorithm; import com.alibaba.nacos.common.utils.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.vci.ubcs.code.annotation.MdmSerialAlgorithm; import com.vci.ubcs.code.annotation.MdmSerialAlgorithmMethod; import com.vci.ubcs.code.dto.CodeCustomSerialDTO; import com.vci.ubcs.code.entity.CodeAllCode; import com.vci.ubcs.code.enumpack.CodeBZOperationTypeEnum; import com.vci.ubcs.code.service.ICodeAllCodeService; import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.VciBaseUtil; import io.reactivex.internal.util.LinkedArrayList; import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.management.StringValueExp; import java.util.*; import java.util.stream.Collectors; import static com.vci.ubcs.code.constant.MdmEngineConstant.*; /**** * 自定义罗马流水算法自定义类 */ @MdmSerialAlgorithm(text = "自定义罗马流水",serialType="custom_serial_roman",description = "自定义罗马流水算法") @Component public class CustomRomanSerialAlgorithmExample { /** * 编码规则的服务 */ @Autowired private ICodeAllCodeService codeAllCodeService; /*** * 操作类型 */ @Value("${bzApply.operationType:operationType}") private String operationType; /*** * 是否系列 */ @Value("${bzApply.isSeries:isSeries}") private String isSeries; /*** * 是否变更系列 */ @Value("${bzApply.isEditSeries:isEditSeries}") private String isEditSeries; /*** * 源标准号 */ @Value("${bzApply.oldCode:oldCode}") private String oldCode; /*** *发布时间 */ @Value("${bzApply.releaseTime:releaseTime}") private String releaseTime; /*** * 控制是否写入值的码段名称 */ @Value("${bzApply.yearSecName:年代号}") private String yearSecName; /** * 生成罗马流水号的方法 * @return 流水号的信息 */ @MdmSerialAlgorithmMethod public String serialGenerate(CodeCustomSerialDTO codeCustomSerialDTO){ // boolean isSeriesValue=false; boolean isCrete=false;//是否成产罗马顺序号 String romanValue=""; List codeBasicSecVOList= codeCustomSerialDTO.getCodeBasicSecVOList(); int yearSecValue=0;//年代号 List secValueList=codeCustomSerialDTO.getSecValueList(); String serialUnitString=codeCustomSerialDTO.getSerialUnitString(); //源标准类型 boolean isSeriesValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(isSeries)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(isSeries))&&codeCustomSerialDTO.getBaseModel().getData().get(isEditSeries).equals("true")?true:false; //是否变更系列 boolean isEditSeriesValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(isEditSeries)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(isEditSeries))&&codeCustomSerialDTO.getBaseModel().getData().get(isEditSeries).equals("true")?true:false; //如果标修订为标准,原有表准系列号不变,则比较年代号,如果年代号跨年(次年1月后则为跨年) String operationTypeValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(operationType)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(operationType))?codeCustomSerialDTO.getBaseModel().getData().get(operationType):""; //发布时间 String releaseTimeValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(releaseTime)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(releaseTime))?codeCustomSerialDTO.getBaseModel().getData().get(releaseTime):""; if(operationTypeValue.equals(CodeBZOperationTypeEnum.CODE_BZ_AMENDMENT.getValue())){//如果是修订 //源标准号 String oldCodeValue=codeCustomSerialDTO.getBaseModel().getData().containsKey(oldCode)&&StringUtils.isNotBlank(codeCustomSerialDTO.getBaseModel().getData().get(oldCode))?codeCustomSerialDTO.getBaseModel().getData().get(oldCode):""; if(StringUtils.isNotBlank(oldCodeValue)){ //还需要修改allCode的生命周期 QueryWrapper allCodeWrapper = new QueryWrapper<>(); allCodeWrapper.in("id", VciBaseUtil.str2List(oldCodeValue)); ListcodeAllcodeList=codeAllCodeService.selectByWrapper(allCodeWrapper); if(!CollectionUtils.isEmpty(codeAllcodeList)){ String codeDelimit=codeAllcodeList.get(0).getCodeDelimit(); String[] secValues= StringUtils.splitByWholeSeparatorPreserveAllTokens(codeDelimit,SERIAL_VALUE_SPACE); int yearIndex=0; if((!isSeriesValue&&!isEditSeriesValue)||(isSeriesValue&&isSeriesValue)){//如果是标准修订为标准,或者系列修订为系列时候,则判断年代号 for (int i=0;iserialUnitStringList=new ArrayList<>(); serialUnitStringList= Arrays.asList(serialUnitStrings); int newYear=0; int month=0; if(yearMoths.length>2){ String year=yearMoths[0]; if(year.length()>String.valueOf(yearSecValue).length()){//有时候发布时间的年长度大于码段的长度,则需要截取后2位 newYear= Integer.parseInt(year.substring(2)); }else { newYear=Integer.parseInt(year); } month=Integer.parseInt(yearMoths[1]); } if(newYear>yearSecValue&&month>1){ secValueList.set(yearIndex,String.valueOf(newYear)); serialUnitStringList.set(yearIndex, String.valueOf(newYear)); codeCustomSerialDTO.setSecValueList(secValueList); String newSerialUnitString = serialUnitStringList.size() == 0 ? EMPTY_SERIAL_UNIT : serialUnitStringList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE)); codeCustomSerialDTO.setSerialUnitString(newSerialUnitString); }else{ isCrete=true; } } } } } } if(isCrete){ CodeBasicSecVO secVO= codeCustomSerialDTO.getSerialCodeCodeBasicSec(); String currentFlowValue=codeCustomSerialDTO.getCurrentFlowValue(); Double newThisSerialValue = 0d; if(StringUtils.isBlank(currentFlowValue)){ //第一个编码 newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart()); }else { //流水号肯定是数字 //将罗马流水转为数字流水 int arabicValue=VciBaseUtil.convertRomanToArabic(currentFlowValue); newThisSerialValue = (double)(arabicValue + secVO.getSerialStep()) ; } //要看是否超过最大的流水值 if (newThisSerialValue >= secVO.getCodeFillLimit()) { throw new VciBaseException("流水号已经超过允许的最大流水值{0}", new String[]{secVO.getCodeFillLimit().toString()}); } //将数字流水转为罗马流水 romanValue=VciBaseUtil.convertArabicToRoman(newThisSerialValue.intValue()); } return romanValue; } }