田源
2024-09-20 51542c2d2272cfe19db8e7dbc07cccc1c448d22a
Merge remote-tracking branch 'origin/master'
已修改19个文件
已添加3个文件
1937 ■■■■ 文件已修改
Bin/Redis-6.2.10/dump.rdb 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-poi/src/main/java/com/vci/starter/poi/bo/ReadExcelOption.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-poi/src/main/java/com/vci/starter/poi/util/ExcelUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/RoleInfoDTO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/RoleRightDTO.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLDefinationVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLTabButtonVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/enumpck/OrgTypeEnum.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsActionController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/UIManagerController.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/data.s.json 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemTypeEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsActionServiceI.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIManagerServiceI.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsActionServiceImpl.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java 1105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Bin/Redis-6.2.10/dump.rdb
Binary files differ
Source/plt-web/plt-web-parent/plt-poi/src/main/java/com/vci/starter/poi/bo/ReadExcelOption.java
@@ -33,7 +33,7 @@
    /**
     * æ‰©å±•属性的映射配置,po对象上属性是map的形式时使用,key与excelColumn注解的value()相同,值是对应的标题
     */
    private Map<String, List<ExcelColumnMap>> extendAttrMap ;
    private Map<String, List<ExcelColumnMap>> extendAttrMap;
    public String getSheetName() {
        return sheetName;
Source/plt-web/plt-web-parent/plt-poi/src/main/java/com/vci/starter/poi/util/ExcelUtil.java
@@ -871,7 +871,7 @@
     * @return æ•°æ®åˆ—表
     * @throws VciBaseException æ‰§è¡Œå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    public static  List<SheetDataSet> readDataObjectFromExcel(File file) throws VciBaseException {
    public static List<SheetDataSet> readDataObjectFromExcel(File file) throws VciBaseException {
        return readDataObjectFromExcel(file, SheetDataSet.class);
    }
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/RoleInfoDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.vci.dto;
import lombok.Data;
import java.io.Serializable;
/**
 * è§’色传输对象
 * @author yuxc
 * @date 2024-09-09
 */
@Data
public class RoleInfoDTO implements Serializable {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
    private static final long serialVersionUID = 2492852474710986720L;
    /**
     * ä¸»é”®
     */
    public String id;
    public String name;
    public String description;
    public short type;
    public long createTime;
    public String createUser;
    public long updateTime;
    public String updateUser;
    public String grantor;
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/RoleRightDTO.java
@@ -36,10 +36,10 @@
    /**新增数据创建者,修改者,创建时间,修改时间,授权者***/
    private String createUser = "";
    private Date createTime = new Date();
    private String createTime= "";
    private String licensor = "";
    private String modifyUser = "";
    private Date modifyTime = new Date();
    private String modifyTime = "";
    public String getId() {
        return id;
@@ -89,11 +89,11 @@
        this.createUser = createUser;
    }
    public Date getCreateTime() {
    public String getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }
@@ -113,11 +113,11 @@
        this.modifyUser = modifyUser;
    }
    public Date getModifyTime() {
    public String getModifyTime() {
        return modifyTime;
    }
    public void setModifyTime(Date modifyTime) {
    public void setModifyTime(String modifyTime) {
        this.modifyTime = modifyTime;
    }
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLDefinationVO.java
@@ -99,7 +99,7 @@
    /**
     * ä¸šåŠ¡ç±»åž‹
     */
    private String btmType = "";
    //private String btmType = "";
    /**
     * é“¾æŽ¥ç±»åž‹
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLTabButtonVO.java
@@ -1,5 +1,6 @@
package com.vci.pagemodel;
import com.vci.corba.portal.data.PLCommandParameter;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java
@@ -2,6 +2,7 @@
import com.vci.common.exception.VciException;
import com.vci.corba.common.PLException;
import com.vci.dto.RoleInfoDTO;
import com.vci.dto.RoleRightDTO;
import com.vci.dto.RoleRightParamDTO;
import com.vci.frameworkcore.enumpck.ResourceControlTypeEnum;
@@ -176,4 +177,10 @@
     * @throws PLException
     */
    BaseResult saveRoleRight(List<RoleRightParamDTO> roleRightDTOS, String roleId) throws PLException;
    /**
     * èŽ·å–æ‰€æŽˆæƒçš„æ¨¡å—æƒé™
     * @param roleName æœç´¢çš„角色
     * @return è§’色列表
     */
    List<RoleInfoDTO> getRoleList(String roleName) throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java
@@ -160,6 +160,15 @@
     */
    List<Tree> refTreeUsers(TreeQueryObject treeQueryObject) throws VciBaseException;
    /***
     * äººå‘˜æƒé™é€‰æ‹©æ ‘
     * @param treeQueryObject
     * @return
     * @throws VciBaseException
     */
    List<Tree> refPersonOrgTree(TreeQueryObject treeQueryObject) throws VciBaseException;
    /**
     * æ ¡éªŒå¯†ç æ˜¯å¦ç›¸åŒï¼Œåœ¨æ–°å¹³å°ä¸­å­˜å‚¨çš„密码是两次md5
     * @param userOid ç”¨æˆ·ä¸»é”®
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java
@@ -12,6 +12,7 @@
import com.vci.corba.framework.data.*;
import com.vci.corba.omd.data.BusinessObject;
import com.vci.corba.portal.data.PLUILayout;
import com.vci.dto.RoleInfoDTO;
import com.vci.dto.RoleRightDTO;
import com.vci.dto.RoleRightParamDTO;
import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
@@ -531,6 +532,7 @@
                menuVO.setSort((int) funcObj.seq);
                findChildAuthFunctionVO(menuVO, isAll);
                functionVO.getChildren().add(menuVO);
                functionVO.setHasChildren(true);
            }
        }else if(type == 2){
            FuncOperationInfo[] infos = platformClientUtil.getFrameworkService().getFuncOperationByModule(functionVO.getId(), "", true);
@@ -549,6 +551,7 @@
                menuVO.setIsValid(info.isValid);
                menuVO.setHasChildren(false);
                functionVO.getChildren().add(menuVO);
                functionVO.setHasChildren(true);
            }
        }else{
            functionVO.setHasChildren(false);
@@ -580,15 +583,13 @@
    public List<String> getSysModelAuth(String roleId) throws PLException {
        RoleRightInfo[] roleRightList = platformClientUtil.getFrameworkService().getRoleRightList(roleId, WebUtil.getCurrentUserId());
        Map<String, Long> authMap = Arrays.stream(roleRightList).collect(Collectors.toMap(e -> e.funcId, e -> e.rightValue));
        Map<String, Long> authMap = Arrays.stream(roleRightList).collect(Collectors.toMap(e -> e.funcId, e -> e.rightValue,
                (existing, replacement) -> existing));
        String parentId;
        SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
        boolean adminOrDeveloperOrRoot = rightControlUtil.isAdminOrDeveloperOrRoot(sessionInfo.getUserId());
        if (adminOrDeveloperOrRoot) {
            //系统菜单
            parentId = SYSTEMMANAGMENTNODE;
        } else if (rightControlUtil.isThreeAdminCurUser()) {
            //三员返回管理功能模块相关的菜单
            parentId = SYSTEMMANAGMENTNODE;
        } else {
            //普通用户只返回业务功能模块相关的菜单
@@ -683,6 +684,32 @@
            throw new PLException("500", new String[]{"功能模块授权失败!"});
        }
        return BaseResult.success();
    }
    /**
     * èŽ·å–æ‰€æŽˆæƒçš„æ¨¡å—æƒé™
     * @param roleName æœç´¢çš„角色
     * @return è§’色列表
     */
    @Override
    public List<RoleInfoDTO> getRoleList(String roleName) throws PLException {
        RoleInfo[] roleInfos = platformClientUtil.getFrameworkService().fetchRoleInfoByUserType(WebUtil.getCurrentUserId());
        List<RoleInfoDTO> dtos = new ArrayList<>();
        for (RoleInfo roleInfo : roleInfos) {
            if(StringUtils.isBlank(roleName) || roleInfo.name.indexOf(roleName) != -1) {
                RoleInfoDTO dto = new RoleInfoDTO();
                dto.setName(roleInfo.name);
                dto.setDescription(roleInfo.description);
                dto.setId(roleInfo.id);
                dto.setGrantor(roleInfo.grantor);
                dto.setType(roleInfo.type);
                dto.setCreateTime(roleInfo.createTime);
                dto.setCreateUser(roleInfo.createUser);
                dto.setUpdateTime(roleInfo.updateTime);
                dto.setUpdateUser(roleInfo.updateUser);
                dtos.add(dto);
            }
        }
        return dtos;
    }
    private long countRightValue(List<RoleRightParamDTO> dtos){
@@ -1075,9 +1102,6 @@
        String parentId;
        if (adminOrDeveloperOrRoot) {
            //系统菜单
            parentId = SYSTEMMANAGMENTNODE;
        } else if (rightControlUtil.isThreeAdminCurUser()) {
            //三员返回管理功能模块相关的菜单
            parentId = SYSTEMMANAGMENTNODE;
        } else {
            //普通用户只返回业务功能模块相关的菜单
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -1,5 +1,7 @@
package com.vci.frameworkcore.compatibility.impl;
import com.vci.corba.framework.data.DeptInfo;
import com.vci.corba.framework.data.RoleInfo;
import com.vci.dto.SmUserDTO;
import com.vci.common.util.ThreeDES;
import com.vci.corba.common.PLException;
@@ -10,6 +12,7 @@
import com.vci.frameworkcore.compatibility.SmPwdStrategyQueryServiceI;
import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
import com.vci.frameworkcore.enumpck.OrgTypeEnum;
import com.vci.model.SmUserDO;
import com.vci.pagemodel.SmUserVO;
import com.vci.po.SmUserPO;
@@ -36,6 +39,7 @@
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -942,7 +946,168 @@
        return treeList;
    }
     /**
    /**
     * èŽ·å–è§’è‰²æ•°æ®
     * @param treeQueryObject
     * @return
     * @throws VciBaseException
     */
    @Override
    public List<Tree> refPersonOrgTree(TreeQueryObject treeQueryObject) throws VciBaseException {
        List<Tree> rootTreeList=new ArrayList<>();
         Map<String,String> conditionMap=treeQueryObject.getConditionMap();
         if(CollectionUtils.isEmpty(conditionMap)) {
             conditionMap = new HashMap<>();
         }
        String dataType=StringUtils.isNotBlank(conditionMap.get("dataType"))?conditionMap.get("dataType"):"";//数据类型
        String parentId=StringUtils.isNotBlank(conditionMap.get("parentId"))?conditionMap.get("parentId"):"";//父节点
        String orgType=StringUtils.isNotBlank(conditionMap.get("orgType"))?conditionMap.get("orgType"):"";//接口查询包含的类型
        try {
            initChildTree(dataType,orgType,parentId,rootTreeList);
        } catch (PLException e) {
            throw new  VciBaseException("用户权限选择树加载失败:"+e.getMessage());
        }
        return rootTreeList;
    }
    /***
     *
     * @param dataType
     * @param orgType
     * @param parentId
     */
    private void initChildTree(String dataType,String orgType, String  parentId, List<Tree>rootTreeList) throws PLException {
        if(StringUtils.isBlank(parentId)){
            Tree rootTree=new Tree("root","人员组织","root");
            rootTree.setParentBtmName("root");
            rootTree.setExpanded(true);
            List<Tree> childList=new ArrayList<>();
            if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(orgType)){//如果是人员
                Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
                childList.add(userTree);
            }else if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(orgType)){//如果是部门
                Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
                childList.add(departmentTree);
            }else if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(orgType)){//如果是角色
                Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
                childList.add(roleTree);
            }else{
                Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
                childList.add(userTree);
                Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
                childList.add(departmentTree);
                Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
                childList.add(roleTree);
            }
            if(childList.size()>0){
                rootTree.setExpanded(true);
                rootTree.setChildren(childList);
            }
            rootTreeList.add(rootTree);
        }else{
            if(OrgTypeEnum.ORG_TYPE_ROOT.getValue().equals(dataType)){//如果父节点有值,则需要判断是加载什么节点
                Tree rootTree=new Tree("root","人员组织","root");
                rootTree.setParentBtmName("root");
                rootTree.setExpanded(true);
                if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(orgType)){//如果是人员
                    Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
                    rootTreeList.add(userTree);
                }else if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(orgType)){//如果是部门
                    Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
                    rootTreeList.add(departmentTree);
                }else if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(orgType)){//如果是角色
                    Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
                    rootTreeList.add(roleTree);
                }else{
                    Tree userTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(),"用户",OrgTypeEnum.ORG_TYPE_USER.getValue(),OrgTypeEnum.ORG_TYPE_USER.getValue(),rootTree);
                    rootTreeList.add(userTree);
                    Tree departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),rootTree);
                    rootTreeList.add(departmentTree);
                    Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),rootTree);
                    rootTreeList.add(roleTree);
                }
            }else if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(dataType)) {//如果传进来的是user节点
                if(OrgTypeEnum.ORG_TYPE_USER.getValue().equals(parentId)) {
                    Tree userTree = initDataTreeNode(OrgTypeEnum.ORG_TYPE_USER.getValue(), "用户", OrgTypeEnum.ORG_TYPE_USER.getValue(), OrgTypeEnum.ORG_TYPE_USER.getValue(), null);
                    UserInfo[] infos = platformClientUtil.getFrameworkService().fetchUserInfo();
                    Arrays.stream(infos).forEach(info -> {
                        Tree childTree = initDataTreeNode(info.id, info.trueName + "(" + info.userName + ")", info, OrgTypeEnum.ORG_TYPE_USER.getValue(), userTree);
                        rootTreeList.add(childTree);
                    });
                }
            }else   if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(dataType)) {//如果是部门
                DeptInfo[] deptInfos=new DeptInfo[]{};
                Tree departmentTree=new Tree();
                if(OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(parentId)) {
                    departmentTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_DEPT.getValue(),"部门",OrgTypeEnum.ORG_TYPE_DEPT.getValue(),OrgTypeEnum.ORG_TYPE_DEPT.getValue(),null);
                    deptInfos = platformClientUtil.getFrameworkService().fetchDepartmentInfo();
                }else{
                    deptInfos=platformClientUtil.getFrameworkService().fetchDepartmentInfoByParentId(parentId);
                    DeptInfo deptInfo=platformClientUtil.getFrameworkService().fetchDepartmentInfoById(parentId);
                    departmentTree=initDataTreeNode(deptInfo.id,deptInfo.name,deptInfo,OrgTypeEnum.ORG_TYPE_DEPT.getValue(),null);
                }
                if(!CollectionUtils.isEmpty(Arrays.asList(deptInfos))){
                    Tree finalDepartmentTree = departmentTree;
                    Arrays.stream(deptInfos).forEach(deptInfo -> {
                        Tree childTree=initDataTreeNode(deptInfo.id,deptInfo.name,deptInfo,OrgTypeEnum.ORG_TYPE_DEPT.getValue(), finalDepartmentTree);
                        rootTreeList.add(childTree);
                    });
                }
                if(!OrgTypeEnum.ORG_TYPE_DEPT.getValue().equals(parentId)) {
                    UserInfo[] infos = platformClientUtil.getFrameworkService().getUserByDeptId(parentId);
                    if (infos != null && infos.length > 0) {
                        Tree finalDepartmentTree = departmentTree;
                        Arrays.stream(infos).forEach(info -> {
                            Tree childTree = initDataTreeNode(info.id, info.trueName + "(" + info.userName + ")", info, OrgTypeEnum.ORG_TYPE_USER.getValue(), finalDepartmentTree);
                            rootTreeList.add(childTree);
                        });
                    }
                }
            }else  if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(dataType)) {//如果是角色
                if(OrgTypeEnum.ORG_TYPE_ROLE.getValue().equals(parentId)){
                    Tree roleTree=initDataTreeNode(OrgTypeEnum.ORG_TYPE_ROLE.getValue(),"角色",OrgTypeEnum.ORG_TYPE_ROLE.getValue(),OrgTypeEnum.ORG_TYPE_ROLE.getValue(),null);
                    RoleInfo[] roleInfos=platformClientUtil.getFrameworkService().fetchRoleInfo();
                    if(roleInfos!=null&&roleInfos.length>0) {
                        Arrays.stream(roleInfos).forEach(info -> {
                            Tree childTree = initDataTreeNode(info.id, info.name, info, OrgTypeEnum.ORG_TYPE_ROLE.getValue(), roleTree);
                            rootTreeList.add(childTree);
                        });
                    }
                }else{
                    RoleInfo roleInfo=platformClientUtil.getFrameworkService().fetchRoleInfoById(parentId);
                    Tree roleTree=initDataTreeNode(roleInfo.id,roleInfo.name,roleInfo,OrgTypeEnum.ORG_TYPE_ROLE.getValue(),null);
                    UserInfo[] infos=platformClientUtil.getFrameworkService().fetchUserInfoByRoleId(roleInfo.id,roleInfo.type);
                    if(infos!=null&&infos.length>0) {
                        Arrays.stream(infos).forEach(info -> {
                            Tree childTree = initDataTreeNode(info.id, info.trueName + "(" + info.userName + ")", info, OrgTypeEnum.ORG_TYPE_USER.getValue(), roleTree);
                            rootTreeList.add(childTree);
                        });
                    }
                }
            }
        }
    }
    /***
     *
     * @param oid
     * @param text
     * @param o
     * @param type
     * @param parentTree
     * @return
     */
    private Tree initDataTreeNode(String oid,String text,Object o,String type,Tree parentTree){
        Tree ObjectTreeNode=new Tree(oid,text,o);
        ObjectTreeNode.setParentBtmName(type);
        if(parentTree!=null) {
            ObjectTreeNode.setParentId(parentTree.getParentId());
            ObjectTreeNode.setParentName(parentTree.getParentName());
        }
        return ObjectTreeNode;
    }
    /**
     * æ ¡éªŒå¯†ç æ˜¯å¦ç›¸åŒï¼Œåœ¨æ–°å¹³å°ä¸­å­˜å‚¨çš„密码是两次md5
     * @param userOid ç”¨æˆ·ä¸»é”®
     * @param md5Password å·²ç»md5加密一次的密码--老的平台里不能加密
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java
@@ -348,4 +348,19 @@
        }
    }
    /**
     * ç”¨æˆ·æƒé™é€‰æ‹©æ ‘
     * @param treeQueryObject æ ‘形数据的查询对象,包括查询条件,上级主键,是否多选等,即允许使用SmUserVO里的所有属性作为查询条件,也可以使用pkRole.xxx,pkDepartment.xxx,pkDuty.xxx这样来查询
     * @return æ™®é€šç”¨æˆ·ï¼ˆä¸åŒ…含三员,也不包含停用的)的树形数据,已经转换过上下级关系,请获取其中的treeData属性
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常,如果是老的项目里不抛出异常
     */
    @RequestMapping(value = "/refPersonOrgTree",method = RequestMethod.GET)
    public BaseResult<Tree> refPersonOrgTree(TreeQueryObject treeQueryObject) throws VciBaseException{
        List<Tree> userTreeList = userQueryService.refPersonOrgTree(treeQueryObject);
        return  BaseResult.tree(userTreeList);
        //老的项目依然是添加try catch,方法里不抛出异常
        //BaseResult.fail("这里返回前端的错误信息");
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/enumpck/OrgTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,112 @@
package com.vci.frameworkcore.enumpck;
import com.vci.starter.web.enumpck.BaseEnum;
/**
 * @author xj
 * @date 2024-09-12
 * äººå‘˜é€‰æ‹©ç»„织类型
 */
public enum OrgTypeEnum  implements BaseEnum {
    /**
     * æ ¹æŽ¥ç‚¹
     */
    ORG_TYPE_ROOT("root","人员组织"),
    /**
     * æŸ¥è¯¢æ‰€æœ‰ç±»åž‹ï¼šäººå‘˜ï¼Œéƒ¨é—¨ï¼Œè§’色
     */
    ORG_TYPE_ALL("all","所有"),
    /**
     * éƒ¨é—¨
     */
    ORG_TYPE_DEPT("department","部门"),
    /**
     * è§’色
     */
    ORG_TYPE_ROLE("role","角色"),
    ORG_TYPE_USER("user","人员");
    /**
     * æžšä¸¾çš„值
     */
    private String value;
    /**
     * æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     */
    private String text;
    /**
     * èŽ·å–æžšä¸¾å€¼
     * @return æžšä¸¾å€¼
     */
    @Override
    public String getValue() {
        return value;
    }
    /**
     * è®¾ç½®æžšä¸¾å€¼
     * @param value æžšä¸¾å€¼
     */
    public void setValue(String value) {
        this.value = value;
    }
    /**
     * èŽ·å–æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     * @return  æ˜¾ç¤ºæ–‡æœ¬
     */
    @Override
    public String getText() {
        return text;
    }
    /**
     * è®¾ç½®æ˜¾ç¤ºæ–‡æœ¬
     * @param text æ˜¾ç¤ºæ–‡æœ¬
     */
    public void setText(String text) {
        this.text = text;
    }
    /**
     * æž„造函数
     * @param value å€¼
     * @param text æ˜¾ç¤ºæ–‡æœ¬
     */
    private OrgTypeEnum(String value, String text){
        this.value = value;
        this.text = text;
    }
    /**
     * æ ¹æ®åç§°èŽ·å–å¯¹åº”çš„æžšä¸¾å€¼
     * @param text åç§°
     * @return æžšä¸¾å€¼
     */
    public static String getValueByText(String text){
        for(OrgTypeEnum wenum : OrgTypeEnum.values()){
            if(wenum.getText().equalsIgnoreCase(text)){
                return wenum.getValue();
            }
        }
        return "";
    }
    /**
     * æ ¹æ®æžšä¸¾å€¼èŽ·å–åç§°
     * @param value æžšä¸¾å€¼
     * @return åç§°
     */
    public static String getTextByValue(String value){
        for(OrgTypeEnum wenum : OrgTypeEnum.values()){
            if(wenum.getValue().equalsIgnoreCase(value)){
                return wenum.getText();
            }
        }
        return "";
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java
@@ -4,6 +4,7 @@
import com.vci.corba.common.PLException;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.dto.RoleInfoDTO;
import com.vci.dto.RoleRightDTO;
import com.vci.dto.RoleRightParamDTO;
import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
@@ -110,6 +111,23 @@
    }
    /**
     * è§’色列表
     * @param roleName æœç´¢çš„角色
     * @return è§’色列表
     */
    @GetMapping("/getRoleList")
    public BaseResult<List<RoleInfoDTO>> getRoleList(String roleName) {
        try {
            return BaseResult.dataList(functionQueryService.getRoleList(roleName));
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "查询时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * ä¿å­˜æŽˆæƒçš„æ¨¡å—
     * @param roleRightDTOS ç”¨æˆ·é€‰æ‹©æŽˆæƒæ¨¡å—信息
     * @param roleId è§’色主键
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsActionController.java
@@ -82,6 +82,24 @@
    }
    /**
     * åˆ é™¤åˆ†ç±»
     * @param dto åˆ†ç±»å¯¹è±¡
     * @return å¤„理结果
     * @throws PLException
     */
    @DeleteMapping("/deleteActionCls")
    public BaseResult deleteActionCls(@RequestBody PLActionClsDTO dto){
        try {
            return osActionServiceI.deleteActionCls(dto);
        } catch (PLException e) {
            BaseResult objectBaseResult = new BaseResult<>();
            objectBaseResult.setCode(Integer.parseInt(e.code));
            objectBaseResult.setMsg(Arrays.toString(e.messages));
            return objectBaseResult;
        }
    }
    /**
     * èŽ·å–Action表格数据
     * dto æŸ¥è¯¢æ¡ä»¶
     * @return æŸ¥è¯¢ç»“æžœ
@@ -234,4 +252,20 @@
            return objectBaseResult;
        }
    }
    /**
     * æŸ¥è¯¢Action参数列表数据
     * actionOid å‚数主键
     * @return ä¿å­˜ç»“æžœ
     */
    @GetMapping("/getPLActionParam")
    public BaseResult getPLActionParam(String actionOid){
        try {
            return osActionServiceI.getPLActionParam(actionOid);
        } catch (PLException e) {
            BaseResult objectBaseResult = new BaseResult<>();
            objectBaseResult.setCode(Integer.parseInt(e.code));
            objectBaseResult.setMsg(Arrays.toString(e.messages));
            return objectBaseResult;
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/UIManagerController.java
@@ -1,20 +1,26 @@
package com.vci.web.controller;
import cn.hutool.core.io.FileUtil;
import com.vci.constant.FrameWorkLangCodeConstant;
import com.vci.corba.common.PLException;
import com.vci.corba.portal.data.PLPageDefination;
import com.vci.corba.portal.data.PLTabPage;
import com.vci.corba.portal.data.PLUILayout;
import com.vci.dto.UIAuthorDTO;
import com.vci.pagemodel.PLDefinationVO;
import com.vci.pagemodel.PLTabButtonVO;
import com.vci.pagemodel.PLUILayoutCloneVO;
import com.vci.starter.web.annotation.log.VciBusinessLog;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.BaseQueryObject;
import com.vci.starter.web.pagemodel.BaseResult;
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.util.ControllerUtil;
import com.vci.starter.web.util.LocalFileUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.web.service.OsBtmServiceI;
import com.vci.web.service.UIManagerServiceI;
import com.vci.web.util.Func;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,10 +28,12 @@
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.xml.crypto.Data;
import java.io.File;
import java.io.IOException;
import java.util.Comparator;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * UI定义控制层
@@ -160,26 +168,76 @@
    }
    /**
     * æŸ¥è¯¢è¦å¯¼å‡ºUI上下文树
     * @param expDatas
     * @return
     * @throws PLException
     */
    @GetMapping( "/getExpContextTree")
    @VciBusinessLog(operateName = "查询要导出UI上下文树")
    public BaseResult getExpContextTree(String[] expDatas){
        try {
            return BaseResult.success(uiManagerService.getExpContextTree(Arrays.asList(expDatas)),"Success");
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "查询要导出UI上下文树时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * å¯¼å‡ºUI上下文
     * name é“¾æŽ¥ç±»åž‹åç§°
     * @return
     */
    @GetMapping("/expUIContextData")
    public void expUIContextData(String[] oids, HttpServletResponse response) throws PLException, IOException {
        uiManagerService.expUIContextData(oids, response);
    @PostMapping("/expUIContextData")
    public void expUIContextData(@RequestBody Map<String,String> expConditionMap, HttpServletResponse response) throws PLException, IOException {
        try {
            String excelPath = uiManagerService.expUIContextData(expConditionMap);
            ControllerUtil.writeFileToResponse(response,excelPath);
            FileUtil.del(LocalFileUtil.getDefaultTempFolder() + File.separator);
        } catch (Exception e) {
            String msg = "导出UI上下文时出现错误,原因:" + 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();
            }
        }
    }
    /**
     * å¯¼å…¥UI上下文
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @param isCovered æ˜¯å¦è¦†ç›–
     * @param selectBtm é€‰æ‹©å¯¼å…¥åˆ°çš„业务类型
     * @return
     */
    @PostMapping("/impUiContextData")
    public BaseResult impUIContextData(MultipartFile file){try {
        return uiManagerService.impUIContextData(file);
    }catch (Throwable e) {
        throw new VciBaseException(VciBaseUtil.getExceptionMessage(e),new String[0],e);
    }
    @PostMapping("/impUIContextData")
    public BaseResult impUIContextData(MultipartFile file, boolean isCovered,String selectBtm){
        File file1 = null;
        try {
            //覆盖,不需要传file
            if(!isCovered){
                String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
                file1 = new File(excelFileName);
                file.transferTo(new File(excelFileName));
            }
            if (file != null || isCovered) {
                return uiManagerService.impUIContextData(file1, isCovered,selectBtm);
            } else {
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"});
            }
        }catch (Throwable e) {
            throw new VciBaseException(VciBaseUtil.getExceptionMessage(e),new String[0],e);
        }finally {
            if(!isCovered){
                file1.delete();
            }
        }
    }
    /**
@@ -339,6 +397,110 @@
        }
    }
    //页面设计下配置按钮相关接口
    /**
     * èŽ·å–é¡µç­¾åŒºåŸŸæŒ‰é’®é…ç½®ä¿¡æ¯
     * @param pageDefinationOid
     * @return
     */
    @GetMapping( "/getTabButtons")
    @VciBusinessLog(operateName = "获取页签区域按钮配置信息")
    public BaseResult getTabButtons(String pageDefinationOid){
        try {
            return BaseResult.dataList(uiManagerService.getTabButtons(pageDefinationOid));
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = "获取页签区域按钮配置信息时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * æ·»åŠ æŒ‰é’®é…ç½®ä¿¡æ¯
     * @param tabButtonVO
     * @return ä¿å­˜ç»“æžœ
     */
    @PostMapping("/addTapButton")
    public BaseResult addTapButton(@RequestBody PLTabButtonVO tabButtonVO){
        try {
            return uiManagerService.addTapButton(tabButtonVO);
        } catch (Throwable e) {
            e.printStackTrace();
            String exceptionMessage = "按钮配置信息添加时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * ä¿®æ”¹æŒ‰é’®é…ç½®ä¿¡æ¯
     * @param  tabButtonVO
     * @return ä¿®æ”¹ç»“æžœ
     */
    @PutMapping("/updateTapButton")
    public BaseResult updateTapButton(@RequestBody PLTabButtonVO tabButtonVO){
        try {
            return uiManagerService.updateTapButton(tabButtonVO);
        } catch (Throwable e) {
            e.printStackTrace();
            String exceptionMessage = "修改按钮配置信息时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * åˆ é™¤å•个按钮配置
     * @param tabButtonVO
     * @return
     */
    @DeleteMapping("/deleteTapButton")
    public BaseResult deleteTapButton(@RequestBody PLTabButtonVO tabButtonVO){
        try {
            return uiManagerService.deleteTapButton(tabButtonVO) ? BaseResult.success("删除单个按钮配置成功!"):BaseResult.fail("删除单个按钮配置失败!");
        } catch (PLException e) {
            e.printStackTrace();
            String exceptionMessage = "删除单个按钮配置时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * è°ƒæ•´ä¸ºä¸‹çº§æŒ‰é’®
     * @param  tabButtonVO
     * @return ä¿®æ”¹ç»“æžœ
     */
    @PutMapping("/joinBtn")
    public BaseResult joinBtn(@RequestBody PLTabButtonVO tabButtonVO){
        try {
            return uiManagerService.joinBtn(tabButtonVO);
        } catch (Throwable e) {
            e.printStackTrace();
            String exceptionMessage = "调整为下级按钮时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * è°ƒæ•´ä¸ºä¸Šçº§æŒ‰é’®
     * @param  tabButtonVO
     * @return ä¿®æ”¹ç»“æžœ
     */
    @PutMapping("/exitBtn")
    public BaseResult exitBtn(@RequestBody PLTabButtonVO tabButtonVO){
        try {
            return uiManagerService.exitBtn(tabButtonVO);
        } catch (Throwable e) {
            e.printStackTrace();
            String exceptionMessage = "调整为上级按钮时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * æ ¹æ®è§’色获取UI/表单/按钮的权限.
     * @param baseQueryObject
@@ -363,7 +525,7 @@
     */
    @PostMapping( "/authorizedUI")
    @VciBusinessLog(operateName = "UI授权")
    public BaseResult authorizedUI(UIAuthorDTO uiAuthorDTO){
    public BaseResult authorizedUI(@RequestBody UIAuthorDTO uiAuthorDTO){
        try {
            return uiManagerService.authorizedUI(uiAuthorDTO)?BaseResult.success("授权成功!"):BaseResult.fail("授权失败!");
        }catch (Throwable e) {
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/data.s.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,94 @@
{
    "code": 200,
    "data": null,
    "exceptionClassName": null,
    "exceptionCode": null,
    "exceptionObjs": null,
    "finishTime": 1726130668800,
    "msg": "",
    "msgObjs": null,
    "obj": null,
    "requestTraceId": null,
    "success": true,
    "total": 0,
    "traceId": "71bfe687-1112-47c3-9fe5-45ae9f7b7228",
    "treeData": [
        {
            "attributes": {},
            "checked": false,
            "children": [
                {
                    "attributes": {},
                    "checked": false,
                    "children": [],
                    "data": "user",
                    "expanded": false,
                    "href": null,
                    "icon": null,
                    "iconCls": null,
                    "index": null,
                    "leaf": false,
                    "level": 0,
                    "oid": "user",
                    "parentBtmName": "user",
                    "parentId": null,
                    "parentName": null,
                    "showCheckbox": false,
                    "text": "用户"
                },
                {
                    "attributes": {},
                    "checked": false,
                    "children": [],
                    "data": "department",
                    "expanded": false,
                    "href": null,
                    "icon": null,
                    "iconCls": null,
                    "index": null,
                    "leaf": false,
                    "level": 0,
                    "oid": "department",
                    "parentBtmName": "department",
                    "parentId": null,
                    "parentName": null,
                    "showCheckbox": false,
                    "text": "部门"
                },
                {
                    "attributes": {},
                    "checked": false,
                    "children": [],
                    "data": "role",
                    "expanded": false,
                    "href": null,
                    "icon": null,
                    "iconCls": null,
                    "index": null,
                    "leaf": false,
                    "level": 0,
                    "oid": "role",
                    "parentBtmName": "role",
                    "parentId": null,
                    "parentName": null,
                    "showCheckbox": false,
                    "text": "角色"
                }
            ],
            "data": "root",
            "expanded": true,
            "href": null,
            "icon": null,
            "iconCls": null,
            "index": null,
            "leaf": false,
            "level": 0,
            "oid": "root",
            "parentBtmName": "root",
            "parentId": null,
            "parentName": null,
            "showCheckbox": false,
            "text": "人员组织"
        }
    ]
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemTypeEnum.java
@@ -183,7 +183,7 @@
            if (isText) {
                value = itemTypeEnum.getText();
            } else {
                value = itemTypeEnum.getText();
                value = itemTypeEnum.getValue();
            }
        }
        return value;
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsActionServiceI.java
@@ -93,4 +93,17 @@
     * @return ä¿å­˜ç»“æžœ
     */
    BaseResult deletePLActionParam(String oid) throws PLException;
    /**
     * æŸ¥è¯¢Action参数列表数据
     * actionOid å‚数主键
     * @return ä¿å­˜ç»“æžœ
     */
    BaseResult getPLActionParam(String actionOid) throws PLException;
    /**
     * åˆ é™¤åˆ†ç±»
     * @param dto åˆ†ç±»å¯¹è±¡
     * @return å¤„理结果
     * @throws PLException
     */
    BaseResult deleteActionCls(PLActionClsDTO dto) throws PLException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIManagerServiceI.java
@@ -1,9 +1,7 @@
package com.vci.web.service;
import com.vci.corba.common.PLException;
import com.vci.corba.portal.data.PLTabButton;
import com.vci.corba.portal.data.PLUILayout;
import com.vci.corba.portal.data.PLPageDefination;
import com.vci.corba.portal.data.PLTabPage;
import com.vci.pagemodel.PLTabButtonVO;
import com.vci.pagemodel.PLUILayoutCloneVO;
@@ -16,8 +14,10 @@
import com.vci.pagemodel.PLDefinationVO;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
 * @author ludc
@@ -63,18 +63,25 @@
    boolean cloneUIContextData(PLUILayoutCloneVO pluiLayoutCloneVO) throws PLException;
    /**
     * æ ¹æ®å‹¾é€‰çš„æ¡ä»¶èŽ·å–éœ€è¦å¯¼å‡ºçš„ui上下文树
     * @param expDatas
     * @return
     */
    Tree getExpContextTree(List<String> expDatas);
    /**
     * å¯¼å‡ºui上下文(勾选的要导出的控制区的数据)
     * oids
     * @return
     */
    void expUIContextData(String[] oids, HttpServletResponse response) throws PLException, IOException;
    String expUIContextData(Map<String,String> expConditionMap) throws PLException, IOException;
    /**
     * å¯¼å…¥UI上下文
     * @param file
     * @return
     */
    BaseResult impUIContextData(MultipartFile file);
    BaseResult impUIContextData(File file, boolean isCovered,String selectBtm);
    //区域相关查询、添加、删除、修改等接口
    /**
@@ -170,24 +177,24 @@
    /**
     * åˆ é™¤å•个按钮配置
     * @param tabButton
     * @param tabButtonVO
     * @return
     */
    boolean deleteTapButton(PLTabButton tabButton) throws PLException;
    boolean deleteTapButton(PLTabButtonVO tabButtonVO) throws PLException;
    /**
     * è°ƒæ•´ä¸ºä¸‹çº§æŒ‰é’®
     * @param plTabButton
     * @param tabButtonVO
     * @return
     */
    BaseResult joinBtn(PLTabButton plTabButton) throws PLException;
    BaseResult joinBtn(PLTabButtonVO tabButtonVO) throws PLException;
    /**
     * è°ƒæ•´ä¸ºä¸Šçº§æŒ‰é’®
     * @param plTabButton
     * @param tabButtonVO
     * @return
     */
    BaseResult exitBtn(PLTabButton plTabButton) throws PLException;
    BaseResult exitBtn(PLTabButtonVO tabButtonVO) throws PLException;
    /**
     * èŽ·å–UI权限树
@@ -204,6 +211,5 @@
     * @throws Exception
     */
    boolean authorizedUI(UIAuthorDTO uiAuthorDTO)throws Exception;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsActionServiceImpl.java
@@ -127,6 +127,7 @@
        PLActionCls[] clses = platformClientUtil.getUIService().getPLActionClsArray();
        PLActionClsDTO treDto = new PLActionClsDTO();
        treDto.setName("Action分类");
        treDto.setId("root");
        Map<String, List<PLActionCls>> allDataMap = Arrays.stream(clses).collect(Collectors.groupingBy(pl -> pl.pid));
        for (PLActionCls cls : clses) {
@@ -134,7 +135,7 @@
                PLActionClsDTO parentDto = new PLActionClsDTO();
                parentDto.setId(cls.id);
                parentDto.setName(cls.name);
                parentDto.setPid(cls.pid);
                parentDto.setPid("root");
                parentDto.setDescription(cls.description);
                parentDto.setCreator(cls.creator);
                parentDto.setCreateTime(cls.createTime);
@@ -186,7 +187,7 @@
        Constraint[] consArray ;
        if(StringUtils.isNotBlank(dto.getPlactioncls())){
            consArray = new Constraint[7];
            consArray[6] = new Constraint("plactioncls", dto.getPlactioncls());
            consArray[6] = new Constraint("plactioncls", dto.getPlactioncls().equals("root") ? "": dto.getPlactioncls());
        }else {
            consArray = new Constraint[6];
        }
@@ -565,6 +566,57 @@
        }
        return BaseResult.success();
    }
    /**
     * æŸ¥è¯¢Action参数列表数据
     * actionOid å‚数主键
     * @return ä¿å­˜ç»“æžœ
     */
    @Override
    public BaseResult getPLActionParam(String actionOid) throws PLException {
        if (StringUtils.isBlank(actionOid)){
            throw new PLException("500", new String[]{"Action主键不能为空!"});
        }
        PLActionParam[] paramArrays = platformClientUtil.getUIService().getPLActionParamArrayByActionId(actionOid);
        List<PLActionParamDTO> dtos = new ArrayList<>();
        for (PLActionParam paramArray : paramArrays) {
            PLActionParamDTO dto = new PLActionParamDTO();
            dto.setAction(paramArray.action);
            dto.setOid(paramArray.oid);
            dto.setName(paramArray.name);
            dto.setDescription(paramArray.description);
            dto.setDefaultValue(paramArray.defaultValue);
            dtos.add(dto);
        }
        return BaseResult.dataList(dtos);
    }
    /**
     * åˆ é™¤åˆ†ç±»
     * @param dto åˆ†ç±»å¯¹è±¡
     * @return å¤„理结果
     * @throws PLException
     */
    @Override
    public BaseResult deleteActionCls(PLActionClsDTO dto) throws PLException {
        PLActionCls[] clses = platformClientUtil.getUIService().getPLActionClsArray();
        // å°†æ‰€æœ‰åˆ†ç±»çˆ¶åˆ†ç±»ä¿å­˜
        HashSet<String> clsPids = new HashSet<String>();
        for (PLActionCls plActionCls : clses) {
            clsPids.add(plActionCls.pid);
        }
        if (dto.getName().equals("未分类")) {
            throw new PLException("500", new String[]{"未分类不能删除!"});
        }
        if (clsPids.contains(dto.getId())) {
            throw new PLException("500", new String[]{"该分类下存在子分类不能删除!\n请删除此分类下的子分类!"});
        }
        // æ‰§è¡Œåˆ é™¤æ“ä½œ
        String message = platformClientUtil.getUIService().deletePLActionClsById(dto.getId());
        if (message.startsWith("0")) {
            throw new PLException("500", new String[]{"删除分类失败!" + message.substring(1)});
        }
        return BaseResult.success("分类删除成功!" + message.substring(1));
    }
    public boolean isValidPageForamt(PLActionExpDTO plActionExpDTO) throws PLException {
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java
@@ -2,27 +2,29 @@
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.RoleRightInfo;
import com.vci.corba.omd.btm.BizType;
import com.vci.corba.portal.PortalService;
import com.vci.corba.portal.data.*;
import com.vci.dto.RoleRightDTO;
import com.vci.dto.UIAuthorDTO;
import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
import com.vci.model.PLDefination;
import com.vci.pagemodel.*;
import com.vci.starter.poi.bo.*;
import com.vci.starter.poi.util.ExcelUtil;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.*;
import com.vci.starter.web.pagemodel.BaseQueryObject;
import com.vci.starter.web.pagemodel.BaseResult;
import com.vci.starter.web.pagemodel.DataGrid;
import com.vci.starter.web.pagemodel.SessionInfo;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.starter.web.util.VciDateUtil;
import com.vci.starter.web.util.WebThreadLocalUtil;
import com.vci.starter.web.util.*;
import com.vci.web.redis.RedisService;
import com.vci.web.service.OsBtmServiceI;
import com.vci.web.service.UIManagerServiceI;
import com.vci.web.util.*;
import com.vci.web.util.BeanUtil;
import org.apache.commons.lang3.StringUtils;
import com.vci.web.util.Func;
import com.vci.web.util.PlatformClientUtil;
@@ -33,13 +35,11 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.swing.*;
import javax.swing.tree.TreePath;
import java.io.IOException;
import java.io.File;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import java.util.regex.Pattern;
@@ -57,6 +57,12 @@
    @Resource
    private PlatformClientUtil platformClientUtil;
    /**
     * ç¼“存工具
     */
    @Resource
    private RedisService redisService;
    /***
     * æ˜¯å¦æ˜¯ç®¡ç†å‘˜
     */
@@ -73,6 +79,11 @@
     * æ—¥å¿—
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * å¯¼å…¥æ•°æ®çš„sheet集合
     */
    private final String IMPORTUIKEY = "importUIKey:";
    /**
     * æŽ’序比较器
@@ -136,7 +147,7 @@
    public List<PLUILayout> getUIContextDataByBtName(String btemName,String context) throws PLException {
        VciBaseUtil.alertNotNull(btemName,"业务类型");
        List<PLUILayout> pluiLayoutList=new ArrayList<>();
        List<String> contextList= VciBaseUtil.str2List(context);
        List<String> contextList= new ArrayList<>();
        if(StringUtils.isNotBlank(context)){
            contextList=VciBaseUtil.str2List(context);
        }else{
@@ -313,23 +324,526 @@
    }
    /**
     * æ ¹æ®å‹¾é€‰çš„æ¡ä»¶èŽ·å–éœ€è¦å¯¼å‡ºçš„ui上下文树
     * @param expDatas
     * @return
     */
    @Override
    public Tree getExpContextTree(List<String> expDatas) {
        VciBaseUtil.alertNotNull(expDatas,"导出查询列表");
        Tree tree = new Tree();
        String newObjectID36 = ObjectUtility.getNewObjectID36();
        tree.setOid(newObjectID36);
        tree.setText("区域");
        tree.setLevel(0);
        List<Tree> treeList = new ArrayList<>();
        expDatas.stream().forEach(oid->{
            try {
                PLUILayout pluiLayout = platformClientUtil.getUIService().getPLUILayoutById(oid);
                if(Func.isNotEmpty(pluiLayout) &&  Func.isNotBlank(pluiLayout.plOId)){
                    Tree tree1 = new Tree();
                    tree1.setText(pluiLayout.plName);
                    tree1.setOid(pluiLayout.plOId);
                    tree1.setLevel(1);
                    tree1.setParentId(newObjectID36);
                    //查询
                    PLTabPage[] plTabPages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(pluiLayout.plOId);
                    List<Tree> treeChildrens = new ArrayList<>();
                    Arrays.stream(plTabPages).forEach(item->{
                        Tree tree2 = new Tree();
                        tree2.setLeaf(true);
                        tree2.setOid(item.plOId);
                        tree2.setText(item.plName);
                        tree2.setLevel(2);
                        tree2.setParentId(item.plContextOId);
                        treeChildrens.add(tree2);
                    });
                    tree1.setChildren(treeChildrens);
                    treeList.add(tree1);
                }
            } catch (PLException e) {
                e.printStackTrace();
            }
        });
        tree.setChildren(treeList);
        return tree;
    }
    /**
     * å¯¼å‡ºui上下文(勾选的要导出的控制区的数据)
     * oids
     * @return
     */
    @Override
    public void expUIContextData(String[] oids, HttpServletResponse response) throws PLException, IOException {
    public String expUIContextData(Map<String,String> expConditionMap) throws PLException {
        if(Func.isEmpty(expConditionMap)){
            throw new PLException("500",new String[]{"请勾选要导出的UI上下文数据!"});
        }
        //界面没传名称,使用默认导出名称
        String exportFileName = "UI上下文导出_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss");
        //设置列名
        /*List<String> columns = Arrays.asList(
                "所属业务类型","名称", "UI上下文", "导航区", "控制区","操作区",
                "页签序号","区域编码","区域名称","是否启用","显示表达式", "UI解析类",
                "扩展属性", "描述","页面设计信息","页面下配置的按钮"
        );*/
        //写excel
        String excelPath = LocalFileUtil.getDefaultTempFolder() + File.separator + exportFileName +  ".xls";
        try {
            new File(excelPath).createNewFile();
        } catch (Throwable e) {
            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[]{excelPath}, e);
        }
        //设置列
        List<WriteExcelData> pldDataList = new ArrayList<>();
        List<WriteExcelData> tpDataList = new ArrayList<>();
        List<WriteExcelData> pdDataList = new ArrayList<>();
        List<WriteExcelData> tbDataList = new ArrayList<>();
        List<WriteExcelData> cpDataList = new ArrayList<>();
        //设置列头
        /*for (int index = 0; index < columns.size(); index++) {
            excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
        }*/
        AtomicInteger pldRow = new AtomicInteger(0);
        AtomicInteger tpRow = new AtomicInteger(0);
        AtomicInteger pdRow = new AtomicInteger(0);
        AtomicInteger tbRow = new AtomicInteger(0);
        AtomicInteger cpRow = new AtomicInteger(0);
        expConditionMap.entrySet().stream().forEach(item->{
            //key存放的ui上下文的id
            try {
                PLUILayout pluiLayout = platformClientUtil.getUIService().getPLUILayoutById(item.getKey());
                pldDataList.add(new WriteExcelData(pldRow.get(),0, pluiLayout.plOId));
                pldDataList.add(new WriteExcelData(pldRow.get(),1, pluiLayout.plCode));
                pldDataList.add(new WriteExcelData(pldRow.get(),2, pluiLayout.plName));
                pldDataList.add(new WriteExcelData(pldRow.get(),3, pluiLayout.plRelatedType));
                pldDataList.add(new WriteExcelData(pldRow.get(),4, pluiLayout.plIsShowForm));
                pldDataList.add(new WriteExcelData(pldRow.get(),5, pluiLayout.plIsShowNavigator));
                pldDataList.add(new WriteExcelData(pldRow.get(),6, pluiLayout.plIsShowTab));
                pldRow.getAndIncrement();
                //value中存放的多个以逗号间隔的页签id,通过这个id查询出其下的页面设计和按钮配置
                List<String> plTabPageOIds = Arrays.asList(item.getValue().split(","));
                if(Func.isNotEmpty(pluiLayout) && Func.isNotBlank(pluiLayout.plOId) && Func.isNotEmpty(plTabPageOIds)){
                    PLTabPage[] plTabPages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(pluiLayout.plOId);
                    List<PLTabPage> filterTabPages = Arrays.stream(plTabPages).filter(plTabPage -> plTabPageOIds.contains(plTabPage.plOId)).collect(Collectors.toList());
                    filterTabPages.stream().forEach(tabPage->{
                        //区域定义
                        tpDataList.add(new WriteExcelData(tpRow.get(),0, tabPage.plOId));
                        tpDataList.add(new WriteExcelData(tpRow.get(),1, tabPage.plSeq));
                        tpDataList.add(new WriteExcelData(tpRow.get(),2, tabPage.plCode));
                        tpDataList.add(new WriteExcelData(tpRow.get(),3, tabPage.plLabel));
                        tpDataList.add(new WriteExcelData(tpRow.get(),4, tabPage.plName));
                        tpDataList.add(new WriteExcelData(tpRow.get(),5, tabPage.plContextOId));
                        tpDataList.add(new WriteExcelData(tpRow.get(),6, tabPage.plAreaType));
                        tpDataList.add(new WriteExcelData(tpRow.get(),7, tabPage.plIsOpen));
                        tpDataList.add(new WriteExcelData(tpRow.get(),8, tabPage.plOpenExpression));
                        tpDataList.add(new WriteExcelData(tpRow.get(),9, tabPage.plUIParser));
                        tpDataList.add(new WriteExcelData(tpRow.get(),10, tabPage.plExtAttr));
                        tpDataList.add(new WriteExcelData(tpRow.get(),11, tabPage.plDesc));
                        tpDataList.add(new WriteExcelData(tpRow.get(),12, tabPage.plLicensOrs));
                        tpRow.getAndIncrement();
                        try {
                            PLPageDefination[] plPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(tabPage.plOId);
                            if(Func.isNotEmpty(plPageDefinations)){
                                //List<PLTabButtonVO> tabButtonsTotal = new ArrayList<>();
                                Arrays.stream(plPageDefinations).forEach(plPageDefination->{
                                    pdDataList.add(new WriteExcelData(pdRow.get(),0, plPageDefination.plOId));
                                    pdDataList.add(new WriteExcelData(pdRow.get(),1, plPageDefination.plTabPageOId));
                                    pdDataList.add(new WriteExcelData(pdRow.get(),2, plPageDefination.plType));
                                    pdDataList.add(new WriteExcelData(pdRow.get(),3, plPageDefination.name));
                                    pdDataList.add(new WriteExcelData(pdRow.get(),4, plPageDefination.desc));
                                    pdDataList.add(new WriteExcelData(pdRow.get(),5, plPageDefination.seq));
                                    pdDataList.add(new WriteExcelData(pdRow.get(),6, plPageDefination.plDefination));
                                    pdRow.getAndIncrement();
                                    //查询按钮
                                    try {
                                        PLTabButton[] tabButtons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(plPageDefination.plOId);
                                        for (PLTabButton tabButton:tabButtons){
                                            tbDataList.add(new WriteExcelData(tbRow.get(),0, tabButton.plOId));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),1, tabButton.plTableOId));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),2, tabButton.plPageOId));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),3, tabButton.plActionOId));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),4, tabButton.plLabel));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),5, tabButton.plAreaType));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),6, tabButton.plDesc));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),7, tabButton.plSeq));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),8, tabButton.plParentOid));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),9, tabButton.displayMode));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),10, tabButton.iconPath));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),11, tabButton.authorization));
                                            tbDataList.add(new WriteExcelData(tbRow.get(),12, tabButton.show));
                                            tbRow.getAndIncrement();
                                            PLCommandParameter[] parameters = platformClientUtil.getUIService().getPLCommandParametersByCommandOId(tabButton.plOId);
                                            if(Func.isNotEmpty(parameters)){
                                                Arrays.stream(parameters).forEach(param->{
                                                    cpDataList.add(new WriteExcelData(cpRow.get(),0, param.plOId));
                                                    cpDataList.add(new WriteExcelData(cpRow.get(),1, param.plCommandOId));
                                                    cpDataList.add(new WriteExcelData(cpRow.get(),2, param.plKey));
                                                    cpDataList.add(new WriteExcelData(cpRow.get(),3, param.plValue));
                                                    cpRow.getAndIncrement();
                                                });
                                            }
                                        }
                                    } catch (PLException e) {
                                        e.printStackTrace();
                                    }
                                });
                            }
                        } catch (PLException e) {
                            e.printStackTrace();
                        }
                    });
                }
            } catch (PLException e) {
                e.printStackTrace();
            }
        });
        WriteExcelOption excelOption = new WriteExcelOption();
        excelOption.addSheetDataList("PlpageLayoutDefnation",pldDataList);
        excelOption.addSheetDataList("Pltabpage",tpDataList);
        excelOption.addSheetDataList("Plpagedefination",pdDataList);
        excelOption.addSheetDataList("Pltabbutton",tbDataList);
        excelOption.addSheetDataList("PlcommondParam",cpDataList);
        ExcelUtil.writeDataToFile(excelPath, excelOption);
        return excelPath;
    }
    /**
     * å¯¼å…¥UI上下文
     * @param file
     * @param isCovered æ˜¯å¦è¦†ç›–
     * @param selectBtm é€‰æ‹©çš„业务类型
     * @return
     */
    @Override
    public BaseResult impUIContextData(MultipartFile file) {
        return null;
    public BaseResult impUIContextData(File file,boolean isCovered,String selectBtm) {
        if(!isCovered){
            VciBaseUtil.alertNotNull(file,"excel文件");
            if(!file.exists()){
                throw new VciBaseException("导入的excel文件不存在,{0}",new String[]{file.getPath()});
            }
        }
        try {
            List<SheetDataSet> sheetDataSets = null;
            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
            //是覆盖操作,所以直接读取
            if(isCovered){
                sheetDataSets = redisService.getCacheList(IMPORTUIKEY + sessionInfo.getUserId());
                if(Func.isEmpty(sheetDataSets)){
                    throw new VciBaseException("从缓存中未获取到导入的数据,请刷新后重试!!");
                }
            }else{
                //读取excel表
                ReadExcelOption readExcelOption = new ReadExcelOption();
                readExcelOption.setReadAllSheet(true); //读取全部的sheet
                sheetDataSets = ExcelUtil.readDataObjectFromExcel(file,SheetDataSet.class,readExcelOption);
            }
            PLUILayout[] plpagelayoutdefinations = null;
            SheetDataSet plpagelayoutdefnationsheet = sheetDataSets.get(0);
            SheetDataSet pltabpagesheet = sheetDataSets.get(1);
            SheetDataSet plpagedefinationsheet = sheetDataSets.get(2);
            SheetDataSet pltabbuttonsheet = sheetDataSets.get(3);
            SheetDataSet plcommondparamsheet = sheetDataSets.get(4);
            Map<PLUILayout,List<PLTabPage>> pdMap = new HashMap<>();
            Map<PLTabPage,List<PLPageDefination>> tdMap = new HashMap<>();
            Map<PLPageDefination,List<PLTabButton>> dbMap = new HashMap<>();
            Map<PLTabButton,List<PLCommandParameter>> bcMap = new HashMap<>();
            List<PLUILayout> plpagelayoutdefinationList = new ArrayList<>();
            List<PLTabPage> pltabpagelist = new ArrayList<>();
            List<PLPageDefination> plpagedefinationlist = new ArrayList<>();
            List<PLTabButton> pltabbuttonlist = new ArrayList<>();
            List<PLCommandParameter> plcommandparameterlist = new ArrayList<>();
            /*StringBuffer checkplpagelayoutdefination = new StringBuffer();
            StringBuffer checkplpagelayoutdefinationPlcode = new StringBuffer();*/
            StringBuffer plActionIDNulls = new StringBuffer();
            //add by caill start åˆå§‹åŒ–标记
            int count=0;
            int preCount=0;
            String preOID="";
            String doublePreOID="";
            String plpageLayoutDefinationId="";
            String plPageContextOId="";
            String plCommandOId="";
            String plTableOId="";
            //add by caill end
            PLAction[] allPLAction = platformClientUtil.getUIService().getAllPLAction();
            Map<String,String> relation = null;
            List<SheetRowData> rowData = plpagelayoutdefnationsheet.getRowData();
            for(int i=0; i<rowData.size(); i++){
                pltabpagelist = new ArrayList<PLTabPage>();
                PLUILayout p = new PLUILayout();
                //HSSFRow readrow = plpagelayoutdefnationsheet.getRowData();
                Map<Integer, String> dataMap = rowData.get(i).getData();
                if(Func.isEmpty(dataMap)){
                    break;
                }
                //根据业务类型查询ui上下文
                plpagelayoutdefinations = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(selectBtm);
                p.plOId = ObjectUtility.getNewObjectID36();
                p.plCode = dataMap.get(1);
                p.plName = dataMap.get(2);
                //add by caill start
                //遍历UI名称
                for(PLUILayout pd : plpagelayoutdefinations){
                    if(pd.plName.equals(p.plName) && !isCovered){
                        //如果用户选择覆盖,第二次调用就不会传导入文件,所以这里存入缓存
                        redisService.setCacheList(IMPORTUIKEY+sessionInfo.getUserId(),sheetDataSets);
                        //设置过期时间为5分钟,因为一般情况下不会说是等太久
                        redisService.expire(IMPORTUIKEY+sessionInfo.getUserId(),5, TimeUnit.MINUTES);
                        throw new VciBaseException(pd.plName+"名称已经存在,是否覆盖?");
                    }
                    //根据UI上下文做判断
                    if(pd.plCode.equals(p.plCode)){
                        count=1;
                        preOID=pd.plOId;  //如果UI上下文相同,就把系统中的id赋值给新导入的id
                        p.plOId=pd.plOId;
                    }
                }
                //add by caill end
                plpageLayoutDefinationId = dataMap.get(0);
                String name = dataMap.get(3);
                p.plRelatedType = dataMap.get(3);
                p.plIsShowNavigator = Short.parseShort(dataMap.get(4));
                p.plIsShowTab = Short.parseShort(dataMap.get(5));
                p.plIsShowForm = Short.parseShort(dataMap.get(6));
                //选择的和导入的业务类型节点不一致
                if(!selectBtm.equals(name)){
                    throw new VciBaseException("请选择要导入的类型节点名称!");
                }
                plpagelayoutdefinationList.add(p);
                //区域定义sheet处理
                List<SheetRowData> tabPageRowData = pltabpagesheet.getRowData();
                if(Func.isNotEmpty(tabPageRowData)){
                    for(int j=0; j<tabPageRowData.size(); j++){
                        plpagedefinationlist = new ArrayList<PLPageDefination>();
                        PLTabPage pt = new PLTabPage();
                        Map<Integer, String> tabPageDataMap = tabPageRowData.get(j).getData();
                        if(Func.isEmpty(tabPageDataMap)){
                            break;
                        }
                        pt.plOId = ObjectUtility.getNewObjectID36();
                        pt.plCode = tabPageDataMap.get(2);
                        pt.plName = tabPageDataMap.get(4);
                        //add by caill start
                        if(count==1) {
                            PLTabPage[] PLTabPages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(preOID);
                            //遍历控制区表格
                            for(PLTabPage pl : PLTabPages){
                                if(pl.plCode.equals(pt.plCode)){
                                    pt.plOId=pl.plOId; //如果控制区表格的编码和导入的编码一样,就把控制区id赋值给新导入的id
                                    preCount=1;
                                    doublePreOID=pl.plOId;
                                }
                            }
                        }
                        //add by caill end
                        pt.plSeq = Short.parseShort(tabPageDataMap.get(1));
                        pt.plLabel = tabPageDataMap.get(3);
                        pt.plContextOId = tabPageDataMap.get(5);
                        pt.plAreaType = Short.parseShort(tabPageDataMap.get(6));
                        pt.plIsOpen = Short.parseShort(tabPageDataMap.get(7));
                        pt.plOpenExpression = tabPageDataMap.get(8);
                        pt.plUIParser = tabPageDataMap.get(9);
                        pt.plExtAttr = tabPageDataMap.get(10);
                        pt.plDesc = tabPageDataMap.get(11);
                        pt.plLicensOrs = tabPageDataMap.get(12);
                        plPageContextOId = tabPageDataMap.get(5);
                        if(pt.plContextOId.equals(plpageLayoutDefinationId)){
                            pt.plContextOId = p.plOId;
                            pltabpagelist.add(pt);
                            //页面设计处理
                            List<SheetRowData> pagedefinationRowData = plpagedefinationsheet.getRowData();
                            if(Func.isNotEmpty(pagedefinationRowData)){
                                for(int k=0;k<pagedefinationRowData.size();k++){
                                    pltabbuttonlist = new ArrayList<>();
                                    PLPageDefination plpagedefination  = new PLPageDefination();
                                    Map<Integer, String> pagedefinationDataMap = pagedefinationRowData.get(k).getData();
                                    if(Func.isEmpty(pagedefinationDataMap)){
                                        break;
                                    }
                                    plpagedefination.plOId = ObjectUtility.getNewObjectID36();
                                    plpagedefination.name = pagedefinationDataMap.get(3);
                                    //add by caill start
                                    //最后一级的判断
                                    if(preCount==1) {
                                        PLPageDefination[] PLPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(doublePreOID);
                                        for(PLPageDefination plp : PLPageDefinations) {
                                            if(plp.name.equals(plpagedefination.name)) {
                                                plpagedefination.plOId=plp.plOId;
                                            }
                                        }
                                    }
                                    //add by caill end
                                    plpagedefination.plDefination = pagedefinationDataMap.get(6);
                                    plpagedefination.seq = Short.parseShort(pagedefinationDataMap.get(5));
                                    plpagedefination.plTabPageOId = pagedefinationDataMap.get(1);
                                    plpagedefination.desc = pagedefinationDataMap.get(4);
                                    plpagedefination.plType = Short.parseShort(pagedefinationDataMap.get(2));
                                    plTableOId = pagedefinationDataMap.get(1);
                                    if(plpagedefination.plTabPageOId.equals(plPageContextOId)){
                                        plpagedefination.plTabPageOId = pt.plOId;
                                        plpagedefinationlist.add(plpagedefination);
                                        //保存新旧oid的关系,在确定层级关系时使用
                                        relation = new HashMap<String,String>();
                                        List<SheetRowData> tabbuttonRowData = pltabbuttonsheet.getRowData();
                                        if(Func.isNotEmpty(tabbuttonRowData)){
                                            for(int a=0;a<tabbuttonRowData.size();a++){
                                                Map<Integer, String> tabbuttonDataMap = tabbuttonRowData.get(a).getData();
                                                if(Func.isNotEmpty(tabbuttonDataMap)){
                                                    plCommandOId = tabbuttonDataMap.get(1);
                                                    String newOId = ObjectUtility.getNewObjectID36();
                                                    relation.put(plCommandOId, newOId);
                                                }
                                            }
                                            for(int a=0;a<tabbuttonRowData.size();a++){
                                                plcommandparameterlist = new ArrayList<PLCommandParameter>();
                                                PLTabButton plTabButton = new PLTabButton();
                                                Map<Integer, String> tabbuttonDataMap = tabbuttonRowData.get(a).getData();
                                                if(Func.isEmpty(tabbuttonDataMap)){
                                                    break;
                                                }
                                                plTabButton.plOId = ObjectUtility.getNewObjectID36();
                                                plTabButton.plLabel = tabbuttonDataMap.get(4);
                                                plTabButton.plAreaType = tabbuttonDataMap.get(5);
                                                plTabButton.plTableOId = tabbuttonDataMap.get(1);
                                                plTabButton.plSeq = Short.parseShort(tabbuttonDataMap.get(7));
                                                String plActionId = "";
                                                //PLAction[] allPLAction = Tool.getService().getAllPLAction();
                                                for(PLAction action : allPLAction){
                                                    if((tabbuttonDataMap.get(3)!=null&&!"".equals(tabbuttonDataMap.get(3))
                                                    )&&(tabbuttonDataMap.get(3).trim().equals(action.plCode.trim()))
                                                    ){
                                                        plActionId = action.plOId;
                                                        break;
                                                    }
                                                }
                                                if(plActionId==null||"".equals(plActionId)){
                                                    if(!plActionIDNulls.toString().contains(tabbuttonDataMap.get(3))){
                                                        plActionIDNulls.append("\n\tAction编号:"+tabbuttonDataMap.get(3));
                                                    }
                                                }
                                                plTabButton.plActionOId = plActionId;
                                                plTabButton.plAreaType = tabbuttonDataMap.get(5);
                                                plTabButton.plDesc = tabbuttonDataMap.get(6);
                                                String parentOid = tabbuttonDataMap.get(8);//父oid
                                                plCommandOId = tabbuttonDataMap.get(1);
                                                plTabButton.displayMode = tabbuttonDataMap.get(9);
                                                plTabButton.iconPath = tabbuttonDataMap.get(10);
                                                plTabButton.authorization = tabbuttonDataMap.get(11);
                                                plTabButton.show = tabbuttonDataMap.get(12);
                                                //赋予保存好的值,来保证层级关系不会丢失
                                                plTabButton.plOId = relation.get(plCommandOId);
                                                if(parentOid != null && parentOid.length() > 0) {
                                                    plTabButton.plParentOid =
                                                            relation.get(parentOid) == null ? "" : relation.get(parentOid);
                                                }
                                                if(plTabButton.plTableOId.equals(plTableOId)){
                                                    plTabButton.plTableOId = plpagedefination.plOId;
                                                    pltabbuttonlist.add(plTabButton);
                                                    List<SheetRowData> commondparamsRowData = plcommondparamsheet.getRowData();
                                                    if(Func.isNotEmpty(commondparamsRowData)){
                                                        for(int b=0;b<commondparamsRowData.size();b++){
                                                            PLCommandParameter plCommandParameter = new PLCommandParameter();
                                                            Map<Integer, String> commandParameterDataMap = commondparamsRowData.get(b).getData();
                                                            if(Func.isEmpty(commandParameterDataMap)){
                                                                break;
                                                            }
                                                            plCommandParameter.plOId = ObjectUtility.getNewObjectID36();
                                                            plCommandParameter.plCommandOId = commandParameterDataMap.get(1);
                                                            plCommandParameter.plKey = commandParameterDataMap.get(2);
                                                            plCommandParameter.plValue = commandParameterDataMap.get(3);
                                                            if(plCommandParameter.plCommandOId.equals(plCommandOId)){
                                                                plCommandParameter.plCommandOId = plTabButton.plOId;
                                                                plcommandparameterlist.add(plCommandParameter);
                                                            }
                                                        }
                                                        bcMap.put(plTabButton, plcommandparameterlist);
                                                    }
                                                }
                                            }
                                            dbMap.put(plpagedefination, pltabbuttonlist);
                                        }
                                    }
                                }
                                tdMap.put(pt, plpagedefinationlist);
                            }
                        }
                    }
                    pdMap.put(p, pltabpagelist);
                }
            }
            if(plActionIDNulls.length()>0){
                throw new VciBaseException(plActionIDNulls.toString()+"不存在!");
            }
            //删除原有button数据
            if(tdMap.size() > 0) {
                for(List<PLPageDefination> list : tdMap.values()) {
                    for(PLPageDefination ppd : list) {
                        if(ppd.plOId != null && ppd.plOId.length() > 0) {
                            PLTabButton[] buttons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(ppd.plOId);
                            if(buttons != null && buttons.length > 0) {
                                for(PLTabButton ptb : buttons) {
                                    platformClientUtil.getUIService().deletePLTabButtonByID(ptb.plOId);
                                }
                            }
                        }
                    }
                }
            }
            for(PLUILayout plPageLayoutDefination : plpagelayoutdefinationList){
                List<PLTabPage> pltabpagelists = pdMap.get(plPageLayoutDefination);
                for(PLTabPage pltabpage:pltabpagelists){
                    List<PLPageDefination> plpagedefinationlists = tdMap.get(pltabpage);
                    for(PLPageDefination plpagedefination : plpagedefinationlists){
                        List<PLTabButton> pltabbuttons = dbMap.get(plpagedefination);
                        for(PLTabButton pltabbutton : pltabbuttons){
                            List<PLCommandParameter> plcommandParams = bcMap.get(pltabbutton);
                            for(PLCommandParameter plcommandparameter : plcommandParams){
                                plcommandparameter.plCreateUser = sessionInfo.getUserId();
                                plcommandparameter.plModifyUser = sessionInfo.getUserId();
                                platformClientUtil.getUIService().savePLCommandParameter(plcommandparameter);
                            }
                            pltabbutton.plCreateUser = sessionInfo.getUserId();
                            pltabbutton.plModifyUser = sessionInfo.getUserId();
                            platformClientUtil.getUIService().savePLTabButton(pltabbutton);
                        }
                        platformClientUtil.getUIService().savePLPageDefination(plpagedefination);
                    }
                    pltabpage.plCreateUser = sessionInfo.getUserId();
                    pltabpage.plModifyUser = sessionInfo.getUserId();
                    platformClientUtil.getUIService().savePLTabPage(pltabpage);
                }
                plPageLayoutDefination.plCreateUser = sessionInfo.getUserId();
                plPageLayoutDefination.plModifyUser = sessionInfo.getUserId();
                platformClientUtil.getUIService().savePLUILayout(plPageLayoutDefination);
            }
            return BaseResult.success("UI上下文导入成功!");
        } catch (PLException e) {
            e.printStackTrace();
            return BaseResult.success("UI上下文导入失败,原因:"+VciBaseUtil.getExceptionMessage(e));
        }
    }
    /**
@@ -436,6 +950,13 @@
                PLDefinationVO plDefinationVO = new PLDefinationVO();
                PLDefination plDefination = UITools.getPLDefination(item.plDefination);
                BeanUtil.copy(plDefination,plDefinationVO);
                plDefinationVO.setDescription(item.desc);
                plDefinationVO.setSeq(String.valueOf(item.seq));
                plDefinationVO.setTabPageOId(item.plTabPageOId);
                plDefinationVO.setId(item.plOId);
                plDefinationVO.setName(item.name);
                plDefinationVO.setType(item.plType);
                plDefinationVO.setTemplateType(String.valueOf(plDefination.getTemplateType()));
                plDefinationVOList.add(plDefinationVO);
            } catch (Throwable e) {
                e.printStackTrace();
@@ -460,14 +981,14 @@
        pd.plTabPageOId = pdVO.getTabPageOId();
        pd.plOId = ObjectUtility.getNewObjectID36();
        //不能为空属性检查
        if(!this.baseInfoIsOk(pd,false)){
        /*if(!this.baseInfoIsOk(pd,false)){
            return false;
        }
        }*/
        pd.name = pdVO.getName().trim();
        pd.seq = Short.valueOf(pdVO.getSeq().trim());
        pd.desc = pdVO.getDescription();
        pd.plType = Short.parseShort(pdVO.getTemplateType());
        pd.plType = (short) pdVO.getType();
        d.setName(pdVO.getName().trim());
        d.setUiParser(pdVO.getUiParser().trim());
@@ -478,15 +999,15 @@
        newPLDefinationIsOk(pdVO, false);
        // æ£€æŸ¥å„个类型下的数据是否输入或有效,一共6种类型按类型检验
        short plType = pd.plType;
        switch (plType){
        String templateType = pdVO.getTemplateType();
        switch (templateType){
            //Table(表格)
            case 1:
            case "1":
            //From(表单)
            case 4:
            case "4":
                TableComptCheckInput tci = new TableComptCheckInput(
                    pdVO.getSearchTarger()
                    ,pdVO.getBtmType()
                    ,pdVO.getShowType()
                    ,pdVO.getLinkType()
                    ,pdVO.getTemplateId()
                    ,pdVO.getQueryTemplateName()
@@ -497,7 +1018,7 @@
                d = tci.getNewPLDefination(d);
                break;
            //Custom(自定义模板)
            case 2:
            case "2":
                //只检查控制路径不能为空,有问题会直接报错
                CustomComptCheckInput ccci = new CustomComptCheckInput(pdVO.getControlPath());
                if(!ccci.checkInputIsOk()){
@@ -506,10 +1027,10 @@
                d = ccci.getNewPLDefination(d);
                break;
            //TreeTable(树表)
            case 3:
            case "3":
                TreeTableComptCheckInput ttcci = new TreeTableComptCheckInput(
                    pdVO.getSearchTarger()
                    ,pdVO.getBtmType()
                    ,pdVO.getShowType()
                    ,pdVO.getLinkType()
                    ,pdVO.getTemplateId()
                    ,pdVO.getQueryTemplateName()
@@ -522,9 +1043,9 @@
                d = ttcci.getNewPLDefination(d);
                break;
            //Tree(树)
            case 5:
            case "5":
                TreeComptCheckInput tcci = new TreeComptCheckInput(
                    pdVO.getBtmType(),
                    pdVO.getShowType(),
                    pdVO.getLinkType(),
                    pdVO.getQueryTemplateName(),
                    pdVO.getShowExpressionRoot(),
@@ -539,10 +1060,10 @@
                d = tcci.getNewPLDefination(d);
                break;
            //UILayout(UI定义)
            case 6:
            case "6":
                UILayoutComptCheckInput ulci = new UILayoutComptCheckInput(
                    pdVO.getSearchTarger(),
                    pdVO.getBtmType(),
                    pdVO.getShowType(),
                    pdVO.getUiLayout(),
                    pdVO.getQueryTemplateName(),
                    pdVO.getQryType()
@@ -576,14 +1097,17 @@
        BeanUtil.copy(pdVO,d);
        //不能为空属性检查
        if(!this.baseInfoIsOk(pd,true)){
        /*if(!this.baseInfoIsOk(pd,true)){
            return false;
        }
        }*/
        pd.plOId = pdVO.getId();
        pd.plTabPageOId = pdVO.getTabPageOId();
        pd.name = pdVO.getName().trim();
        pd.seq = Short.valueOf(pdVO.getSeq().trim());
        pd.desc = pdVO.getDescription();
        pd.plType = Short.parseShort(pdVO.getTemplateType());
        pd.plType = (short) pdVO.getType();
        d.setId(pdVO.getId());
        d.setName(pdVO.getName().trim());
        d.setUiParser(pdVO.getUiParser().trim());
        d.setExtAttr(pdVO.getExtAttr().trim());
@@ -592,15 +1116,15 @@
        this.newPLDefinationIsOk(pdVO, true);
        // æ£€æŸ¥å„个组件内部的数据是否有效
        int plType = pdVO.getType();
        switch (plType){
        String templateType = pdVO.getTemplateType();
        switch (templateType){
            //Table(表格)
            case 1:
            case "1":
                //From(表单)
            case 4:
            case "4":
                TableComptCheckInput tci = new TableComptCheckInput(
                        pdVO.getSearchTarger()
                        ,pdVO.getBtmType()
                        ,pdVO.getShowType()
                        ,pdVO.getLinkType()
                        ,pdVO.getTemplateId()
                        ,pdVO.getQueryTemplateName()
@@ -611,7 +1135,7 @@
                d = tci.getNewPLDefination(d);
                break;
            //Custom(自定义模板)
            case 2:
            case "2":
                //只检查控制路径不能为空,有问题会直接报错
                CustomComptCheckInput ccci = new CustomComptCheckInput(pdVO.getControlPath());
                if(!ccci.checkInputIsOk()){
@@ -620,10 +1144,10 @@
                d = ccci.getNewPLDefination(d);
                break;
            //TreeTable(树表)
            case 3:
            case "3":
                TreeTableComptCheckInput ttcci = new TreeTableComptCheckInput(
                        pdVO.getSearchTarger()
                        ,pdVO.getBtmType()
                        ,pdVO.getShowType()
                        ,pdVO.getLinkType()
                        ,pdVO.getTemplateId()
                        ,pdVO.getQueryTemplateName()
@@ -636,9 +1160,9 @@
                d = ttcci.getNewPLDefination(d);
                break;
            //Tree(树)
            case 5:
            case "5":
                TreeComptCheckInput tcci = new TreeComptCheckInput(
                        pdVO.getBtmType(),
                        pdVO.getShowType(),
                        pdVO.getLinkType(),
                        pdVO.getQueryTemplateName(),
                        pdVO.getShowExpressionRoot(),
@@ -653,10 +1177,10 @@
                d = tcci.getNewPLDefination(d);
                break;
            //UILayout(UI定义)
            case 6:
            case "6":
                UILayoutComptCheckInput ulci = new UILayoutComptCheckInput(
                        pdVO.getSearchTarger(),
                        pdVO.getBtmType(),
                        pdVO.getShowType(),
                        pdVO.getUiLayout(),
                        pdVO.getQueryTemplateName(),
                        pdVO.getQryType()
@@ -682,7 +1206,7 @@
    @Override
    public boolean delPageDefination(String[] oids) throws PLException {
        VciBaseUtil.alertNotNull(oids,"删除的页面定义主键");
        boolean res = platformClientUtil.getUIService().deletePLUILayoutByOidsForCascade(oids);
        boolean res = platformClientUtil.getUIService().deletePLPageDefinationByOidsForCascade(oids);
        return res;
    }
@@ -734,7 +1258,6 @@
                logger.error(errorLog);
                throw new VciBaseException(errorLog);
            }
        });
        return plTabButtonVOList;
    }
@@ -770,7 +1293,13 @@
        //参数信息回填
        PLCommandParameter[] parameters = platformClientUtil.getUIService().getPLCommandParametersByCommandOId(tabButtonDO.plOId);
        if(Func.isNotEmpty(parameters)){
            LinkedHashMap<String, String> parameterMap = (LinkedHashMap<String, String>)Arrays.stream(parameters).collect(Collectors.toMap(parm -> parm.plKey, parm -> parm.plValue));
            LinkedHashMap<String, String> parameterMap = Arrays.stream(parameters)
                .collect(Collectors.toMap(
                        parm -> parm.plKey,
                        parm -> parm.plValue,
                        (existing, replacement) -> existing, // å¤„理重复键的情况
                        LinkedHashMap::new // æŒ‡å®šä½¿ç”¨ LinkedHashMap
                ));
            plTabButtonVO.setButtonParams(parameterMap);
        }
        return plTabButtonVO;
@@ -900,7 +1429,7 @@
        }
        LinkedHashMap<String, String> buttonParams = tabButtonVO.getButtonParams();
        if(!buttonParams.isEmpty()) {
        if(Func.isNotEmpty(buttonParams)) {
            Iterator<Map.Entry<String, String>> iterator = buttonParams.entrySet().iterator();
            while(iterator.hasNext()){
                Map.Entry<String, String> next = iterator.next();
@@ -908,23 +1437,21 @@
                    iterator.remove();
                }
            }
            if(!buttonParams.isEmpty()){
                Iterator<Map.Entry<String, String>> kvItor = buttonParams.entrySet().iterator();
                while(kvItor.hasNext()){
                    Map.Entry<String, String> next = kvItor.next();
                    PLCommandParameter plCommandParameter = new PLCommandParameter();
                    plCommandParameter.plOId = ObjectUtility.getNewObjectID36();
                    plCommandParameter.plCommandOId = plTabButton.plOId;
                    plCommandParameter.plKey = next.getKey();
                    plCommandParameter.plValue = next.getValue();
                    plCommandParameter.plCreateUser = sessionInfo.getUserId();
                    plCommandParameter.plModifyUser = sessionInfo.getUserId();
                    try {
                        platformClientUtil.getUIService().savePLCommandParameter(plCommandParameter);
                    } catch (PLException e) {
                        e.printStackTrace();
                        throw new VciBaseException("保存按钮信息时发生异常:"+ e.getMessage());
                    }
            Iterator<Map.Entry<String, String>> kvItor = buttonParams.entrySet().iterator();
            while(kvItor.hasNext()){
                Map.Entry<String, String> next = kvItor.next();
                PLCommandParameter plCommandParameter = new PLCommandParameter();
                plCommandParameter.plOId = ObjectUtility.getNewObjectID36();
                plCommandParameter.plCommandOId = plTabButton.plOId;
                plCommandParameter.plKey = next.getKey();
                plCommandParameter.plValue = next.getValue();
                plCommandParameter.plCreateUser = sessionInfo.getUserId();
                plCommandParameter.plModifyUser = sessionInfo.getUserId();
                try {
                    platformClientUtil.getUIService().savePLCommandParameter(plCommandParameter);
                } catch (PLException e) {
                    e.printStackTrace();
                    throw new VciBaseException("保存按钮信息时发生异常:"+ e.getMessage());
                }
            }
        }
@@ -933,36 +1460,36 @@
    /**
     * åˆ é™¤å•个按钮配置
     * @param tabButton
     * @param tabButtonVO
     * @return
     */
    @Override
    public boolean deleteTapButton(PLTabButton tabButton) throws PLException {
            VciBaseUtil.alertNotNull(tabButton,"删除的按钮配置对象");
            boolean success = UITools.getService().deletePLTabButton(tabButton);
            if(success == false){
                throw new VciBaseException("该有子级按钮,不能删除!");
            }
            return true;
    public boolean deleteTapButton(PLTabButtonVO tabButtonVO) throws PLException {
        VciBaseUtil.alertNotNull(tabButtonVO,"删除的按钮配置对象");
        boolean success = platformClientUtil.getUIService().deletePLTabButton(this.tabButtonVO2TabButton(new PLTabButton(),tabButtonVO));
        if(success == false){
            throw new VciBaseException("该有子级按钮,不能删除!");
        }
        return true;
    }
    /**
     * è°ƒæ•´ä¸ºä¸‹çº§æŒ‰é’®
     * @param plTabButton
     * @param tabButtonVO
     * @return
     */
    @Override
    public BaseResult joinBtn(PLTabButton plTabButton) throws PLException {
        VciBaseUtil.alertNotNull(plTabButton,"需调整为下级按钮",plTabButton.plTableOId,"当前按钮配置所在的页面主键");
    public BaseResult joinBtn(PLTabButtonVO tabButtonVO) throws PLException {
        VciBaseUtil.alertNotNull(tabButtonVO,"需调整为下级按钮",tabButtonVO.getTableOId(),"当前按钮配置所在的页面主键");
        //同一页面下的按钮
        List<PLTabButtonVO> plTabButtons = this.getTabButtons(plTabButton.plTableOId);
        List<PLTabButtonVO> plTabButtons = this.getTabButtons(tabButtonVO.getTableOId());
        if(Func.isEmpty(plTabButtons)){
            return BaseResult.fail("未获取到按钮配置信息!");
        }
        //获取当前要移动的按钮的下标
        int index = 0;
        for (int i = 0; i < plTabButtons.size(); i++) {
            if (plTabButtons.get(i).getOId().equals(plTabButton.plOId)) {
            if (plTabButtons.get(i).getOId().equals(tabButtonVO.getOId())) {
                index = i; // æ‰¾åˆ°åŽè®°å½•下标
                break; // æ‰¾åˆ°åŽé€€å‡ºå¾ªçޝ
            }
@@ -972,8 +1499,8 @@
            return BaseResult.fail("当前节点不存在兄节点,无法调整为下级按钮!");
        }
        //设置父id为上一个节点的
        plTabButton.plParentOid = plTabButtons.get(index-1).getOId();
        tabButtonVO.setParentOid(plTabButtons.get(index-1).getOId());
        PLTabButton plTabButton = this.tabButtonVO2TabButton(new PLTabButton(), tabButtonVO);
        boolean success = platformClientUtil.getUIService().updatePLTabButton(plTabButton);
        if(success == false) {
            return BaseResult.fail("修改失败!");
@@ -983,13 +1510,13 @@
    /**
     * è°ƒæ•´ä¸ºä¸Šçº§æŒ‰é’®
     * @param plTabButton
     * @param tabButtonVO
     * @return
     */
    @Override
    public BaseResult exitBtn(PLTabButton plTabButton) throws PLException {
        plTabButton.plParentOid = "";
    public BaseResult exitBtn(PLTabButtonVO tabButtonVO) throws PLException {
        tabButtonVO.setParentOid("");
        PLTabButton plTabButton = this.tabButtonVO2TabButton(new PLTabButton(), tabButtonVO);
        boolean success = platformClientUtil.getUIService().updatePLTabButton(plTabButton);
        if(success == false) {
            BaseResult.fail("撤销失败!");
@@ -1047,7 +1574,6 @@
     * @throws PLException
     */
    private void newPLDefinationIsOk(PLDefinationVO pd, boolean isEdit) throws PLException{
        boolean res = false;
        boolean nameExist = false;
        boolean seqExist = false;
        PLPageDefination[] pds = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(pd.getTabPageOId());
@@ -1162,7 +1688,7 @@
          String userName= WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
            RoleRightInfo[] rightInfos= platformClientUtil.getFrameworkService().getRoleRightList(roleId,userName);
            List<RoleRightVO>  roleRightVOList=roleRightDOO2VOS(Arrays.asList(rightInfos));
            roleRightVOMap=roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVO));
            roleRightVOMap=roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVO,(oldValue,newOldValue)->oldValue));
        }
        BizType[] bizTypes=osBtmServiceI.getBizTypes(type);
        List<Tree> treeList=new ArrayList<>();
@@ -1180,12 +1706,10 @@
            bizTypeTree.setShowCheckbox(true);
            bizTypeTree.setParentBtmName(bizTypes[i].name);
            childList.add(bizTypeTree);
            if(roleRightVOMap.containsKey(bizTypes[i].oid)){
                List<PLUILayout>contextList=getUIContextDataByBtName(bizTypes[i].name,context);
                List<Tree> btmChildList=new ArrayList<>();
                btmChildList.add(bizTypeTree);
                setChildNode(btmChildList,contextList,roleRightVOMap,showCheckBox);
            }
            List<PLUILayout>contextList=getUIContextDataByBtName(bizTypes[i].name,context);
            List<Tree> btmChildList=new ArrayList<>();
            btmChildList.add(bizTypeTree);
            setChildNode(btmChildList,contextList,roleRightVOMap,showCheckBox);
        }
        rootNode.setChildren(childList);
        treeList.add(rootNode);
@@ -1213,48 +1737,96 @@
        treeQueryObject.setConditionMap(conditionMap);
        List<Tree> treeList=this.getUIAuthor(treeQueryObject);
        HashMap<String,Tree> allTreeMap=new HashMap<>();
        Map<String,RoleRightVO> roleRightVOMap=new HashMap<>();
        Map<String,RoleRightDTO> roleRightVOMap=new HashMap<>();
        if(!CollectionUtil.isEmpty(treeList)){
            if(StringUtils.isNotBlank(uiAuthorDTO.getRoleId())){
                String userName= WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
                RoleRightInfo[] rightInfos= platformClientUtil.getFrameworkService().getRoleRightList(uiAuthorDTO.getRoleId(),userName);
                List<RoleRightVO>  roleRightVOList=roleRightDOO2VOS(Arrays.asList(rightInfos));
                roleRightVOMap=roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVO));
                roleRightVOMap=roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVOO2DTO(roleRightVO),(oldValue,newValue)->oldValue));
            }
            convertTreeDOO2Map(treeList,allTreeMap);
            List<RoleRightDTO> roleRightDTOList=new ArrayList<>();
            List<Tree>  selectTreeList= uiAuthorDTO.getSelectTreeList();
            getSelectedRoleRightObjs(uiAuthorDTO.getRoleId(),selectTreeList,allTreeMap,roleRightDTOList);
            getSelectedRoleRightObjs(uiAuthorDTO.getRoleId(),selectTreeList,allTreeMap,roleRightVOMap,roleRightDTOList);
            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
            String currentUserName = sessionInfo.getUserId();
            boolean isDeveloper= rightControlUtil.isDeveloper(currentUserName);
            List<RoleRightInfo>  roleRightInfoList= roleRightDTOO2InfoS(roleRightDTOList);
            UserEntityInfo info=new UserEntityInfo();
            info.modules="UI授权";
            info.userName=currentUserName;
            try {
             res= platformClientUtil.getFrameworkService().saveRoleRight(roleRightInfoList.toArray(new RoleRightInfo[]{}),uiAuthorDTO.getRoleId(),currentUserName,info);
            }catch (PLException e){
                throw  new Exception("保存失败:"+e.getMessage());
            }
        }
        return res;
    }
    /**
     *
     *根据权限计算上下权限
     * @param roleOid
     * @param selectTreeList
     * @param allTreeMap
     * @param roleRightDTOList
     */
    private void getSelectedRoleRightObjs(String roleOid,List<Tree>  selectTreeList,HashMap<String,Tree> allTreeMap,  List<RoleRightDTO> roleRightDTOList){
    private void getSelectedRoleRightObjs(String roleOid,List<Tree>  selectTreeList,HashMap<String,Tree> allTreeMap,Map<String,RoleRightDTO> allRoleRightDTOMap,  List<RoleRightDTO> roleRightDTOList){
        Date date=new Date();
        Map<String,RoleRightDTO> roleRightDTOMap=new HashMap<>();
        selectTreeList.stream().forEach(tree -> {
            RoleRightDTO roleRightDTO=new RoleRightDTO();
            String id=ObjectUtility.getNewObjectID36();
            Object data=  tree.getData();
            if(data instanceof String){
                getRightValue(roleOid,tree,allTreeMap,false,roleRightDTOMap);//向下获取所有模块的权限值
            }else if (!(data instanceof PLTabButton)) {//业务类型
                getRightValue(roleOid,tree,allTreeMap,true,roleRightDTOMap);//向上处理
                getRightValue(roleOid,tree,allTreeMap,false,roleRightDTOMap);//向下处理(包含当前节点)
            }else if (data instanceof PLTabButton) {//按钮
        if(!CollectionUtil.isEmpty(selectTreeList)){
            selectTreeList.stream().forEach(tree -> {
                String oid=tree.getOid();
                if(allTreeMap.containsKey(oid)){
                    tree=   allTreeMap.get(oid);
                   Object data= tree.getData();
                    if (data instanceof String) {
                        getRightValue(roleOid, tree, allTreeMap, false, roleRightDTOMap);//向下获取所有模块的权限值
                    } else if (!(data instanceof PLTabButton)) {//业务类型
                        getRightValue(roleOid, tree, allTreeMap, true, roleRightDTOMap);//向上处理
                        getRightValue(roleOid, tree, allTreeMap, false, roleRightDTOMap);//向下处理(包含当前节点)
                    } else if (data instanceof PLTabButton) {//按钮
                        String parrentId=tree.getParentId();
                        if(allTreeMap.containsKey(parrentId)){
                            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
                            String currentUserName = sessionInfo.getUserId();
                            boolean isDeveloper= rightControlUtil.isDeveloper(currentUserName);
                            Tree parentNode= allTreeMap.get(parrentId);
                            String funcId = parentNode.getOid();
                            getRightValue(roleOid,tree, allTreeMap, true, roleRightDTOMap);//向上处理该操作父级的上级模块权限(不包含父节点)
                            if(!roleRightDTOMap.containsKey(funcId)){
                                RoleRightDTO roleRightDTO = new RoleRightDTO();
                                roleRightDTO.setId(ObjectUtility.getNewObjectID36());//主键
                                roleRightDTO.setFuncId(funcId);
                                if(isDeveloper) {
                                    roleRightDTO.setRightType((short) 1);//权限类型 æƒé™ç±»åž‹ï¼Œè¶…级管理员给管理员授权为1,管理员给普通用户授权为2
                                }else{
                                    roleRightDTO.setRightType((short) 2);
                                }
                                roleRightDTO.setRightValue(1);// æƒé™å€¼ï¼Œæ²¡æœ‰æ“ä½œçš„æ¨¡å—权限值存储为0
                                roleRightDTO.setRoleId(roleOid);//角色ID
                                roleRightDTO.setCreateUser(currentUserName);//创建者
                                roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));//创建时间
                                roleRightDTO.setModifyUser(currentUserName);//修改者
                                roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));//修改时间
                                roleRightDTO.setLicensor("");
                                if(!roleRightDTOMap.containsKey(funcId)){
                                    roleRightDTOMap.put(funcId, roleRightDTO);
                                }
                                roleRightDTOMap.put(funcId, roleRightDTO);
                            }
                        }
            }
        });
                    }
                }
            });
          /*  allRoleRightDTOMap.putAll(roleRightDTOMap.entrySet().stream()
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::  getValue)));*/
         List<RoleRightDTO>    newRoleRightDTOList=Optional.ofNullable(roleRightDTOMap).orElseGet(()->new HashMap<String,RoleRightDTO>()).values().stream().collect(Collectors.toList());
            roleRightDTOList.addAll(newRoleRightDTOList);
        }
    }
    /**
@@ -1265,28 +1837,28 @@
        SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
        String currentUserName = sessionInfo.getUserId();
        boolean isDeveloper= rightControlUtil.isDeveloper(currentUserName);
        String parentOid=node.getParentId();
        if(allTreeMap.containsKey(parentOid)){
            String id=ObjectUtility.getNewObjectID36();
            Tree parentNode =allTreeMap.get(parentOid);
            Object parentData=  parentNode.getData();
            if(isUp) {//向上获取,存储每个上级模块的权限值
                while (!"root".equals(parentNode.getData())){
        String id=ObjectUtility.getNewObjectID36();
        Object data=node.getData();
        if(isUp) {//向上获取,存储每个上级模块的权限值
            while (!"root".equals(node.getData())){
                data=node.getData();
               String oid=node.getOid();
                if(allTreeMap.containsKey(oid)){
                    String funcId = "";
                    if (parentData instanceof BizType) {
                        BizType bizType = (BizType) parentData;
                    if (data instanceof BizType) {
                        BizType bizType = (BizType) data;
                        funcId = bizType.name;
                    } else if (parentData instanceof PLUILayout) {
                        PLUILayout context = (PLUILayout)parentData;
                    } else if (data instanceof PLUILayout) {
                        PLUILayout context = (PLUILayout)data;
                        funcId = context.plOId;
                    } else if (parentData instanceof PLTabPage) {
                        PLTabPage tab = (PLTabPage) parentData;
                    } else if (data instanceof PLTabPage) {
                        PLTabPage tab = (PLTabPage) data;
                        funcId = tab.plOId;
                    } else if (parentData instanceof PLPageDefination){
                        PLPageDefination pageDef = (PLPageDefination) parentData;
                    } else if (data instanceof PLPageDefination){
                        PLPageDefination pageDef = (PLPageDefination) data;
                        funcId = pageDef.plOId;
                    } else if (parentData instanceof PLTabButton) {
                        PLTabButton but = (PLTabButton)parentData;
                    } else if (data instanceof PLTabButton) {
                        PLTabButton but = (PLTabButton)data;
                        funcId = but.plOId;
                    }
                    RoleRightDTO roleRightDTO = new RoleRightDTO();
@@ -1300,74 +1872,77 @@
                    roleRightDTO.setRightValue(1);// æƒé™å€¼ï¼Œæ²¡æœ‰æ“ä½œçš„æ¨¡å—权限值存储为0
                    roleRightDTO.setRoleId(roleId);//角色ID
                    roleRightDTO.setCreateUser(currentUserName);//创建者
                    roleRightDTO.setCreateTime(new Date());//创建时间
                    roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));//创建时间
                    roleRightDTO.setModifyUser(currentUserName);//修改者
                    roleRightDTO.setModifyTime(new Date());//修改时间
                    roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));//修改时间
                    roleRightDTO.setLicensor("");
                    if(!rightMap.containsKey(funcId)){
                        rightMap.put(funcId, roleRightDTO);
                    }
                }
            }else{
                String funcId = "";
                if(parentData instanceof String){
                    funcId = (String)parentData;
                } else if (parentData instanceof BizType) {
                    BizType bizType = (BizType)parentData;
                    funcId = bizType.name;
                } else if (parentData instanceof PLUILayout) {
                    PLUILayout context = (PLUILayout)parentData;
                    funcId = context.plOId;
                } else if (parentData instanceof PLTabPage) {
                    PLTabPage tab = (PLTabPage) parentData;
                    funcId = tab.plOId;
                } else if (parentData instanceof PLPageDefination){
                    PLPageDefination pageDef = (PLPageDefination) parentData;
                    funcId = pageDef.plOId;
                } else if (parentData instanceof PLTabButton) {
                    PLTabButton but = (PLTabButton)parentData;
                    funcId = but.plOId;
                }
                if(!(parentData instanceof PLPageDefination)) {//子节点不是操作
                    if(!rightMap.containsKey(funcId)&&!funcId.equals("root")){
                        RoleRightDTO roleRightDTO = new RoleRightDTO();
                        roleRightDTO.setFuncId(funcId);
                        if(isDeveloper) {
                            roleRightDTO.setRightType((short) 1);//权限类型 æƒé™ç±»åž‹ï¼Œè¶…级管理员给管理员授权为1,管理员给普通用户授权为2
                        }else{
                            roleRightDTO.setRightType((short) 2);
                        }
                        roleRightDTO.setRightValue(0);//没有操作的模块权限值存储为0
                        roleRightDTO.setRoleId(roleId);
                        roleRightDTO.setCreateUser(currentUserName);
                        roleRightDTO.setCreateTime(new Date());
                        roleRightDTO.setModifyUser(currentUserName);
                        roleRightDTO.setModifyTime(new Date());
                        roleRightDTO.setLicensor("");
                        rightMap.put(funcId, roleRightDTO);
                    }
                    for(int i = 0;i < parentNode.getChildren().size();i++){
                        //对每个子向下递归遍历
                        getRightValue(roleId,parentNode.getChildren().get(i),allTreeMap,false,rightMap);
                    }
                }else {
                    if(!rightMap.containsKey(funcId)){
                        RoleRightDTO roleRightDTO = new RoleRightDTO();
                        roleRightDTO.setFuncId(funcId);
                        roleRightDTO.setRightType((short)2); // è®¾ç½®UI权限
                        roleRightDTO.setRightValue(countRightValue(parentNode,true));//没有操作的模块权限值存储为0
                        roleRightDTO.setRoleId(roleId);
                        roleRightDTO.setCreateUser(currentUserName);
                        roleRightDTO.setCreateTime(new Date());
                        roleRightDTO.setModifyUser(currentUserName);
                        roleRightDTO.setModifyTime(new Date());
                        roleRightDTO.setLicensor("");
                        rightMap.put(funcId, roleRightDTO);
                    oid= node.getParentId();
                    if(allTreeMap.containsKey(oid)) {
                        node=allTreeMap.get(oid);
                    }
                }
            }
        }else {
            String funcId = "";
            if (data instanceof String) {
                funcId = (String) data;
            } else if (data instanceof BizType) {
                BizType bizType = (BizType) data;
                funcId = bizType.name;
            } else if (data instanceof PLUILayout) {
                PLUILayout context = (PLUILayout) data;
                funcId = context.plOId;
            } else if (data instanceof PLTabPage) {
                PLTabPage tab = (PLTabPage) data;
                funcId = tab.plOId;
            } else if (data instanceof PLPageDefination) {
                PLPageDefination pageDef = (PLPageDefination) data;
                funcId = pageDef.plOId;
            } else if (data instanceof PLTabButton) {
                PLTabButton but = (PLTabButton) data;
                funcId = but.plOId;
            }
            if (!(data instanceof PLPageDefination)) {//子节点不是操作
                if (!rightMap.containsKey(funcId) && !funcId.equals("root")) {
                    RoleRightDTO roleRightDTO = new RoleRightDTO();
                    roleRightDTO.setFuncId(funcId);
                    if (isDeveloper) {
                        roleRightDTO.setRightType((short) 1);//权限类型 æƒé™ç±»åž‹ï¼Œè¶…级管理员给管理员授权为1,管理员给普通用户授权为2
                    } else {
                        roleRightDTO.setRightType((short) 2);
                    }
                    roleRightDTO.setRightValue(0);//没有操作的模块权限值存储为0
                    roleRightDTO.setRoleId(roleId);
                    roleRightDTO.setCreateUser(currentUserName);
                    roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));
                    roleRightDTO.setModifyUser(currentUserName);
                    roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));
                    roleRightDTO.setLicensor("");
                    rightMap.put(funcId, roleRightDTO);
                }
                for (int i = 0; i < node.getChildren().size(); i++) {
                    //对每个子向下递归遍历
                    getRightValue(roleId, node.getChildren().get(i), allTreeMap, false, rightMap);
                }
            } else {
                if (!rightMap.containsKey(funcId)) {
                    RoleRightDTO roleRightDTO = new RoleRightDTO();
                    roleRightDTO.setFuncId(funcId);
                    roleRightDTO.setRightType((short) 2); // è®¾ç½®UI权限
                    roleRightDTO.setRightValue(countRightValue(node, true));//没有操作的模块权限值存储为0
                    roleRightDTO.setRoleId(roleId);
                    roleRightDTO.setCreateUser(currentUserName);
                    roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));
                    roleRightDTO.setModifyUser(currentUserName);
                    roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));
                    roleRightDTO.setLicensor("");
                    rightMap.put(funcId, roleRightDTO);
                }
            }
        }
    }
@@ -1404,6 +1979,13 @@
        });
    }
    /***
     * éåŽ†å­èŠ‚ç‚¹
     * @param parentTree
     * @param contextList
     * @param roleRightVOMap
     * @param isShowCheckBox
     */
    private void setChildNode(List<Tree> parentTree, List<PLUILayout>contextList,Map<String,RoleRightVO> roleRightVOMap,boolean isShowCheckBox){
        Optional.ofNullable(parentTree).orElseGet(()->new ArrayList<Tree>()).stream().forEach(pTree -> {
            Object funcObj=  pTree.getData();
@@ -1523,6 +2105,22 @@
    /**
     * UI角色对象转换
     * @param vos
     * @return
     */
    private List<RoleRightDTO> roleRightVOO2DTOS(List<RoleRightVO> vos){
        List<RoleRightDTO> roleRightVOS=new ArrayList<>();
        Optional.ofNullable(vos).orElseGet(()->new ArrayList<>()).stream().forEach(vo -> {
            RoleRightDTO dto=roleRightVOO2DTO(vo);
            roleRightVOS.add(dto);
        });
        return roleRightVOS;
    }
    /**
     * UI角色对象转换
     * @param infos
     * @return
     */
@@ -1534,6 +2132,26 @@
        });
        return roleRightVOS;
    }
    /**
     * UI角色对象转换
     * @param dtos
     * @return
     */
    private List<RoleRightInfo> roleRightDTOO2InfoS(List<RoleRightDTO> dtos){
        List<RoleRightInfo> roleRightInfoList=new ArrayList<>();
        Optional.ofNullable(dtos).orElseGet(()->new ArrayList<>()).stream().forEach(dto -> {
            RoleRightInfo info= null;
            try {
                info = roleRightDTOO2Info(dto);
            } catch (Exception e) {
                e.printStackTrace();
            }
            roleRightInfoList.add(info);
        });
        return roleRightInfoList;
    }
    /**
@@ -1554,6 +2172,46 @@
        vo.setModifyTime(VciDateUtil.date2Str(VciDateUtil.long2Date(info.modifyTime),""));
        vo.setModifyUser(info.modifyUser);
        return vo;
    }
    /**
     * UI角色对象转换
     * @param vo
     * @return
     */
    private RoleRightDTO  roleRightVOO2DTO(RoleRightVO vo){
        RoleRightDTO dto=new RoleRightDTO();
        dto.setId(vo.getId());
        dto.setCreateTime(vo.getCreateTime());
        dto.setCreateUser(vo.getCreateUser());
        dto.setRoleId(vo.getRoleId());
        dto.setRightType(vo.getRightType());
        dto.setLicensor(vo.getLicensor());
        dto.setRightValue(vo.getRightValue());
        dto.setFuncId(vo.getFuncId());
        dto.setModifyTime(vo.getModifyTime());
        dto.setModifyUser(vo.getModifyUser());
        return dto;
    }
    /**
     * UI角色对象转换
     * @param dto
     * @return
     */
    private RoleRightInfo  roleRightDTOO2Info(RoleRightDTO dto) throws Exception {
        RoleRightInfo info=new RoleRightInfo();
        info.id=StringUtils.isBlank(dto.getId())?"":dto.getId();
        info.createTime=StringUtils.isBlank(dto.getCreateTime())?new Date().getTime():VciDateUtil.getTime(VciDateUtil.str2Date(dto.getCreateTime(),""));
        info.createUser=StringUtils.isBlank(dto.getCreateUser())?"":dto.getCreateUser();
        info.roleId=StringUtils.isBlank(dto.getRoleId())?"":dto.getRoleId();
        info.rightType=dto.getRightType();
        info.licensor =StringUtils.isBlank(dto.getLicensor())?"":dto.getLicensor();
        info.rightValue=dto.getRightValue();
        info.funcId=StringUtils.isBlank(dto.getFuncId())?"":dto.getFuncId();
        info.modifyTime=StringUtils.isBlank(dto.getModifyTime())? new Date().getTime() :VciDateUtil.getTime(VciDateUtil.str2Date(dto.getModifyTime(),""));
        info.modifyUser=StringUtils.isBlank(dto.getModifyUser())?"":dto.getModifyUser();
        return info;
    }
    /**
@@ -1694,13 +2352,14 @@
        /**
         * éžç©ºæ£€æŸ¥
         * @param tip
         * @param txt
         * @param tip æç¤ºä¿¡æ¯
         * @param txt æ ¡éªŒçš„内容
         * @param isRequired æ˜¯å¦å¿…å¡«
         * @return
         */
        protected boolean checkRequiredIsOk(String tip, String txt){
        protected boolean checkRequiredIsOk(String tip, String txt,boolean isRequired/*是否必填*/){
            boolean res = false;
            if(Func.isBlank(txt)){
            if(Func.isBlank(txt) && isRequired){
                throw new VciBaseException(tip + " ä¸èƒ½ä¸ºç©ºï¼");
            } else {
                res = true;
@@ -1714,11 +2373,11 @@
         * @param btmName ä¸šåŠ¡ç±»åž‹å
         * @return
         */
        protected boolean checkBtmTypeTxtIsOk(String tipName, String btmName) throws PLException {
        protected boolean checkBtmTypeTxtIsOk(String tipName, String btmName,boolean isRequired) throws PLException {
            boolean res = false;
            if(tipName == null) return true;
            if(btmName == null) return true;
            if(!checkRequiredIsOk(tipName, btmName)){
            if(!checkRequiredIsOk(tipName, btmName, isRequired)){
                res = false;
            } else if(!checkBtmNameIsExist(tipName, btmName)){
                res = false;
@@ -1770,11 +2429,11 @@
         * @param btmLinkType
         * @return
         */
        protected boolean checkPortalVITxtIsOk(String tip, String txtVIName, String btmLinkType) throws PLException {
        protected boolean checkPortalVITxtIsOk(String tip, String txtVIName, String btmLinkType, boolean isRequired) throws PLException {
            boolean res = false;
            if(tip == null) return true;
            if(txtVIName == null) return true;
            if(!checkRequiredIsOk(tip, txtVIName)){
            if(!checkRequiredIsOk(tip, txtVIName,isRequired)){
                res = false;
            } else if(!checkPortalVIIsExist(tip, txtVIName, btmLinkType)){
                res = false;
@@ -1813,13 +2472,13 @@
         * @param btmLinkType
         * @return
         */
        protected boolean checkQTNameTxtIsOk(String tip, String txtQTName, String btmLinkType) throws PLException {
        protected boolean checkQTNameTxtIsOk(String tip, String txtQTName, String btmLinkType, boolean isRequired) throws PLException {
            boolean res = false;
            if(tip == null) return true;
            if(txtQTName == null) return true;
            if(!checkRequiredIsOk(tip, txtQTName)){
            if(!checkRequiredIsOk(tip, txtQTName, isRequired)){
                res = false;
            } else if(Func.isBlank(txtQTName) && !checkQTIsExist(tip, txtQTName, btmLinkType)){
            } else if(Func.isNotBlank(txtQTName) && !checkQTIsExist(tip, txtQTName, btmLinkType)){
                res = false;
            } else {
                res = true;
@@ -1834,11 +2493,11 @@
         * @param btmLinkType
         * @return
         */
        protected boolean checkUILayoutTxtIsOk(String tip, String uiName, String btmLinkType) throws PLException {
        protected boolean checkUILayoutTxtIsOk(String tip, String uiName, String btmLinkType, boolean isRequired) throws PLException {
            boolean res = false;
            if(tip == null) return true;
            if(uiName == null) return true;
            if(!checkRequiredIsOk(tip, uiName)){
            if(!checkRequiredIsOk(tip, uiName,isRequired)){
                res = false;
            } else if(!checkUILayoutIsExist(tip, uiName, btmLinkType)){
                res = false;
@@ -1892,11 +2551,11 @@
         * @param linkTypeName
         * @return
         */
        protected boolean checkLinkTypeTxtIsOk(String tip, String linkTypeName) throws PLException {
        protected boolean checkLinkTypeTxtIsOk(String tip, String linkTypeName, boolean isRequired) throws PLException {
            boolean res = false;
            if(tip == null) return true;
            if(linkTypeName == null) return true;
            if(!checkRequiredIsOk(tip, linkTypeName)){
            if(!checkRequiredIsOk(tip, linkTypeName,isRequired)){
                res = false;
            } else if(!checkLinkTypeIsExist(tip, linkTypeName)){
                res = false;
@@ -2040,11 +2699,11 @@
         */
        private boolean checkBtmTypeInputIsOk(String btmType,String txtVIName/*选择模板*/,String txtQTName/*查询模板*/) throws PLException {
            boolean res = false;
            if(!super.checkBtmTypeTxtIsOk("业务类型", btmType)){
            if(!super.checkBtmTypeTxtIsOk("业务类型", btmType,true)){
                res = false;
            } else if(!super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType)){
            } else if(!super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType,true)){
                res = false;
            } else if(!super.checkQTNameTxtIsOk("查询模板", txtQTName, btmType)){
            } else if(!super.checkQTNameTxtIsOk("查询模板", txtQTName, btmType,false)){
                res = false;
            } else {
                res = true;
@@ -2061,11 +2720,11 @@
         */
        private boolean checkLinkTypeInputIsOk(String txtVIName/*选择的模板*/,String txtQTName/*查询模板*/,String btmType) throws PLException {
            boolean res = false;
            if(!(this.checkBtmTypeTxtIsOk("目标对象", linkType))){
            if(!(this.checkBtmTypeTxtIsOk("目标对象", linkType,true))){
                res = false;
            } else if(!(this.checkPortalVITxtIsOk("选择模板", txtVIName, linkType))){
            } else if(!(this.checkPortalVITxtIsOk("选择模板", txtVIName, linkType,true))){
                res = false;
            } else if(!(this.checkQTNameTxtIsOk("查询模板", txtQTName, linkType))){
            } else if(!(this.checkQTNameTxtIsOk("查询模板", txtQTName, linkType,false))){
                res = false;
            } else {
                res = true;
@@ -2145,11 +2804,11 @@
        private boolean checkBtmTypeInputIsOk() throws PLException {
            boolean res = false;
            if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", btmType))){
            if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", btmType,true))){
                res = false;
            } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType))){
            } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType,true))){
                res = false;
            } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName , btmType))){
            } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName , btmType,false))){
                res = false;
            } else {
                res = true;
@@ -2159,11 +2818,11 @@
        private boolean checkLinkTypeInputIsOk() throws PLException {
            boolean res = false;
            if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", linkType))){
            if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", linkType,true))){
                res = false;
            } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, linkType))){
            } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, linkType,true))){
                res = false;
            } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName, linkType))){
            } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName, linkType,false))){
                res = false;
            } else {
                res = true;
@@ -2241,34 +2900,34 @@
        private boolean checkBtmTypeInputIsOk() throws PLException {
            boolean res = false;
            if(!(super.checkBtmTypeTxtIsOk("业务类型", btmType))){
            if(!(super.checkBtmTypeTxtIsOk("业务类型", btmType,true))){
                res = false;
                return res;
            }
            // é“¾æŽ¥ç±»åž‹ä¸ä¸ºç©ºæ—¶ï¼Œéœ€è¦åŒæ—¶æ£€æŸ¥é“¾æŽ¥ç±»åž‹åŠé“¾æŽ¥ç±»åž‹ä¸‹çš„æŸ¥è¯¢æ¨¡æ¿æ˜¯å¦æœ‰æ•ˆ
            if(Func.isBlank(linkType)){
                if(!(super.checkLinkTypeTxtIsOk("链接类型", linkType))){
                if(!(super.checkLinkTypeTxtIsOk("链接类型", linkType,false))){
                    res = false;
                    return res;
                } else if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, linkType))){
                } else if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, linkType,true))){
                    res = false;
                    return res;
                }
            } else {
                // é“¾æŽ¥ç±»åž‹ä¸ºç©ºæ—¶ï¼Œåªéœ€è¦æ£€æŸ¥ä¸šåŠ¡ç±»åž‹ä¸‹çš„æŸ¥è¯¢æ¨¡æ¿æ˜¯å¦æœ‰æ•ˆ
                if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, btmType))){
                if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, btmType,true))){
                    res = false;
                    return res;
                }
            }
            if(!super.checkRequiredIsOk("根节点显示表达式", showExpressionRoot)){
            if(!super.checkRequiredIsOk("根节点显示表达式", showExpressionRoot,true)){
                res = false;
            }
            else if(!super.checkRequiredIsOk("树节点显示表达式", showExpression)){
            else if(!super.checkRequiredIsOk("树节点显示表达式", showExpression,true)){
                res = false;
            }
            else if(!super.checkRequiredIsOk("参照树设置", refTreeSet)){
            else if(!super.checkRequiredIsOk("参照树设置", refTreeSet,true)){
                res = false;
            }
            else {
@@ -2336,11 +2995,11 @@
        private boolean checkUILayoutInputIsOk() throws PLException {
            boolean res = false;
            if (!(super.checkBtmTypeTxtIsOk("对象类型", uiBtmType))) {
            if (!(super.checkBtmTypeTxtIsOk("对象类型", uiBtmType,true))) {
                res = false;
            } else if (!(super.checkUILayoutTxtIsOk("UI定义", uiLayout, uiBtmType))) {
            } else if (!(super.checkUILayoutTxtIsOk("UI定义", uiLayout, uiBtmType,true))) {
                res = false;
            } else if (!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, qryType))) {
            } else if (!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, qryType,false))) {
                res = false;
            } else {
                res = true;