1428594221
2023-06-14 931eb15f748f181fbf347508830f21830f09c863
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.service.impl;
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.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
@@ -8,6 +9,7 @@
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
import com.vci.ubcs.code.dto.CodeDeleteBatchDTO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
@@ -20,6 +22,8 @@
import com.vci.ubcs.code.vo.pagemodel.UITableFieldVO;
import com.vci.ubcs.code.vo.pagemodel.UITablePageVO;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.omd.constant.BtmTypeLcStatusConstant;
import com.vci.ubcs.omd.entity.BtmTypeAttribute;
import com.vci.ubcs.omd.feign.IAttributeClient;
import com.vci.ubcs.omd.feign.IBtmTypeClient;
import com.vci.ubcs.omd.feign.IEnumClient;
@@ -30,6 +34,7 @@
import com.vci.ubcs.omd.vo.RevisionRuleVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
@@ -48,16 +53,21 @@
import com.vci.ubcs.system.user.feign.IUserClient;
import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
import oracle.sql.TIMESTAMP;
import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.StringPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import plm.bs.bom.clientobject.ClientBusinessObject;
import javax.annotation.Resource;
import java.beans.BeanInfo;
@@ -264,7 +274,7 @@
   /**
    * 替换字符
    */
   public static final String SPECIAL_CHAR  = "VCI";
   public static final String SPECIAL_CHAR = "VCI";
//   @Autowired
//   private CodeOsbtmtypeMapper codeOsbtmtypeMapper;----
@@ -310,7 +320,7 @@
//          Dict dict = new Dict();
//         dict.setParentId(Long.valueOf(attrVO.getEnumid()));
         R<List<EnumVO>> list = enumClient.getList(attrVO.getEnumId());
         if(list.isSuccess()){
         if (list.isSuccess()) {
            for (EnumVO datum : list.getData()) {
               KeyValue keyValue = new KeyValue();
               keyValue.setKey(datum.getItemValue());
@@ -321,12 +331,12 @@
      }
      return comboboxKVs;
   }
   /**
    * 修改状态
    *
    * @param baseModelDTO 数据传输对象
    */
   @Transactional
   @Override
   public void changeStatus(BaseModelDTO baseModelDTO) {
      VciBaseUtil.alertNotNull(baseModelDTO, "数据信息", baseModelDTO.getOid(), "主键", baseModelDTO.getBtmname(), "业务类型", baseModelDTO.getLcStatus(), "目标状态");
@@ -337,6 +347,14 @@
      wrapper.eq("BTMNAME",baseModelDTO.getBtmname());
      wrapper.in("OID",oids);
      // TODO 待完善
      //插个点 业务类型完成后需要修改
//      QueryWrapper<BtmTypeVO> wrapper = new QueryWrapper<>();
      List<BaseModel> baseModels = new ArrayList<>();
      baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
      if(baseModels.size() == 0){
         throw new VciBaseException("未查询到相关数据。");
      }
      // 待完善
      List<BtmTypeVO> cboList =  null;  // btmTypeClient.selectList(wrapper);
      //还需要修改allCode的生命周期
//      Map<String, String> conditionMap = new HashMap<>();
@@ -349,6 +367,9 @@
//      List<ClientBusinessObject> codeCbos = boService.queryCBO(MdmBtmTypeConstant.CODE_ALL_CODE, conditionMap);
      // 回收需要业务数据删除
      if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
         R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
//         String referTable = listR.getData().get(0).getTableName();
         commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(),VciBaseUtil.toInSql(baseModelDTO.getOid()));
         // BatchCBO batchCBO = new BatchCBO();
         // batchCBO.getDeleteCbos().addAll(cboList);
@@ -357,8 +378,16 @@
         //boService.persistenceBatch(batchCBO);
      } else {
         for (BaseModel baseModel : baseModels) {
            baseModel.setLcStatus(baseModelDTO.getLcStatus());
         }
         updateBatchByBaseModel(baseModelDTO.getBtmname(),baseModels);
         // lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
      }
      for (CodeAllCode codeCbo : codeCbos) {
         codeCbo.setLcStatus(baseModelDTO.getLcStatus());
      }
      codeAllCodeService.updateBatchById(codeCbos);
      // lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
   }
@@ -625,9 +654,10 @@
      //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
      if (!CollectionUtils.isEmpty(conditionMap)) {
         //表需要改
//         final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
         final String[] sql = {"select count(*) from pl_code_wupin t where 1 = 1 "};
         R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(classifyFullInfo.getTopClassifyVO().getBtmtypeid()));
