ludc
2023-12-11 7db864d691fdc62cda52c11b4c740cdc25dfeaa9
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -13,9 +13,7 @@
import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
import com.vci.ubcs.code.dto.*;
import com.vci.ubcs.code.entity.CodeAllCode;
import com.vci.ubcs.code.enumpack.CodeDefaultLC;
import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
import com.vci.ubcs.code.enumpack.sysIntegrationPushTypeEnum;
import com.vci.ubcs.code.enumpack.*;
import com.vci.ubcs.code.lifecycle.CodeAllCodeLC;
import com.vci.ubcs.code.mapper.CommonsMapper;
import com.vci.ubcs.code.service.*;
@@ -383,7 +381,7 @@
      CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
      //获取码段宽度
      //String secWidth = getCodeSegmentWidth(codeClassifyVO.getOid());
      String secWidth = getCodeSegmentWidth(codeClassifyVO.getOid());
      if(isHistory){
         templateVOList= templateService.childTemplates(codeClassifyOid);
@@ -434,6 +432,8 @@
            excelDataList.add(new WriteExcelData(0,0,"分类路径",""));
            excelDataList.add(new WriteExcelData(0,1,"码段宽度",""));
            excelDataList.add(new WriteExcelData(0,2,!CollectionUtils.isEmpty(idAttrVOList)?idAttrVOList.get(0).getName():"企业编码",idAttrVOList.get(0).getId()));
            // 填充码段
            excelDataList.add(new WriteExcelData(1,1,secWidth));
         }
         for (int i = 0; i < templateAttrVOS.size(); i++) {
            CodeClassifyTemplateAttrVO attrVO = templateAttrVOS.get(i);
@@ -620,22 +620,121 @@
    * @return
    */
   private String getCodeSegmentWidth(String codeClassifyOid){
      CodeClassifyVO codeClassifyVO = classifyService.getObjectByOid(codeClassifyOid);
      CodeClassifyFullInfoBO classifyFullInfoBO = classifyService.getClassifyFullInfo(codeClassifyOid);
      // 要获取码段宽度,先要获取规则,当前没有往上找
      CodeRuleVO codeRuleByClassifyFullInfo = mdmEngineService.getCodeRuleByClassifyFullInfo(classifyService.getClassifyFullInfo(codeClassifyOid));
      List<CodeBasicSecVO> secVOList = codeRuleByClassifyFullInfo.getSecVOList();
      if(secVOList.isEmpty()){
         return "";
      }
      StringBuffer secWidth = new StringBuffer("");
      for (int j = 0; j < secVOList.size(); j++) {
         CodeBasicSecVO secVO = secVOList.get(j);
         int width = VciBaseUtil.getInt(secVO.getCodeSecLength()) + ((secVO.getPrefixCode() + secVO.getSuffixCode()).length());
         secWidth.append(width).append("#");
      }
      secVOList.stream().forEach(item->{
         switch (item.getSecType().toLowerCase(Locale.ROOT)){
            case "codeclassifysec":
            case "codevariablesec":
            case "coderefersec":
            case "codefixedsec":
            case "codeattrsec":
            case "codeserialsec":
               countSecWith(item,secWidth);
               break;
            case "codelevelsec":
               //层级码段,需要从分类上获取相应的信息
               String secValue = "";
               if (CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(item.getCodeLevelType())) {
                  //最小层,因为我们只能在叶子节点上申请编码,所以这个就是当前分类的
                  if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(item.getCodeGetValueType()) || CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
                     //就是当前分类的
                     secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
                  } else {
                     //我们需要从顶层开始找到当前分类为止
                     secValue = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
                  }
               } else {
                  //指定层,我们需要通过上级的来获取
                  if (CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) {
                     //说明当前已经是最高的了
                     secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
                  } else {
                     //这个我们需要看看,层级是不是大于了最大层级的数
                     List<CodeClassifyVO> parentClassifyVOList = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).collect(Collectors.toList());
                     if (item.getCodeLevelValue() > (parentClassifyVOList.size() + 1)) {
                        //指定的层级比当前的层级还大了,所以只能获取当前层级了
                        if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(item.getCodeGetValueType())) {
                           secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
                        } else {
                           secValue = parentClassifyVOList.stream().map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
                        }
                     } else {
                        //我们获取其中指定层的内容
                        if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(item.getCodeGetValueType())) {
                           CodeClassifyVO classifyVO = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() == item.getCodeLevelValue().intValue()).findFirst().orElseGet(() -> null);
                           if (classifyVO != null) {
                              secValue = classifyVO.getId();
                           }
                        } else {
                           //小于等于的全部拿出来
                           secValue = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() <= item.getCodeLevelValue().intValue()).sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining());
                        }
                     }
                  }
               }
               //看看长度是否需要截断
               if (!CodeCutTypeEnum.NONE.getValue().equalsIgnoreCase(item.getValueCutType()) &&
                  item.getValueCutLength() != null && item.getValueCutLength() > 0 && secValue.length() > item.getValueCutLength()) {
                  if (CodeCutTypeEnum.RIGHT.getValue().equalsIgnoreCase(item.getValueCutType())) {
                     //左截取是从左边剪掉,右截取是从右边剪掉--保留左边
                     secValue = secValue.substring(0, item.getValueCutLength());
                  } else {
                     secValue = secValue.substring(secValue.length() - item.getValueCutLength());
                  }
               }
               secValue = productCodeService.joinPreffixAndSuffix(item,secValue);
               secWidth.append(secValue.length()).append("#");
               break;
            case "codedatesec":
               String dateFormatStr = item.getCodeDateFormatStr();
               if(Func.isNotEmpty(dateFormatStr)) {
                  // 获取当前时间
                  Date currentDate = new Date();
                  // 指定日期格式
                  SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatStr);
                  // 将当前时间转换为指定日期格式
                  // 使用正则表达式去掉除数字以外的所有字符串
                  String cleanedDate = dateFormat.format(currentDate).replaceAll("[^0-9]", "");
                  int width = cleanedDate.length();
                  if (Func.isNotEmpty(item.getPrefixCode())) {
                     width += item.getPrefixCode().length();
                  }
                  if (Func.isNotEmpty(item.getSuffixCode())) {
                     width += item.getSuffixCode().length();
                  }
                  secWidth.append(width).append("#");
               }
               break;
         }
      });
      return secWidth.toString().substring(0, secWidth.length() - 1);
   }
   /**
    * 计算码段长度加前后缀的长度
    * @param codeBasicSecVO
    * @param secWidth
    */
   private void countSecWith(CodeBasicSecVO codeBasicSecVO,StringBuffer secWidth){
      if(Func.isNotEmpty(codeBasicSecVO.getCodeSecLength())){
         int width = VciBaseUtil.getInt(codeBasicSecVO.getCodeSecLength());
         if(Func.isNotEmpty(codeBasicSecVO.getPrefixCode())){
            width += codeBasicSecVO.getPrefixCode().length();
         }
         if(Func.isNotEmpty(codeBasicSecVO.getSuffixCode())){
            width += codeBasicSecVO.getSuffixCode().length();
         }
         secWidth.append(width).append("#");
      }else {
         secWidth.append(0).append("#");
      }
   }
   /**
@@ -774,7 +873,8 @@
         //除去默认的属性.还有只有表单显示的字段才导入
         List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
            !DEFAULT_ATTR_LIST.contains(s.getId()) &&
               ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
         ).collect(Collectors.toList());
         Map<String/**模板属性字段oid**/, String /**模板属性外部名称**/> fieldNameMap =attrVOS.stream().collect(Collectors.toMap(CodeClassifyTemplateAttrVO::getId,s->s.getName()));
