Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -7,6 +7,7 @@
import com.vci.client.mw.ClientSessionUtility;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.atm.AttributeDef;
import com.vci.corba.omd.vrm.VersionRule;
import com.vci.dto.OsAttributeDTO;
import com.vci.dto.OsEnumDTO;
import com.vci.dto.OsEnumItemDTO;
@@ -33,6 +34,7 @@
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.web.util.PlatformClientUtil;
@@ -111,6 +113,13 @@
   @Autowired(required = false)
   @Lazy
   private OsBtmServiceImpl osBtmService;
   /**
    * 枚举的服务
    */
   @Autowired
   @Lazy
   private OsEnumServiceI  enumService;
   /**
    *  必填列
@@ -198,14 +207,10 @@
   public List<OsAttributeVO> getByAttributeNames(String[] attrNames) throws PLException {
      VciBaseUtil.alertNotNull(attrNames,"属性名");
      List<OsAttributeVO> osAttributeVOS = new ArrayList<>();
      for (int i = 0; i < attrNames.length; i++) {
         AttributeDef[] attributeDefs = platformClientUtil.getAttributeService().getAttributeDefs(attrNames[i].toLowerCase(Locale.ROOT),1,1);
         if(Func.isNotEmpty(attributeDefs)){
            Arrays.stream(attributeDefs).forEach(attributeDef -> {
               osAttributeVOS.add(attributeDO2VO(attributeDef));
            });
         }
      }
      AttributeDef[] attributeDefs = platformClientUtil.getAttributeService().getAttributeDefsByNames(attrNames);
      Arrays.stream(attributeDefs).forEach(attr->{
         osAttributeVOS.add(attributeDO2VO(attr));
      });
      return osAttributeVOS;
   }
@@ -474,10 +479,13 @@
      );
      //属性英文名称校验(判空、系统中判重、是否关键字、是否合规等)
      checkName(osAttributeDTO.getId());
      //检查属性名是否已存在与系统中
      if(platformClientUtil.getAttributeService().checkRowIsExists(osAttributeDTO.getId())){
         throw new PLException("500",new String[]{"属性名称【" + osAttributeDTO.getId() + "】在系统中已存在!"});
      }
      //检查默认值与属性类型是否匹配
      checkDefValue(osAttributeDTO);
      //dto对象转换为存储所需对象
      osAttributeDTO.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT));
      //osAttributeDTO.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT));
      AttributeDef attributeDef = this.osAttributeDTO2AttributeDef(osAttributeDTO);
      return platformClientUtil.getAttributeService().addAttributeDef(attributeDef);
   }
@@ -511,7 +519,7 @@
      if(hasInstance && !compatible){
         throw new PLException("500",new String[]{"无效变更, 不兼容已产生的数据!"});
      }
      String userId = "developer";//WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
      String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
      osAttributeDTO.setLastModifier(userId);
      osAttributeDTO.setCreator(osAttributeVO.getCreator());
      osAttributeDTO.setCreateTime(osAttributeVO.getCreateTime());
@@ -557,9 +565,9 @@
         attributeDef.rage = osAttributeDTO.getRange().replace("<","&lt;");
      }
      attributeDef.ts = Func.format((Func.isNotEmpty(osAttributeDTO.getTs()) ? osAttributeDTO.getTs():new Date()),VciDateUtil.DateTimeMillFormat);
      attributeDef.creator = "developer";//Func.isBlank(osAttributeDTO.getCreator()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getCreator();
      attributeDef.creator = Func.isBlank(osAttributeDTO.getCreator()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getCreator();
      attributeDef.createTime = Func.isEmpty(osAttributeDTO.getCreateTime()) ? System.currentTimeMillis():osAttributeDTO.getCreateTime().getTime();
      attributeDef.modifier = "developer";//Func.isBlank(osAttributeDTO.getLastModifier()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getLastModifier();
      attributeDef.modifier = Func.isBlank(osAttributeDTO.getLastModifier()) ? WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId():osAttributeDTO.getLastModifier();
      attributeDef.modifyTime = System.currentTimeMillis();
      //other需要自行处理
      StringBuffer sb = new StringBuffer();
@@ -600,6 +608,7 @@
            if(StringUtils.isNotBlank(osAttributeDTO.getLinkTypeName())){
               //参照链接类型
               sb.append(LINKTYPENAME).append(" = ").append(osAttributeDTO.getLinkTypeName()).append(";");
               sb.append(VERSION).append(" = ").append(osAttributeDTO.getVersion()).append(";");
            }
            sb.append(LENGTH).append(" = ").append(length > osAttributeDTO.getAttrLength()?length:osAttributeDTO.getAttrLength()).append(";");
            if (StringUtils.isNotBlank(osAttributeDTO.getEnumId())) {
@@ -688,9 +697,9 @@
         throw new PLException("500",new String[]{"属性名无效,原因:属性名是数据库关键字!"});
      }
      //检查属性名是否已存在与系统中
      if(platformClientUtil.getAttributeService().checkRowIsExists(abName)){
         throw new PLException("500",new String[]{"属性名称在系统中已存在!"});
      }
      /*if(platformClientUtil.getAttributeService().checkRowIsExists(abName)){
         throw new PLException("500",new String[]{"属性名称【" + abName + "】在系统中已存在!"});
      }*/
   }
   /**
@@ -812,7 +821,7 @@
         if(Func.isBlank(oid) || Func.isBlank(name) || Func.isEmpty(ts)){
            throw new PLException("500",new String[]{"待删除的属性列表中主键【oid】、调整时间【ts】、属性名【name】不能为空!"});
         }
         //判断枚举是否有被引用
         //判断属性是否有被引用
         List<Map<String, String>> usedAttrList = this.getUsedAttributeList(name);
         if(Func.isNotEmpty(usedAttrList)){
            throw new PLException("500",new String[]{"删除的属性中,属性名称为:【" + name + "】,已被引用!"});
@@ -857,22 +866,18 @@
    * 导出选中的属性
    * @param exportFileName 导出的文件名
    * @param attrNames 需要导出的属性名称
    * @param flag 控制导出的列名是否和导入模板一致
    * @return
    */
   @Override
   public String exportAttributes(String exportFileName, String attrNames) throws PLException {
   public String exportAttributes(String exportFileName, String attrNames,boolean flag/*控制导出的列名是否和导入模板一致*/) throws PLException {
      if(Func.isBlank(attrNames)){
         throw new PLException("500",new String[]{"请勾选要导出的属性!"});
      }
      //界面没传名称,使用默认导出名称
      exportFileName = Func.isBlank(exportFileName) ?  "属性池中属性导出_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
      //设置列名
      List<String> columns = new ArrayList<>(
            Arrays.asList("属性名", "标签", "描述",
                  "属性类型", "允许为空", "默认值", "使用的枚举英文名称(枚举名)",
                  "使用的枚举中文名称(标签)", "参照的业务类型编号", "参照的业务类型名称",
                  "参照的链接类型名称","版本版次","属性长度", "小数精度位数","小数刻度位数","取值范围","创建时间")
      );
      List<String> columns = this.getCloumns(flag);
      //写excel
      String excelPath = LocalFileUtil.getDefaultTempFolder() + File.separator + exportFileName +  ".xls";
@@ -888,8 +893,8 @@
         excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
      }
      //按照属性名查询属性,然后处理属性导出
      List<String> enumNameList = Func.toStrList(attrNames);
      List<OsAttributeVO> osAttributeVOS = this.listAttrByIds(enumNameList);
      List<String> attrameList = Func.toStrList(attrNames);
      List<OsAttributeVO> osAttributeVOS = this.listAttrByIds(attrameList);
      if(Func.isEmpty(osAttributeVOS)){
         excelDataList.add(new WriteExcelData(1,1, "根据属性名称未查询到属性信息,请刷新后尝试重新导出!"));
      }else{
@@ -900,25 +905,54 @@
            excelDataList.add(new WriteExcelData(i+1,0, osAttributeVO.getId()));
            excelDataList.add(new WriteExcelData(i+1,1, osAttributeVO.getName()));
            excelDataList.add(new WriteExcelData(i+1,2, osAttributeVO.getDescription()));
            excelDataList.add(new WriteExcelData(i+1,3, osAttributeVO.getAttributeDataTypeText()+"("+osAttributeVO.getAttributeDataType()+")"));
            if(flag){
               excelDataList.add(new WriteExcelData(i+1,3, osAttributeVO.getAttributeDataType()));
            }else{
               excelDataList.add(new WriteExcelData(i+1,3, osAttributeVO.getAttributeDataType()+"("+osAttributeVO.getAttributeDataTypeText()+")"));
            }
            excelDataList.add(new WriteExcelData(i+1,4, osAttributeVO.isNullableFlag()));
            excelDataList.add(new WriteExcelData(i+1,5, osAttributeVO.getDefaultValue()));
            excelDataList.add(new WriteExcelData(i+1,6, osAttributeVO.getEnumId()));
            excelDataList.add(new WriteExcelData(i+1,7, osAttributeVO.getEnumName()));
            excelDataList.add(new WriteExcelData(i+1,8, osAttributeVO.getBtmTypeId()));
            excelDataList.add(new WriteExcelData(i+1,9, osAttributeVO.getBtmTypeName()));
            excelDataList.add(new WriteExcelData(i+1,10, osAttributeVO.getAttrLength()));
            excelDataList.add(new WriteExcelData(i+1,11, osAttributeVO.getLinkTypeName()));
            excelDataList.add(new WriteExcelData(i+1,12, osAttributeVO.getVersion()));
            excelDataList.add(new WriteExcelData(i+1,13, osAttributeVO.getPrecisionLength()));
            excelDataList.add(new WriteExcelData(i+1,14, osAttributeVO.getScaleLength()));
            excelDataList.add(new WriteExcelData(i+1,15, osAttributeVO.getRange()));
            excelDataList.add(new WriteExcelData(i+1,16, osAttributeVO.getCreateTime()));
            //excelDataList.add(new WriteExcelData(i+1,7, osAttributeVO.getEnumName()));
            excelDataList.add(new WriteExcelData(i+1,7, osAttributeVO.getBtmTypeId()));
            //excelDataList.add(new WriteExcelData(i+1,9, osAttributeVO.getBtmTypeName()));
            excelDataList.add(new WriteExcelData(i+1,8, osAttributeVO.getAttrLength()));
            excelDataList.add(new WriteExcelData(i+1,9, osAttributeVO.getLinkTypeName()));
            excelDataList.add(new WriteExcelData(i+1,10, osAttributeVO.getVersion()));
            excelDataList.add(new WriteExcelData(i+1,11, osAttributeVO.getPrecisionLength()));
            excelDataList.add(new WriteExcelData(i+1,12, osAttributeVO.getScaleLength()));
            excelDataList.add(new WriteExcelData(i+1,13, osAttributeVO.getRange()));
            if(!flag){
               excelDataList.add(new WriteExcelData(i+1,14, Func.format(osAttributeVO.getCreateTime(),"yyyy年MM月dd日 hh:mm:ss")));
            }
         }
      }
      WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
      ExcelUtil.writeDataToFile(excelPath, excelOption);
      return excelPath;
   }
   /**
    * 获取导出或导入模板的列名
    * @param flag 是否获取导入模板列名
    * @return
    */
   private List<String> getCloumns(boolean flag){
      if(flag){
         return new ArrayList<>(
               Arrays.asList("属性名", "标签", "描述",
                     "属性类型(参照新增界面的属性类型如VTString)", "允许为空(是/否)", "默认值", "使用的枚举英文名称"
                     , "参照的业务类型编号","参照的链接类型编号","版本版次","属性长度", "小数精度位数","小数刻度位数"
                     ,"取值范围"
               )
         );
      }
      return new ArrayList<>(
            Arrays.asList("属性名", "标签", "描述",
                  "属性类型", "允许为空", "默认值", "使用的枚举英文名称(枚举名)",
                  "参照的业务类型编号", "参照的链接类型编号","版本版次","属性长度",
                  "小数精度位数","小数刻度位数","取值范围","创建时间")
      );
   }
   /**
@@ -932,11 +966,7 @@
      //界面没传名称,使用默认导出名称
      exportFileName = Func.isBlank(exportFileName) ?  "属性池导入模板_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
      //设置列名
      List<String> columns = new ArrayList<>(
            Arrays.asList("属性名", "标签", "描述",
                  "属性类型", "允许为空(是/否)", "默认值", "使用的枚举英文名称", "参照的业务类型编号",
                  "参照的链接类型编号","版本版次","属性长度", "小数精度位数","小数刻度位数","取值范围")
      );
      List<String> columns = this.getCloumns(true);
      //设置必填列
      ColumnNameisRed.clear();
      ColumnNameisRed.add(0);
@@ -971,10 +1001,12 @@
   /**
    * 导入属性
    * @param file
    * @param isContinue 系统中出现重复是否跳过报错继续执行
    * @return
    * @throws Exception
    */
   @Override
   public BaseResult importAttributes(File file) throws Exception{
   public BaseResult importAttributes(File file, boolean isContinue) throws Exception{
      VciBaseUtil.alertNotNull(file,"excel文件");
      if(!file.exists()){
         throw new VciBaseException("导入的excel文件不存在,{0}",new String[]{file.getPath()});
@@ -991,14 +1023,29 @@
         List<OsAttributeDTO> dtoList = new ArrayList<>();
         //当前excel中是否重复用的判重Map:(key:判重属性,value:行号)
         Map<String, String> excelReapeat = new HashMap<>();
         //判断必填属性是否为空,用户是否已存在,以及部门是否填错等校验逻辑
         poList.stream().forEach(osAttributePO -> {
         for (int i = 0; i < poList.size(); i++) {
            OsAttributePO osAttributePO = poList.get(i);
            if(Func.isBlank(osAttributePO.getId())){//属性名判空
               throw new VciBaseException("第【"+osAttributePO.getRowIndex()+"】行,enumnameerror");
               throw new VciBaseException("第【"+osAttributePO.getRowIndex()+"】行,attrnameerror");
            }else if(Func.isBlank(osAttributePO.getAttributeDataType())){
               throw new VciBaseException("第【"+osAttributePO.getRowIndex()+"】行,typeerror");
            }else if(excelReapeat.containsKey(osAttributePO.getId())){//属性名表格中判重
               throw new VciBaseException("第【"+excelReapeat.get(osAttributePO.getId())+"】行和第【"+osAttributePO.getRowIndex()+"】行数据,属性名重复");
            }else {
               try {
                  if(platformClientUtil.getAttributeService().checkRowIsExists(osAttributePO.getId())){
                     throw new PLException("500",new String[]{"属性名称【" + osAttributePO.getId() + "】在系统中已存在!"});
                  }
               } catch (PLException e) {
                  e.printStackTrace();
                  String errorMsg = "与系统中属性名查重时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
                  logger.error(errorMsg);
                  //是否跳过当期重复数据
                  if(isContinue){
                     continue;
                  }
                  throw new VciBaseException(errorMsg);
               }
            }
            //属性名校验
            try {
@@ -1010,6 +1057,22 @@
            //属性名excel中判重处理
            excelReapeat.put(osAttributePO.getId(),osAttributePO.getRowIndex());
            OsAttributeDTO osAttributeDTO = new OsAttributeDTO();
            //查询属性是否存在,填写了枚举但没填写取值范围,这时候直接使用枚举项值作为默认的range
            if(Func.isNotBlank(osAttributePO.getEnumId()) && Func.isBlank(osAttributePO.getRange())){
               try {
                  OsEnumVO enumVO = enumService.getEnumTypeById(osAttributePO.getEnumId());
                  if(Func.isEmpty(enumVO)){
                     throw new VciBaseException("第【" + osAttributePO.getRowIndex() + "】行数据,通过枚举名称【" + osAttributePO.getEnumId()
                           + "】未获取到枚举信息!");
                  }
                  String itemValues = enumVO.getItemMaps().values().stream().collect(Collectors.joining(";"));
                  osAttributeDTO.setRange(itemValues);
               } catch (PLException e) {
                  e.printStackTrace();
                  throw new VciBaseException("枚举查询失败,原因:"+e.getMessage());
               }
               osAttributeDTO.setBtmTypeId(osAttributePO.getEnumId());
            }
            osAttributeDTO.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT));
            osAttributeDTO.setId(osAttributePO.getId());
            osAttributeDTO.setName(osAttributePO.getName());
@@ -1032,10 +1095,10 @@
               checkDefValue(osAttributeDTO);
            } catch (PLException e) {
               e.printStackTrace();
               throw new VciBaseException(e.getMessage());
               throw new VciBaseException(VciBaseUtil.getExceptionMessage(e));
            }
            dtoList.add(osAttributeDTO);
         });
         }
         //执行保存操作
         dtoList.stream().forEach(dto->{
            try {
@@ -1045,17 +1108,17 @@
               }
            } catch (PLException e) {
               e.printStackTrace();
               throw new VciBaseException("执行保存时出现错误,错误属性对象名为:【" + dto.getId() + "】,原因:"+e.getMessage());
               throw new VciBaseException("执行保存时出现错误,错误属性对象名为:【" + dto.getId() + "】,原因:"+VciBaseUtil.getExceptionMessage(e));
            }
         });
      }catch (Exception e){
         if(logger.isErrorEnabled()){
            logger.error("读取excel内容时或保存用户信息时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
            logger.error("读取excel内容时或保存属性时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
         }
         e.printStackTrace();
         return BaseResult.fail(VciBaseUtil.getExceptionMessage(e),new String[]{},e);
      }
      return BaseResult.success("枚举导入成功!");
      return BaseResult.success("属性导入成功!");
   }
   /**