//            String referTable = VciBaseUtil.getTableName(referVO.getReferType());
         final String[] sql = {"select count(*) from "+ listR.getData().get(0).getTableName() +" t where 1 = 1 "};
         conditionMap.forEach((key, value) -> {
            sql[0] += " and " + key + " = " + value;
         });
@@ -1161,7 +1191,7 @@
         //处理所有的列,这个模板没有合并的表头的情况
         List<UITableFieldVO> fieldVOList = new ArrayList<>();
         resembleAttrList.forEach(attrVO -> {
            UITableFieldVO tableFieldVO = templateAttr2TableField(attrVO,false);
            UITableFieldVO tableFieldVO = templateAttr2TableField(attrVO, false);
            tableFieldVO.setHidden(false);
            fieldVOList.add(tableFieldVO);
         });
@@ -1176,12 +1206,12 @@
   /**
    * 模板属性转换为表格显示的配置
    *
    * @param attrVO 模板属性
    * @param attrVO  模板属性
    * @param forEdit 是否是编辑所需
    * @return 表格的字段
    */
   @Override
   public UITableFieldVO templateAttr2TableField(CodeClassifyTemplateAttrVO attrVO,boolean forEdit) {
   public UITableFieldVO templateAttr2TableField(CodeClassifyTemplateAttrVO attrVO, boolean forEdit) {
      UITableFieldVO fieldVO = new UITableFieldVO();
      if (SECRET_FILED.equalsIgnoreCase(attrVO.getId())) {
         attrVO.setEnumId(MY_DATA_SECRET);
@@ -1192,9 +1222,9 @@
      fieldVO.setSort(true);
      fieldVO.setSortField(fieldVO.getField());
      fieldVO.setQueryField(fieldVO.getField());
      if (forEdit){
      if (forEdit) {
         fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getFormDisplayFlag()));
      }else {
      } else {
         fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getTableDisplayFlag()));
      }
      if (attrVO.getAttrTableWidth() != null && attrVO.getAttrTableWidth() > 0) {
@@ -1214,7 +1244,7 @@
            if (StringUtils.isBlank(attrVO.getEnumId())) {
               fieldVO.setComboxKey(fieldVO.getField() + "_data");
            }
         }else {
         } else {
//            List<KeyValue> osEnumItemVOList= enumService.getEnum(attrVO.getEnumId());
//            fieldVO.setData(osEnumItemVOList);
         }
@@ -1384,8 +1414,8 @@
            }
         }
         queryValue = String.format(temp, (trim ? value.trim() : value));
         temp = temp.replace("to_single_byte('%s')","to_single_byte(%s)");
         queryKey = String.format(temp, "t."+attrId);
         temp = temp.replace("to_single_byte('%s')", "to_single_byte(%s)");
         queryKey = String.format(temp, "t." + attrId);
         conditionMap.put(queryKey, QueryOptionConstant.OR + queryValue);
      }
   }
@@ -1404,35 +1434,49 @@
   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<String,String>> maps = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
      List<Map<String, String>> maps = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
      DataGrid<Map<String, String>> dataGrid = new DataGrid<>();
      List<Map<String, String>> dataList = new ArrayList<>();
//      if (!CollectionUtils.isEmpty(maps)) {
//         maps.stream().forEach(map -> {
//            Map<String, String> data = new HashMap<>();
//            map.forEach((key, value) -> {
//               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
//            });
//            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<>();
            for (String s : map.keySet()) {
               data.put(s.toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
            }
//            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()));
         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);
//         });
      }
//      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;
   }
