Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1,11 +1,14 @@
package com.vci.ubcs.code.service.impl;
import cn.hutool.db.sql.Query;
import com.alibaba.fastjson.JSON;
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.plugins.pagination.Page;
import com.vci.ubcs.code.applyjtcodeservice.entity.DockingPreMetaAttr;
import com.vci.ubcs.code.applyjtcodeservice.vo.BaseModelVO;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
@@ -147,6 +150,7 @@
    */
   @Value("${bzApply.seriesFlow:seriesFlow}")
   private String seriesFlow;
   /***
    * 是否变更系列
    */
@@ -175,6 +179,11 @@
    */
   @Resource
   private MdmProductCodeService productCodeService;
   /**
    * 近义词规则查询服务
    */
   @Autowired ICodeSynonymService codeSynonymService;
   /**
    * 可输可选的服务
@@ -253,8 +262,9 @@
    */
   @Autowired
   private ICodeRuleService ruleService;
   /**
    * 编码规则的服务
    * 码值的服务
    */
   @Autowired
   private ICodeAllCodeService codeAllCodeService;
@@ -310,6 +320,12 @@
   public static final String BTM_NAME = "btm:name";
   /**
    * 配置的用来申请集团码的用户
    */
   @Value("${docking.apply.personUserAccount:28201728}")
   public String applyCodeUserAccount;
   /**
    * 密级的字段
    */
   public static final String SECRET_FILED = "secretgrade";