@@ -1586,7 +1686,8 @@
         //除去默认的属性.还有只有表单显示的字段才导入
         List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
            !DEFAULT_ATTR_LIST.contains(s.getId()) &&
               ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
         ).collect(Collectors.toList());
         Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
         List<String> titleRowData = dataSet.getColName();
@@ -1831,24 +1932,27 @@
         tableName = VciBaseUtil.getTableName(btmTypeId);
      }
      String countSql = "select count(*) from (select * FROM " + tableName +" where 1=1" +
      String countSql = "select count(*) from " + tableName +" where 1=1" +
         " and lastr = '1'" +
         " and lastv='1'" +
         " and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%' {}";
         " and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%'";
      //先查询总数
      int total = 0;
      if(exportAttrDTO.getEndPage()!=null && exportAttrDTO.getEndPage()>0
         &&exportAttrDTO.getPage() !=null && exportAttrDTO.getPage() >0
         &&exportAttrDTO.getEndPage()>exportAttrDTO.getPage()){
         //从多少页到多少页的查询方式,
         String countPageSql = "select count(*) from (select * FROM " + tableName +" where 1=1" +
            " and lastr = '1'" +
            " and lastv='1'" +
            " and codeclsfpath like '%" + exportAttrDTO.getCodeClassifyOid() + "%' {}";
         for(int i = exportAttrDTO.getPage() ;i <= exportAttrDTO.getEndPage();i++){
            PageHelper thisPage = new PageHelper(exportAttrDTO.getLimit()==null?-1:exportAttrDTO.getLimit());
            thisPage.setPage(exportAttrDTO.getPage()==null?1:exportAttrDTO.getPage());
            thisPage.setSort(exportAttrDTO.getSort());
            thisPage.setOrder(exportAttrDTO.getOrder());
            thisPage.addDefaultDesc("createTime");
            total += commonsMapper.queryCountBySql(StringUtil.format(countSql," limit " + exportAttrDTO.getLimit() +" offset "+ i +")subquery;"));
            total += commonsMapper.queryCountBySql(StringUtil.format(countPageSql," limit " + exportAttrDTO.getLimit() +" offset "+ i +")subquery;"));
         }
      }else{
         total = commonsMapper.queryCountBySql(countSql);
@@ -2046,7 +2150,8 @@
         CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
         //除去默认的属性.还有只有表单显示的字段才导入
         List<CodeClassifyTemplateAttrVO> attrVOS = codeClassifyTemplateVO.getAttributes().stream().filter(s ->
            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
            !DEFAULT_ATTR_LIST.contains(s.getId()) &&
               ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
         ).collect(Collectors.toList());
         String fullPath = getFullPath(classifyFullInfo);
         excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList, codeClassifyTemplateVO,cboList,fullPath,!isImprot);
