业务类型创建索引、导出、导入等接口,属性池导入接口调整上传。
已修改9个文件
已添加2个文件
691 ■■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/IndexObject.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsBtmTypePO.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java 367 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/IndexObject.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.vci.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * @author ludc
 * @date 2024/8/13 13:26
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class IndexObject {
    private String oid;
    private String typeName;
    private String attrNames;
    private String description;
    private String indexName;
    private String createTime;
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java
@@ -36,6 +36,11 @@
    private String tableName;
    /**
     * çˆ¶ä¸šåŠ¡ç±»åž‹
     */
    private String fName;
    /**
     * æè¿°
     */
    private String description;
@@ -176,10 +181,31 @@
    private Date ts;
    /**
     * åŒ…含属性名称
     */
    private String[] apNameArray;
    /**
     * åŒ…含属性
     */
    private List<OsBtmTypeAttributeVO> attributes;
    public void setApNameArray(String[] apNameArray) {
        this.apNameArray = apNameArray;
    }
    public String[] getApNameArray() {
        return apNameArray;
    }
    public void setfName(String fName) {
        this.fName = fName;
    }
    public String getfName() {
        return fName;
    }
    public void setDelimiter(String delimiter) {
        this.delimiter = delimiter;
    }
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/po/OsBtmTypePO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package com.vci.po;
import com.vci.starter.poi.annotation.ExcelColumn;
import com.vci.starter.web.pagemodel.BaseModelVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * ä¸šåŠ¡ç±»åž‹å¯¼å…¥å¯¹è±¡
 * @author yuxc
 * @date 2024/7/30 16:27
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OsBtmTypePO extends BaseModelVO {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
    private static final long serialVersionUID = -2239512786206928201L;
    /**
     * æ‰€åœ¨æ•°æ®è¡Œ
     */
    @ExcelColumn(rowIndexColumn = true,value = "")
    private String rowIndex;
    /**
     * åç§°
     */
    @ExcelColumn(value="名称",nullable = false)
    private String name;
    /**
     * æ ‡ç­¾
     */
    @ExcelColumn(value="标签")
    private String lable;
    /**
     * æè¿°
     */
    @ExcelColumn(value="描述")
    private String description;
    /**
     * ç»§æ‰¿è‡ª
     */
    @ExcelColumn(value="继承自")
    private String fName;
    /**
     * å®žçŽ°ç±»
     */
    @ExcelColumn(value="实现类")
    private String implClass;
    /**
     * ç‰ˆæœ¬è§„则
     */
    @ExcelColumn(value="版本规则")
    private short revLevel;
    /**
     * ç‰ˆæœ¬å·è§„则
     */
    @ExcelColumn(value="版本号规则")
    private String revRuleName;
    /**
     * æ˜¯å¦æ‰‹å·¥è¾“å…¥
     */
    @ExcelColumn(value="是否手工输入")
    private String revInput;
    /**
     * åˆ†éš”符
     */
    @ExcelColumn(value="分隔符")
    private String delimiter;
    /**
     * ç‰ˆæ¬¡å·è§„则
     */
    @ExcelColumn(value="版次号规则")
    private short verRuleName;
    /**
     * btmItemsTo
     */
    @ExcelColumn(value="生命周期")
    private String lifeCycle;
    /**
     * å¤‡é€‰ç”Ÿå‘½å‘¨æœŸåˆ—表
     */
    @ExcelColumn(value="备选生命周期列表",nullable = false)
    private String lifeCycles;
    /**
     * å±žæ€§åˆ—表
     */
    @ExcelColumn(value="属性列表")
    private String apNameArray;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java
@@ -214,7 +214,7 @@
        try {
            file.transferTo(new File(excelFileName));
            if (file != null) {
                return attributeService.importAttributes(file1);
                return attributeService.importAttributes(file1,false);
            } else {
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"});
            }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java
@@ -4,6 +4,7 @@
import com.vci.corba.omd.btm.BizType;
import com.vci.corba.omd.ltm.LinkType;
import com.vci.dto.OsBtmTypeDTO;
import com.vci.model.IndexObject;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.annotation.log.VciBusinessLog;
import com.vci.starter.web.enumpck.BooleanEnum;
@@ -30,6 +31,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
@@ -39,6 +41,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.vci.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
@@ -171,7 +174,7 @@
     * btmTypeDTO é“¾æŽ¥ç±»åž‹çš„保存对象
     * @return ä¿å­˜ç»“æžœ
     */
    @PostMapping("/addBtmTypes")
    /*@PostMapping("/addBtmTypes")
    public BaseResult addBtmTypes(@RequestBody List<BizType> bizTypes){
        try {
            return btmService.addBtmTypes(bizTypes) ? BaseResult.success("业务类型批量创建成功!"):BaseResult.fail("业务类型批量创建失败!");
@@ -181,7 +184,7 @@
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    }*/
    /**
     * ä¿®æ”¹ä¸šåŠ¡ç±»åž‹
@@ -318,6 +321,82 @@
    }
    /**
     * èŽ·å–å½“å‰ä¸šåŠ¡ç±»åž‹ä¸‹çš„ç´¢å¼•
     * @return
     * @throws PLException
     */
    @GetMapping("/getIndexByCondition")
    public BaseResult getIndexByCondition(BaseQueryObject baseQueryObject){
        try {
            return BaseResult.dataList(btmService.getIndexByCondition(baseQueryObject.getConditionMap()));
        } catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "查询当前业务类型下的索引时时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * åˆ›å»ºç´¢å¼•
     * @param indexObjectList
     * @return
     */
    @PostMapping("/addIndex")
    public BaseResult addIndex(@RequestBody List<IndexObject> indexObjectList){
        try {
            return btmService.addIndex(indexObjectList) ? BaseResult.success("创建索引成功!"):BaseResult.fail("创建索引失败!");
        } catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "创建索引时时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * åˆ é™¤ç´¢å¼•
     * @param btmName
     * @param indexName
     * @return
     */
    @DeleteMapping("/delIndex")
    public BaseResult delIndex(String btmName,String indexName){
        try {
            return btmService.delIndex(btmName,indexName) ? BaseResult.success("删除索引成功!"):BaseResult.fail("删除索引失败!");
        } catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "删除索引时时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * å¯¼å‡ºä¸šåŠ¡ç±»åž‹
     * name é“¾æŽ¥ç±»åž‹åç§°
     * @return
     */
    @GetMapping("/expData")
    public void expData(String name,HttpServletResponse response) throws PLException, IOException {
        btmService.expData(name, response);
    }
    /**
     * å¯¼å…¥ä¸šåŠ¡ç±»åž‹
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return
     */
    @PostMapping("/impData")
    @VciUnCheckRight
    public BaseResult impData(MultipartFile file){try {
        return btmService.impData(file);
    }catch (Throwable e) {
        throw new VciBaseException(VciBaseUtil.getExceptionMessage(e),new String[0],e);
    }
    }
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹åŒ…å«çš„å±žæ€§å…¨éƒ¨ä¸ºå°å†™
     * @param btmId ä¸šåŠ¡ç±»åž‹åç§°
     * @return å±žæ€§çš„信息
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java
@@ -166,9 +166,10 @@
    /**
     * å¯¼å…¥å±žæ€§
     * @param file
     * @param isContinue ç³»ç»Ÿä¸­å‡ºçŽ°é‡å¤æ˜¯å¦è·³è¿‡æŠ¥é”™ç»§ç»­æ‰§è¡Œ
     * @return
     */
    BaseResult importAttributes(File file) throws Exception;
    BaseResult importAttributes(File file,boolean isContinue/*系统中出现重复是否跳过报错继续执行*/) throws Exception;
    /**
     * æ˜¯å¦é»˜è®¤çš„属性
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java
@@ -3,6 +3,7 @@
import com.vci.corba.common.PLException;
import com.vci.corba.omd.btm.BizType;
import com.vci.dto.OsBtmTypeDTO;
import com.vci.model.IndexObject;
import com.vci.pagemodel.OsBtmTypeAttributeVO;
import com.vci.pagemodel.OsBtmTypeVO;
import com.vci.pagemodel.OsERVO;
@@ -11,7 +12,9 @@
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.pagemodel.PageHelper;
import com.vci.starter.web.pagemodel.Tree;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.util.Collection;
@@ -187,7 +190,7 @@
     * @param bizTypes
     * @return
     */
    boolean addBtmTypes(List<BizType> bizTypes);
    //boolean addBtmTypes(List<BizType> bizTypes);
    /**
     * ä¿®æ”¹ä¸šåŠ¡ç±»åž‹
@@ -249,26 +252,39 @@
    BaseResult deleteAllType() throws PLException;
    /**
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹åç§°å’Œå…¶ä¸‹çš„å±žæ€§åç§°èŽ·å–ä¹Ÿæœ‰çš„ç´¢å¼•
     * @param btmName
     * @param attrName
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹åç§°å’Œç´¢å¼•åç§°æŸ¥è¯¢èŽ·å–å·²æœ‰çš„ç´¢å¼•
     * @param conditionMap æ ¹æ®æŸ¥è¯¢æ¡ä»¶ä¼ å‚: typename:业务类型名;indexname:索引名
     * @return
     */
    List<String> getIndexByBtmAndAttrName(String btmName,String attrName);
    List<IndexObject> getIndexByCondition(Map<String,String> conditionMap) throws PLException;
    /**
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹åç§°å’Œå…¶ä¸‹çš„å±žæ€§åç§°åˆ é™¤ç´¢å¼•
     * @param btmName
     * @param attrName
     * @param indexName
     * @return
     */
    boolean delIndexByBtmAndAttrName(String btmName,String attrName);
    boolean delIndex(String btmName,String indexName) throws PLException;
    /**
     * ç»™ä¸šåŠ¡ç±»åž‹ä¸‹çš„æŒ‡å®šå±žæ€§æ–°å¢žç´¢å¼•
     * @param addMap å¦‚:(btmName:part  attrName:name  indexName: PARTNAMEINDEX)
     * @param indexObjectList
     * @return
     */
    boolean addIndex(Map<String,String> addMap);
    boolean addIndex(List<IndexObject> indexObjectList) throws PLException;
    /**
     * å¯¼å‡ºä¸šåŠ¡ç±»åž‹
     * name ä¸šåŠ¡ç±»åž‹åç§°
     * @return åˆ›å»ºç»“æžœ
     */
    void expData(String oid, HttpServletResponse response) throws PLException, IOException;
    /**
     * å¯¼å…¥ä¸šåŠ¡ç±»åž‹
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return
     */
    BaseResult impData(MultipartFile file) throws Exception;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -479,6 +479,10 @@
        );
        //属性英文名称校验(判空、系统中判重、是否关键字、是否合规等)
        checkName(osAttributeDTO.getId());
        //检查属性名是否已存在与系统中
        if(platformClientUtil.getAttributeService().checkRowIsExists(osAttributeDTO.getId())){
            throw new PLException("500",new String[]{"属性名称【" + osAttributeDTO.getId() + "】在系统中已存在!"});
        }
        //检查默认值与属性类型是否匹配
        checkDefValue(osAttributeDTO);
        //osAttributeDTO.setOid(VciBaseUtil.getPk().toUpperCase(Locale.ROOT));
@@ -693,9 +697,9 @@
            throw new PLException("500",new String[]{"属性名无效,原因:属性名是数据库关键字!"});
        }
        //检查属性名是否已存在与系统中
        if(platformClientUtil.getAttributeService().checkRowIsExists(abName)){
        /*if(platformClientUtil.getAttributeService().checkRowIsExists(abName)){
            throw new PLException("500",new String[]{"属性名称【" + abName + "】在系统中已存在!"});
        }
        }*/
    }
    /**
@@ -997,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()});
@@ -1017,13 +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()+"】行,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 {
@@ -1076,7 +1098,7 @@
                    throw new VciBaseException(VciBaseUtil.getExceptionMessage(e));
                }
                dtoList.add(osAttributeDTO);
            });
            }
            //执行保存操作
            dtoList.stream().forEach(dto->{
                try {
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
@@ -1,12 +1,21 @@
package com.vci.web.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vci.client.common.oq.OQTool;
import com.vci.client.common.providers.ClientServiceProvider;
import com.vci.client.mw.ClientSessionUtility;
import com.vci.common.qt.object.Condition;
import com.vci.common.qt.object.QueryTemplate;
import com.vci.common.utility.ObjectUtility;
import com.vci.constant.FrameWorkLangCodeConstant;
import com.vci.corba.common.PLException;
import com.vci.corba.omd.atm.AttributeDef;
import com.vci.corba.omd.btm.BizType;
import com.vci.corba.omd.data.AttributeValue;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.omd.etm.EnumType;
import com.vci.corba.omd.lcm.Bound;
import com.vci.corba.omd.lcm.LifeCycle;
@@ -15,10 +24,19 @@
import com.vci.corba.omd.vrm.VersionRule;
import com.vci.dto.OsBtmTypeDTO;
import com.vci.dto.OsBtmTypeLinkAttributesDTO;
import com.vci.model.IndexObject;
import com.vci.omd.constants.AttributeConstants;
import com.vci.omd.constants.FileObjectType;
import com.vci.omd.objects.OtherInfo;
import com.vci.omd.utils.ObjectTool;
import com.vci.pagemodel.*;
import com.vci.po.OsBtmTypePO;
import com.vci.po.OsLinkTypePO;
import com.vci.starter.poi.bo.ReadExcelOption;
import com.vci.starter.poi.bo.WriteExcelData;
import com.vci.starter.poi.bo.WriteExcelOption;
import com.vci.starter.poi.constant.ExcelLangCodeConstant;
import com.vci.starter.poi.util.ExcelUtil;
import com.vci.starter.web.annotation.log.VciUnLog;
import com.vci.starter.web.enumpck.BooleanEnum;
import com.vci.starter.web.exception.VciBaseException;
@@ -26,15 +44,10 @@
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.pagemodel.PageHelper;
import com.vci.starter.web.pagemodel.Tree;
import com.vci.starter.web.util.*;
import com.vci.starter.web.util.BeanUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.starter.web.util.VciDateUtil;
import com.vci.starter.web.util.WebThreadLocalUtil;
import com.vci.web.service.*;
import com.vci.web.util.ConcurrentDateFormat;
import com.vci.web.util.Func;
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import com.vci.web.util.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,8 +55,11 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -192,7 +208,7 @@
            }
            vo.setDescription(btmItem.description);
            vo.setId(btmItem.name);
             vo.setName(btmItem.label);
            vo.setName(btmItem.label);
            vo.setLifeCycleId(btmItem.lifeCycle);
            vo.setAbstractFlag(btmItem.isAbstract);
            vo.setImplClass(btmItem.implClass);
@@ -202,11 +218,13 @@
            vo.setTableName(VciBaseUtil.getTableName(vo.getId()));
            vo.setInputRevisionFlag(btmItem.revInput);
            vo.setDelimiter(btmItem.delimiter);
            vo.setfName(btmItem.fName);
            if(StringUtils.isNotBlank(vo.getRevisionRuleId()) || vo.isInputRevisionFlag()){
                vo.setRevisionFlag(true);
            }
            vo.setVersionRule(String.valueOf(btmItem.verRuleName));
            vo.setSubLifeCycleId(Arrays.stream(btmItem.lifeCycles).collect(Collectors.joining(",")));
            vo.setApNameArray(btmItem.apNameArray);
            List<OsAttributeVO> attributeVOS = attributeService.listAttrByIds(Arrays.stream(btmItem.apNameArray).collect(Collectors.toList()));
            List<OsBtmTypeAttributeVO> btmTypeAttributeVOS = new ArrayList<>();
            Optional.ofNullable(attributeVOS).orElseGet(()->new ArrayList<>()).stream().forEach(attributeVO->{
@@ -580,18 +598,20 @@
    public List<Tree> getTreeBizTypes() throws PLException {
        List<Tree> rootTreeList = new ArrayList<>();
        BizType[] bizTypes = getBizTypes("");
        BizType btItem = null;
        for(int i = 0; i < bizTypes.length; i++){
            btItem = bizTypes[i];
            if(btItem.fName.equals("")){
        OsBtmTypeVO osBtmTypeVO = null;
        List<OsBtmTypeVO> osBtmTypeVOS = btmDO2VOs(Arrays.asList(bizTypes));
        for(int i = 0; i < osBtmTypeVOS.size(); i++){
            osBtmTypeVO = osBtmTypeVOS.get(i);
            if(osBtmTypeVO.getfName().equals("")){
                Tree tree = new Tree();
                tree.setOid(btItem.oid);
                tree.setOid(osBtmTypeVO.getOid());
                tree.setParentName(null);
                tree.setParentId(null);
                tree.setLeaf(true);
                tree.setText(btItem.description);
                tree.setAttributes(WebUtil.objectToMapString(btItem));
                tree.setChildren(getChildren(bizTypes,btItem));
                tree.setText(osBtmTypeVO.getDescription());
                tree.setAttributes(WebUtil.objectToMapString(osBtmTypeVO));
                tree.setChildren(getChildren(osBtmTypeVOS,osBtmTypeVO));
                rootTreeList.add(tree);
            }
        }
@@ -734,7 +754,7 @@
     * @param bizTypes
     * @return
     */
    @Override
/*    @Override
    public boolean addBtmTypes(List<BizType> bizTypes) {
        VciBaseUtil.alertNotNull(bizTypes,"创建的业务类型对象列表");
        bizTypes.stream().forEach(bizType->{
@@ -747,9 +767,8 @@
                throw new VciBaseException(exceptionMessage);
            }
        });
        return true;
    }
    }*/
    /**
     * æ£€æŸ¥ä¸šåŠ¡ç±»åž‹åç§°æ˜¯å¦åˆè§„
@@ -809,7 +828,6 @@
        if (dbBizType.revLevel == 1 && dto.getRevLevel()==0) {
            throw new PLException("500",new String[]{"版本变更错误:不能从一级变为不可修订"});
        }
        if (dbBizType.revLevel == 2 && (dto.getRevLevel() == 1 || dto.getRevLevel() == 0)) {
            throw new PLException("500",new String[]{"版本变更错误:不能从二级变为一级或不可修订"});
        }
@@ -1119,35 +1137,304 @@
    }
    /**
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹åç§°å’Œå…¶ä¸‹çš„å±žæ€§åç§°èŽ·å–ä¹Ÿæœ‰çš„ç´¢å¼•
     * @param btmName
     * @param attrName
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹åç§°å’Œå…¶ä¸‹çš„å±žæ€§åç§°èŽ·å–å·²æœ‰çš„ç´¢å¼•
     * @param conditionMap æ ¹æ®æŸ¥è¯¢æ¡ä»¶ä¼ å‚: typename:业务类型名;
     * @return
     */
    @Override
    public List<String> getIndexByBtmAndAttrName(String btmName, String attrName) {
        return null;
    public List<IndexObject> getIndexByCondition(Map<String,String> conditionMap) throws PLException {
        if(Func.isEmpty(conditionMap)){
            return new ArrayList<>();
        }
        List<String> indexNameList = new ArrayList<String>();
        QueryTemplate qtl = new QueryTemplate();
        List<String> list = new ArrayList<String>();
        list.add("*");
        qtl.setBtmType("indexobject");
        qtl.setClauseList(list);
        qtl.setId("p");
        qtl.setType("btm");
        qtl.setRightFlag(false);
        Condition condition = OQTool.getCondition(conditionMap);
        qtl.setCondition(condition);
        //HashMap<String, String> indexmap = new HashMap<String, String>();
        BusinessObject findBTMObjects[] = platformClientUtil.getQueryService().findBTMObjects(qtl.getId(), OQTool.qtTOXMl(qtl).asXML());
        List<IndexObject> indexObjects = new ArrayList<>();
        for(int i = 0; i < findBTMObjects.length; i++) {
            BusinessObject findBTMObject = findBTMObjects[i];
            IndexObject indexObject = new IndexObject();
            indexObject.setOid(findBTMObject.oid);
            indexObject.setDescription(findBTMObject.description);
            indexObject.setCreateTime(Func.format(new Date(findBTMObject.createTime),DateUtil.PATTERN_DATE));
            indexObject.setIndexName(ObjectTool.getBOAttributeValue(findBTMObject,"indexname"));
            indexObject.setTypeName(ObjectTool.getBOAttributeValue(findBTMObject,"typename"));
            indexObject.setAttrNames(ObjectTool.getBOAttributeValue(findBTMObject,"attrname"));
            indexObjects.add(indexObject);
        }
        return indexObjects;
    }
    /**
     * æ ¹æ®ä¸šåŠ¡ç±»åž‹åç§°å’Œå…¶ä¸‹çš„å±žæ€§åç§°åˆ é™¤ç´¢å¼•
     * @param btmName
     * @param attrName
     * @param indexName
     * @return
     */
    @Override
    public boolean delIndexByBtmAndAttrName(String btmName, String attrName) {
        return false;
    public boolean delIndex(String btmName, String indexName) throws PLException {
        VciBaseUtil.alertNotNull(btmName,"业务类型名",indexName,"索引名");
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("typename",btmName);
        conditionMap.put("indexname",indexName);
        List<IndexObject> bo2 = getIndexByCondition(conditionMap);
        if(bo2!=null && bo2.size()>0) {
            String[] indexAttr = {indexName};
            boolean alterFlag = platformClientUtil.getBtmService().dropIndex(btmName, indexAttr);
            if (!alterFlag) {
                return false;
            }
            for (int i = 0; i < bo2.size(); i++) {
                String oid = bo2.get(i).getOid();
                BusinessObject bo = platformClientUtil.getBOFactoryService().readBusinessObject(oid, "indexobject");
                platformClientUtil.getBOFactoryService().deleteBusinessObject(bo,1);
            }
        }
        return true;
    }
    /**
     * ç»™ä¸šåŠ¡ç±»åž‹ä¸‹çš„æŒ‡å®šå±žæ€§æ–°å¢žç´¢å¼•
     * @param addMap å¦‚:(btmName:part  attrName:name  indexName: PARTNAMEINDEX)
     * @param indexObjectList
     * @return
     */
    @Override
    public boolean addIndex(Map<String, String> addMap) {
        return false;
    public boolean addIndex(List<IndexObject> indexObjectList) throws PLException {
        VciBaseUtil.alertNotNull(indexObjectList,"新增的索引信息");
        String btmName = indexObjectList.get(0).getTypeName();
        String indexNames = indexObjectList.stream().map(IndexObject::getIndexName).collect(Collectors.joining());
        String[] oldindexAttr = {indexNames};
        BusinessObject bo;
        List<BusinessObject> boList = new ArrayList<>();
        //先查询当前添加索引是否已经存在,如果存在就先删除再新增实现替换操作
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("typename",btmName);
        List<IndexObject> indexObjects = getIndexByCondition(conditionMap);
        if(indexObjects!=null && indexObjects.size()>0){
            //索引不存在时删除就会报错索引不存在,所以这里有索引才去删除
            boolean b = platformClientUtil.getBtmService().dropIndex(btmName, oldindexAttr);
            if(b){
                for(int i = 0; i < indexObjects.size(); i ++){
                    String oid = (String) indexObjects.get(i).getOid();
                    bo = platformClientUtil.getBOFactoryService().readBusinessObject(oid,"indexobject");
                    platformClientUtil.getBOFactoryService().deleteBusinessObject(bo,1);
                }
            }
        }
        for(int i = 0; i < indexObjectList.size(); i ++){
            IndexObject indexObject = indexObjectList.get(i);
            //bo = platformClientUtil.getBOFService().initBusinessObject("indexobject");
            bo = boService.createCBOByBtmName("indexobject");
            List<AttributeValue> attributeValues = new ArrayList<>();
            attributeValues.add(new AttributeValue("typename", btmName));
            attributeValues.add(new AttributeValue("indexname", indexObject.getIndexName()));
            attributeValues.add(new AttributeValue("attrname", indexObject.getAttrNames()));
            bo.newAttrValList = attributeValues.toArray(new AttributeValue[attributeValues.size()]);
            bo.description = indexObject.getDescription();
            String[] indexAttr = {indexObject.getIndexName(),indexObject.getAttrNames()};
            //给指定业务类型的指定属性创建索引
            boolean alterFlag = platformClientUtil.getBtmService().addIndex(btmName, indexAttr);
            //索引创建成功之后,需要存储成功索引到索引表中
            if(!alterFlag){
                return false;
            }
            boList.add(bo);
            //添加索引信息到索引的业务表中
            //platformClientUtil.getBOFactoryService().createBusinessObject(bo,false,false);
        }
        //添加索引信息到索引的业务表中
        platformClientUtil.getBOFactoryService().batchCreateBusinessObject(boList.toArray(new BusinessObject[boList.size()]),false,false);
        return true;
    }
    /**
     * å¯¼å‡ºä¸šåŠ¡ç±»åž‹
     * name ä¸šåŠ¡ç±»åž‹åç§°
     * @return åˆ›å»ºç»“æžœ
     */
    @Override
    public void expData(String names, HttpServletResponse response) throws PLException, IOException {
        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
        //写excel
        String excelPath = defaultTempFolder + File.separator + "btm.xls";
        //设置列名
        List<String> columns = new ArrayList<>(
                Arrays.asList("类型名称", "标签", "继承自", "实现类", "描述", "版本规则", "版本号规则",
                        "是否手工输入","分隔符", "版次号规则","生命周期", "备选生命周期列表","属性列表")
        );
        try {
            new File(excelPath).createNewFile();
            //设置列
            List<WriteExcelData> excelDataList = new ArrayList<>();
            //设置列头
            for (int index = 0; index < columns.size(); index++) {
                excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
            }
            HashSet<String> attributes = new HashSet<>();
            int i = 0;
            for (String name : names.split(",")) {
                BizType bizType = platformClientUtil.getBtmService().getBizTypeByName(name);
                excelDataList.add(new WriteExcelData(i+1,0, bizType.name));
                excelDataList.add(new WriteExcelData(i+1,1, bizType.label));
                excelDataList.add(new WriteExcelData(i+1,2, bizType.fName));
                excelDataList.add(new WriteExcelData(i+1,3, bizType.implClass));
                excelDataList.add(new WriteExcelData(i+1,4, bizType.description));
                excelDataList.add(new WriteExcelData(i+1,5, bizType.revLevel));
                excelDataList.add(new WriteExcelData(i+1,6, bizType.revRuleName));
                excelDataList.add(new WriteExcelData(i+1,7, bizType.revInput));
                excelDataList.add(new WriteExcelData(i+1,8, bizType.delimiter));
                excelDataList.add(new WriteExcelData(i+1,9, bizType.verRuleName));
                excelDataList.add(new WriteExcelData(i+1,10, bizType.lifeCycle));
                excelDataList.add(new WriteExcelData(i+1,11, String.join(",",bizType.lifeCycles)));
                excelDataList.add(new WriteExcelData(i+1,12, String.join(",",bizType.apNameArray)));
                attributes.addAll(Arrays.asList(bizType.apNameArray));
                i++;
            }
            WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
            ExcelUtil.writeDataToFile(excelPath, excelOption);
            //导出属性
            String attrPath = attributeService.exportAttributes("btmattr",
                    attributes.stream().collect(Collectors.joining(",")),true);
            //移动属性到链接类型文件夹里面去
            cn.hutool.core.io.FileUtil.move(new File(attrPath), new File(defaultTempFolder),true);
            cn.hutool.core.io.FileUtil.del(attrPath.substring(0,attrPath.lastIndexOf("\\")));
        }catch (IOException e) {
            throw new RuntimeException(e);
        }
        File zip = ZipUtil.zip(defaultTempFolder);
        FileUtil.del(defaultTempFolder + File.separator);
        ControllerUtil.writeFileToResponse(response,zip.getAbsoluteFile());
    }
    /**
     * å¯¼å…¥ä¸šåŠ¡ç±»åž‹
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return
     */
    @Override
    public BaseResult impData(MultipartFile file) throws Exception {
        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
        String fileName = defaultTempFolder + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
        file.transferTo(new File(fileName));
        if (file == null) {
            return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"});
        }
        if (!fileName.endsWith(".zip") || !fileName.endsWith(".rar")) {
            throw new VciBaseException("仅能上传zip压缩文件,请重新上传!");
        }
        File unzip = ZipUtil.unzip(fileName);
        File btmExcel = new File(unzip.getAbsolutePath() + File.separator + "btm.xls");
        File attrExcel = new File(unzip.getAbsolutePath() + File.separator + "btmattr.xls");
        if (!attrExcel.exists()) {
            //增加解压的路径,看文件还在没有
            attrExcel = new File(unzip.getAbsolutePath() + File.separator + unzip.getName() + File.separator + "btmattr.xls");
            if (!attrExcel.exists()) {
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"没有导入的属性文件。导入终止!"});
            }
        }
        //TODO:导入属性,但是这个逻辑实际上存在一些问题,导入的属性只是业务类型的属性不应该去给属性池导入,可能是想的属性不存在的就新增一次
        BaseResult baseResult = attributeService.importAttributes(attrExcel,true);
        if(!baseResult.isSuccess()){
            //删除上传的文件夹
            FileUtil.del(defaultTempFolder + File.separator);
            return baseResult;
        }
        //入业务类型
        if (!btmExcel.exists()) {
            //增加解压的路径,看文件还在没有
            btmExcel = new File(unzip.getAbsolutePath() + File.separator + unzip.getName() + File.separator + "btm.xls");
            if (!btmExcel.exists()) {
                //删除上传的文件夹
                FileUtil.del(defaultTempFolder + File.separator);
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"没有导入的链接文件。导入终止!"});
            }
        }
        try{
            //1、读取excel中的数据,组成对象
            ReadExcelOption excelOption = new ReadExcelOption();
            List<OsBtmTypePO> poList = ExcelUtil.readDataObjectFromExcel(btmExcel, OsBtmTypePO.class,excelOption,(value, po, fieldName)->{});
            //去除都是空的情况
            if(CollectionUtils.isEmpty(poList)){
                return BaseResult.fail(ExcelLangCodeConstant.IMPORT_CONTENT_NULL,new String[]{});
            }
            //当前excel中是否重复用的判重Map:(key:判重属性,value:行号)
            Map<String, String> excelReapeat = new HashMap<>();
            int maxLength = platformClientUtil.getLinkTypeService().getLTNameMaxLength();
            //判断必填属性是否为空,用户是否已存在,以及部门是否填错等校验逻辑
            poList.stream().forEach(osBtmTypePO -> {
                if(Func.isBlank(osBtmTypePO.getName())){//属性名判空
                    throw new VciBaseException("第【"+osBtmTypePO.getRowIndex()+"】行,name");
                }else if(osBtmTypePO.getName().length() > maxLength){
                    throw new VciBaseException("第【"+osBtmTypePO.getRowIndex()+"】行,业务类型名长度不能超过" + maxLength);
                }else if(!osBtmTypePO.getName().matches("^[A-Za-z]+$")){
                    throw new VciBaseException("第【"+osBtmTypePO.getRowIndex()+"】行,业务类型名称只能为英文字母");
                }else if (osBtmTypePO.getName().length() > maxLength) {
                    throw new VciBaseException("第【"+osBtmTypePO.getRowIndex()+"】行,业务类型名长度不能超过" + maxLength);
                }else if(excelReapeat.containsKey(osBtmTypePO.getName())){//业务类型名在表格中判重
                    throw new VciBaseException("第【"+excelReapeat.get(osBtmTypePO.getName())+"】行和第【"+osBtmTypePO.getRowIndex()+"】行数据,业务类型名重复");
                }else if (Func.isBlank(osBtmTypePO.getLifeCycle())) {
                    throw new VciBaseException("第【"+osBtmTypePO.getRowIndex()+"】行,生命周期不能为空");
                }else if ("true".equalsIgnoreCase(osBtmTypePO.getRevInput()) && Func.isBlank(osBtmTypePO.getRevRuleName())) {
                    throw new VciBaseException("第【"+osBtmTypePO.getRowIndex()+"】行,版本号规则不能为空");
                }
                try {
                    BizType historyBtm = platformClientUtil.getBtmService().getBizTypeByName(osBtmTypePO.getName());
                    //已有此数据进行删除覆盖
                    if(historyBtm != null && !historyBtm.name.equals("")){
                        platformClientUtil.getBtmService().deleteBizType(historyBtm);
                    }
                } catch (PLException e) {
                    throw new RuntimeException(e);
                }
                //属性名excel中判重处理
                excelReapeat.put(osBtmTypePO.getName(),osBtmTypePO.getRowIndex());
                BizType bizType = new BizType();
                bizType.name = osBtmTypePO.getName();
                bizType.label = osBtmTypePO.getLable();
                bizType.description = osBtmTypePO.getDescription();
                bizType.fName = osBtmTypePO.getFName();
                bizType.implClass = osBtmTypePO.getImplClass();
                bizType.revLevel = osBtmTypePO.getRevLevel();
                bizType.revRuleName = osBtmTypePO.getRevRuleName();
                bizType.revInput = Boolean.parseBoolean(osBtmTypePO.getRevInput().toLowerCase(Locale.ROOT));
                bizType.delimiter = osBtmTypePO.getDelimiter();
                bizType.verRuleName = osBtmTypePO.getVerRuleName();
                bizType.lifeCycle = osBtmTypePO.getLifeCycle();
                bizType.lifeCycles = osBtmTypePO.getLifeCycles().split(",");
                bizType.apNameArray = osBtmTypePO.getApNameArray().split(",");
                String userId = WebUtil.getCurrentUserId();
                bizType.modifier = userId;
                bizType.creator = userId;
                try {
                    platformClientUtil.getBtmService().addBizType(bizType);
                } catch (PLException e) {
                    throw new RuntimeException(e);
                }
            });
        }catch (Exception e){
            if(logger.isErrorEnabled()){
                logger.error("读取excel内容时或保存业务类型信息时出现了错误,具体原因:",VciBaseUtil.getExceptionMessage(e));
            }
            e.printStackTrace();
            return BaseResult.fail(VciBaseUtil.getExceptionMessage(e),new String[]{},e);
        }
        //删除上传的文件夹
        FileUtil.del(defaultTempFolder + File.separator);
        return BaseResult.success("业务类型导入成功!");
    }
    /**
@@ -1186,21 +1473,21 @@
        return flag;
    }
    private List<Tree> getChildren(BizType[] bizTypes,BizType parentBIzType){
    private List<Tree> getChildren(List<OsBtmTypeVO> osBtmTypeVOS,OsBtmTypeVO parentBIzType){
        List<Tree> trees= new ArrayList<>();
        for (BizType bizType : bizTypes) {
            if(StringUtils.isBlank(bizType.fName)){
        for (OsBtmTypeVO bizType : osBtmTypeVOS) {
            if(StringUtils.isBlank(bizType.getfName())){
                continue;
            }
            if(bizType.fName.equals(parentBIzType.name)){
            if(bizType.getfName().equals(parentBIzType.getName())){
                Tree tree = new Tree();
                tree.setOid(bizType.oid);
                tree.setParentName(parentBIzType.fName);
                tree.setParentId(parentBIzType.oid);
                tree.setOid(bizType.getOid());
                tree.setParentName(parentBIzType.getfName());
                tree.setParentId(parentBIzType.getOid());
                tree.setLeaf(true);
                tree.setText(bizType.description);
                tree.setText(bizType.getDescription());
                tree.setAttributes(WebUtil.objectToMapString(bizType));
                tree.setChildren(getChildren(bizTypes,bizType));
                tree.setChildren(getChildren(osBtmTypeVOS,bizType));
                trees.add(tree);
            }
        }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java
@@ -713,7 +713,7 @@
            throw new PLException("500",new String[]{"请勾选要导出的生命周期模板!"});
        }
        //界面没传名称,使用默认导出名称
        exportFileName = Func.isBlank(exportFileName) ?  "版本规则导出_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
        exportFileName = Func.isBlank(exportFileName) ?  "生命周期导出_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss"):exportFileName;
        //设置列名
        List<String> columns = this.getCloumns(flag);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java
@@ -611,7 +611,7 @@
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"没有导入的属性文件。导入终止!"});
            }
        }
        BaseResult baseResult = attributeService.importAttributes(attrExcel);
        BaseResult baseResult = attributeService.importAttributes(attrExcel,true);
        if(!baseResult.isSuccess()){
            //删除上传的文件夹
            FileUtil.del(defaultTempFolder + File.separator);
@@ -648,7 +648,7 @@
                }else if(!osLinkTypePO.getName().matches("^[A-Za-z]+$")){
                    throw new VciBaseException("第【"+osLinkTypePO.getRowIndex()+"】行,链接类型名称只能为英文字母");
                }else if(excelReapeat.containsKey(osLinkTypePO.getName())){//属性名表格中判重
                    throw new VciBaseException("第【"+excelReapeat.get(osLinkTypePO.getName())+"】行和第【"+osLinkTypePO.getRowIndex()+"】行数据,属性名重复");
                    throw new VciBaseException("第【"+excelReapeat.get(osLinkTypePO.getName())+"】行和第【"+osLinkTypePO.getRowIndex()+"】行数据,链接类型名重复");
                }
                try {
                    LinkType historyLink = platformClientUtil.getLinkTypeService().getLinkType(osLinkTypePO.getName());
@@ -687,7 +687,7 @@
            });
        }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);