Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -4,20 +4,17 @@
import com.vci.client.common.datatype.VTInteger;
import com.vci.client.common.datatype.VTLong;
import com.vci.client.common.datatype.VTString;
import com.vci.client.mw.ClientSessionUtility;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.atm.AttributeDef;
import com.vci.corba.omd.ltm.LinkType;
import com.vci.corba.omd.vrm.VersionRule;
import com.vci.dto.OsAttributeDTO;
import com.vci.dto.OsEnumDTO;
import com.vci.dto.OsEnumItemDTO;
import com.vci.enumpck.UI.ItemTypeEnum;
import com.vci.model.OsAttributeDO;
import com.vci.omd.dataType.VTDataType;
import com.vci.omd.objects.OtherInfo;
import com.vci.pagemodel.*;
import com.vci.pagemodel.OsAttributeVO;
import com.vci.pagemodel.OsEnumVO;
import com.vci.po.OsAttributePO;
import com.vci.po.OsEnumPO;
import com.vci.starter.poi.bo.ReadExcelOption;
import com.vci.starter.poi.bo.WriteExcelData;
import com.vci.starter.poi.bo.WriteExcelOption;
@@ -28,15 +25,11 @@
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.*;
import com.vci.starter.web.util.*;
import com.vci.model.OsAttributeDO;
import com.vci.web.enumpck.ItemTypeEnum;
import com.vci.web.enumpck.PortalVITypeFlag;
import com.vci.web.properties.UsedNames;
import com.vci.web.service.OsAttributeServiceI;
import com.vci.web.service.OsBaseServiceI;
import com.vci.web.service.OsEnumServiceI;
import com.vci.web.service.OsLinkTypeServiceI;
import com.vci.web.util.Func;
import com.vci.starter.web.util.Lcm.Func;
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
@@ -47,16 +40,12 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
//import static com.vci.client.omd.attribpool.ui.VTDataTypePanel.*;
import static com.vci.omd.constants.AttributeConstants.*;
/**
@@ -91,14 +80,22 @@
   private Integer NAME_MAX_LENGTH = 28;
   /**
    * 系统中变量配置文件中配置的key
    * 数据库中的一些关键字
    */
   private final String SYSUSEDNAMES = "sysUsedNames";
   /**
    * 数据库中关键字配置文件中配置的key
    */
   private final String DATABASEUSEDNAMES = "dataBaseUsedNames";
   private final List<String> DATABASEUSEDNAMELIST = Arrays.asList(
         "ACCESS", "ADD", "ALL", "ALTER", "AND", "ANY", "AS", "ASC", "AUDIT", "BETWEEN",
         "BY", "CHAR", "CHECK", "CLUSTER", "COLUMN", "COMMENT", "COMPRESS", "CONNECT",
         "CREATE", "CURRENT", "DATE", "DECIMAL", "DEFAULT", "DELETE", "DESC", "DISTINCT",
         "DROP", "ELSE", "EXCLUSIVE", "EXISTS", "FILE", "FLOAT", "FOR", "FROM", "GRANT", "GROUP",
         "HAVING", "IDENTIFIED", "IMMEDIATE", "IN", "INCREMENT", "INDEX", "INITIAL",
         "INSERT", "INTEGER", "INTERSECT", "INTO", "IS", "LEVEL", "LIKE", "LOCK", "LONG",
         "MAXEXTENTS", "MINUS", "MLSLABEL", "MODE", "MODIFY", "NOAUDIT", "NOCOMPRESS",
         "NOT", "NOWAIT", "NULL", "NUMBER", "OF", "OFFLINE", "ON", "ONLINE", "OPTION", "OR", "ORDER",
         "P", "CTFREE", "PRIOR", "PRIVILEGES", "PUBLIC", "RAW", "RENAME", "RESOURCE", "REVOKE",
         "ROW", "ROWID", "ROWNUM", "ROWS", "SELECT", "SESSION", "SET", "SHARE", "SIZE", "SMALLINT",
         "START", "SUCCESSFUL", "SYNONYM", "SYSDATE", "TABLE", "THEN", "TO", "TRIGGER", "UID", "UNION",
         "UNIQUE", "UPDATE", "USER", "VALIDATE", "VALUES", "VARCHAR", "VARCHAR2", "VIEW",
         "WHENEVER", "WHERE", "WITH");
   /**
    * 链接类型服务
@@ -167,7 +164,7 @@
   }
   /**
    * 够着属性树节点
    * 构造属性树节点
    * @param parentTreeList
    * @param refTypeName
    * @param refFlag
@@ -228,7 +225,6 @@
            pTree.setExpanded(true);
         }
      }
   }
   /**
@@ -342,7 +338,10 @@
            attributeVO.setLastModifyTime(new Date(attribItem.modifyTime));
            attributeVO.setTs(VciDateUtil.str2Date(attribItem.ts,VciDateUtil.DateTimeMillFormat));
         }catch (Throwable e){
            e.printStackTrace();
            String errorLog = "属性DO转VO时出错,原因:"+VciBaseUtil.getExceptionMessage(e);
            logger.error(errorLog);
            throw new VciBaseException(errorLog);
         }
         attributeVO.setLastModifier(attribItem.modifier);
         attributeVO.setName(attribItem.label);
@@ -639,9 +638,10 @@
      //检查默认值与属性类型是否匹配
      checkDefValue(osAttributeDTO);
      boolean compatible = isCompatible(osAttributeVO,osAttributeDTO);
      boolean hasInstance = hasInstance(osAttributeDTO.getName());
      //产生数据, 并且不兼容
      if(hasInstance && !compatible){
      //boolean hasInstance = hasInstance(osAttributeDTO.getId()); //不判断是否产生数据只要被引用就需要进一步判断类型是否兼容
      boolean checkAttrIsUse = this.checkAttrIsUse(osAttributeDTO.getId());
      //TODO:按照以前操作配置文档中的逻辑应该是:不论是否产生数据只要被引用就需要要判断类型是否兼容(如VTString不能转为VTIntger或VTLong)
      if(checkAttrIsUse/*hasInstance*/ && !compatible){
         throw new PLException("500",new String[]{"无效变更, 不兼容已产生的数据!"});
      }
      String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