@@ -2251,8 +2356,10 @@
      //校验模板是不是最新的
      //checkTemplateSync(sheetDataSetList,templateVO);
      //除去默认的属性.还有只有表单显示的字段才导入
      List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
      //除去默认的属性.还有只有具有分类注入的才过滤出来
      List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(
         s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) &&
            ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
      ).collect(Collectors.toList());
      Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
      List<String> titleRowData = dataObjectVO.getColName();
@@ -2622,7 +2729,8 @@
      //校验模板是不是最新的
      //checkTemplateSync(sheetDataSetList,templateVO);
      //除去默认的属性.还有只有表单显示的字段才导入
      List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
      List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s -> !DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) &&
         ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
      ).collect(Collectors.toList());
      Map<Integer/**列号**/, String/**字段的名称**/> fieldIndexMap = new HashMap<>();
      List<String> titleRowData = dataObjectVO.getColName();
@@ -4299,7 +4407,7 @@
               List<BaseModel> newCboList = new ArrayList<>();
               newDataList.stream().forEach(stringStringMap -> {
                  BaseModel baseModel=new BaseModel();
                  DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel,false);
                  DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(stringStringMap,baseModel,false,user);
                  baseModel.setData(stringStringMap);
                  newCboList.add(baseModel);
               });
@@ -4523,9 +4631,10 @@
   }
   private List<ClientBusinessObject> ChangeMapTOClientBusinessObjects(List<Map<String,String>> oldDataMap){
      List<ClientBusinessObject> clientBusinessObjectList=new ArrayList<>();
      final BladeUser user = AuthUtil.getUser();
      oldDataMap.stream().forEach(dataMap->{
         ClientBusinessObject clientBusinessObject=new ClientBusinessObject();
         DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject,true);
         DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject,true,user);
         for (String key:dataMap.keySet()){
            Object value= dataMap.getOrDefault(key,"");
            clientBusinessObject.setAttributeValue(key.toLowerCase(Locale.ROOT),value==null?"":value.toString());
@@ -4620,7 +4729,8 @@
   private void createExeclClassData(List<String> titleRowData, CodeClassifyTemplateVO newTemplateVO, Map<Integer, String> execlData, CodeImprotDataVO codeImprotDataVO){
      //除去默认的属性.还有只有表单显示的字段才导入
      List<CodeClassifyTemplateAttrVO> attrVOS = newTemplateVO.getAttributes().stream().filter(s ->
         !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
         !DEFAULT_ATTR_LIST.contains(s.getId()) &&
            ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
      ).collect(Collectors.toList());
      Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId()));
      List<String> fields=new ArrayList<>();
@@ -5101,7 +5211,8 @@
      CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(codeClassifyOid);
      //获取最新的模板
      CodeClassifyTemplateVO templateVO = engineService.getUsedTemplateByClassifyOid(codeClassifyOid);      //除去默认的属性.还有只有表单显示的字段才导入
      List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
      List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!DEFAULT_SYNC_ATTR_LIST.contains(s.getId()) &&
         ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
      ).collect(Collectors.toList());
      ExecGroupCodePortDataDTO execGroupCodePortDataDTO=new ExecGroupCodePortDataDTO();
      createExportGroupCodeMapConfig(templateVO,execGroupCodePortDataDTO);//组织数据