@@ -1443,7 +1487,7 @@
    * @param dataMap              数据的映射
    * @param templateVO           模板的属性
    * @param onlySelectAttrIdList 仅仅查询的属性字段
    * @param form 表单里使用
    * @param form                 表单里使用
    */
   @Override
   public void wrapperData(List<Map<String, String>> dataMap, CodeClassifyTemplateVO templateVO,
@@ -1474,15 +1518,15 @@
         //处理枚举
         wrapperEnum(enumAttrVOs, data);
         String lcstatus = data.get(VciQueryWrapperForDO.LC_STATUS_FIELD);
         String copyFromVersion = data.getOrDefault(COPY_FROM_VERSION,"");
         String copyFromVersion = data.getOrDefault(COPY_FROM_VERSION, "");
         if ((CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus) || CodeDefaultLC.AUDITING.getValue().equalsIgnoreCase(lcstatus))
            && StringUtils.isBlank(copyFromVersion)
         ) {
            data.put(VciQueryWrapperForDO.ID_FIELD, "******");
         }
         data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), CodeDefaultLC.getTextByValue(lcstatus));
         if(CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus)
            && StringUtils.isNotBlank(copyFromVersion)){
         if (CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus)
            && StringUtils.isNotBlank(copyFromVersion)) {
            data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), "修改中");
         }
         if (data.containsKey("creator")) {
@@ -1495,12 +1539,12 @@
      if (!CollectionUtils.isEmpty(userIds)) {
         Map<String, User> userVOMap = new HashMap<>();
         for (String userId : userIds) {
            if(!StringUtils.isNumeric(userId)){
            if (!StringUtils.isNumeric(userId)) {
               continue;
            }
            User data = iUserClient.userInfoById(Long.valueOf(userId)).getData();
            if(data != null){
               userVOMap.put(String.valueOf(data.getId()),data);
            if (data != null) {
               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));
@@ -1633,7 +1677,7 @@
//            selectFieldList.add(attrId.getOid());
//         }
//      });
      if(allAttributeByBtmId.getData() != null ){
      if (allAttributeByBtmId.getData() != null) {
         for (BtmTypeAttributeVO attribute : allAttributeByBtmId.getData().getAttributes()) {
            if (!selectFieldList.contains(attribute.getId()) && !"secretgrade".equalsIgnoreCase(attribute.getId())) {
               selectFieldList.add(attribute.getId());
@@ -1708,9 +1752,7 @@
         }
         whereSql += " and ( t.secretGrade <= " + userSecret + ") ";
      }
      //要改,表明获取有问题
//      String tableName = VciBaseUtil.getTableName(btmType);
//      String tableName = "pl_code_wupin";
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
//            String referTable = VciBaseUtil.getTableName(referVO.getReferType());
      String tableName = listR.getData().get(0).getTableName();
@@ -2025,8 +2067,6 @@
//      return codeList.size() > 0 ? codeList.get(0) : "";
      //修改的时候,编码是不变的
//      BatchCBO batchCBO = new BatchCBO();
//      batchCBO.getUpdateCbos().add(cbo);
@@ -2071,10 +2111,10 @@
      //只能删除自己创建的数据
      String userId = AuthUtil.getUser().getUserName();
      for (CodeWupin clientBusinessObject:cboList){
      for (CodeWupin clientBusinessObject : cboList) {
         String creator = clientBusinessObject.getCreator();
         if(!userId.equalsIgnoreCase(creator)){
            throw new VciBaseException("编码为"+clientBusinessObject.getId()+"的数据不是当前用户创建,不能删除!");
         if (!userId.equalsIgnoreCase(creator)) {
            throw new VciBaseException("编码为" + clientBusinessObject.getId() + "的数据不是当前用户创建,不能删除!");
         }
      }
@@ -2158,15 +2198,18 @@
      //pageHelper.addDefaultDesc("createTime");
      pageHelper.addDefaultDesc("id");
      if (!classifyService.checkHasChild(codeClassifyOid)) {
         conditionMap.put(CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
         conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
      } else {
         //表需要改
//         conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY)
         conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from pl_code_classify where lcstatus='" + FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED +
            "' start with parentCodeClassifyOid = '" + codeClassifyOid + "' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
         conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from "+
            btmTypeClient.selectByIdCollection(Collections.singletonList(MdmBtmTypeConstant.CODE_CLASSIFY))
               .getData().get(0).getTableName() +" where lcstatus='" + FrameWorkDefaultValueConstant
            .FRAMEWORK_DATA_ENABLED + "' start with parentCodeClassifyOid = '" + codeClassifyOid +
            "' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
      }
      conditionMap.put("lastr", "1");
      conditionMap.put("lastv", "1");
      conditionMap.put("t.lastr", "1");
      conditionMap.put("t.lastv", "1");
      return queryGrid(btmTypeId, templateVO, conditionMap, pageHelper);
//        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
//        //参照让平台直接查询就行
@@ -2481,11 +2524,11 @@
      String btmId = topClassifyVO.getBtmtypeid();
      //查询数据
      Map<String, String> conditionMap = new HashMap<>();
      conditionMap.put("t.oid",oid);
      conditionMap.put("t.oid", oid);
      CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmId, templateVO, conditionMap, new PageHelper(-1));
      //我们使用和业务类型的来查询
      List<Map> cbosB = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
      List<Map<String,String>> cbos = new ArrayList<>();
      List<Map<String, String>> cbos = new ArrayList<>();
      cbosB.stream().forEach(map -> {
         Map<String, String> data = new HashMap<>();
         for (Object o : map.keySet()) {
@@ -2499,7 +2542,7 @@
         throw new VciBaseException("数据在系统中不存在,是否因为修改过业务类型?");
      }
//      Map<String, String> data = new HashMap<>();
      Map<String,String> cbo = cbos.get(0);
      Map<String, String> cbo = cbos.get(0);
//      WebUtil.copyValueToMapFromCbos(cbo, data);
      List<Map<String, String>> dataList = new ArrayList<>();
      dataList.add(cbo);
@@ -2595,10 +2638,10 @@
      QueryWrapper<CodeWupin> wrapper = new QueryWrapper();
      if (conditionMap.get("oid").contains(",")) {
//         oidMap.put("oid", QueryOptionConstant.IN +"("+ VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
         wrapper.in("oid",oidList);
         wrapper.in("oid", oidList);
      } else {
//         oidMap.put("oid", conditionMap.get("oid"));
         wrapper.in("oid",conditionMap.get("oid"));
         wrapper.in("oid", conditionMap.get("oid"));
      }
      if (CollectionUtils.isEmpty(oidMap)) {
         throw new VciBaseException("业务数据主键不能为空");
@@ -2631,18 +2674,18 @@
      CodeClassifyTemplateVO templateVO = templateService.codeClassifyTemplateDO2VO(templateDOList.get(0));
      templateVO.setAttributes(codeClassifyTemplateAttrService.codeClassifyTemplateAttrDO2VOs(attrDOList));
      try {
         if (oidList.size() > 1){
            DataGrid<Map<String,String>> allDataGrid = new DataGrid<>();
            List<Map<String,String>> allData = new ArrayList<>();
         if (oidList.size() > 1) {
            DataGrid<Map<String, String>> allDataGrid = new DataGrid<>();
            List<Map<String, String>> allData = new ArrayList<>();
            oidList.forEach(oid -> {
               Map<String,String> condition = new HashMap<>();
               condition.put("oid",oid);
               Map<String, String> condition = new HashMap<>();
               condition.put("oid", oid);
               DataGrid<Map<String, String>> dataGrid = queryGrid(btmType, templateVO, condition, pageHelper);
               allData.addAll(dataGrid.getData());
            });
            allDataGrid.setData(allData);
            return allDataGrid;
         }else {
         } else {
            return queryGrid(btmType, templateVO, conditionMap, pageHelper);
         }
      } catch (Exception e) {
@@ -2662,20 +2705,20 @@
      MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
      CodeClassifyTemplateVO templateVO = getUsedTemplateByClassifyOid(codeClassifyOid);
      uiInfoVO.setTemplateVO(templateVO);
      UITableDefineVO uiTableDefineVO = wrapperTableDefineByTemplate(templateVO,true);
      UITableDefineVO uiTableDefineVO = wrapperTableDefineByTemplate(templateVO, true);
      List<String> phaseAttrIdList = listPhaseAttrByClassifyOid(codeClassifyOid, phase);
      uiTableDefineVO.getCols().stream().forEach(list -> {
         List<UITableFieldVO> visiableTableField=new ArrayList<>();
         if(StringUtils.isNotBlank(phase)) {
         List<UITableFieldVO> visiableTableField = new ArrayList<>();
         if (StringUtils.isNotBlank(phase)) {
            visiableTableField = list.stream().filter(col ->
               phaseAttrIdList.stream().anyMatch(s -> StringUtils.equalsIgnoreCase(col.getField(), s) ||
                  (StringUtils.equalsIgnoreCase(col.getFieldType(), "combox") && StringUtils.equalsIgnoreCase(col.getSortField(), s))
                  || (StringUtils.equalsIgnoreCase(col.getFieldType(), "refer") && StringUtils.equalsIgnoreCase(col.getQueryField(), s))
               )).collect(Collectors.toList());
         }else{
            visiableTableField=  list.stream().filter(col ->
         } else {
            visiableTableField = list.stream().filter(col ->
               templateVO.getAttributes().stream().anyMatch(s ->
                  (!s.getReadOnlyFlag().equalsIgnoreCase("true")&& StringUtils.equalsIgnoreCase(col.getField(), s.getId())) ||
                  (!s.getReadOnlyFlag().equalsIgnoreCase("true") && StringUtils.equalsIgnoreCase(col.getField(), s.getId())) ||
                     (StringUtils.equalsIgnoreCase(col.getFieldType(), "combox") && StringUtils.equalsIgnoreCase(col.getSortField(), s.getId()))
                     || (StringUtils.equalsIgnoreCase(col.getFieldType(), "refer") && StringUtils.equalsIgnoreCase(col.getQueryField(), s.getId()))
               )).collect(Collectors.toList());
@@ -2687,9 +2730,9 @@
               setReferConfig2EditConfig(vo);
            } else if ("combox".equalsIgnoreCase(vo.getFieldType())) {
               setComboxConfig2EditConfig(vo);
            } else if (StringUtils.isNotBlank(vo.getDateFormate())){
            } else if (StringUtils.isNotBlank(vo.getDateFormate())) {
               vo.setEdit("date");
            }else {
            } else {
               vo.setEdit(vo.getFieldType());
            }
         });
@@ -2769,14 +2812,14 @@
    * @param vo 表格字段显示对象
    */
   private void setReferConfig2EditConfig(UITableFieldVO vo) {
      if (!CollectionUtils.isEmpty(vo.getReferConfig().getWhere())){
      if (!CollectionUtils.isEmpty(vo.getReferConfig().getWhere())) {
         vo.getReferConfig().getWhere().keySet().forEach(key -> {
            vo.getReferConfig().getWhere().put(key, "'" + vo.getReferConfig().getWhere().get(key) + "'");
         });
      }
      if (StringUtils.isNotBlank(vo.getReferConfig().getParentValue())){
      if (StringUtils.isNotBlank(vo.getReferConfig().getParentValue())) {
         String parentValue = vo.getReferConfig().getParentValue();
         parentValue ="\\" +  parentValue.replaceAll("'","{vci-quote}").replaceAll("=","{vci-equals}");
         parentValue = "\\" + parentValue.replaceAll("'", "{vci-quote}").replaceAll("=", "{vci-equals}");
         vo.getReferConfig().setParentValue(parentValue);
      }
      String referConfig = vo.getReferConfig().toString()
@@ -2800,16 +2843,16 @@
    */
   private void setComboxConfig2EditConfig(UITableFieldVO vo) {
      vo.setEditConfig("{editable:true,comboxKey:'" + vo.getComboxKey() + "'");
      if (!CollectionUtils.isEmpty(vo.getData())){
         vo.setEditConfig(vo.getEditConfig()+", comboxConfig:");
      if (!CollectionUtils.isEmpty(vo.getData())) {
         vo.setEditConfig(vo.getEditConfig() + ", comboxConfig:");
         for (int i = 0; i < vo.getData().size(); i++) {
            KeyValue data = vo.getData().get(i);
            if (i == vo.getData().size() -1){
               vo.setEditConfig(vo.getEditConfig() + "{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'}]}");
            }else if (i == 0){
               vo.setEditConfig(vo.getEditConfig() + "{data:[{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'},");
            }else{
               vo.setEditConfig(vo.getEditConfig() + "{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'},");
            if (i == vo.getData().size() - 1) {
               vo.setEditConfig(vo.getEditConfig() + "{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'}]}");
            } else if (i == 0) {
               vo.setEditConfig(vo.getEditConfig() + "{data:[{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'},");
            } else {
               vo.setEditConfig(vo.getEditConfig() + "{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'},");
            }
         }
         vo.setEditConfig(vo.getEditConfig() + ",valueField:'" + vo.getQueryField() + "'");
@@ -2827,7 +2870,7 @@
   @Override
   public MdmUIInfoVO getFormDefineByClassifyIdPath(String idPath) {
      CodeClassifyVO classifyVO = classifyService.getObjectByIdPath(idPath);
      if(classifyVO !=null){
      if (classifyVO != null) {
         return getFormDefineByClassifyOid(classifyVO.getOid());
      }
      return null;
@@ -2872,7 +2915,7 @@
      MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
      uiInfoVO.setTemplateVO(templateVO);
      //我们需要将模板转换为表格相关的显示信息
      uiInfoVO.setTableDefineVO(wrapperTableDefineByTemplate(uiInfoVO.getTemplateVO(),false));
      uiInfoVO.setTableDefineVO(wrapperTableDefineByTemplate(uiInfoVO.getTemplateVO(), false));
      //需要去看扩展的按钮,只有列表里面本身才添加进去,工具栏上的单独获取
      List<CodeClassifyTemplateButtonVO> buttonVOS = templateButtonService.listButtonByTemplateOid(templateVO.getOid(), true);
      if (!CollectionUtils.isEmpty(buttonVOS)) {
@@ -2911,8 +2954,8 @@
   @Override
   public MdmUIInfoVO getUIInfoByClassifyIdPath(String codeClassifyIdPath, String functionId) {
      CodeClassifyVO classifyVO = classifyService.getObjectByIdPath(codeClassifyIdPath);
      if(classifyVO !=null){
         return getUIInfoByClassifyOid(classifyVO.getOid(),functionId);
      if (classifyVO != null) {
         return getUIInfoByClassifyOid(classifyVO.getOid(), functionId);
      }
      return null;
   }
@@ -3002,7 +3045,7 @@
    * @return 处理成功数据条数
    */
   @Override
   public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) throws Exception {
   public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) {
      //使用传入的业务类型查询表
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
      if(listR.getData().size() == 0){
@@ -3024,15 +3067,15 @@
    * 传入业务类型以及相oid集合查询数据进行返回
    *
    * @param btmType 业务类型
    * @param oids      需要查询的oid集合 逗号分开
    * @param oids    需要查询的oid集合 逗号分开
    * @return 查询出的数据
    */
   @Override
   public List<BaseModel> selectByTypeAndOid(String btmType, String oids) throws IllegalAccessException, NoSuchFieldException, InstantiationException, InvocationTargetException, IntrospectionException, SQLException {
   public List<BaseModel> selectByTypeAndOid(String btmType, String oids)  {
      //使用传入的业务类型查询表
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
      if(listR.getData().size() == 0){
      if (listR.getData().size() == 0) {
         throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
      }
      //查询数据
@@ -3041,38 +3084,42 @@
      List<BaseModel> baseModels = new ArrayList<>();
      //将查询到的数据转换为basemodel,使用的反射方式来进行创建的
      for (Map map : maps) {
         Object obj = BaseModel.class.newInstance();
         BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
         PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
         for (PropertyDescriptor property : propertyDescriptors) {
            Method setter = property.getWriteMethod();
            if (setter != null) {
               //oracle的时间为TIMESTAMP的,需要进行转换成data,否则将报错
               if(map.get(property.getName().toUpperCase()) instanceof TIMESTAMP){
                  LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
                  ZoneId zoneId = ZoneId.systemDefault();
                  ZonedDateTime zdt = localDateTime.atZone(zoneId);
                  Date date = Date.from(zdt.toInstant());
                  setter.invoke(obj,date);
                  map.remove(property.getName().toUpperCase());
               } //oracle的数字为BigDecimal的,需要进行转换成Integer,否则将报错
               else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
                  && ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())){
                  setter.invoke(obj, ((BigDecimal)map.get(property.getName().toUpperCase())).intValue());
                  map.remove(property.getName().toUpperCase());
               }else if(map.get(property.getName().toUpperCase()) != null){
                  setter.invoke(obj, map.get(property.getName().toUpperCase()));
                  map.remove(property.getName().toUpperCase());
      try{
         for (Map map : maps) {
            Object obj = BaseModel.class.newInstance();
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
               Method setter = property.getWriteMethod();
               if (setter != null) {
                  //oracle的时间为TIMESTAMP的,需要进行转换成data,否则将报错
                  if(map.get(property.getName().toUpperCase()) instanceof TIMESTAMP){
                     LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
                     ZoneId zoneId = ZoneId.systemDefault();
                     ZonedDateTime zdt = localDateTime.atZone(zoneId);
                     Date date = Date.from(zdt.toInstant());
                     setter.invoke(obj,date);
                     map.remove(property.getName().toUpperCase());
                  } //oracle的数字为BigDecimal的,需要进行转换成Integer,否则将报错
                  else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
                     && ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())){
                     setter.invoke(obj, ((BigDecimal)map.get(property.getName().toUpperCase())).intValue());
                     map.remove(property.getName().toUpperCase());
                  }else if(map.get(property.getName().toUpperCase()) != null){
                     setter.invoke(obj, map.get(property.getName().toUpperCase()));
                     map.remove(property.getName().toUpperCase());
                  }
               }
            }
         }
         for (Object key : map.keySet()) {
            map.put(key,String.valueOf(map.get(key)));
         }
            for (Object key : map.keySet()) {
               map.put(key,String.valueOf(map.get(key)));
            }
         ((BaseModel) obj).setData(map);
         baseModels.add((BaseModel) obj);
            ((BaseModel) obj).setData(map);
            baseModels.add((BaseModel) obj);
         }
      }catch (Exception e){
         throw new VciBaseException("查询失败:" + e.getMessage());
      }
      return baseModels;
   }
@@ -3148,7 +3195,7 @@
    * @return 处理状态
    */
   @Override
   public R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) throws Exception {
   public R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) {
      //使用传入的业务类型查询表
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
      if(listR.getData().size() == 0){
@@ -3173,4 +3220,149 @@
      return R.success("更新成功!");
   }
   /**
    * 获取参照的信息
    *
    * @param referConfigVO 参照的配置
    * @param pageHelper    分页的工具
    * @return 列表数据
    */
   @Override
   public DataGrid referDataGrid(UIFormReferVO referConfigVO, PageHelper pageHelper) {
//      checkReferConfig(referConfigVO);
      //使用业务类型查询
      R<BtmTypeVO> allAttributeByBtmId = btmTypeClient.getAllAttributeByBtmId(referConfigVO.getReferType());
      BtmTypeVO btmTypeVO = allAttributeByBtmId.getData();
      if (referConfigVO.getWhere() == null) {
         referConfigVO.setWhere(new HashMap<>());
      }
      /**
       * 加上查询最新版次
       */
      Map<String, String> conditionMap = new HashMap<>();
      conditionMap.put("lastr", "1");
      conditionMap.put("lastv", "1");
      referConfigVO.getWhere().putAll(conditionMap);
      if (VciBaseUtil.containsKeyUnCaseForMap(referConfigVO.getWhere(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
         BtmTypeLcStatusConstant.FRAME_WORK_LIFE_CYCLE_NAME.equalsIgnoreCase(btmTypeVO.getLifeCycleId())) {
         referConfigVO.getWhere().put(VciQueryWrapperForDO.LC_STATUS_FIELD, FrameworkDataLCStatus.ENABLED.getValue());
      }
      if (VciBaseUtil.containsKeyUnCaseForMap(referConfigVO.getWhere(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
         BtmTypeLcStatusConstant.RELEASE_LIFE_CYCLE.equalsIgnoreCase(btmTypeVO.getLifeCycleId())) {
         referConfigVO.getWhere().put(VciQueryWrapperForDO.LC_STATUS_FIELD, CodeDefaultLC.RELEASED.getValue());
      }
      BaseQueryObject baseQueryObject = new BaseQueryObject();
      Map<String, String> where = referConfigVO.getWhere();
      where.put("domain", AppConstant.APPLICATION_NAME_CODE);
      baseQueryObject.setConditionMap(where);
      baseQueryObject.setPage(pageHelper.getPage());
      baseQueryObject.setSort(pageHelper.getSort());
      baseQueryObject.setLimit(pageHelper.getLimit());
      baseQueryObject.setOrder(pageHelper.getOrder());
      R<List<BtmTypeVO>> ref = btmTypeClient.getRef(baseQueryObject);
      DataGrid<BtmTypeVO> btmTypeVODataGrid = new DataGrid<>();
      List<BtmTypeVO> data = ref.getData();
      btmTypeVODataGrid.setData(data);
      btmTypeVODataGrid.setCode(ref.getCode());
      btmTypeVODataGrid.setLimit(pageHelper.getLimit());
      btmTypeVODataGrid.setMsg(ref.getMsg());
      btmTypeVODataGrid.setSort(pageHelper.getSort());
      btmTypeVODataGrid.setOrder(pageHelper.getOrder());
      btmTypeVODataGrid.setPage(pageHelper.getPage());
      return btmTypeVODataGrid;
   }
   /**
    * 获取树形的参照
    *
    * @param referConfigVO 参照的配置
    * @return 树形的数据
    */
   @Override
   public List<Tree> referTree(UIFormReferVO referConfigVO, TreeQueryObject queryObject) {
      if (queryObject.getConditionMap() == null) {
         queryObject.setConditionMap(new HashMap<>());
      }
      if (queryObject.getParentOid()==null){
         LambdaQueryWrapper<CodeClassify> lqw = new LambdaQueryWrapper<>();
         String parentValue = referConfigVO.getParentValue().substring(3);
         lqw.inSql(CodeClassify::getOid,parentValue);
         List<String> codeClassifies = classifyService.select1(lqw);
         String oid = codeClassifies.get(0);
         queryObject.setParentOid(oid);
      }
      String oidFieldName = StringUtils.isNotBlank(referConfigVO.getParentUsedField()) ? referConfigVO.getParentUsedField() : referConfigVO.getValueField();
      if (queryObject.isQueryAllLevel()) {
         String parentOidSql = "";
         if (StringUtils.isNotBlank(referConfigVO.getParentValue())) {
            String temp = referConfigVO.getParentValue();
            if (temp.startsWith(QueryOptionConstant.IN)) {
               temp = temp.substring((QueryOptionConstant.IN).length()).trim();
               parentOidSql = " in " + ((temp.startsWith("(") && temp.endsWith(")")) ? temp : "(" + temp + ")");
            } else if (temp.startsWith(QueryOptionConstant.NOTIN)) {
               parentOidSql = " not in " + ((temp.startsWith("(") && temp.endsWith(")")) ? temp : "(" + temp + ")");
            } else if (temp.startsWith(QueryOptionConstant.NOTEQUAL)) {
               temp = temp.substring((QueryOptionConstant.NOTEQUAL).length()).trim();
               parentOidSql = QueryOptionConstant.NOTEQUAL + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
            } else if (temp.startsWith(QueryOptionConstant.MORETHAN)) {
               temp = temp.substring((QueryOptionConstant.MORETHAN).length()).trim();
               parentOidSql = QueryOptionConstant.MORETHAN + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
            } else if (temp.startsWith(QueryOptionConstant.MORE)) {
               temp = temp.substring((QueryOptionConstant.MORE).length()).trim();
               parentOidSql = QueryOptionConstant.MORE + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
            } else if (temp.startsWith(QueryOptionConstant.LESSTHAN)) {
               temp = temp.substring((QueryOptionConstant.LESSTHAN).length()).trim();
               parentOidSql = QueryOptionConstant.LESSTHAN + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
            } else if (temp.startsWith(QueryOptionConstant.LESS)) {
               temp = temp.substring((QueryOptionConstant.LESS).length()).trim();
               parentOidSql = QueryOptionConstant.LESS + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
            } else if (temp.startsWith(QueryOptionConstant.ISNOTNULL)) {
               parentOidSql = " is not null";
            } else if (temp.startsWith(QueryOptionConstant.ISNULL)) {
               parentOidSql = " is  null";
            } else if (temp.contains("*")) {
               parentOidSql = " like " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'").replace("*", "%");
            } else {
               parentOidSql = " = " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
            }
         }
         //查询全部的信息
         queryObject.getConditionMap().put("oid", QueryOptionConstant.IN + "(select oid from " +
               getTableName(referConfigVO.getReferType())+
            " START WITH " + referConfigVO.getParentFieldName() + " " +
            parentOidSql +
            " CONNECT BY PRIOR " + oidFieldName + " = " + referConfigVO.getParentFieldName() + ")");
      } else {
         if (StringUtils.isNotBlank(referConfigVO.getParentFieldName()) && StringUtils.isNotBlank(queryObject.getParentOid())) {
            queryObject.getConditionMap().put(referConfigVO.getParentFieldName(), queryObject.getParentOid());
         }
      }
      LambdaQueryWrapper<CodeClassify> lqw = new LambdaQueryWrapper<>();
      String sql = queryObject.getConditionMap().get("oid").substring(3);
      lqw.inSql(CodeClassify::getOid,sql);
      List<CodeClassify> codeClassifies = classifyService.selectByWrapper(lqw);
      TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(referConfigVO.getParentFieldName());
      treeWrapperOptions.setOidFieldName(oidFieldName);
      treeWrapperOptions.setTextFieldName(referConfigVO.getTextField());
      treeWrapperOptions.setMultipleSelect(referConfigVO.isMuti());
      treeWrapperOptions.setParentOid(queryObject.getParentOid());
      return revisionModelUtil.doList2Trees(codeClassifies, treeWrapperOptions, null);
   }
   private String getTableName(String refertype){
      if ("codeclassify".equals(refertype)){
         return "pl_code_classify";
      }
      if ("table".equals(refertype)){
         return "pl_code_test_table";
      }
      if ("testBtmType".equals(refertype)){
         return "PLBT_code_testBtmType";
      }
      return "pl_code_"+refertype.trim().toLowerCase();
   }
}