ludc
2024-08-24 c259536f2c3055f4f81822e159a94cdc59cc9483
首页后台接口基本全部完善测试(待联调)
已修改4个文件
已添加2个文件
951 ■■■■■ 文件已修改
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/AppConfigDetailInfoVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/ExpExcelConditionVO.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java 642 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/AppConfigDetailInfoVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.vci.pagemodel;
import com.vci.corba.framework.data.AppConfigDetailInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * ç³»ç»Ÿé…ç½®å¯¹è±¡
 * @author ludc
 * @date 2024/8/24 13:54
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AppConfigDetailInfoVO {
    /**
     * éœ€è¦çš„参数对象
     */
    private AppConfigDetailInfo appConfigDetailInfo;
    /**
     * æ˜¯å¦ä¸ºæ“ä½œé…ç½®é¡¹åˆ†é…
     */
    private boolean isConfCategorys;
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/ExpExcelConditionVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.vci.pagemodel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
 * å¯¼å‡ºexcel时的接口条件对象
 * @author ludc
 * @date 2024/8/24 11:38
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExpExcelConditionVO {
    /**
     * å¯¼å‡ºèµ·å§‹é¡µ
     */
    private Integer startPage;
    /**
     * å¯¼å‡ºç»“束页
     */
    private Integer endPage;
    /**
     * å¯¼å‡ºç±»åž‹ï¼šå…¨éƒ¨å¯¼å‡ºï¼šall,选择导出:select,按页码导出:page
     */
    private String expType;
    /**
     * å¯¼å‡ºçš„属性列表(配合isSelectExp使用)
     */
    private List<String> expAttrNames;
    /**
     * æŒ‰é€‰æ‹©å¯¼å‡ºæ—¶ï¼Œé€‰æ‹©çš„æ•°æ®çš„唯一标识:能通过该表示查询到具体数据的
     */
    private List<String> selectDataIdentify;
    /**
     * å¯¼å‡ºçš„æ–‡ä»¶åï¼šå¦‚果要传的话,叫前端自己传文件后缀
     */
    private String expFileName;
    /**
     * å…¶ä»–导出条件
     */
    private Map<String,Object> conditionMap;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java
@@ -2,7 +2,11 @@
import com.vci.common.exception.VciException;
import com.vci.corba.common.PLException;
import com.vci.corba.framework.data.AppConfigCategoryInfo;
import com.vci.corba.framework.data.AppConfigDetailInfo;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.pagemodel.ExpExcelConditionVO;
import com.vci.pagemodel.MenuVO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.BaseResult;
@@ -52,7 +56,27 @@
     * å¢žåŠ æ“ä½œç±»åž‹
     * @return
     */
    boolean addOperationType(List<FuncOperationInfo> funcOperationInfoList);
    boolean addFuncOperationType(List<FuncOperationInfo> funcOperationInfoList);
    /**
     * å¢žåŠ æ“ä½œç±»åž‹
     * @return
     */
    OperateInfo addOperationType(OperateInfo operateInfo);
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    OperateInfo updateOperationType(OperateInfo operateInfo) throws VciBaseException;
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    boolean delOperationType(OperateInfo operateInfo);
    /**
     * åˆ é™¤éžç³»ç»Ÿæ¨¡å—
@@ -99,33 +123,39 @@
    //系统配置相关接口
    /**
     * æŸ¥è¯¢ç³»ç»Ÿé…ç½®åˆ†ç±»
     * æŸ¥è¯¢ç³»ç»Ÿé…ç½®æ ‘
     */
    List<Object>getSysConfTree();
    List<AppConfigCategoryInfo>getAppConfigCategoryInfo();
    /**
     * å¢žåŠ ç³»ç»Ÿé…ç½®
     * æ ¹æ®åˆ†ç±»ID返回全部的 AppConfigDetail å¯¹è±¡
     * @return
     */
    boolean addSysConf();
    List<AppConfigDetailInfo> getAppConfigDetailsByID(String clsId);
    /**
     * ä¿®æ”¹ç³»ç»Ÿé…ç½®
     * å¢žåŠ é…ç½®é¡¹åˆ†ç±»æˆ–é…ç½®é¡¹
     * @return
     */
    boolean updateSysConf();
    boolean addAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/);
    /**
     * åˆ é™¤ç³»ç»Ÿé…ç½®
     * ä¿®æ”¹é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    boolean delSysConf();
    boolean updateAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/);
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®
     * åˆ é™¤é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    boolean delAppConf(String[] ids,boolean isConfCategorys/*是否为操作配置项分配*/);
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®(配置项分类或配置项)
     * @param response
     * @return
     */
    String exportSysConf(HttpServletResponse response);
    String exportSysConf(ExpExcelConditionVO expExcelConditionVO, HttpServletResponse response) throws IOException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java