@@ -5179,10 +5290,10 @@
            // 修改版次号
            engineService.updateBatchByBaseModel(btmTypeId,oldCbos);
            List<CodeAllCode> codeAllCodeList=new ArrayList<>();
            final BladeUser user = AuthUtil.getUser();
            cboList.stream().forEach(clientBusinessObject -> {
               BaseModel newBaseModel=new BaseModel();
               DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(clientBusinessObject.getData(),newBaseModel,true);
               DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(clientBusinessObject.getData(),newBaseModel,true,user);
               newCbos.add(newBaseModel);
            });
            // 插入新的数据
@@ -5214,6 +5325,7 @@
   public void batchSwitchCheckExist(Map<String,String> errorMap,List<ClientBusinessObject> cboList,CodeClassifyFullInfoBO classifyFullInfo,CodeClassifyTemplateVO templateVO,ExecGroupCodePortDataDTO execGroupCodePortDataDTO,Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap){
      List<BaseModel> oldBaseModelList=new ArrayList<>();
      List<CodeAllCode> codeAllCodeList=new ArrayList<>();
      final BladeUser user = AuthUtil.getUser();
      cboList.stream().forEach(clientBusinessObject -> {
         String code=clientBusinessObject.getId();
         String rowIndex=clientBusinessObject.getAttributeValue(IMPORT_ROW_INDEX);
@@ -5226,7 +5338,7 @@
            Map<String,String> dataMap=dataList.get(0);
            BaseModel oldBaseModel=new BaseModel();
            DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,oldBaseModel,false);
            DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,oldBaseModel,false,user);
            String oldOid=oldBaseModel.getOid();
            clientBusinessObject.setCopyFromVersion(oldOid);
@@ -5311,7 +5423,8 @@
               errorMap.put(rowIndex,"第"+rowIndex+"行,在系统中未查询到相应的码值数据");
            }
            //除去默认的属性.还有只有表单显示的字段才导入
            List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!fieldIndexMap.containsValue(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
            List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->!fieldIndexMap.containsValue(s.getId()) &&
               ((Func.isNotEmpty(s.getClassifyInvokeAttr()) || Func.isNotEmpty(s.getClassifyInvokeAttrName())) || VciBaseUtil.getBoolean(s.getFormDisplayFlag()))
            ).collect(Collectors.toList());
            attrVOS.stream().forEach(codeClassifyTemplateAttrVO -> {//将不需要更改的默认字段或者不更改的属性复制到新的版本上
               String arrtibuteKey=codeClassifyTemplateAttrVO.getId();