@@ -794,6 +794,26 @@
   }
   /**
    * 查看属性是否被引用
    * @param abName
    * @return false未被引用 true被引用
    */
   private boolean checkAttrIsUse(String abName) throws PLException {
      if(Func.isBlank(abName)){
         return false;
      }
      String[] btNames = platformClientUtil.getBtmService().getBTNamesByAPName(abName);
      if(Func.isNotEmpty(btNames)){
         return true;
      }
      String[] ltNames = platformClientUtil.getLinkTypeService().getLTNamesByAPName(abName);
      if(Func.isNotEmpty(ltNames)){
         return true;
      }
      return false;
   }
   /**
    * 检查属性名称是否符合规范
    * @param attributeName
    * @return 没有返回值,存在问题直接抛出错误
@@ -902,10 +922,14 @@
    * @param abName
    * @return
    */
   private boolean usedBySystem(String abName) {
   private boolean usedBySystem(String abName) throws PLException {
      boolean flag = false;
      String[] names = UsedNames.getProperty(SYSUSEDNAMES).toUpperCase().split(",");
      List<String> nameList = Arrays.asList(names);
      AttributeDef[] sysAttributeDefs = platformClientUtil.getBtmService().getSysAttributeDefs();
      List<String> nameList = null;
      if(Func.isNotEmpty(sysAttributeDefs)){
         nameList = Arrays.stream(sysAttributeDefs)
               .map(item -> item.name.toUpperCase(Locale.ROOT)).collect(Collectors.toList());
      }
      if(nameList.contains(abName.toUpperCase())){
         flag = true;
      }
@@ -919,9 +943,7 @@
    */
   private boolean usedByDataBase(String abName){
      boolean flag = false;
      String[] names = UsedNames.getProperty(DATABASEUSEDNAMES).toUpperCase().split(",");
      List<String> nameList = Arrays.asList(names);
      if(nameList.contains(abName.toUpperCase())){
      if(DATABASEUSEDNAMELIST.contains(abName.toUpperCase())){
         flag = true;
      }
      return flag;
@@ -974,11 +996,14 @@
         throw new PLException("500",new String[]{"请选择要查询应用范围的属性!"});
      }
      String[] btNames = platformClientUtil.getBtmService().getBTNamesByAPName(attributeName);
      if(Func.isEmpty(btNames)){
      String[] ltNames = platformClientUtil.getLinkTypeService().getLTNamesByAPName(attributeName);
      String[] mergedArray = Stream.concat(Stream.of(btNames), Stream.of(ltNames)).toArray(String[]::new);
      if(Func.isEmpty(mergedArray)){
         return new ArrayList<>();
      }
      List<Map<String,String>> btmNameMapList = new ArrayList<>();
      Arrays.stream(btNames).forEach(btName->{
      Arrays.stream(mergedArray).forEach(btName->{
         Map<String, String> itemMap = new HashMap<>();
         itemMap.put("attributeName",attributeName);
         itemMap.put("source",btName);