Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
@@ -2,52 +2,63 @@
import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.vci.ubcs.code.dto.CodeBasicSecDTO;
import com.vci.ubcs.code.entity.CodeBasicSec;
import com.vci.ubcs.code.entity.CodeClassifyValue;
import com.vci.ubcs.code.entity.CodeFixedValue;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.dto.CodeOrderSecDTO;
import com.vci.ubcs.code.entity.*;
import com.vci.ubcs.code.enumpack.*;
import com.vci.ubcs.code.lifecycle.CodeRuleLC;
import com.vci.ubcs.code.mapper.CodeBasicSecMapper;
import com.vci.ubcs.code.mapper.CodeClassifyValueMapper;
import com.vci.ubcs.code.mapper.CodeFixedValueMapper;
import com.vci.ubcs.code.service.ICodeBasicSecService;
import com.vci.ubcs.code.service.ICodeClassifyValueService;
import com.vci.ubcs.code.service.ICodeFixedValueService;
import com.vci.ubcs.code.service.ICodeRuleService;
import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO;
import com.vci.ubcs.code.vo.pagemodel.CodeFixedValueVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.code.mapper.CodeSerialValueMapper;
import com.vci.ubcs.code.service.*;
import com.vci.ubcs.code.vo.CodeReferConfigVO;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.code.wrapper.CodeBasicSecWrapper;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.omd.enums.EnumEnum;
import com.vci.ubcs.starter.enumpack.CodeTableNameEnum;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.util.MdmBtmTypeConstant;
import com.vci.ubcs.starter.util.UBCSCondition;
import com.vci.ubcs.starter.util.UBCSSqlKeyword;
import com.vci.ubcs.starter.web.enumpck.OsCodeFillTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import com.vci.ubcs.starter.web.pagemodel.UIFormReferVO;
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.starter.web.util.WebUtil;
import com.vci.ubcs.system.entity.DictBiz;
import com.vci.ubcs.system.feign.IDictBizClient;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
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 javax.annotation.Resource;
import java.rmi.ServerException;
import java.util.*;
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.*;
import static com.vci.ubcs.code.constant.MdmEngineConstant.EMPTY_SERIAL_UNIT;
import static com.vci.ubcs.code.constant.MdmEngineConstant.SERIAL_UNIT_SPACE;
/**
 * 码段基础信息服务接口
@@ -84,6 +95,9 @@
   private ICodeClassifyValueService codeClassifyValueService;
   @Resource
   private ICodeReferConfigService codeReferConfigService;
   @Resource
   private IDictBizClient iDictBizClient;
   /**
@@ -93,9 +107,15 @@
   private ICodeFixedValueService fixedValueService;
   /**
    * 流水号的相关的信息
    */
   @Resource
   private CodeSerialValueMapper serialValueMapper;
   /**
    * 上层分类码段的属性名称
    */
   private static  final String PARENT_FIELD_NAME = "parentclassifysecoid";
   private static  final String PARENT_FIELD_NAME = "parentClassifySecOid";
   /**
    * 上级分类码值的属性名称
@@ -104,19 +124,27 @@
   /**
    * 查询所有的码段基础信息
    *
    * @param page 查询条件
    * @param codeBasicSecVO   分页和排序
    * @param conditionMap 查询条件
    * @param query 分页对象
    * @return 执行结果
    * @throws VciBaseException 查询条件和分页出错的时候会抛出异常
    */
   @Override
   public IPage<CodeBasicSecVO> gridCodeBasicSec(IPage<CodeBasicSecVO> page, CodeBasicSecVO codeBasicSecVO) throws VciBaseException {
      if(Func.isEmpty(codeBasicSecVO.getPkCodeRule()) || Func.isBlank(codeBasicSecVO.getPkCodeRule())){
   public IPage<CodeBasicSecVO> gridCodeBasicSec(Query query, Map<String,Object> conditionMap) throws ServiceException {
      if(Func.isEmpty(Func.isEmpty(conditionMap.get(CodeTableNameEnum.PL_CODE_BASICSEC.getText()+".pkCodeRule")))){
         return null;
      }
      List<CodeBasicSec> codeBasicSecs = codeBasicSecMapper.selectCodeBasicSecPage(page, codeBasicSecVO);
      return page.setRecords(CodeBasicSecWrapper.build().listVO(codeBasicSecs));
      // 联表查询 ,设置表别名,表别名默认就采用表名小写,配置高级查询的时候就需要根据这个来对where条件进行配置
      MPJLambdaWrapper<CodeBasicSec> mpjLambdaWrapper = new MPJLambdaWrapper<>(CodeBasicSec.class, CodeTableNameEnum.PL_CODE_BASICSEC.getText())
         .selectAll(CodeBasicSec.class)
         .selectAs(CodeClassify::getName, CodeBasicSec::getReferCodeClassifyOidName)
         .leftJoin(CodeClassify.class, CodeTableNameEnum.PL_CODE_CLASSIFY.getText(), CodeClassify::getOid, CodeBasicSec::getReferCodeClassifyOid)
         .leftJoin(CodeBasicSec.class,CodeTableNameEnum.PL_CODE_BASICSEC.getText()+1,CodeBasicSec::getOid,CodeBasicSec::getParentClassifySecOid
            ,ext->ext.selectAs(CodeBasicSec::getName,CodeBasicSec::getParentClassifySecText));
      // 添加where条件
      UBCSSqlKeyword.buildConditionByAs(conditionMap,mpjLambdaWrapper,CodeTableNameEnum.PL_CODE_BASICSEC.getText());
      IPage<CodeBasicSec> codeBasicSecIPage = codeBasicSecMapper.selectPage(UBCSCondition.getPage(query), mpjLambdaWrapper);
      return CodeBasicSecWrapper.build().pageVO(codeBasicSecIPage);
   }
   /**
@@ -126,7 +154,7 @@
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean batchDeleteSecByCodeRuleOid(String codeRuleOid) {
   public boolean batchDeleteSecByCodeRuleOid(String codeRuleOid) throws ServiceException {
      VciBaseUtil.alertNotNull(codeRuleOid,"编码规则主键");
      // 1、通过pkcoderule作为条件,先查询要删除基础码段
      List<CodeBasicSec> deleteList = this.codeBasicSecMapper.selectList(Wrappers.<CodeBasicSec>query().eq("pkcoderule", codeRuleOid));
@@ -143,9 +171,11 @@
         // 将要作为删除条件的值放在一个集合里面
         Set<String> fixedSecOidSet = fixedSecList.stream().map(CodeBasicSec::getOid).collect(Collectors.toSet());
         // 通过外键进行查询
         List<CodeFixedValue> fixedValueS = fixedValueMapper.selectList(Wrappers.<CodeFixedValue>query().lambda().in(CodeFixedValue::getCodeFixedSecOid,fixedSecOidSet));
         // 根据查询出来的id执行固定码段执行删除
         deletFlag = fixedValueMapper.deleteBatchIds(fixedValueS.stream().map(CodeFixedValue::getOid).collect(Collectors.toSet()))>0;
         List<CodeFixedValue> fixedValues = fixedValueMapper.selectList(Wrappers.<CodeFixedValue>query().lambda().in(CodeFixedValue::getCodeFixedSecOid,fixedSecOidSet));
         if(!fixedValues.isEmpty()){
            // 根据查询出来的id执行固定码段执行删除
            deletFlag = fixedValueMapper.deleteBatchIds(fixedValues.stream().map(CodeFixedValue::getOid).collect(Collectors.toSet()))>0;
         }
      }
      // 4、再删除分类码段
      List<CodeBasicSec> classifySecList = deleteList.stream().filter(sec -> {
@@ -155,9 +185,11 @@
         // 将要作为删除条件的值放在一个集合里面
         Set<String> classifySecOidSet = classifySecList.stream().map(CodeBasicSec::getOid).collect(Collectors.toSet());
         // 通过外键进行查询
         List<CodeClassifyValue> fixedValueS = codeClassifyValueMapper.selectList(Wrappers.<CodeClassifyValue>query().lambda().in(CodeClassifyValue::getCodeClassifySecOid,classifySecOidSet));
         // 根据查询出来的主键id执行固定码段执行删除
         deletFlag = fixedValueMapper.deleteBatchIds(fixedValueS.stream().map(CodeClassifyValue::getOid).collect(Collectors.toSet()))>0;
         List<CodeClassifyValue> codeClassifyValues = codeClassifyValueMapper.selectList(Wrappers.<CodeClassifyValue>query().lambda().in(CodeClassifyValue::getCodeClassifySecOid,classifySecOidSet));
         if(!codeClassifyValues.isEmpty()){
            // 根据查询出来的主键id执行固定码段执行删除
            deletFlag = codeClassifyValueMapper.deleteBatchIds(codeClassifyValues.stream().map(CodeClassifyValue::getOid).collect(Collectors.toSet()))>0;
         }
      }
      return deletFlag;
   }
@@ -169,7 +201,7 @@
    * @return 有空的则传key-属性名 value-字段含义,没有空的则传 key-success value-true
    */
   @Override
   public KeyValue checkAttrNullableBySecType(CodeBasicSecDTO codeBasicSecDTO) {
   public KeyValue checkAttrNullableBySecType(CodeBasicSecDTO codeBasicSecDTO) throws ServiceException {
      VciBaseUtil.alertNotNull(codeBasicSecDTO.getSecType(), "码段分类");
      String secType = codeBasicSecDTO.getSecType();
      HashMap<String, String> attrMap = JSONObject.parseObject(JSONObject.toJSONString(codeBasicSecDTO), HashMap.class);
@@ -198,7 +230,7 @@
    * @return 执行结果
    * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常
    */
   @Override
    @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean addSave(CodeBasicSecDTO codeBasicSecDTO) throws VciBaseException {
      VciBaseUtil.alertNotNull(codeBasicSecDTO, "需要添加的数据对象",codeBasicSecDTO.getPkCodeRule(),"编码规则的主键");
@@ -210,26 +242,17 @@
      if (! "success".equals(attrKv.getKey())){
         throw new VciBaseException(attrKv.getValue() + "不能为空");
      }
      //将DTO转换为DO
      CodeBasicSec codeBasicSecDO = new CodeBasicSec();
      BeanUtilForVCI.copyPropertiesIgnoreCase(codeBasicSecDTO, codeBasicSecDO);
      //text转换
      codeBasicSecDO.setSecTypeText(CodeSecTypeEnum.getTextByValue(codeBasicSecDTO.getSecType()));
      codeBasicSecDO.setCodeLevelTypeText(CodeLevelTypeEnum.getTextByValue(codeBasicSecDTO.getCodeLevelType()));
      codeBasicSecDO.setCodeSecLengthTypeText(CodeSecLengthTypeEnum.getTextByValue(codeBasicSecDTO.getCodeSecLengthType()));
      codeBasicSecDO.setValueCutTypeText(CodeCutTypeEnum.getValueByText(codeBasicSecDTO.getValueCutType()));
      codeBasicSecDO.setCodeGetValueTypeText(CodeGetValueTypeEnum.getValueByText(codeBasicSecDTO.getCodeGetValueType()));
      codeBasicSecDO.setSecTypeText(EnumCache.getValue(EnumEnum.CODE_SEC_TYPE,codeBasicSecDTO.getSecType()));
      codeBasicSecDO.setCodeLevelTypeText(EnumCache.getValue(EnumEnum.CODE_LEVEL_TYPE,codeBasicSecDTO.getCodeLevelType()));
      codeBasicSecDO.setCodeSecLengthTypeText(EnumCache.getValue(EnumEnum.CODE_SEC_LENGTH,codeBasicSecDTO.getCodeSecLengthType()));
      codeBasicSecDO.setValueCutTypeText(EnumCache.getValue(EnumEnum.CODE_CUT_TYPE,codeBasicSecDTO.getValueCutType()));
      codeBasicSecDO.setCodeGetValueTypeText(EnumCache.getValue(EnumEnum.CODE_GET_VALUE_TYPE,codeBasicSecDTO.getCodeGetValueType()));
      //填充一些默认值
      codeBasicSecDO.setOid(VciBaseUtil.getPk());
      codeBasicSecDO.setRevisionOid(VciBaseUtil.getPk());
      codeBasicSecDO.setNameOid(VciBaseUtil.getPk());
      codeBasicSecDO.setBtmname(MdmBtmTypeConstant.CODE_BASIC_SEC);
      codeBasicSecDO.setTs(new Date());
      codeBasicSecDO.setCreateTime(new Date());
      codeBasicSecDO.setCreator(AuthUtil.getUserId().toString());
      codeBasicSecDO.setLastModifier(AuthUtil.getUserId().toString());
      codeBasicSecDO.setLastModifyTime(new Date());
      DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeBasicSecDO, MdmBtmTypeConstant.CODE_BASIC_SEC);
      //排序号,默认等于当前已有的数量加1
      Long total = codeBasicSecMapper.selectCount(Wrappers.<CodeBasicSec>query()
         .lambda()
@@ -245,29 +268,88 @@
         && StringUtils.isBlank(codeBasicSecDO.getCodeFillSeparator())){
         throw new VciBaseException("当补位方式为左补位或者右补位的时候,补位字符不能为空");
      }
      CodeReferConfigVO codeReferConfigVO = null;
      //引用码段的时候,需要判断参照的信息是否正确
      if(CodeSecTypeEnum.CODE_REFER_SEC.getValue().equalsIgnoreCase(codeBasicSecDO.getSecType())){
         if(StringUtils.isBlank(codeBasicSecDO.getReferConfig())){
            throw new VciBaseException("引用码段的时候,需要填写 参照配置 的内容");
            throw new VciBaseException("引用码段的时候,需要填写参照配置的内容");
         }
         try{
            JSONObject.parseObject(codeBasicSecDO.getReferConfig(), UIFormReferVO.class);
            //JSONObject.parseObject(codeBasicSecDO.getReferConfig(), UIFormReferVO.class);
            codeReferConfigVO = JSONObject.parseObject(codeBasicSecDO.getReferConfig(), CodeReferConfigVO.class);
            // 将参照配置进行持久化,给用户提供可可选择参照配置的方式
         }catch (Throwable e){
            throw new VciBaseException("引用码段的时候,参照配置的内容的格式不正确,",new String[0],e);
         }
         // 判断是否为引用码段,如果是应用码段的话,为了适配前端组件,这里要对表进行处理一下,按照以前的参照格式进行转换
         codeBasicSecDO.setReferValueInfo(referConfigToUIUiTable(codeReferConfigVO));
         if(Func.toBoolean(codeReferConfigVO.getIsPersistence())){
            codeReferConfigService.insert(codeReferConfigVO);
         }
      }
      boolean resBoolean = codeBasicSecMapper.insert(codeBasicSecDO) > 0;
      //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
      if(StringUtils.isNotBlank(codeBasicSecDO.getCodeFillSeparator())){
         DictBiz dictBiz = new DictBiz();
         dictBiz.setCode(MdmBtmTypeConstant.CODE_BASIC_SEC);
         dictBiz.setDictKey("codefileseparator");
         dictBiz.setCode("codeFillSeparator");
         dictBiz.setDictKey(codeBasicSecDO.getCodeFillSeparator());
         dictBiz.setDictValue(codeBasicSecDO.getCodeFillSeparator());
         //从原来的charService(可输可选)更改为调用omd中的接口来实现
         iDictBizClient.getCheck(dictBiz);
         //charService.save(MdmBtmTypeConstant.CODE_BASIC_SEC,"codefileseparator",codeBasicSecDO.getCodeFillSeparator(),sessionInfo);
      }
      return resBoolean;
   }
   /**
    * 将referconfig转换为JSON格式的UIFormReferVO
    * @param codeReferConfig
    * @return
    */
   private String referConfigToUIUiTable(CodeReferConfigVO codeReferConfig){
      // 拷贝为以前的老对象
      UIReferConfigFormVO uiFormReferVO = new UIReferConfigFormVO();
      BeanUtil.copy(codeReferConfig,uiFormReferVO);
      // 表格的自定义定义
      UITableConfigVO uiTableConfigVO = new UITableConfigVO();
      uiTableConfigVO.setPage(new UITablePageVO(codeReferConfig.getLimit(),1));
      // 列表的列的信息转换
      List<TableColVO> uiTableFieldVOs = new ArrayList<>();
      // 快速查询列
      List<TableColVO> queryColumns = new ArrayList<>();
      if(!CollectionUtils.isEmpty(codeReferConfig.getCodeShowFieldConfigVOS())){
         codeReferConfig.getCodeShowFieldConfigVOS().stream().forEach(showField ->{
            TableColVO tableColVO = new TableColVO();
            BeanUtil.copy(showField,tableColVO);
            tableColVO.setSortField(showField.getAttrSortField());
            uiTableFieldVOs.add(tableColVO);
            if(Func.toBoolean(showField.getIsQuery())){
               TableColVO tableQueryColumns = new TableColVO();
               BeanUtil.copy(showField,tableQueryColumns);
               tableColVO.setSortField(showField.getAttrSortField());
               queryColumns.add(tableQueryColumns);
            }
         });
      }
      // 显示的列
      uiTableConfigVO.setCols(uiTableFieldVOs);
      // 快速查询列
      uiTableConfigVO.setQueryColumns(queryColumns);
      //set给表格配置属性
      uiFormReferVO.setTableConfig(uiTableConfigVO);
      //字段名不一致,需要手动set
      uiFormReferVO.setMuti(Func.toBoolean(codeReferConfig.getIsMuti()));
      uiFormReferVO.setInitSort(new UIFieldSortVO(codeReferConfig.getSortField(),codeReferConfig.getSortType()));
      // 筛选条件
      HashMap<String, String> whereMap = new HashMap<>();
      if(!codeReferConfig.getCodeSrchCondConfigVOS().isEmpty()){
         codeReferConfig.getCodeSrchCondConfigVOS().stream().forEach(srch->{
            whereMap.put(srch.getFilterField()+srch.getFilterType(),srch.getFilterValue());
         });
      }
      uiFormReferVO.setWhere(whereMap);
      return JSONObject.toJSONString(uiFormReferVO);
   }
   /**
@@ -279,16 +361,18 @@
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean editSave(CodeBasicSecDTO codeBasicSecDTO) throws VciBaseException {
   public boolean editSave(CodeBasicSecDTO codeBasicSecDTO) throws ServerException {
      VciBaseUtil.alertNotNull(codeBasicSecDTO, "需要添加的数据对象");
      KeyValue attrKv = checkAttrNullableBySecType(codeBasicSecDTO);
      if (! "success".equals(attrKv.getKey())){
      if (!"success".equals(attrKv.getKey())){
         throw new VciBaseException(attrKv.getValue() + "不能为空");
      }
      //将DTO转换为DO
      CodeBasicSec codeBasicSecDO = selectByOid(codeBasicSecDTO.getOid());
      DefaultAttrAssimtUtil.updateDefaultAttrAssimt(codeBasicSecDO);
      boolean status = codeRuleService.checkEditDelStatus(codeRuleService.getObjectByOid(codeBasicSecDO.getPkCodeRule()).getLcStatus());
      boolean resBoolean;
      CodeReferConfigVO codeReferConfigVO = null;
      if (!status){
         //返回错误信息
         throw new VciBaseException("编码规则不允许编辑或删除!");
@@ -301,23 +385,46 @@
         }
         //引用码段的时候,需要判断参照的信息是否正确
         if(CodeSecTypeEnum.CODE_REFER_SEC.getValue().equalsIgnoreCase(codeBasicSecDO.getSecType())){
            if(StringUtils.isBlank(codeBasicSecDO.getReferConfig())){
               throw new VciBaseException("引用码段的时候,需要填写 参照配置 的内容");
            if(StringUtils.isBlank(codeBasicSecDTO.getReferConfig())){
               throw new VciBaseException("引用码段的时候,需要填写参照配置的内容");
            }
            try{
               JSONObject.parseObject(codeBasicSecDO.getReferConfig(), UIFormReferVO.class);
               // JSONObject.parseObject(codeBasicSecDO.getReferConfig(), UIFormReferVO.class);
               codeReferConfigVO = JSONObject.parseObject(codeBasicSecDTO.getReferConfig(), CodeReferConfigVO.class);
            }catch (Throwable e){
               throw new VciBaseException("引用码段的时候,参照配置的内容的格式不正确,",new String[0],e);
            }
            // 判断是否为引用码段,如果是引用码段的话,为了适配前端组件,这里要对表进行处理一下,按照以前的参照格式进行转换
            codeBasicSecDO.setReferValueInfo(referConfigToUIUiTable(codeReferConfigVO));
            if(codeReferConfigVO.getIsPersistence()=="true"){
               codeReferConfigService.insert(codeReferConfigVO);
            }
         }
         revisionModelUtil.copyFromDTOIgnore(codeBasicSecDTO, codeBasicSecDO);
         // revisionModelUtil.copyFromDTOIgnore(codeBasicSecDTO, codeBasicSecDO);//此处的拷贝会把referValueInfo的值给覆盖掉,需要重新赋值
         BaseModel tempModel = new BaseModel();
         BeanUtilForVCI.copyPropertiesIgnoreCase(codeBasicSecDO, tempModel);
         BeanUtil.copyProperties(codeBasicSecDTO, codeBasicSecDO,"referValueInfo");
         BeanUtilForVCI.copyPropertiesIgnoreCase(tempModel, codeBasicSecDO);
         codeBasicSecDO.setId(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getValueFromField("id", codeBasicSecDTO)));
         codeBasicSecDO.setName(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getValueFromField("name", codeBasicSecDTO)));
         codeBasicSecDO.setDescription(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getValueFromField("description", codeBasicSecDTO)));
         resBoolean = codeBasicSecMapper.updateById(codeBasicSecDO)>0;
         // 从分类码段或固定码段改为其他码段时,判断用户是否选择了清空码值
         if(codeBasicSecDTO.getIsClearValue()){
            // 分类码值清空
            if(codeBasicSecDTO.getSecType().equals(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue())){
               codeClassifyValueService.deleteClassifyValueBySecOid(codeBasicSecDTO.getOid());
            }else {
               //固定码值清空
               fixedValueService.deleteFixedValueBySecOid(codeBasicSecDTO.getOid());
            }
         }
         //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
         if(StringUtils.isNotBlank(codeBasicSecDO.getCodeFillSeparator())){
            //这儿目前需要改 2023/4/24
            DictBiz dictBiz = new DictBiz();
            dictBiz.setCode(MdmBtmTypeConstant.CODE_BASIC_SEC);
            dictBiz.setDictKey("codefileseparator");
            dictBiz.setCode("codeFillSeparator");
            dictBiz.setDictKey(codeBasicSecDO.getCodeFillSeparator());
            dictBiz.setDictValue(codeBasicSecDO.getCodeFillSeparator());
            //从原来的charService(可输可选)更改为调用omd中的接口来实现
            iDictBizClient.getCheck(dictBiz);
@@ -333,7 +440,7 @@
    * @param secType 码段类型
    * @return 不可为空的字段集合
    */
   private Map<String, String> getNotNullableAttr(String secType) {
   private Map<String, String> getNotNullableAttr(String secType) throws ServiceException {
      Map<String, String> attrMap = new HashMap<>();
      if (CodeSecTypeEnum.CODE_ATTR_SEC.getValue().equalsIgnoreCase(secType)) {
         attrMap.put("name", "属性码段名称");
@@ -449,29 +556,29 @@
   /**
    * 参照码段基础信息列表
    *
    * @param codeBasicSecVO 查询条件
    * @param page   分页和排序
    * @param conditionMap 查询条件
    * @param query 分页和排序
    * @return 码段基础信息显示对象列表,生效的内容
    * @throws VciBaseException 查询条件和分页出错的时候会抛出异常
    */
   @Override
   public IPage<CodeBasicSecVO> refDataGridCodeBasicSec(IPage<CodeBasicSecVO> page, CodeBasicSecVO codeBasicSecVO) throws VciBaseException {
      return gridCodeBasicSec(page,codeBasicSecVO);
   public IPage<CodeBasicSecVO> refDataGridCodeBasicSec(Query query ,Map<String,Object> conditionMap) throws VciBaseException {
      return gridCodeBasicSec(query,conditionMap);
   }
   /**
    * 参照分类的码段
    * @param codeBasicSecVO 查询条件
    * @param page 分页的对象
    * @param conditionMap 查询条件
    * @param query 分页和排序
    * @return 码段的内容
    */
   @Override
   public IPage<CodeBasicSecVO> refDataGridClassifySec(IPage<CodeBasicSecVO> page, CodeBasicSecVO codeBasicSecVO) throws VciBaseException {
      if(Func.isEmpty(codeBasicSecVO.getPkCodeRule()) || Func.isBlank(codeBasicSecVO.getPkCodeRule())){
   public IPage<CodeBasicSecVO> refDataGridClassifySec(Query query ,Map<String,Object> conditionMap) throws VciBaseException {
      if(Func.isEmpty(conditionMap.get("pkCodeRule"))){
         return null;
      }
      codeBasicSecVO.setSecType(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue());
      return refDataGridCodeBasicSec(page,codeBasicSecVO);
      conditionMap.put("secType",(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue()));
      return refDataGridCodeBasicSec(query.setAscs("orderNum"),conditionMap);
   }
   /**
@@ -483,27 +590,123 @@
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) {
   public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) throws ServiceException, ServerException {
      boolean isLinked = checkIsLinked(pkCodeRule,null);
      if (isLinked) {
         return R.fail("编码规则已被引用,不允许编辑或删除");
      }
      List<CodeBasicSec> createList = new ArrayList<>();
      List<CodeBasicSec> basicSecDOS = codeBasicSecMapper.selectBatchIds(oidList);
      basicSecDOS.forEach(sec -> {
      /* 需要注意的是克隆过来的码段需要对orderNum进行排序,否则会出现排序乱跳的情况
      实现方式是查询出该规则下根据orderNum排序后的最后一个码段   */
      LambdaQueryWrapper<CodeBasicSec> lastBasicWrapper = Wrappers.<CodeBasicSec>query()
         .lambda().orderByDesc(CodeBasicSec::getOrderNum)
         .eq(CodeBasicSec::getPkCodeRule,pkCodeRule)
         .last("limit 1");
      CodeBasicSec lastCodeBasicSec = codeBasicSecMapper.selectOne(lastBasicWrapper);
      // 排序号从这儿开始排
      int orderNum = Func.isEmpty(lastCodeBasicSec) || Func.isEmpty(lastCodeBasicSec.getOrderNum()) ? -1 : lastCodeBasicSec.getOrderNum();
      if(basicSecDOS.isEmpty()){
         return R.fail("克隆的码段信息不存在!");
      }
      List<CodeBasicSec> codeClassifySec = new ArrayList<>();
      Map<String,List<CodeFixedValue>> codeFixedValueMaps = new HashMap<>();
      for (CodeBasicSec sec : basicSecDOS) {
         CodeBasicSec newSecDO = new CodeBasicSec();
         BeanUtilForVCI.copyPropertiesIgnoreCase(sec,newSecDO);
         newSecDO.setOid("");
         newSecDO.setNameOid("");
         newSecDO.setRevisionOid("");
         newSecDO.setId(newSecDO.getId() + "_copy");
         newSecDO.setName(newSecDO.getName() + "_copy");
         String oldBasicOid = newSecDO.getOid();
         newSecDO.setId(newSecDO.getId());
         newSecDO.setName(newSecDO.getName());
         orderNum++;
         newSecDO.setOrderNum(orderNum);
         newSecDO.setPkCodeRule(pkCodeRule);
         // 判断是否是分类码段,业务逻辑稍微复杂一点所以需要先提出来单独处理
         if(newSecDO.getSecType().equals(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue())){
            // 存储旧的码段oid和新的码段的oid的关联关系
            codeClassifySec.add(newSecDO);
            continue;
         }
         // 更改创建时间,修改时间等默认值
         DefaultAttrAssimtUtil.addDefaultAttrAssimt(newSecDO,MdmBtmTypeConstant.CODE_BASIC_SEC);
         //固定码段
         if(newSecDO.getSecType().equals(CodeSecTypeEnum.CODE_FIXED_SEC.getValue())){
            // 固定码段存储好oid和码值的关联关系
            codeFixedValueMaps.put(newSecDO.getOid(),fixedValueService.list(Wrappers.<CodeFixedValue>query()
               .lambda().eq(CodeFixedValue::getCodeFixedSecOid, oldBasicOid)
            ));
         }
         createList.add(newSecDO);
      }
      // 处理分类码段的oid,因为oid关联parentClassifyOid,与码值codeClassifyOid,码值又需要通过旧的码段oid来查询,所以不能直接改变oid
      changeParentOidAssnOid(codeClassifySec);
      // 将处理过的分类码段也添加进要做新增处理的码段集合中
      createList.addAll(codeClassifySec);
      boolean resBoolean = true;
      if(!createList.isEmpty()){
         resBoolean = saveBatch(createList);
      }
      // 最终要存入码值表中的,码值对象
      List<CodeFixedValue> codeFixedDOValues = new ArrayList<>();
      // 构造码值对象,与码段主键关联关系,以及改变固定码值的oid
      codeFixedValueMaps.forEach((key, value) -> {
         value.stream().forEach(item -> {
            item.setOid("");
            item.setCodeFixedSecOid(key);
            DefaultAttrAssimtUtil.updateDefaultAttrAssimt(item);
            codeFixedDOValues.add(item);
         });
      });
      boolean b = saveBatch(createList);
      //codeBasicSecMapper.insertBatch(createList);
      return R.data(b,"克隆码段信息成功");
      boolean resFixed = true;
      if(!codeFixedValueMaps.isEmpty()){
         // 克隆固定码值
         resFixed = fixedValueService.saveBatch(codeFixedDOValues);
      }
      return (resBoolean&&resFixed) ? R.data(resBoolean,"克隆码段信息成功"):R.fail("克隆码段信息失败!");
   }
   /**
    * 改变码段中父分类码段和子分类码段之间的关联oid为新的oid,并且不破坏分类码值的关联关系
    * @param basicSecs
    * @return
    * @throws ServerException
    */
   @Override
   public boolean changeParentOidAssnOid(List<CodeBasicSec> basicSecs) throws ServerException {
      Map<String, List<CodeClassifyValue>> codeClassValues = new HashMap<>();
      List<CodeClassifyValue> codeClassifyDOValues = new ArrayList<>();
      HashMap<String, String> oidMap = new HashMap<>();
      boolean resClone = false;
      try {
         // 遍历对象数组,为每个对象生成新的oid,并将原始oid和新oid的映射关系存储到Map中
         for (CodeBasicSec obj : basicSecs) {
            String originalOid = obj.getOid();
            String newOid = VciBaseUtil.getPk();
            oidMap.put(originalOid, newOid);
         }
         // 遍历对象数组,更新每个对象的oid和codeClassifySecOid属性值
         for (CodeBasicSec obj : basicSecs) {
            String originalOid = obj.getOid();
            String newOid = oidMap.get(originalOid);
            // 新的oid关联要克隆码值
            codeClassValues.put(newOid,codeClassifyValueService.list(Wrappers.<CodeClassifyValue>query()
               .lambda().eq(CodeClassifyValue::getCodeClassifySecOid, originalOid)));
            obj.setOid(newOid);
            String originalParentClassifyValueOid = obj.getParentClassifySecOid();
            String newParentClassifyValueOid = oidMap.get(originalParentClassifyValueOid);
            obj.setParentClassifySecOid(newParentClassifyValueOid);
         }
         codeClassValues.forEach((key, value) -> {
            value.stream().forEach(item -> {
               DefaultAttrAssimtUtil.updateDefaultAttrAssimt(item);
               item.setCodeClassifySecOid(key);
               codeClassifyDOValues.add(item);
            });
         });
         resClone = codeClassifyValueService.cloneCodeClassifyVaue(codeClassifyDOValues);
      }catch (Exception e){
         throw new ServerException("父分类码段和子分类码段clone转换oid时出错:"+e.getCause());
      }
      return resClone;
   }
   /**
@@ -547,7 +750,7 @@
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean upOrderNum(String oid) {
   public boolean upOrderNum(String oid) throws ServiceException{
      CodeBasicSec secDO = selectByOid(oid);
      if(secDO.getOrderNum() > 1){
         //等于1的时候不能上移了
@@ -578,7 +781,7 @@
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public boolean downOrderNum(String oid) {
   public boolean downOrderNum(String oid) throws ServiceException {
      CodeBasicSec secDO = selectByOid(oid);
      Long total = codeBasicSecMapper.selectCount(Wrappers.<CodeBasicSec>query()
         .lambda().eq(CodeBasicSec::getPkCodeRule,secDO.getPkCodeRule())
@@ -610,7 +813,7 @@
    * @return
    */
   @Override
   public List<String> getOidByCodeclassifysecOid(String codeClassifySecOid) {
   public List<String> getOidByCodeclassifysecOid(String codeClassifySecOid)throws ServiceException {
      return codeBasicSecMapper.getOidByCodeclassifysecOid(codeClassifySecOid.trim());
   }
@@ -682,7 +885,6 @@
      return codeBasicSecDO;
   }
   /**
    * 使用规则的主键获取对应的码段内容
    *
@@ -690,17 +892,14 @@
    * @return 码段的内容
    */
   @Override
   public List<CodeBasicSecVO> listCodeBasicSecByRuleOid(String ruleOid) {
   public List<CodeBasicSecVO> listCodeBasicSecByRuleOid(String ruleOid)throws ServiceException {
      if(StringUtils.isBlank(ruleOid)){
         return new ArrayList<>();
      }
      Map<String,String> conditionMap = new HashMap<>();
      conditionMap.put("pkCodeRule",ruleOid);
//      PageHelper pageHelper = new PageHelper(-1);
//      pageHelper.addDefaultAsc("ordernum");
      QueryWrapper<CodeBasicSec> wrapper = new QueryWrapper<>();
      wrapper.orderByAsc("ordernum");
      List<CodeBasicSec> secDOList = codeBasicSecMapper.selectList(wrapper);//.selectByCondition(conditionMap, pageHelper);
      LambdaQueryWrapper<CodeBasicSec> wrapper = Wrappers.<CodeBasicSec>query().lambda()
         .eq(CodeBasicSec::getPkCodeRule, ruleOid)
         .orderByAsc(CodeBasicSec::getOrderNum);
      List<CodeBasicSec> secDOList = baseMapper.selectList(wrapper);//
      return codeBasicSecDO2VOs(secDOList,true);
   }
@@ -737,6 +936,27 @@
   }
   /**
    * 批量数据对象转换为显示对象
    *
    * @param codeBasicSecDOs 数据对象列表
    * @return 显示对象
    * @throws VciBaseException 参数为空或者不存在的时候会抛出异常
    */
   @Override
   public List<CodeBasicSecVO> codeBasicSecDO2VOs(Collection<CodeBasicSec> codeBasicSecDOs) throws VciBaseException {
      List<CodeBasicSecVO> voList = new ArrayList<CodeBasicSecVO>();
      if (!CollectionUtils.isEmpty(codeBasicSecDOs)) {
         for (CodeBasicSec s : codeBasicSecDOs) {
            CodeBasicSecVO vo = codeBasicSecDO2VO(s);
            if (vo != null) {
               voList.add(vo);
            }
         }
      }
      return voList;
   }
   /**
    * 数据对象转换为显示对象
    *
    * @param codeBasicSecDO 数据对象
@@ -745,14 +965,227 @@
    */
   @Override
   public CodeBasicSecVO codeBasicSecDO2VO(CodeBasicSec codeBasicSecDO) throws VciBaseException {
      CodeBasicSecVO vo = new CodeBasicSecVO();
      CodeBasicSecVO codeBasicSecVO = new CodeBasicSecVO();
      if (codeBasicSecDO != null) {
         BeanUtilForVCI.copyPropertiesIgnoreCase(codeBasicSecDO, vo);
         BeanUtilForVCI.copyPropertiesIgnoreCase(codeBasicSecDO, codeBasicSecVO);
         if(StringUtils.isNotBlank(codeBasicSecDO.getSecType())){
            codeBasicSecVO.setSecTypeText(EnumCache.getValue(EnumEnum.CODE_SEC_TYPE,codeBasicSecDO.getSecType()));
         }
         if(StringUtils.isNotBlank(codeBasicSecDO.getCodeLevelType())){
            codeBasicSecVO.setCodeLevelTypeText(EnumCache.getValue(EnumEnum.CODE_LEVEL_TYPE,codeBasicSecDO.getCodeLevelType()));
         }
         if(StringUtils.isNotBlank(codeBasicSecDO.getCodeSecLengthType())){
            codeBasicSecVO.setCodeSecLengthTypeText(EnumCache.getValue(EnumEnum.CODE_SEC_LENGTH,codeBasicSecDO.getCodeSecLengthType()));
         }
         if(StringUtils.isNotBlank(codeBasicSecDO.getValueCutType())){
            codeBasicSecVO.setValueCutTypeText(EnumCache.getValue(EnumEnum.CODE_CUT_TYPE,codeBasicSecDO.getValueCutType()));
         }
         if(StringUtils.isNotBlank(codeBasicSecDO.getCodeGetValueType())){
            codeBasicSecVO.setCodeGetValueTypeText(EnumCache.getValue(EnumEnum.CODE_GET_VALUE_TYPE,codeBasicSecDO.getCodeGetValueType()));
         }
         // 如果是分类码段需要查询所属分类的中文名称
         if(codeBasicSecDO.getSecType().equals("codeclassifysec") && Func.isNotEmpty(codeBasicSecDO.getParentClassifySecOid())){
            CodeBasicSec codeBasicSec = codeBasicSecMapper.selectOne(Wrappers.<CodeBasicSec>query().lambda()
               .eq(CodeBasicSec::getOid, codeBasicSecDO.getParentClassifySecOid())
               .eq(CodeBasicSec::getSecType, codeBasicSecDO.getSecType()));
            if(Func.isNotEmpty(codeBasicSec)){
               codeBasicSecVO.setParentClassifySecOid(codeBasicSec.getOid());
               codeBasicSecVO.setParentClassifySecText(codeBasicSec.getName());
            }
         }
         //如果有lcstatus的类的话
         if (true) {
            //vo.setLcStatusText({lcStatusFullClassName}.getTextByValue(vo.getLcStatus()));
         }
      }
      return vo;
      return codeBasicSecVO;
   }
   /**
    * 根据编码规则主键获取编码下的流水依赖码段
    *
    * @param oid 编码规则主键
    * @return
    * @throws VciBaseException
    */
   @Override
   public CodeRuleVO getSerialNumberDepend(String oid) throws VciBaseException {
      VciBaseUtil.alertNotNull(oid,"编码规则主键");
      CodeRuleVO codeRuleVO = codeRuleService.getObjectByOid(oid);
      if (codeRuleVO != null) {
         //如果有lcstatus的类的话
         codeRuleVO.setLcStatusText(CodeRuleLC.getTextByValue(codeRuleVO.getLcStatus()));
         LambdaQueryWrapper<CodeBasicSec> wrapper = Wrappers.<CodeBasicSec>query().lambda()
            .eq(CodeBasicSec::getPkCodeRule, codeRuleVO.getOid())
            .eq(CodeBasicSec::getSecType,CodeSecTypeEnum.CODE_SERIAL_SEC.getValue());
         CodeBasicSec codeBasicSec = this.getOne(wrapper);
         if(codeBasicSec != null && VciBaseUtil.isNotNull(codeBasicSec.getOid())){
            wrapper = Wrappers.<CodeBasicSec>query().lambda()
               .eq(CodeBasicSec::getPkCodeRule,codeRuleVO.getOid())
               .eq(CodeBasicSec::getSerialDependFlag,"true")
               .orderByAsc(CodeBasicSec::getOrderNum);
               //.orderByAsc(CodeBasicSec::getSerialDependOrder);
            List<CodeBasicSec> codeBasicSecList = this.list(wrapper);
            if(!CollectionUtils.isEmpty(codeBasicSecList)){
               List<CodeBasicSecVO> codeBasicSecVOS = codeBasicSecDO2VOs(codeBasicSecList);
               //查询固定码的码值
               Map<String, List<CodeFixedValueVO>> secValueMap = fixedValueService.listCodeFixedValueBySecOids(codeBasicSecList.stream().map(CodeBasicSec::getOid).collect(Collectors.toList()));
               codeBasicSecVOS.stream().forEach(vo->{
                  vo.setFixedValueVOList(secValueMap.getOrDefault(vo.getOid(),null));
               });
               codeRuleVO.setSecVOList(codeBasicSecVOS);
            }
         }else{
            throw new VciBaseException(codeRuleVO.getName()+"编码规则下无流水码段,无法设置最大流水号!");
         }
      }
      return codeRuleVO;
   }
   /**
    * 设置最大流水号
    *
    * @param codeOrderDTO 编码申请传输对象
    * @return
    * @throws VciBaseException
    */
   @Override
   public String setMaxSerialNumberForCodeRule(CodeOrderDTO codeOrderDTO) throws VciBaseException {
      VciBaseUtil.alertNotNull(codeOrderDTO.getCodeRuleOid(),"编码规则主键",codeOrderDTO.getMaxSecNum(),"最大流水号");
      List<CodeOrderSecDTO> codeOrderSecDTOList = codeOrderDTO.getSecDTOList();
      if(CollectionUtils.isEmpty(codeOrderSecDTOList)){
         throw new VciBaseException("最大流水号的流水依赖不能为空!");
      }
      String codeRuleOid = codeOrderDTO.getCodeRuleOid();
      int maxSecNum = codeOrderDTO.getMaxSecNum();
      Map<String/**码段主键*/,CodeOrderSecDTO/**码段相关信息*/> codeOrderSecDTOMap = codeOrderSecDTOList.stream().collect(Collectors.toMap(s -> s.getSecOid(), t -> t));
      List<String> codeBasicSecOidList = codeOrderSecDTOList.stream().map(s->s.getSecOid()).collect(Collectors.toList());//流水依赖码段的主键集合
      //获取流水依赖码段
      LambdaQueryWrapper<CodeBasicSec> wrapper = Wrappers.<CodeBasicSec>query().lambda()
         .eq(CodeBasicSec::getPkCodeRule,codeRuleOid)
         .in(CodeBasicSec::getOid,codeBasicSecOidList)
         .eq(CodeBasicSec::getSerialDependFlag,"true")
         //TODO: SerialDependOrder本来是用来流水排序的,但是现在的逻辑是按照orderuNum排序的
         .orderByAsc(CodeBasicSec::getOrderNum); //.orderByAsc(CodeBasicSec::getSerialDependOrder);
      List<CodeBasicSec> codeBasicSecList = this.list(wrapper);
      //按流水依赖顺序,处理流水依赖码段的值
      List<String> serialDependValueList = new ArrayList<>();
      codeBasicSecList.stream().forEach(s->{
         CodeOrderSecDTO codeOrderSecDTO = codeOrderSecDTOMap.get(s.getOid());
         String serialDependValue = codeOrderSecDTO.getSecValue();
         if(s.getSecType().equals(CodeSecTypeEnum.CODE_DATE_SEC.getValue())){
            try {
               Date date = VciDateUtil.str2Date(codeOrderSecDTO.getSecValue(),s.getCodeDateFormatStr());
               serialDependValue = VciDateUtil.date2Str(date,s.getCodeDateFormatStr());
            } catch (Exception e) {
               throw new RuntimeException(e);
            }
         }
         serialDependValueList.add(serialDependValue);
      });
      //获取流水码段
      wrapper = Wrappers.<CodeBasicSec>query().lambda()
         .eq(CodeBasicSec::getPkCodeRule,codeRuleOid)
         .eq(CodeBasicSec::getSecType,CodeSecTypeEnum.CODE_SERIAL_SEC.getValue())
         .orderByAsc(CodeBasicSec::getSerialDependOrder);
      CodeBasicSec codeBasicSec = this.getOne(wrapper);
      //根据编码规则和流水依赖,获取最大流水号
      String serialUnitString = serialDependValueList.size() == 0 ? EMPTY_SERIAL_UNIT : serialDependValueList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
      LambdaQueryWrapper<CodeSerialValue> codeSerialWrapper = new LambdaQueryWrapper<>();
      codeSerialWrapper.eq(CodeSerialValue::getCodeRuleOid, codeRuleOid);
      codeSerialWrapper.eq(CodeSerialValue::getSerialUnit, serialUnitString);
      codeSerialWrapper.eq(CodeSerialValue::getCodeSecOid,codeBasicSec.getOid());
      codeSerialWrapper.orderByDesc(CodeSerialValue::getCreateTime);
      List<CodeSerialValue> codeSerialValueList = serialValueMapper.selectList(codeSerialWrapper);
      //如果最大流水号不为空,说明已有最好流水号,更新最大流水号
      if(!CollectionUtils.isEmpty(codeSerialValueList)){
         CodeSerialValue codeSerialValue = codeSerialValueList.get(0);
         int maxSerial = Double.valueOf(codeSerialValue.getMaxSerial()).intValue();
         //已有的最大流水号,小于设置的最大流水号,更新最大流水号
         if(maxSerial < maxSecNum){
            codeSerialValue.setMaxSerial(String.valueOf(maxSecNum));
            serialValueMapper.updateById(codeSerialValue);
         }else{
            maxSecNum = maxSerial;
         }
      }else{
         //如果最大流水号不为空,说明无最好流水号,新增最大流水号
         CodeSerialValue codeSerialValue = new CodeSerialValue();
         DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeSerialValue, MdmBtmTypeConstant.CODE_SERIAL_VALUE);
         codeSerialValue.setCodeRuleOid(codeRuleOid);
         codeSerialValue.setSerialUnit(serialUnitString);
         codeSerialValue.setCodeSecOid(codeBasicSec.getOid());
         codeSerialValue.setMaxSerial(String.valueOf(maxSecNum));
         serialValueMapper.insert(codeSerialValue);
      }
      return String.valueOf(maxSecNum);
   }
   /***
    * 根据流水依赖获取最大流水号
    * @param codeOrderDTO 编码申请传输对象
    * @return
    */
   @Override
   public Double getMaxSerialNumberForCodeRule(CodeOrderDTO codeOrderDTO) {
      Double maxSerialNumber=0.0;
      VciBaseUtil.alertNotNull(codeOrderDTO.getCodeRuleOid(),"编码规则主键");
      List<CodeOrderSecDTO>  codeOrderSecDTOList=codeOrderDTO.getSecDTOList();
      if(CollectionUtils.isEmpty(codeOrderSecDTOList)){
         throw new VciBaseException("最大流水号的流水依赖不能为空!");
      }
      String codeRuleOid = codeOrderDTO.getCodeRuleOid();
      Map<String/**码段主键*/,CodeOrderSecDTO/**码段相关信息*/> codeOrderSecDTOMap = codeOrderSecDTOList.stream().collect(Collectors.toMap(s -> s.getSecOid(), t -> t));
      List<String> codeBasicSecOidList = codeOrderSecDTOList.stream().map(s->s.getSecOid()).collect(Collectors.toList());//流水依赖码段的主键集合
      //获取流水依赖码段
      LambdaQueryWrapper<CodeBasicSec> wrapper = Wrappers.<CodeBasicSec>query().lambda()
         .eq(CodeBasicSec::getPkCodeRule,codeRuleOid)
         .in(CodeBasicSec::getOid,codeBasicSecOidList)
         .eq(CodeBasicSec::getSerialDependFlag,"true")
         .orderByAsc(CodeBasicSec::getOrderNum); //.orderByAsc(CodeBasicSec::getSerialDependOrder);
      List<CodeBasicSec> codeBasicSecList = this.list(wrapper);
      //按流水依赖顺序,处理流水依赖码段的值
      List<String> serialDependValueList = new ArrayList<>();
      codeBasicSecList.stream().forEach(s->{
         CodeOrderSecDTO codeOrderSecDTO = codeOrderSecDTOMap.get(s.getOid());
         String serialDependValue = codeOrderSecDTO.getSecValue();
         if(s.getSecType().equals(CodeSecTypeEnum.CODE_DATE_SEC.getValue())){
            try {
               Date date = VciDateUtil.str2Date(codeOrderSecDTO.getSecValue(),s.getCodeDateFormatStr());
               serialDependValue = VciDateUtil.date2Str(date,s.getCodeDateFormatStr());
            } catch (Exception e) {
               throw new RuntimeException(e);
            }
         }
         serialDependValueList.add(serialDependValue);
      });
      //获取流水码段
      wrapper = Wrappers.<CodeBasicSec>query().lambda()
         .eq(CodeBasicSec::getPkCodeRule,codeRuleOid)
         .eq(CodeBasicSec::getSecType,CodeSecTypeEnum.CODE_SERIAL_SEC.getValue())
         .orderByAsc(CodeBasicSec::getSerialDependOrder);
      CodeBasicSec codeBasicSec = this.getOne(wrapper);
      //根据编码规则和流水依赖,获取最大流水号
      String serialUnitString = serialDependValueList.size() == 0 ? EMPTY_SERIAL_UNIT : serialDependValueList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
      LambdaQueryWrapper<CodeSerialValue> codeSerialWrapper = new LambdaQueryWrapper<>();
      codeSerialWrapper.eq(CodeSerialValue::getCodeRuleOid, codeRuleOid);
      codeSerialWrapper.eq(CodeSerialValue::getSerialUnit, serialUnitString);
      codeSerialWrapper.eq(CodeSerialValue::getCodeSecOid,codeBasicSec.getOid());
      codeSerialWrapper.orderByDesc(CodeSerialValue::getCreateTime);
      List<CodeSerialValue> codeSerialValueList = serialValueMapper.selectList(codeSerialWrapper);
      if(!CollectionUtils.isEmpty(codeSerialValueList)){
         maxSerialNumber=StringUtils.isBlank(codeSerialValueList.get(0).getMaxSerial())?0:Double.parseDouble(codeSerialValueList.get(0).getMaxSerial());
      }
      return maxSerialNumber;
   }
}