@@ -358,7 +374,6 @@
    */
   @Autowired
   private SaveLogUtil saveLogUtil;
   /**
    * 使用分类的主键获取可以使用的模板对象
@@ -428,10 +443,18 @@
            throw new VciBaseException("未查询到相关数据。");
         }
         //还需要修改allCode的生命周期
         QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
         allCodeWrapper.eq("createcodebtm", baseModelDTO.getBtmname());
         allCodeWrapper.in("createcodeoid", oids);
         List<CodeAllCode> codeCbos = codeAllCodeService.selectByWrapper(allCodeWrapper);// 回收需要业务数据删除
         LambdaQueryWrapper<CodeAllCode> allCodeWrapper = Wrappers.<CodeAllCode>query().lambda();
         allCodeWrapper.eq(CodeAllCode::getCreateCodeBtm, baseModelDTO.getBtmname());
         allCodeWrapper.in(CodeAllCode::getCreateCodeOid, oids);
         List<CodeAllCode> codeCbos = codeAllCodeService.selectByWrapper(allCodeWrapper);
         if(codeCbos.size() != baseModels.size()){
            throw new ServiceException("当前回收操作中查询出的业务数据中,存在多条码值数据对应关系,请联系开发人员对数据进行排查处理!!");
         }
         //转为map后续取的时候方便
         Map<String, BaseModel> baseModelMap = baseModels.stream().collect(Collectors.toMap(BaseModel::getId, baseModel -> baseModel));
         // 回收需要业务数据删除
         if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
            R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
            if (!listR.isSuccess() || listR.getData().size() == 0) {
@@ -446,16 +469,17 @@
            }
            R r = updateBatchByBaseModel(baseModelDTO.getBtmname(), baseModels);
            if (!r.isSuccess()) {
               throw new VciBaseException("更新数据出错,重试!" + r.getMsg());
               throw new VciBaseException("更新数据出错,请重试!" + r.getMsg());
            }
         }
         // 刚好顺序是一致的,所以直接按照codeallcode的顺序来拿业务数据
         int i = -1;
         BaseModel baseModel = null;
         for (CodeAllCode codeCbo : codeCbos) {
            codeCbo.setLcStatus(baseModelDTO.getLcStatus());
            // 如果是回收,就需要将业务数据存储到码值表中
            baseModel = baseModelMap.get(codeCbo.getId());
            if (baseModelDTO.getLcStatus().equals(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_TAKEBACK)) {
               codeCbo.setBusinessData(JSON.toJSONString(baseModels.get(++i)));
               codeCbo.setBusinessData(JSON.toJSONString(baseModel));
            }
         }
         codeAllCodeService.updateBatchById(codeCbos);
@@ -484,7 +508,7 @@
      return addSaveCode(orderDTO, true);
   }
   /***
   /**
    * 集成可变码段申请接口
    * @param orderDTO 申请的信息,需要包含属性的内容和码段相关的内容
    * @return
@@ -755,27 +779,36 @@
      //注意的是keyRuleVO可能为空,表示不使用规则控制
      //获取所有的关键属性
      Map<String, CodeClassifyTemplateAttrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
      // TODO:2024-02-01 先获取配置了近义词查询规则的属性,不同于关键属性,设置了近义词查询规则的属性可能是多条不同的近义词查询规则
      Map<String, CodeClassifyTemplateAttrVO> sysonymAttrMaps = templateVO.getAttributes().stream().filter(item -> Func.isNotBlank(item.getSysonymRuleOids())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
      // 获取是否有配置近义词查询规则属性
      Map<String, List<CodeSynonym>> codeSynonymMaps = new HashMap<>();
      if(!sysonymAttrMaps.isEmpty()){
         // 查询近义词规则,存储方式key:属性id,value近义词查询规则列表
         codeSynonymMaps = codeSynonymService.getCodeSynonymByOids(sysonymAttrMaps);
      }
      Map<String, String> conditionMap = new HashMap<>();
      boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
      //全部去空的优先级大于去空
      boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
      boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
      boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
      Map<String, List<CodeSynonym>> finalCodeSynonymMaps = codeSynonymMaps;
      ketAttrMap.forEach((attrId, attrVO) -> {
         String value = getValueFromOrderDTO(orderDTO, attrId);
         if (value == null) {
            value = "";
         }
         wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
         wrapperKeyAttrConditionMap(value, keyRuleVO, finalCodeSynonymMaps.get(attrId), attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
      });
      //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
      if (!CollectionUtils.isEmpty(conditionMap)) {
         // TODO: 同一个库判重不需要区分分类oid
         // conditionMap.put("CODETEMPLATEOID","'" + orderDTO.getTemplateOid() + "'");
//         final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
         // final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
         R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(classifyFullInfo.getTopClassifyVO().getBtmTypeId()));
//            String referTable = VciBaseUtil.getTableName(referVO.getReferType());
         // String referTable = VciBaseUtil.getTableName(referVO.getReferType());
         if (!listR.isSuccess() || listR.getData().size() == 0) {
            throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
         }
@@ -800,7 +833,7 @@
         if (Func.isNotEmpty(isParticipateCheckOids)) {
            sql[0] += " and codeclsfid not in(" + isParticipateCheckOids + ")";
         }
//         if (boService.queryCountBySql(sql[0], new HashMap<>()) > 0) {
         // if (boService.queryCountBySql(sql[0], new HashMap<>()) > 0) {
         List<String> repeatData = commonsMapper.selectList(sql[0]);
         if (!repeatData.isEmpty()) {
            String ruleInfoMsg = keyRuleVO == null ? "" : "查询规则:去除空格--{0},忽略大小写--{1},忽略全半角--{2},忽略全部空格--{3}";
@@ -825,18 +858,27 @@
      //注意的是keyRuleVO可能为空,表示不使用规则控制
      //获取所有的关键属性
      Map<String, CodeClassifyTemplateAttrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
      // TODO:2024-02-01 先获取配置了近义词查询规则的属性,不同于关键属性,设置了近义词查询规则的属性可能是多条不同的近义词查询规则
      Map<String, CodeClassifyTemplateAttrVO> sysonymAttrMaps = templateVO.getAttributes().stream().filter(item -> Func.isNotBlank(item.getSysonymRuleOids())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
      // 获取是否有配置近义词查询规则属性
      Map<String, List<CodeSynonym>> codeSynonymMaps = new HashMap<>();
      if(!sysonymAttrMaps.isEmpty()){
         // 查询近义词规则,存储方式key:属性id,value近义词查询规则列表
         codeSynonymMaps = codeSynonymService.getCodeSynonymByOids(sysonymAttrMaps);
      }
      Map<String, String> conditionMap = new HashMap<>();
      boolean trimAll = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
      //全部去空的优先级大于去空
      boolean trim = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
      boolean ignoreCase = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
      boolean ignoreWidth = keyRuleVO == null ? false : VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
      Map<String, List<CodeSynonym>> finalCodeSynonymMaps = codeSynonymMaps;
      ketAttrMap.forEach((attrId, attrVO) -> {
         String value = getValueFromOrderDTO(orderDTO, attrId);
         if (value == null) {
            value = "";
         }
         wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
         wrapperKeyAttrConditionMap(value, keyRuleVO, finalCodeSynonymMaps.get(attrId), attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
      });
      //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
@@ -927,7 +969,7 @@
      }
      //是否系列
      if (!codeBZApplyDTO.isSeries()) {
         boolean isSeriesValue = codeBZApplyDTO.getData().get(isSeries).equals("true") ? true : false;
         boolean isSeriesValue = Func.toBoolean(codeBZApplyDTO.getData().get(isSeries));
         codeBZApplyDTO.setSeries(isSeriesValue);
      }
      //原标准号
@@ -947,7 +989,7 @@
      }
      //是否变更系列
      if (!codeBZApplyDTO.isEditSeries()) {
         boolean isEditSeriesValue = codeBZApplyDTO.getData().get(isEditSeries).equals("true") ? true : false;
         boolean isEditSeriesValue = Func.toBoolean(codeBZApplyDTO.getData().get(isEditSeries));
         codeBZApplyDTO.setEditSeries(isEditSeriesValue);
      }
      VciBaseUtil.alertNotNull(codeBZApplyDTO.getOperationType(), "操作类型",
@@ -965,7 +1007,7 @@
      } else if (codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_DISABLE.getValue())) {//作废
         code = amendmentDataBZ(codeBZApplyDTO, authUser);
         createChangeOder(code, codeBZApplyDTO, authUser);
      } else if (codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_AMENDMENT.getValue())) {//备查
      } else if (codeBZApplyDTO.getOperationType().equals(CodeBZOperationTypeEnum.CODE_BZ_FOR_REFERENCE.getValue())) {//备查
         code = amendmentDataBZ(codeBZApplyDTO, authUser);
         createChangeOder(code, codeBZApplyDTO, authUser);
      }
@@ -1235,14 +1277,18 @@
    * @param conditionMap 查询条件
    */
   @Override
   public void wrapperKeyAttrConditionMap(String value, CodeKeyAttrRepeatVO keyRuleVO, String attrId,
   public void wrapperKeyAttrConditionMap(String value, CodeKeyAttrRepeatVO keyRuleVO,
                                 List<CodeSynonym> codeSynonymMaps, String attrId,
                                 boolean trim, boolean ignoreCase, boolean ignoreWidth,
                                 boolean trimAll, Map<String, String> conditionMap) {
      boolean ignoreSpace = trim || trimAll;
      if (StringUtils.isBlank(value)) {
         //为空的时候,不能用QueryOperation.ISNULL,平台不知道啥时候不处理这种了
         //值为空的时候,不能用QueryOperation.ISNULL,平台不知道啥时候不处理这种了
         conditionMap.put("t." + attrId, QueryOptionConstant.ISNULL);
      } else {
         //近义词查询规则valu值转换
         value = this.getValueToSynony(codeSynonymMaps, value);
         if (keyRuleVO != null) {
            String queryKey = "";
            String queryValue = "";
@@ -1278,7 +1324,7 @@
            conditionMap.put(queryKey, queryValue);
         } else {
            if (StringUtils.isNotBlank(value)) {
               //为空的时候不代表不校验,只是不去除相关的信息
               //关键属性查重规则为空的时候不代表不校验,只是不去除相关的信息
               conditionMap.put("nvl(" + "t." + attrId + ",'/')", "'" + SpecialCharacterConverter.escapeSpecialCharacters(value) + "'");
            } else {
               conditionMap.put("t." + attrId, QueryOptionConstant.ISNULL);
@@ -1288,17 +1334,20 @@
   }
   /**
    * 封装近义词查询规则属性的查询语句
    * @param value 当前的值
    * @param keyRuleVO 属性的编号
    * @param attrId
    * @param conditionMap 查询条件
    * 近义词查询规则转换
    * @param codeSynonymMaps
    * @param value
    * @return
    */
   @Override
   public void wrapperSynonymAttrConditionMap(String value, CodeKeyAttrRepeatVO keyRuleVO, String attrId, Map<String, String> conditionMap) {
      // map构造思路:1、先完成正向替换sql值
      // 2、再完成反向替换sql值
   public String getValueToSynony(/*近义词查询规则*/List<CodeSynonym> codeSynonymMaps,String value){
      // 获取并判断是否配置了近义词查询规则
      // TODO:近义词替换成源值(源值是正确的值,近义词是相当于输错笔误的字符)
      if(Func.isNotEmpty(codeSynonymMaps)){
         for (int i = 0; i < codeSynonymMaps.size(); i++) {
            value = value.replace(codeSynonymMaps.get(i).getSynonymValue(),codeSynonymMaps.get(i).getSourceValue());
         }
      }
      return value;
   }
   /**
@@ -1523,7 +1572,6 @@
      wrapperResemble(templateVO, uiInfoVO);
      return uiInfoVO;
   }
   /**
    * 模板属性转换为表单定义的信息
@@ -2014,7 +2062,7 @@
   @Override
   public DataGrid<Map<String, String>> queryGrid(String btmType, CodeClassifyTemplateVO templateVO, Map<String, String> conditionMap, PageHelper pageHelper) {
      CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmType, templateVO, conditionMap, pageHelper);
//      List<Map> maps = boService.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
      // List<Map> maps = boService.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
      List<Map<String, String>> maps = null;
      try {
         maps = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
@@ -2034,39 +2082,39 @@
            for (String s : map.keySet()) {
               data.put(s.toLowerCase(Locale.ROOT), map.get(s) == null ? null : String.valueOf(map.get(s)));
            }
//            map.forEach((key, value) -> {
//               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
//            });
            //   map.forEach((key, value) -> {
            //      data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
            //   });
            dataList.add(data);
         });
         wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), false);
//         maps.stream().forEach(map -> {
//            Map<String, String> data = new HashMap<>();
////            map.forEach((key, value) -> {
////               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////            });
//            for (String s : map.keySet()) {
//               data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//            }
//            dataList.add(data);
//         });
         // maps.stream().forEach(map -> {
         //    Map<String, String> data = new HashMap<>();
         //    map.forEach((key, value) -> {
         //       data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
         //    });
         //    for (String s : map.keySet()) {
         //       data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
         //    }
         //    dataList.add(data);
         // });
      }
//      dataGrid.setData(dataList);
//      if (!CollectionUtils.isEmpty(maps)) {
//         wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
//         maps.stream().forEach(map -> {
//            Map<String, String> data = new HashMap<>();
////            map.forEach((key, value) -> {
////               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////            });
//            for (String s : map.keySet()) {
//               data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//            }
//            dataList.add(data);
//         });
      //      dataGrid.setData(dataList);
      //      if (!CollectionUtils.isEmpty(maps)) {
      //         wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
      //         maps.stream().forEach(map -> {
      //            Map<String, String> data = new HashMap<>();
      ////            map.forEach((key, value) -> {
      ////               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
      ////            });
      //            for (String s : map.keySet()) {
      //               data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
      //            }
      //            dataList.add(data);
      //         });
      dataGrid.setData(dataList);
      dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
//      }
      //      }
      return dataGrid;
   }
@@ -2143,7 +2191,7 @@
               userVOMap.put(String.valueOf(data.getId()), data);
            }
         }
//         Map<String, SmUserVO> userVOMap = Optional.ofNullable(userQueryService.listUserByUserIds(userIds)).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
         // Map<String, SmUserVO> userVOMap = Optional.ofNullable(userQueryService.listUserByUserIds(userIds)).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
         dataMap.stream().forEach(data -> {
            String creator = data.getOrDefault("creator", null);
            if (StringUtils.isNotBlank(creator) && userVOMap.containsKey(creator.toLowerCase(Locale.ROOT))) {
@@ -2156,7 +2204,6 @@
         });
      }
   }
   /**
    * 处理时间格式
@@ -2184,7 +2231,6 @@
         });
      }
   }
   /**
    * 处理枚举的内容,如果不在枚举中,会返回原本的值
@@ -2535,8 +2581,19 @@
            if (referFieldMap.containsKey(field)) {
               return VciBaseUtil.toInSql(referFieldMap.get(field), value);  //referFieldMap.get(field) + SPACE + "= '" + value + "'" + SPACE;
            } else {
               return (field.contains(".") ? "" : "t.") + field + SPACE + "= " + getStringValueInWhere(field, value, attrVOMap) + "" + SPACE;
               //TODO:暂时没考虑IN>1000条的问题
               //return (field.contains(".") ? "" : "t.") + field + SPACE + "= " + getStringValueInWhere(field, value, attrVOMap) + "" + SPACE;
               return (field.contains(".") ? "" : "t.") + field + SPACE + "IN (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE;
            }
         } else if (key.endsWith("_notin")) {
            String field = UBCSSqlKeyword.getColumn(key, "_in");
            if (referFieldMap.containsKey(field)) {
               return VciBaseUtil.toInSql(referFieldMap.get(field), value);  //referFieldMap.get(field) + SPACE + "= '" + value + "'" + SPACE;
            } else {
               //return (field.contains(".") ? "" : "t.") + field + SPACE + "not in (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE;
               return (field.contains(".") ? "" : "t.") + field + SPACE + "IN (" + getStringValueInWhere(field, "IN//"+value, attrVOMap) + ")" + SPACE;
            }
         } else {
//                if (referFieldMap.containsKey(key)) {
//                    //说明是参照的,我们参照的查询都认为是字符串,如果是时间格式的查询肯定有问题,
@@ -2633,13 +2690,21 @@
               || VciFieldTypeEnum.VTInteger.equals(fieldTypeEnum)) {
               return value;
            } else {
               if(value.contains("IN//")){
                  return MybatisParameterUtil.getInClause(Func.toStrList(value.replace("IN//","")));
               }
               return "'" + value + "'";
            }
         } else {
            if ((value.startsWith("(") && value.endsWith(")")) || (value.startsWith("'") && value.endsWith("'"))) {
               return value;
            }else if(value.contains("IN//")){
               //暂时不考虑>1000的情况,因为搜索一般也不会出现搜索1000条的情况
               //return MybatisParameterUtil.convertToOrConditions(field, Func.toStrList(value.replace("IN//","")));
               return MybatisParameterUtil.getInClause(Func.toStrList(value.replace("IN//","")));
            }else{
               return "'" + value + "'";
            }
            return "'" + value + "'";
         }
      }
@@ -2978,7 +3043,7 @@
         conditionMap = new HashMap<>();
      }
      pageHelper.addDefaultDesc("createTime");
//        pageHelper.addDefaultDesc("id");
      // pageHelper.addDefaultDesc("id");
      if (!classifyService.checkHasChild(codeClassifyOid)) {
         conditionMap.put("t." + CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
      } else {
@@ -3008,26 +3073,26 @@
         }
      });
      return mapDataGrid;
//        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
//        //参照让平台直接查询就行
//        List<String> finalSelectFieldList = selectFieldList;
//        List<CodeClassifyTemplateAttrVO> referAttrVOs = templateVO.getAttributes().stream().filter(
//                s -> StringUtils.isNotBlank(s.getReferbtmid())
//                        &&
//                        (finalSelectFieldList.size() ==0 || finalSelectFieldList.contains(s.getId().toLowerCase(Locale.ROOT)))
//        ).collect(Collectors.toList());
//        if(!CollectionUtils.isEmpty(referAttrVOs)){
//            for (int i = 0; i < referAttrVOs.size(); i++) {
//                selectFieldList.add(referAttrVOs.get(i).getId() + ".name");
//            }
//        }
//        //我们使用和业务类型的来查询
//        DataGrid<Map<String,String>> dataGrid = boService.queryGridByBo(btmTypeId, conditionMap, pageHelper, selectFieldList);
//        //我们需要使用模板来转换
//        if(!CollectionUtils.isEmpty(dataGrid.getData())){
//            wrapperData(dataGrid.getData(),templateVO,finalSelectFieldList,false);
//        }
//        return dataGrid;
      //        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
      //        //参照让平台直接查询就行
      //        List<String> finalSelectFieldList = selectFieldList;
      //        List<CodeClassifyTemplateAttrVO> referAttrVOs = templateVO.getAttributes().stream().filter(
      //                s -> StringUtils.isNotBlank(s.getReferbtmid())
      //                        &&
      //                        (finalSelectFieldList.size() ==0 || finalSelectFieldList.contains(s.getId().toLowerCase(Locale.ROOT)))
      //        ).collect(Collectors.toList());
      //        if(!CollectionUtils.isEmpty(referAttrVOs)){
      //            for (int i = 0; i < referAttrVOs.size(); i++) {
      //                selectFieldList.add(referAttrVOs.get(i).getId() + ".name");
      //            }
      //        }
      //        //我们使用和业务类型的来查询
      //        DataGrid<Map<String,String>> dataGrid = boService.queryGridByBo(btmTypeId, conditionMap, pageHelper, selectFieldList);
      //        //我们需要使用模板来转换
      //        if(!CollectionUtils.isEmpty(dataGrid.getData())){
      //            wrapperData(dataGrid.getData(),templateVO,finalSelectFieldList,false);
      //        }
      //        return dataGrid;
   }
   /**
@@ -3440,19 +3505,19 @@
         cbos.add(data);
      });
//      List<ClientBusinessObject> cbos = boService.queryByOnlySql(sqlBO.getSqlUnPage());
      // List<ClientBusinessObject> cbos = boService.queryByOnlySql(sqlBO.getSqlUnPage());
      if (CollectionUtils.isEmpty(cbos)) {
         throw new VciBaseException("数据在系统中不存在,是否因为修改过业务类型?");
         return R.fail("数据在系统中不存在,是否因为修改过业务类型?");
      }
//      Map<String, String> data = new HashMap<>();
      // Map<String, String> data = new HashMap<>();
      Map<String, String> cbo = cbos.get(0);
//      WebUtil.copyValueToMapFromCbos(cbo, data);
      // WebUtil.copyValueToMapFromCbos(cbo, data);
      List<Map<String, String>> dataList = new ArrayList<>();
      dataList.add(cbo);
      wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), true);
      R<List<Map<String, String>>> result = R.data(Collections.singletonList(cbo));
      if(templateVO.getAttributes().isEmpty()){
         throw new ServiceException(String.format("主键为:{}的模板下,模板属性配置为空!",templateVO.getOid()));
         return R.fail(String.format("主键为:%s的模板下,模板属性配置为空!",templateVO.getOid()));
      }
      //处理返回数据与模板数据配置的字段不一样问题
      templateVO.getAttributes().stream().forEach(e -> {
@@ -3465,42 +3530,42 @@
      });
      //我们要看是否不是升版的,升版的话,需要对比不相等的属性
/*        String copy = cbo.get("copyfromversion");
//      if (StringUtils.isBlank(copy)) {
//         copy = cbo.getAttributeValue("copyfromversion");
//      }
        if (StringUtils.isNotBlank(copy)) {
            //说明有变更的内容
      /*        String copy = cbo.get("copyfromversion");
      //      if (StringUtils.isBlank(copy)) {
      //         copy = cbo.getAttributeValue("copyfromversion");
      //      }
            if (StringUtils.isNotBlank(copy)) {
               //说明有变更的内容
            CodeTemplateAttrSqlBO oldSqlBO = getSqlByTemplateVO(btmId, templateVO, WebUtil.getOidQuery(copy), new PageHelper(-1));
            //我们使用和业务类型的来查询
//         List<Map> cbos = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
            List<Map> oldCbos = commonsMapper.selectBySql(oldSqlBO.getSqlUnPage());
            if (!CollectionUtils.isEmpty(oldCbos)) {
//            Map<String, String> newData = new HashMap<>();
//            WebUtil.copyValueToMapFromCbos(cbo, newData);
                Map<String, String> oldData = new HashMap<>();
                oldData = oldCbos.get(0);
                Map<String, String> difFieldMap = new HashMap<>();
                Map<String, String> finalOldData = oldData;
                cbo.forEach((key, value) -> {
               // 这儿oldmap中的全是大写,而cbo中的全是小写所以会拿不到只,这儿直接处理成小写拿不到就用大写拿
               String oldValue = String.valueOf(finalOldData.getOrDefault(key.toUpperCase(Locale.ROOT), finalOldData.getOrDefault(key, "")));
               if (value == null || value == "null") {
                        value = "";
                    }
                    if (oldValue == null || oldValue == "null") {
                        oldValue = "";
                    }
                    if (!value.equalsIgnoreCase(oldValue)) {
                        difFieldMap.put(key, oldValue);
                    }
                });
                List<Map<String, String>> difFieldList = new ArrayList<>();
                difFieldList.add(difFieldMap);
                result.setData(difFieldList);
            }
        }*/
               CodeTemplateAttrSqlBO oldSqlBO = getSqlByTemplateVO(btmId, templateVO, WebUtil.getOidQuery(copy), new PageHelper(-1));
               //我们使用和业务类型的来查询
      //         List<Map> cbos = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
               List<Map> oldCbos = commonsMapper.selectBySql(oldSqlBO.getSqlUnPage());
               if (!CollectionUtils.isEmpty(oldCbos)) {
      //            Map<String, String> newData = new HashMap<>();
      //            WebUtil.copyValueToMapFromCbos(cbo, newData);
                  Map<String, String> oldData = new HashMap<>();
                  oldData = oldCbos.get(0);
                  Map<String, String> difFieldMap = new HashMap<>();
                  Map<String, String> finalOldData = oldData;
                  cbo.forEach((key, value) -> {
                     // 这儿oldmap中的全是大写,而cbo中的全是小写所以会拿不到只,这儿直接处理成小写拿不到就用大写拿
                     String oldValue = String.valueOf(finalOldData.getOrDefault(key.toUpperCase(Locale.ROOT), finalOldData.getOrDefault(key, "")));
                     if (value == null || value == "null") {
                        value = "";
                     }
                     if (oldValue == null || oldValue == "null") {
                        oldValue = "";
                     }
                     if (!value.equalsIgnoreCase(oldValue)) {
                        difFieldMap.put(key, oldValue);
                     }
                  });
                  List<Map<String, String>> difFieldList = new ArrayList<>();
                  difFieldList.add(difFieldMap);
                  result.setData(difFieldList);
               }
      }*/
      return result;
   }
@@ -4371,8 +4436,8 @@
               if (cboMap.containsKey(oid)) {
                  CodeAllCode codeAllCode = cboMap.get(oid);
                  codeAllCode.setId(baseModel.getId());
                  // codeAllCode.setLastModifier(AuthUtil.getUser().getUserName());
                  codeAllCode.setLastModifier(AuthUtil.getUser().getAccount());
                  // 主数据推送形式,是拿不到用户信息的
                  codeAllCode.setLastModifier(Func.isBlank(AuthUtil.getUserAccount()) ? applyCodeUserAccount:AuthUtil.getUserAccount());
                  codeAllCode.setLastModifyTime(new Date());
                  codeAllCode.setLcStatus(baseModel.getLcStatus());
                  newCodeAllCodeList.add(codeAllCode);
@@ -4695,7 +4760,13 @@
      */
      Map<String, Object> nextRevision = commonsMapper.getCurrentRevision(listR.getData().get(0).getTableName(), fromBo.getNameOid());
      R<RevisionRuleVO> revisionRuleVOR = revisionRuleClient.selectById(listR.getData().get(0).getRevisionRuleId());
      String revisionval = nextRevision.get("REVISIONVAL").toString();
      String revisionval = "";
      try{
         revisionval = nextRevision.get("REVISIONVAL").toString();
      }catch (Exception e){
         throw new ServiceException("业务数据版次值获取出错,原因:" + e.getMessage());
      }
      // 未查询到版本规则,默认直接给大版本加一
      if (!revisionRuleVOR.isSuccess() || Func.isEmpty(revisionRuleVOR.getData())) {
         revisionval = String.valueOf((Integer.parseInt(revisionval) + 1));