@@ -1,16 +1,12 @@
package com.vci.frameworkcore.compatibility.impl;
import com.vci.client.ClientSession;
import com.vci.client.common.excel.ExcelDocumentUtils;
import com.vci.common.exception.VciException;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.PLException;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.FunctionInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.corba.framework.data.*;
import com.vci.frameworkcore.compatibility.SmHMSysModConfigServiceI;
import com.vci.pagemodel.MenuVO;
import com.vci.pagemodel.*;
import com.vci.starter.poi.bo.SheetDataSet;
import com.vci.starter.poi.bo.SheetRowData;
import com.vci.starter.poi.bo.WriteExcelData;
@@ -32,6 +28,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
/**
 * é¦–页系统模块配置添加按钮、添加操作类型等接口服务
@@ -182,8 +179,8 @@
     * @return
     */
    @Override
    public boolean addOperationType(List<FuncOperationInfo> funcOperationInfoList) {
        VciBaseUtil.alertNotNull(funcOperationInfoList,"添加操作类型的列表");//将操作类型组装成需要存储的对象
    public boolean addFuncOperationType(List<FuncOperationInfo> funcOperationInfoList) {
        VciBaseUtil.alertNotNull(funcOperationInfoList,"添加的操作类型列表");//将操作类型组装成需要存储的对象
        List<FuncOperationInfo> objs = new ArrayList<>();
        funcOperationInfoList.stream().forEach(info -> {
            if(Func.isBlank(info.funcId)){
@@ -209,6 +206,120 @@
            throw new VciBaseException(exceptionMessage);
        }
        return res;
    }
    /**
     * å¢žåŠ æ“ä½œç±»åž‹
     * @return
     */
    @Override
    public OperateInfo addOperationType(OperateInfo operateInfo) throws VciBaseException {
        try {
            //校验
            this.checkItem(operateInfo);
            String s = foDelegate.saveOperate(operateInfo);
            /**返回1表示名称有重复,返回2表示标识有重复,返回3表示顺序有重复**/
            if (s.equals("1")) {
                throw new VciBaseException("名称存在重复!");
            } else if (s.equals("2")) {
                throw new VciBaseException("标识存在重复!");
            } else if (s.equals("3")) {
                throw new VciBaseException("顺序存在重复!");
            }
            operateInfo.id = s;
            return operateInfo;
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @Override
    public OperateInfo updateOperationType(OperateInfo operateInfo) throws VciBaseException {
        try {
            this.checkItem(operateInfo);
            String res = foDelegate.updateOperate(operateInfo);
            /**返回1表示名称有重复,返回2表示标识有重复,返回3表示顺序有重复**/
            if (res.equals("1")) {
                throw new VciBaseException("名称存在重复!");
            } else if (res.equals("2")) {
                throw new VciBaseException("标识存在重复!");
            } else if (res.equals("3")) {
                throw new VciBaseException("顺序存在重复!");
            }
            return operateInfo;
        } catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @Override
    public boolean delOperationType(OperateInfo operateInfo) throws VciBaseException {
        try {
            /**检查当前操作是否被引用,0表示无引用,1表示被模块引用,2表示已有权限信息**/
            int res = foDelegate.checkOperateIsReferenced(operateInfo.id);
            if(res == 1){
                throw new VciBaseException("当前操作已被模块引用,删除该操作的同时会将其从模块下移除,确认执行删除吗?");
            }else if(res == 2){
                throw new VciBaseException("当前操作已经在权限模块被分配过权限,删除该操作的同时会将其从用户的权限中移除,确认执行删除吗?");
            }
            return foDelegate.deleteOperate(operateInfo.id);
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * æ ¡éªŒ
     * @param operateInfo
     * @return
     */
    private void checkItem(OperateInfo operateInfo) {
        if (Func.isBlank(operateInfo.name)) {
            throw new VciBaseException("名称不能为空!");
        }
        if (Func.isBlank(operateInfo.identify)) {
            throw new VciBaseException("标识不能为空!");
        }
        if (Func.isBlank(operateInfo.alias)) {
            throw new VciBaseException("别名不能为空!");
        }
        /*if (operateInfo.seq > -1){
            throw new VciBaseException("请输入正确的操作顺序值!");
        }*/
        /*long seq = operateInfo.seq;
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(seq);
        if( !isNum.matches() ){
            throw new VciBaseException("操作的顺序值只能是[0-9]之间的数字,并且必须是正整数.\n长度不允许输入小数或者负数!");
        }*/
        if (operateInfo.name.length() > 128) {
            throw new VciBaseException("名称长度不能超过128!");
        }
        if (operateInfo.desc.length() > 255) {
            throw new VciBaseException("描述长度不能超过255!");
        }
        if (operateInfo.alias.length() > 128) {
            throw new VciBaseException("别名长度不能超过255!");
        }
    }
    /**
@@ -348,11 +459,10 @@
        boolean isSuccess = collectionDatas(files);
        logger.info("正在导入表单人员信息......");
        logger.info("count==="+count);
        boolean resBoolean = false;
        if(isSuccess == false){
            resBoolean = importExcelData(count);
            isSuccess = importExcelData(count);
        }
        return resBoolean ? BaseResult.success("导入成功!"):BaseResult.fail("导入失败!");
        return isSuccess ? BaseResult.success("导入成功!"):BaseResult.fail("导入失败!");
    }
    /**
@@ -360,7 +470,7 @@
     * @return
     */
    @Override
    public boolean updateAlias(MenuVO menuVO) throws VciException {
    public boolean updateAlias(MenuVO menuVO) throws VciBaseException {
        String alias = menuVO.getAlias();
        if ("".equals(alias)){
            throw new VciBaseException("请填写操作别名!");
@@ -370,29 +480,296 @@
        return foDelegate.updateFuncOperation(id , alias, isValid);
    }
    /**
     * æŸ¥è¯¢ç³»ç»Ÿé…ç½®æ ‘
     * @return
     */
    @Override
    public List<Object> getSysConfTree() {
        return null;
    public List<AppConfigCategoryInfo> getAppConfigCategoryInfo() {
        try {
            AppConfigCategoryInfo[] appConfigCategorys = foDelegate.getAppConfigCategorys();
            return Arrays.asList(appConfigCategorys);
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * æ ¹æ®åˆ†ç±»ID返回全部的 AppConfigDetail å¯¹è±¡
     * @return
     */
    @Override
    public boolean addSysConf() {
    public List<AppConfigDetailInfo> getAppConfigDetailsByID(String clsId) {
        try {
            AppConfigDetailInfo[] appConfigDetailInfos = foDelegate.getAppConfigDetailsByID(clsId);
            return Arrays.asList(appConfigDetailInfos);
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * å¢žåŠ é…ç½®é¡¹åˆ†ç±»æˆ–é…ç½®é¡¹
     * @return
     */
    @Override
    public boolean addAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/) {
        VciBaseUtil.alertNotNull(appConfigDetailInfo,"添加的操作类型");
        boolean rs = false;
        try {
            String id = "";
            if(isConfCategorys){
                AppConfigCategoryInfo appConfigCategoryInfo = new AppConfigCategoryInfo();
                appConfigCategoryInfo.name = appConfigDetailInfo.name;
                appConfigCategoryInfo.desc = appConfigDetailInfo.desc;
                this.checkConf(appConfigCategoryInfo);
                id = foDelegate.saveAppConfigCategory(appConfigCategoryInfo);
            }else{
                this.checkConfItem(appConfigDetailInfo);
                id = foDelegate.saveAppConfigDetail(appConfigDetailInfo);
            }
            appConfigDetailInfo.id = id;
            rs = true;
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            rs = false;
            throw new VciBaseException(exceptionMessage);
        }
        return rs;
    }
    /**
     * ä¿®æ”¹é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    @Override
    public boolean updateAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/) {
        VciBaseUtil.alertNotNull(appConfigDetailInfo,"添加的操作类型");
        boolean rs = false;
        try {
            if(isConfCategorys){
                AppConfigCategoryInfo appConfigCategoryInfo = new AppConfigCategoryInfo();
                appConfigCategoryInfo.id = appConfigDetailInfo.id;
                appConfigCategoryInfo.name = appConfigDetailInfo.name;
                appConfigCategoryInfo.desc = appConfigDetailInfo.desc;
                this.checkConf(appConfigCategoryInfo);
                rs = foDelegate.updateAppConfigCategory(appConfigCategoryInfo);
            }else{
                this.checkConfItem(appConfigDetailInfo);
                rs = foDelegate.updateAppConfigDetail(appConfigDetailInfo);
            }
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
        return rs;
    }
    /**
     * åˆ é™¤é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    @Override
    public boolean delAppConf(String[] ids,boolean isConfCategorys/*是否为操作配置项分配*/) {
        VciBaseUtil.alertNotNull(ids,"待删除的主键列表");
        boolean res = false;
        if(isConfCategorys){
            if (this.hasAppConfigDetail(ids)) {
                throw new VciBaseException("删除的配置项分类下存在关联数据!");
            }
            res = foDelegate.deleteAppConfigCategory(ids);
        }else {
            res = foDelegate.deleteAppConfigDetail(ids);
        }
        return res;
    }
    /**
     * æ£€æŸ¥æ˜¯å¦å­˜åœ¨å¼•用关系
     * @param ids
     * @return
     */
    private boolean hasAppConfigDetail(final String[] ids){
        for (int i = 0; i < ids.length; i++) {
            AppConfigDetailInfo[] appConfigDetailsByID = foDelegate.getAppConfigDetailsByID(ids[i]);
            if(Func.isNotEmpty(appConfigDetailsByID)){
                return true;
            }
        }
        return false;
    }
    @Override
    public boolean updateSysConf() {
        return false;
    /**
     * é…ç½®é¡¹åˆ†ç±»æ ¡éªŒ
     * @param obj
     */
    private void checkConf(AppConfigCategoryInfo obj) {
        if ("".equals(obj.name)) {
            throw new VciBaseException("名称不能为空!");
        }
    }
    @Override
    public boolean delSysConf() {
        return false;
    /**
     * é…ç½®é¡¹æ ¡éªŒ
     * @param obj
     */
    private void checkConfItem(AppConfigDetailInfo obj) {
        if ("".equals(obj.name)) {
            throw new VciBaseException("名称不能为空!");
        }
        /*AppConfigDetailInfo[] appConfigDetailInfoByName = foDelegate.getAppConfigDetailInfoByName(obj.name);
        if(appConfigDetailInfoByName != null && appConfigDetailInfoByName.length > 0){
            throw new VciBaseException("配置项名称重复!");
        }*/
        if ("".equals(obj.key)){
            throw new VciBaseException("主键不能为空!");
        }
        if ("".equals(obj.value)){
            throw new VciBaseException("键值不能为空!");
        }
    }
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®
     * @param response
     * @return
     */
    @Override
    public String exportSysConf(HttpServletResponse response) {
        return null;
    public String exportSysConf(ExpExcelConditionVO expExcelConditionVO, HttpServletResponse response) throws IOException {
        //设置文件名和路径
        String expFileName = expExcelConditionVO.getExpFileName();
        if(Func.isNotBlank(expFileName) && expFileName.contains(".xls")){
            throw new VciBaseException("设置的文件名中未设置文件后缀,或后缀设置有误,当前仅支持导出.xls格式!");
        }
        expFileName = Func.isBlank(expFileName) ? "appConfig.xls":expFileName;
        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
        //写excel
        String excelPath = defaultTempFolder + File.separator + expFileName;
        //先判断是全部导出还是选择数据导出
        Map<String, Object> conditionMap = expExcelConditionVO.getConditionMap();
        if (Func.isEmpty(conditionMap)) {
            throw new VciBaseException("缺少必要导出条件!");
        }
        //指定导出的属性名
        List<String> expAttrNames = expExcelConditionVO.getExpAttrNames();
        if(Func.isEmpty(expAttrNames)){
            throw new VciBaseException("请选择您要导出的属性!");
        }
        //先区分是导出的配置项分类还是配置项详情
        boolean isExpAppConfDetail = (boolean) conditionMap.get("isExpAppConfDetail");
        //因为AppConfigDetailInfo中的属性包含了AppConfigCategoryInfo中的属性所以先通用了
        List<AppConfigDetailInfo> appConfigDetailInfos = new ArrayList<>();
        //选中导出数据的唯一标识
        List<String> selectDataIdentify = expExcelConditionVO.getSelectDataIdentify();
        //当前界面导出逻辑,只存在全部和选择导出
        String expType = expExcelConditionVO.getExpType();
        if(!isExpAppConfDetail){
            AppConfigCategoryInfo[] appConfigCategorys = foDelegate.getAppConfigCategorys();
            List<AppConfigCategoryInfo> filterAppConfigInfo = null;
            if("select".equals(expType)){
                filterAppConfigInfo = Arrays.stream(appConfigCategorys).filter(item -> {
                    if (selectDataIdentify.contains(item.id)) {
                        return true;
                    }
                    return false;
                }).collect(Collectors.toList());
            }else{
                filterAppConfigInfo = new ArrayList<>(Arrays.asList(appConfigCategorys));
            }
            if (Func.isNotEmpty(filterAppConfigInfo)) {
                filterAppConfigInfo.stream().forEach(item->{
                    AppConfigDetailInfo appConfigDetailInfo = new AppConfigDetailInfo();
                    appConfigDetailInfo.id = item.id;
                    appConfigDetailInfo.name = item.name;
                    appConfigDetailInfo.desc = item.desc;
                    appConfigDetailInfos.add(appConfigDetailInfo);
                });
            }
        }else{
            String clsId = (String)conditionMap.get("clsId");
            if(Func.isBlank(clsId)){
                throw new VciBaseException("未获取到查询配置项的配置项分类主键");
            }
            AppConfigDetailInfo[] configDetailInfos = foDelegate.getAppConfigDetailsByID(clsId);
            List<AppConfigDetailInfo> filterAppConfigInfo = null;
            if("select".equals(expType)){
                filterAppConfigInfo = Arrays.stream(configDetailInfos).filter(item -> {
                    if (selectDataIdentify.contains(item.id)) {
                        return true;
                    }
                    return false;
                }).collect(Collectors.toList());
            }else{
                filterAppConfigInfo = new ArrayList<>(Arrays.asList(configDetailInfos));
            }
            if (Func.isNotEmpty(filterAppConfigInfo)) {
                appConfigDetailInfos.addAll(filterAppConfigInfo);
            }
        }
        //设置列名
        List<String> columns = new ArrayList<>();
        //根据导出列设置列名
        Map<String,Integer> colAttrMap = new HashMap<>(); //导出的列和属性映射
        for (int i = 0; i < expAttrNames.size(); i++) {
            String attrName = expAttrNames.get(i);
            switch (attrName){
                case "name":
                    columns.add("名称");
                    break;
                case "key":
                    columns.add("key");
                    break;
                case "value":
                    columns.add("value");
                    break;
                case "desc":
                    columns.add("描述");
                    break;
            }
            colAttrMap.put(attrName,i);
        }
        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)));
        }
        //处理数据导出
        if(Func.isEmpty(appConfigDetailInfos)){
            excelDataList.add(new WriteExcelData(1,1, "未获取到要导出的数据,请刷新后尝试重新导出!"));
        }else{
            for (int i = 0; i < appConfigDetailInfos.size(); i++) {
                AppConfigDetailInfo appConfigDetailInfo = appConfigDetailInfos.get(i);
                int row = i+1;
                if(Func.isNotEmpty(colAttrMap.get("name"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("name"), appConfigDetailInfo.name));
                }
                if(Func.isNotEmpty(colAttrMap.get("key"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("key"), appConfigDetailInfo.key));
                }
                if(Func.isNotEmpty(colAttrMap.get("value"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("value"), appConfigDetailInfo.value));
                }
                if(Func.isNotEmpty(colAttrMap.get("desc"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("desc"), appConfigDetailInfo.desc));
                }
            }
        }
        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
        ExcelUtil.writeDataToFile(excelPath, excelOption);
        return excelPath;
    }
    /**
@@ -428,7 +805,7 @@
                            if(oneData.get(14).equals("1")) {
                                try {
                                    onebl = foDelegate.firstLevel(plName);
                                } catch (VciException e) {
                                } catch (VciBaseException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
@@ -438,14 +815,13 @@
                                    try {
                                        fParentId = foDelegate.changeFirstLevel(funObj,plName);
                                        pd[2]=fParentId;
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    funObj.id = fParentId;
                                    fileFunctionDatas.add(funObj);
                                    first=true;
                                } else {
                                    funObj.id = id;
@@ -466,7 +842,7 @@
                                                pd[jibie]="";
                                            }
                                            twobl=foDelegate.secondLevel(plName,pd[jibie]);
                                        } catch (VciException e) {
                                        } catch (VciBaseException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
@@ -512,7 +888,7 @@
                                    try {
                                        OperateInfo operObj = foDelegate.fetchOperateTypeByName(oneData.get(18));
                                        foObj.operId = operObj.id;
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
@@ -521,7 +897,7 @@
                                    foObj.isValid = Integer.parseInt(oneData.get(17)) != 0;
                                    try {
                                        foDelegate.saveFuncOperation2(foObj);
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
@@ -532,7 +908,7 @@
                                    foObj.isValid = Integer.parseInt(oneData.get(17)) != 0;
                                    try {
                                        foDelegate.updateOperation(foObj,dataOperName,plFuncOid);
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
@@ -713,12 +1089,12 @@
         * @return
         * @throws VciException
         */
        public boolean firstLevel(String plName) throws VciException{
        public boolean firstLevel(String plName) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().firstLevel(plName);
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciException(String.valueOf(e.code), e.messages);
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
@@ -726,7 +1102,7 @@
         * è¦†ç›–重名的第一级数据
         * add by caill
         * */
        public String changeFirstLevel(FunctionInfo functionInfo,String plName) throws VciException{
        public String changeFirstLevel(FunctionInfo functionInfo,String plName) throws VciBaseException{
            String fParentId="";
            try {
                fParentId= platformClientUtil.getFrameworkService().changeFirstLevel(functionInfo, plName);
@@ -734,7 +1110,6 @@
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return fParentId;
        }
@@ -742,12 +1117,12 @@
         * åˆ¤æ–­ç¬¬äºŒçº§æ•°æ®æœ‰æ²¡æœ‰é‡åçš„
         * add by caill
         * */
        public boolean secondLevel(String plName,String fParentId) throws VciException{
        public boolean secondLevel(String plName,String fParentId) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().secondLevel(plName,fParentId);
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciException(String.valueOf(e.code), e.messages);
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
@@ -943,7 +1318,7 @@
            int len = funObject.length;
            List<FunctionInfo> funInfoList = new ArrayList<FunctionInfo>();
            for(int i = count ; i<len ; i++){
                if(funObject[i].parentId!=null){
                if(Func.isNotBlank(funObject[i].parentId)){
                    FunctionInfo funInfo = funObject[i];
                    funInfoList.add(funInfo);
                }
@@ -978,7 +1353,7 @@
            return same;
        }
        public OperateInfo fetchOperateTypeByName(String name) throws VciException {
        public OperateInfo fetchOperateTypeByName(String name) throws VciBaseException {
            try{
                OperateInfo info =  platformClientUtil.getFrameworkService().fetchOperateTypeByName(name);
                return info;
@@ -992,12 +1367,13 @@
         * ä¿å­˜æ“ä½œç±»åž‹
         * add by caill
         * */
        public boolean saveFuncOperation2(FuncOperationInfo funcOperationInfo) throws VciException{
        public boolean saveFuncOperation2(FuncOperationInfo funcOperationInfo) throws VciBaseException{
            try {
                platformClientUtil.getFrameworkService().saveFuncOperation2(funcOperationInfo,this.getUserEntityInfo());
            } catch (PLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return true;
        }
@@ -1006,26 +1382,208 @@
         * è¦†ç›–操作类型
         * add by caill
         * */
        public String updateOperation(FuncOperationInfo funcOperationInfo,String dataOperName,String plFuncOid) throws VciException{
        public String updateOperation(FuncOperationInfo funcOperationInfo,String dataOperName,String plFuncOid) throws VciBaseException{
            try {
                platformClientUtil.getFrameworkService().updateOperation(funcOperationInfo,this.getUserEntityInfo(),dataOperName,plFuncOid);
            } catch (PLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return null;
        }
        public boolean updateFuncOperation(String id , String alias, boolean isSelected) throws VciException {
        public boolean updateFuncOperation(String id , String alias, boolean isSelected) throws VciBaseException {
            boolean res = false;
            try{
                res = platformClientUtil.getFrameworkService().updateFuncOperation(id, alias, isSelected, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciException(String.valueOf(e.code), e.messages);
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * ä¿å­˜æ“ä½œç±»åž‹
         *
         * @param operateInfo
         * @return
         * @throws VciException
         */
        public String saveOperate(OperateInfo operateInfo) throws VciBaseException {
            String res = "";
            try{
                res = platformClientUtil.getFrameworkService().saveOperate(operateInfo,this.getUserEntityInfo());
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * ä¿®æ”¹æ“ä½œç±»åž‹
         *
         * @param operateInfo
         * @return
         * @throws VciException
         */
        public String updateOperate(OperateInfo operateInfo) throws VciBaseException {
            String res = "";
            try{
                res = platformClientUtil.getFrameworkService().updateOperate(operateInfo,this.getUserEntityInfo());
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * åˆ é™¤æ“ä½œç±»åž‹
         *
         * @param id
         * @return
         * @throws VciException
         */
        public boolean deleteOperate(String id) throws VciBaseException {
            boolean res = true;
            try{
                res = platformClientUtil.getFrameworkService().deleteOperate(id,this.getUserEntityInfo());
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * æ£€æŸ¥æ“ä½œæ˜¯å¦è¢«å¼•用
         * @param operateId
         * @return 0表示无引用,1表示被模块引用,2表示有权限信息
         * @throws VciException
         */
        public int checkOperateIsReferenced(String operateId) throws VciBaseException {
            try{
                return (int)platformClientUtil.getFrameworkService().checkOperateIsReferenced(operateId);
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code),e.messages);
            }
        }
        /**
         * è¿”回全部的 AppConfigCategory å¯¹è±¡
         * @return
         * @throws VciException
         */
        public AppConfigCategoryInfo[] getAppConfigCategorys() throws VciBaseException{
            try{
                AppConfigCategoryInfo[] infos = platformClientUtil.getFrameworkService().getAppConfigCategorys(this.getUserEntityInfo());
                return infos;
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ®åˆ†ç±»ID返回全部的 AppConfigDetail å¯¹è±¡
         */
        public AppConfigDetailInfo[] getAppConfigDetailsByID(String clsfId) throws VciBaseException{
            try{
                AppConfigDetailInfo[] infos = platformClientUtil.getFrameworkService().getAppConfigDetailsByCatId(clsfId, this.getUserEntityInfo());
                return infos;
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ·»åŠ ã€ä¿å­˜ AppConfigCategory å¯¹è±¡
         * @param object AppConfigCategoryInfo å¯¹è±¡
         */
        public String saveAppConfigCategory(AppConfigCategoryInfo object) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().saveAppConfigCategory(object, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * ä¿®æ”¹ã€æ›´æ–° AppConfigCategory å¯¹è±¡
         * @param object AppConfigCategoryInfo å¯¹è±¡
         */
        public boolean updateAppConfigCategory(AppConfigCategoryInfo object) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().updateAppConfigCategory(object, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ®åç§°æŸ¥è¯¢é…ç½®é¡¹
         * @param name
         * @return
         * @throws VciBaseException
         */
        public AppConfigDetailInfo[] getAppConfigDetailInfoByName(String name) throws VciBaseException{
            try{
                AppConfigDetailInfo[] appConfigDetailsByName = platformClientUtil.getFrameworkService().getAppConfigDetailsByName(name, this.getUserEntityInfo());
                return appConfigDetailsByName;
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ® ID åˆ é™¤ AppConfigCategory å¯¹è±¡ï¼ˆæ‰¹é‡ï¼‰
         * @param ids AppConfigCategory å¯¹è±¡çš„ ID åˆ—表
         */
        public boolean deleteAppConfigCategory(String[] ids) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().deleteAppConfigCategory(ids, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /** æ·»åŠ ã€ä¿å­˜ AppConfigDetail å¯¹è±¡
        * @param info AppConfigDetailInfo å¯¹è±¡
        */
        public String saveAppConfigDetail(AppConfigDetailInfo info) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().saveAppConfigDetail(info, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * ä¿®æ”¹ã€æ›´æ–° AppConfigDetail å¯¹è±¡
         * @param info AppConfigDetailInfo å¯¹è±¡
         */
        public boolean updateAppConfigDetail(AppConfigDetailInfo info) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().updateAppConfigDetail(info, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ® ID åˆ é™¤ AppConfigDetail å¯¹è±¡ï¼ˆæ‰¹é‡ï¼‰
         * @param ids AppConfigDetail å¯¹è±¡çš„ ID åˆ—表
         */
        public boolean deleteAppConfigDetail(String[] ids) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().deleteAppConfigDetail(ids, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java
@@ -1,9 +1,13 @@
package com.vci.web.controller;
import com.vci.constant.FrameWorkLangCodeConstant;
import com.vci.corba.framework.data.AppConfigDetailInfo;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
import com.vci.frameworkcore.compatibility.SmHMSysModConfigServiceI;
import com.vci.pagemodel.AppConfigDetailInfoVO;
import com.vci.pagemodel.ExpExcelConditionVO;
import com.vci.pagemodel.MenuVO;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.exception.VciBaseException;
@@ -34,7 +38,6 @@
 */
@RestController
@RequestMapping("/hmSysModConfigController")
@VciUnCheckRight
public class HMSysModConfigController {
    /**
@@ -151,7 +154,24 @@
            return BaseResult.success(hmSysModConfigService.updateAlias(menuVO),"操作别名修改成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "操作别名修改时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            String errorMsg = "操作类型别名修改时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * æ·»åŠ æ“ä½œç±»åž‹ä¸Žæ¨¡å—çš„å…³è”å…³ç³»
     * @param funcOperationInfoList
     * @return
     */
    @PostMapping("/addFuncOperationType")
    public BaseResult addFuncOperationType(@RequestBody List<FuncOperationInfo> funcOperationInfoList) {
        try {
            return BaseResult.success(hmSysModConfigService.addFuncOperationType(funcOperationInfoList),"为当前模块添加操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "为当前模块添加操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
@@ -159,16 +179,50 @@
    /**
     * æ·»åŠ æ“ä½œç±»åž‹
     * @param funcOperationInfoList
     * @param operateInfo
     * @return
     */
    @PostMapping("/addOperationType")
    public BaseResult addOperationType(@RequestBody List<FuncOperationInfo> funcOperationInfoList) {
    public BaseResult addOperationType(@RequestBody OperateInfo operateInfo) {
        try {
            return BaseResult.success(hmSysModConfigService.addOperationType(funcOperationInfoList),"操作类型添加成功");
            return BaseResult.success(hmSysModConfigService.addOperationType(operateInfo),"添加操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "删除模块时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @PutMapping("/updateOperationType")
    public BaseResult updateOperationType(@RequestBody OperateInfo operateInfo) {
        try {
            return BaseResult.success(hmSysModConfigService.updateOperationType(operateInfo),"修改操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "修改操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @DeleteMapping("/delOperationType")
    public BaseResult delOperationType(@RequestBody OperateInfo operateInfo) {
        try {
            return BaseResult.success(hmSysModConfigService.delOperationType(operateInfo),"删除操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "删除操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
@@ -274,4 +328,111 @@
        }
    }
    /**
     *查询系统配置树
     * @return
     */
    @GetMapping("/getAppConfigCategoryInfo")
    public BaseResult getAppConfigCategoryInfo() {
        try {
            return BaseResult.dataList(hmSysModConfigService.getAppConfigCategoryInfo());
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "查询系统配置列表时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     *根据分类ID返回全部的 AppConfigDetail å¯¹è±¡
     * @return
     */
    @GetMapping("/getAppConfigDetailsByID")
    public BaseResult getAppConfigDetailsByID(String clsId) {
        try {
            return BaseResult.dataList(hmSysModConfigService.getAppConfigDetailsByID(clsId));
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "查询配置项列表时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * æ·»åŠ æ“ä½œç±»åž‹
     * @param appConfigDetailInfoVO
     * @return
     */
    @PostMapping("/addAppConf")
    public BaseResult addAppConf(@RequestBody AppConfigDetailInfoVO appConfigDetailInfoVO) {
        try {
            boolean res = hmSysModConfigService.addAppConf(appConfigDetailInfoVO.getAppConfigDetailInfo(), appConfigDetailInfoVO.isConfCategorys());
            return res ? BaseResult.success("添加操作类型成功"):BaseResult.fail("添加操作类型失败!");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "添加操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param appConfigDetailInfoVO
     * @return
     */
    @PutMapping("/updateAppConf")
    public BaseResult updateAppConf(@RequestBody AppConfigDetailInfoVO appConfigDetailInfoVO) {
        try {
            boolean res = hmSysModConfigService.updateAppConf(appConfigDetailInfoVO.getAppConfigDetailInfo(),appConfigDetailInfoVO.isConfCategorys());
            return res ? BaseResult.success("修改操作类型成功"):BaseResult.fail("修改操作类型失败!");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "修改操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param ids
     * @param isConfCategorys
     * @return
     */
    @DeleteMapping("/delAppConf")
    public BaseResult delAppConf(String[] ids,boolean isConfCategorys) {
        try {
            return hmSysModConfigService.delAppConf(ids,isConfCategorys) ? BaseResult.success("删除操作类型成功"):BaseResult.fail("删除操作类型失败!");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "删除操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®(配置项分类或配置项)
     * @return
     */
    @PostMapping("/exportSysConf")
    public void exportSysConf(@RequestBody ExpExcelConditionVO expExcelConditionVO, HttpServletResponse response) {
        try {
            String excelPath = hmSysModConfigService.exportSysConf(expExcelConditionVO,response);
            ControllerUtil.writeFileToResponse(response,excelPath);
        } catch (Exception e) {
            String msg = "导出系统配置时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            try {
                //出错时
                e.printStackTrace();
                ControllerUtil.writeDataToResponse(response,"error_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss") + ".txt", StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
@@ -1311,8 +1311,8 @@
            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("\\")));
            FileUtil.move(new File(attrPath), new File(defaultTempFolder),true);
            FileUtil.del(attrPath.substring(0,attrPath.lastIndexOf("\\")));
        }catch (IOException e) {
            throw new RuntimeException(e);
        }