wangting
2024-08-27 ef5018d575a22697e468ed949fab746e68912d75
Merge remote-tracking branch 'origin/master'
已修改11个文件
已删除4个文件
已重命名2个文件
已添加10个文件
3367 ■■■■ 文件已修改
Bin/jre-linux/lib/security/trusted.libraries 补丁 | 查看 | 原始文档 | blame | 历史
Bin/properties/menuConfig.json 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ClonePortalVIDTO.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ClonePortalVIDTOList.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/DeletePortalVIDTOList.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMItemDTO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/AppConfigDetailInfoVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/ExpExcelConditionVO.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java 812 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsPortalVIServiceI.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java 332 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-parent/plt-web/src/main/resources/menuConfig.json 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/api/systemModel/mangeModel/api.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/businessModel/index.vue 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/mangeModel/index.vue 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/operateType/index.vue 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/systemConfig/index.vue 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModel/systemMonitor/index.vue 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModule/businessModel/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModule/mangeModel/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/systemModule/operateType/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Bin/jre-linux/lib/security/trusted.libraries
Bin/properties/menuConfig.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
{
  "hasChildren": true,
  "children": [
    {
      "hasChildren": true,
      "children": [],
      "id": "systemManagmentNode",
      "name": "管理功能模块",
      "parentId": "VCIBaseTreeNode",
      "code": "systemManagmentNode",
      "alias": "system",
      "meta": {
        "keepAlive": false
      },
      "sort": 2,
      "soruce": "",
      "path": "views/systemModel/mangeModel/index"
    },
    {
      "hasChildren": true,
      "children": [],
      "id": "modelManagmentNode",
      "name": "业务功能模块",
      "parentId": "VCIBaseTreeNode",
      "code": "modelManagmentNode",
      "alias": "model",
      "meta": {
        "keepAlive": false
      },
      "sort": 3,
      "soruce": "",
      "path": "views/systemModel/businessModel/index"
    },
    {
      "hasChildren": true,
      "children": [],
      "id": "operateNode",
      "name": "操作类型管理",
      "parentId": "VCIBaseTreeNode",
      "code": "operateNode",
      "alias": "operate",
      "meta": {
        "keepAlive": false
      },
      "sort": 4,
      "soruce": "",
      "path": "views/systemModel/operateType/index"
    },
    {
      "hasChildren": false,
      "children": [],
      "id": "sysOptionNode",
      "name": "系统配置",
      "parentId": "VCIBaseTreeNode",
      "code": "sysOptionNode",
      "alias": "sysOption",
      "meta": {
        "keepAlive": false
      },
      "sort": 5,
      "soruce": "",
      "path": "views/systemModel/systemConfig/index"
    },
    {
      "hasChildren": false,
      "children": [],
      "id": "sysMonitorNode",
      "name": "系统运行监控",
      "parentId": "VCIBaseTreeNode",
      "code": "sysMonitorNode",
      "alias": "sysMonitor",
      "meta": {
        "keepAlive": false
      },
      "sort": 5,
      "soruce": "",
      "path": "views/systemModel/systemMonitor/index"
    }
  ],
  "id": "VCIBaseTreeNode",
  "name": "系统模块配置",
  "parentId": "systemManagmentNode",
  "code": "rootNode",
  "alias": "root",
  "meta": {
    "keepAlive": false
  },
  "sort": 0,
  "soruce": "",
  "path": ""
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ClonePortalVIDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.vci.dto;
public class ClonePortalVIDTO implements java.io.Serializable{
    private static final long serialVersionUID = -721829341919731723L;
    /**
     * å…‹éš†çš„表单对象
     */
    private PortalVIDTO oldPortalVIDTO;
    /**
     *新表单/表格名称
     */
    private String viName;
    /***
     *业务类型
     */
    private  String typeName;
    /**
     * 0: ä¸šåŠ¡ç±»åž‹; 1: é“¾æŽ¥ç±»åž‹. é»˜è®¤0
     */
    private short typeFlag;
    public PortalVIDTO getOldPortalVIDTO() {
        return oldPortalVIDTO;
    }
    public void setOldPortalVIDTO(PortalVIDTO oldPortalVIDTO) {
        this.oldPortalVIDTO = oldPortalVIDTO;
    }
    public String getViName() {
        return viName;
    }
    public void setViName(String viName) {
        this.viName = viName;
    }
    public String getTypeName() {
        return typeName;
    }
    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
    public short getTypeFlag() {
        return typeFlag;
    }
    public void setTypeFlag(short typeFlag) {
        this.typeFlag = typeFlag;
    }
    @Override
    public String toString() {
        return "ClonePortalVIDTO{" +
                "oldPortalVIDTO=" + oldPortalVIDTO +
                ", viName='" + viName + '\'' +
                ", typeName='" + typeName + '\'' +
                '}';
    }
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ClonePortalVIDTOList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.vci.dto;
import java.util.List;
public class ClonePortalVIDTOList implements  java.io.Serializable{
  private List<ClonePortalVIDTO> clonePortalVIDTOList;
    public List<ClonePortalVIDTO> getClonePortalVIDTOList() {
        return clonePortalVIDTOList;
    }
    public void setClonePortalVIDTOList(List<ClonePortalVIDTO> clonePortalVIDTOList) {
        this.clonePortalVIDTOList = clonePortalVIDTOList;
    }
    @Override
    public String toString() {
        return "ClonePortalVIDTOList{" +
                "clonePortalVIDTOList=" + clonePortalVIDTOList +
                '}';
    }
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/DeletePortalVIDTOList.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.vci.dto;
import java.util.List;
public class DeletePortalVIDTOList implements java.io.Serializable{
    private static final long serialVersionUID = 3618617014834926325L;
    private List<PortalVIDTO> portalVIDTOList;
    public List<PortalVIDTO> getPortalVIDTOList() {
        return portalVIDTOList;
    }
    public void setPortalVIDTOList(List<PortalVIDTO> portalVIDTOList) {
        this.portalVIDTOList = portalVIDTOList;
    }
    @Override
    public String toString() {
        return "DeletePortalVIDTOList{" +
                "portalVIDTOList=" + portalVIDTOList +
                '}';
    }
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMItemDTO.java
@@ -51,9 +51,7 @@
    /**
     * å¾…选择的属性字段
     */
    private List<String[]> itemSelectoutFields=new ArrayList<>();
    private List<String> itemSelectoutFieldList=new ArrayList<>();
    /**
     * éœ€è¦ä½¿ç”¨çš„集合
     */
@@ -614,12 +612,12 @@
        this.itemSeniorQueryBOS = itemSeniorQueryBOS;
    }
    public List<String[]> getItemSelectoutFields() {
        return itemSelectoutFields;
    public List<String> getItemSelectoutFieldList() {
        return itemSelectoutFieldList;
    }
    public void setItemSelectoutFields(List<String[]> itemSelectoutFields) {
        this.itemSelectoutFields = itemSelectoutFields;
    public void setItemSelectoutFieldList(List<String> itemSelectoutFieldList) {
        this.itemSelectoutFieldList = itemSelectoutFieldList;
    }
    public List<String> getItemSearchFieldList() {
@@ -712,7 +710,7 @@
                ", itemPageSize='" + itemPageSize + '\'' +
                ", itemImgWH='" + itemImgWH + '\'' +
                ", itemOutFields='" + itemOutFields + '\'' +
                ", itemSelectoutFields=" + itemSelectoutFields +
                ", itemSelectoutFieldList=" + itemSelectoutFieldList +
                ", itemOutFieldList=" + itemOutFieldList +
                ", itemKeyFields='" + itemKeyFields + '\'' +
                ", itemSearchFieldList=" + itemSearchFieldList +
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/AppConfigDetailInfoVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.vci.pagemodel;
import com.vci.corba.framework.data.AppConfigDetailInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * ç³»ç»Ÿé…ç½®å¯¹è±¡
 * @author ludc
 * @date 2024/8/24 13:54
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AppConfigDetailInfoVO {
    /**
     * éœ€è¦çš„参数对象
     */
    private AppConfigDetailInfo appConfigDetailInfo;
    /**
     * æ˜¯å¦ä¸ºæ“ä½œé…ç½®é¡¹åˆ†é…
     */
    private boolean isConfCategorys;
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/ExpExcelConditionVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.vci.pagemodel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
 * å¯¼å‡ºexcel时的接口条件对象
 * @author ludc
 * @date 2024/8/24 11:38
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExpExcelConditionVO {
    /**
     * å¯¼å‡ºèµ·å§‹é¡µ
     */
    private Integer startPage;
    /**
     * å¯¼å‡ºç»“束页
     */
    private Integer endPage;
    /**
     * å¯¼å‡ºç±»åž‹ï¼šå…¨éƒ¨å¯¼å‡ºï¼šall,选择导出:select,按页码导出:page
     */
    private String expType;
    /**
     * å¯¼å‡ºçš„属性列表(配合isSelectExp使用)
     */
    private List<String> expAttrNames;
    /**
     * æŒ‰é€‰æ‹©å¯¼å‡ºæ—¶ï¼Œé€‰æ‹©çš„æ•°æ®çš„唯一标识:能通过该表示查询到具体数据的
     */
    private List<String> selectDataIdentify;
    /**
     * å¯¼å‡ºçš„æ–‡ä»¶åï¼šå¦‚果要传的话,叫前端自己传文件后缀
     */
    private String expFileName;
    /**
     * å…¶ä»–导出条件
     */
    private Map<String,Object> conditionMap;
}
Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java
@@ -135,10 +135,36 @@
    private Boolean isValid;
    /**
     * åˆå¹¶äº†functionOperate对象中的属性的模块的id
     */
    private String funcId;
    /**
     * æ¨¡å—下关联的操作类型id
     */
    private String operId;
    /**
     * å‰ç«¯æ˜¯å¦éšè—
     */
    private HashMap<String,Boolean> meta = new HashMap<>();
    public void setFuncId(String funcId) {
        this.funcId = funcId;
    }
    public void setOperId(String operId) {
        this.operId = operId;
    }
    public String getFuncId() {
        return funcId;
    }
    public String getOperId() {
        return operId;
    }
    public void setPathC(String pathC) {
        this.pathC = pathC;
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java
@@ -2,6 +2,11 @@
import com.vci.common.exception.VciException;
import com.vci.corba.common.PLException;
import com.vci.corba.framework.data.AppConfigCategoryInfo;
import com.vci.corba.framework.data.AppConfigDetailInfo;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.pagemodel.ExpExcelConditionVO;
import com.vci.pagemodel.MenuVO;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.pagemodel.BaseResult;
@@ -41,10 +46,37 @@
    boolean delModule(MenuVO menuVO);
    /**
     * åˆ é™¤æ¨¡å—下关联的操作类型
     * @param funcOperationInfo
     * @return
     */
    boolean delFuncOperation(FuncOperationInfo funcOperationInfo);
    /**
     * å¢žåŠ æ“ä½œç±»åž‹
     * @return
     */
    boolean addOperationType(List<MenuVO> menuVOList);
    boolean addFuncOperationType(List<FuncOperationInfo> funcOperationInfoList);
    /**
     * å¢žåŠ æ“ä½œç±»åž‹
     * @return
     */
    OperateInfo addOperationType(OperateInfo operateInfo);
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    OperateInfo updateOperationType(OperateInfo operateInfo) throws VciBaseException;
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    boolean delOperationType(OperateInfo operateInfo);
    /**
     * åˆ é™¤éžç³»ç»Ÿæ¨¡å—
@@ -91,33 +123,39 @@
    //系统配置相关接口
    /**
     * æŸ¥è¯¢ç³»ç»Ÿé…ç½®åˆ†ç±»
     * æŸ¥è¯¢ç³»ç»Ÿé…ç½®æ ‘
     */
    List<Object>getSysConfTree();
    List<AppConfigCategoryInfo>getAppConfigCategoryInfo();
    /**
     * å¢žåŠ ç³»ç»Ÿé…ç½®
     * æ ¹æ®åˆ†ç±»ID返回全部的 AppConfigDetail å¯¹è±¡
     * @return
     */
    boolean addSysConf();
    List<AppConfigDetailInfo> getAppConfigDetailsByID(String clsId);
    /**
     * ä¿®æ”¹ç³»ç»Ÿé…ç½®
     * å¢žåŠ é…ç½®é¡¹åˆ†ç±»æˆ–é…ç½®é¡¹
     * @return
     */
    boolean updateSysConf();
    boolean addAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/);
    /**
     * åˆ é™¤ç³»ç»Ÿé…ç½®
     * ä¿®æ”¹é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    boolean delSysConf();
    boolean updateAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/);
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®
     * åˆ é™¤é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    boolean delAppConf(String[] ids,boolean isConfCategorys/*是否为操作配置项分配*/);
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®(配置项分类或配置项)
     * @param response
     * @return
     */
    String exportSysConf(HttpServletResponse response);
    String exportSysConf(ExpExcelConditionVO expExcelConditionVO, HttpServletResponse response) throws IOException;
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java
@@ -34,6 +34,7 @@
import com.vci.web.util.RightControlUtil;
import com.vci.web.util.WebUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.el.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -319,22 +320,25 @@
                    if(childType == 2){
                        try{
                            FuncOperationInfo[] infos = platformClientUtil.getFrameworkService().getFuncOperationByModule(parentId, "", false);
                            for(int i = 0;i < infos.length ;i++){
                                FuncOperationInfo info = infos[i];
                                MenuVO menuVO = new MenuVO();
                                menuVO.setChildType(childType);
                                menuVO.setId(info.id);
                                menuVO.setCode(info.funcId);
                                menuVO.setId(info.operId);
                                menuVO.setName(info.operName);
                                //menuVO.setOperIndentify(info.operIndentify);
                                menuVO.setAlias(info.operAlias);
                                menuVO.setRemark(info.operDesc);
                                menuVO.setSort((int) info.number);
                                menuVO.setModeType("FunctionObject");
                                menuVO.setIsValid(info.isValid);
                                menuVO.setHasChildren(false);
                                menuVOList.add(menuVO);
                            if(Func.isNotEmpty(infos.length)){
                                childType = this.checkChildObject(infos[0].id); //都是同一层所以取第一个即可查询是什么类型
                                for(int i = 0;i < infos.length ;i++){
                                    FuncOperationInfo info = infos[i];
                                    MenuVO menuVO = new MenuVO();
                                    menuVO.setChildType(childType);
                                    menuVO.setId(info.id);
                                    menuVO.setFuncId(info.funcId);
                                    menuVO.setCode(info.operIndentify);
                                    menuVO.setOperId(info.operId);
                                    menuVO.setName(info.operName);
                                    menuVO.setAlias(info.operAlias);
                                    menuVO.setRemark(info.operDesc);
                                    menuVO.setSort((int) info.number);
                                    menuVO.setModeType("FunctionObject");
                                    menuVO.setIsValid(info.isValid);
                                    menuVO.setHasChildren(false);
                                    menuVOList.add(menuVO);
                                }
                            }
                        }catch (PLException e) {
                            e.printStackTrace();
@@ -343,12 +347,15 @@
                    }else if(childType == 1){
                        try{
                            FunctionInfo[] funcInfos = platformClientUtil.getFrameworkService().getModuleListByParentId(parentId, isAll);
                            for(int i = 0;i < funcInfos.length; i++){
                                FunctionInfo funcInfo = funcInfos[i];
                                MenuVO menuVO = this.functionInfoToMenuVO(funcInfo);
                                menuVO.setChildType(childType);
                                menuVO.setModeType("FunctionObject");
                                menuVOList.add(menuVO);
                            if(Func.isNotEmpty(funcInfos.length)){
                                childType = this.checkChildObject(funcInfos[0].id); //都是同一层所以取第一个即可查询是什么类型
                                for(int i = 0;i < funcInfos.length; i++){
                                    FunctionInfo funcInfo = funcInfos[i];
                                    MenuVO menuVO = this.functionInfoToMenuVO(funcInfo);
                                    menuVO.setChildType(childType);
                                    menuVO.setModeType("FunctionObject");
                                    menuVOList.add(menuVO);
                                }
                            }
                        }catch (PLException e) {
                            e.printStackTrace();
@@ -361,14 +368,18 @@
                }
            }else{
                try{
                    MenuVO parentNode;
                    MenuVO parentNode = null;
                    //将返回的节点外层套上当前父节点
                    if(parentId.equals("systemManagmentNode")){
                    if("systemManagmentNode".equals(parentId)){
                        parentNode = JsonConfigReader.getSysModuleConf().getSystemManagmentNode();
                    }else{
                    }else if("modelManagmentNode".equals(parentId)){
                        parentNode = JsonConfigReader.getSysModuleConf().getModelManagmentNode();
                    }
                    List<MenuVO> menuVOS = new ArrayList<>();
                    //如果查询的是第一层节点就需要直接返回systemManagmentNode或modelManagmentNode节点
                    if(Func.isNotBlank(modeType) && modeType.equals("firstNode")){
                        menuVOList.add(parentNode);
                        return menuVOList;
                    }
                    //查询的三级节点
                    FunctionInfo[] funcInfos = platformClientUtil.getFrameworkService().getModuleListByParentId(parentId, isAll);
                    for(int i = 0;i < funcInfos.length; i++){
@@ -376,10 +387,9 @@
                        MenuVO menuVO = this.functionInfoToMenuVO(funcInfo);
                        menuVO.setModeType("FunctionObject");
                        menuVO.setChildType(childType);
                        menuVOS.add(menuVO);
                        menuVOList.add(menuVO);
                    }
                    parentNode.setChildren(menuVOS);
                    menuVOList.add(parentNode);
                    return menuVOList;
                }catch (PLException e) {
                    e.printStackTrace();
                    throw new VciBaseException(String.valueOf(e.code),e.messages);
@@ -455,8 +465,8 @@
    @Override
    public int checkChildObject(String moduleId) throws VciBaseException {
        long res = 0;
        try{
            res = ClientSession.getFrameworkService().checkChildObject(moduleId);
        try{//20D63A69-C6BC-8519-8B2B-E5ACFEA62394
            res = platformClientUtil.getFrameworkService().checkChildObject(moduleId);
        }catch (PLException e) {
            e.printStackTrace();
            throw new VciBaseException(String.valueOf(e.code),e.messages);
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java
@@ -1,17 +1,14 @@
package com.vci.frameworkcore.compatibility.impl;
import com.vci.client.common.excel.ExcelDocumentUtils;
import com.vci.common.exception.VciException;
import com.vci.common.locale.LocaleDisplay;
import com.vci.common.utility.ObjectUtility;
import com.vci.corba.common.PLException;
import com.vci.corba.common.data.UserEntityInfo;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.FunctionInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.corba.framework.data.*;
import com.vci.frameworkcore.compatibility.SmHMSysModConfigServiceI;
import com.vci.pagemodel.MenuVO;
import com.vci.client.common.excel.SheetDataSet;
import com.vci.pagemodel.*;
import com.vci.starter.poi.bo.SheetDataSet;
import com.vci.starter.poi.bo.SheetRowData;
import com.vci.starter.poi.bo.WriteExcelData;
import com.vci.starter.poi.bo.WriteExcelOption;
import com.vci.starter.poi.util.ExcelUtil;
@@ -31,6 +28,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
/**
 * é¦–页系统模块配置添加按钮、添加操作类型等接口服务
@@ -166,34 +164,33 @@
    }
    /**
     * åˆ é™¤æ¨¡å—下关联的操作类型
     * @param funcOperationInfo
     * @return
     */
    @Override
    public boolean delFuncOperation(FuncOperationInfo funcOperationInfo) {
        VciBaseUtil.alertNotNull(funcOperationInfo,"删除的操作类型列表");
        return foDelegate.deleteFuncOperation(funcOperationInfo);
    }
    /**
     * å¢žåŠ æ“ä½œç±»åž‹
     * @return
     */
    @Override
    public boolean addOperationType(List<MenuVO> menuVOList) {
        VciBaseUtil.alertNotNull(menuVOList,"添加操作类型的列表");
    public boolean addFuncOperationType(List<FuncOperationInfo> funcOperationInfoList) {
        VciBaseUtil.alertNotNull(funcOperationInfoList,"添加的操作类型列表");//将操作类型组装成需要存储的对象
        List<FuncOperationInfo> objs = new ArrayList<>();
        //将操作类型组装成需要存储的对象
        menuVOList.stream().forEach(menuVO -> {
            FuncOperationInfo info = new FuncOperationInfo();
            //info.id = menuVO.getId() == null ? "" : menuVO.getId();
            info.funcId = menuVO.getParentId() == null ? "" : menuVO.getParentId();
            info.operId = menuVO.getId() == null ? "" : menuVO.getId();
            info.operName = menuVO.getName() == null ? "" : menuVO.getName();
            //info.operIndentify = menuVO.getOperIndentify() == null ? "" : menuVO.getOperIndentify();
            info.operAlias = menuVO.getAlias() == null ? "" : menuVO.getAlias();
            info.operDesc = menuVO.getRemark() == null ? "" : menuVO.getRemark();
        funcOperationInfoList.stream().forEach(info -> {
            if(Func.isBlank(info.funcId)){
                throw new VciBaseException("父id不能为空!");
            }
            if(Func.isBlank(info.operId)){
                throw new VciBaseException("未获取操作名称!");
            }
            info.number = -1;
            info.isValid = true;
            /*VCIBaseTreeNode node = (VCIBaseTreeNode)treePaths[i].getLastPathComponent();
            OperateObject operateObject = (OperateObject) node.getObj();
            obj.setFuncId(funcObj.getId());
            obj.setOperId(operateObject.getId());
            obj.setOperName(operateObject.getName());
            obj.setOperIndentify(operateObject.getIdentify());
            obj.setOperAlias(operateObject.getAlias());
            obj.setNumber(-1);
            obj.setIsValid(true);*/
            objs.add(info);
        });
@@ -209,6 +206,120 @@
            throw new VciBaseException(exceptionMessage);
        }
        return res;
    }
    /**
     * å¢žåŠ æ“ä½œç±»åž‹
     * @return
     */
    @Override
    public OperateInfo addOperationType(OperateInfo operateInfo) throws VciBaseException {
        try {
            //校验
            this.checkItem(operateInfo);
            String s = foDelegate.saveOperate(operateInfo);
            /**返回1表示名称有重复,返回2表示标识有重复,返回3表示顺序有重复**/
            if (s.equals("1")) {
                throw new VciBaseException("名称存在重复!");
            } else if (s.equals("2")) {
                throw new VciBaseException("标识存在重复!");
            } else if (s.equals("3")) {
                throw new VciBaseException("顺序存在重复!");
            }
            operateInfo.id = s;
            return operateInfo;
        }catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @Override
    public OperateInfo updateOperationType(OperateInfo operateInfo) throws VciBaseException {
        try {
            this.checkItem(operateInfo);
            String res = foDelegate.updateOperate(operateInfo);
            /**返回1表示名称有重复,返回2表示标识有重复,返回3表示顺序有重复**/
            if (res.equals("1")) {
                throw new VciBaseException("名称存在重复!");
            } else if (res.equals("2")) {
                throw new VciBaseException("标识存在重复!");
            } else if (res.equals("3")) {
                throw new VciBaseException("顺序存在重复!");
            }
            return operateInfo;
        } catch (Exception e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @Override
    public boolean delOperationType(OperateInfo operateInfo) throws VciBaseException {
        try {
            /**检查当前操作是否被引用,0表示无引用,1表示被模块引用,2表示已有权限信息**/
            int res = foDelegate.checkOperateIsReferenced(operateInfo.id);
            if(res == 1){
                throw new VciBaseException("当前操作已被模块引用,删除该操作的同时会将其从模块下移除,确认执行删除吗?");
            }else if(res == 2){
                throw new VciBaseException("当前操作已经在权限模块被分配过权限,删除该操作的同时会将其从用户的权限中移除,确认执行删除吗?");
            }
            return foDelegate.deleteOperate(operateInfo.id);
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * æ ¡éªŒ
     * @param operateInfo
     * @return
     */
    private void checkItem(OperateInfo operateInfo) {
        if (Func.isBlank(operateInfo.name)) {
            throw new VciBaseException("名称不能为空!");
        }
        if (Func.isBlank(operateInfo.identify)) {
            throw new VciBaseException("标识不能为空!");
        }
        if (Func.isBlank(operateInfo.alias)) {
            throw new VciBaseException("别名不能为空!");
        }
        /*if (operateInfo.seq > -1){
            throw new VciBaseException("请输入正确的操作顺序值!");
        }*/
        /*long seq = operateInfo.seq;
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(seq);
        if( !isNum.matches() ){
            throw new VciBaseException("操作的顺序值只能是[0-9]之间的数字,并且必须是正整数.\n长度不允许输入小数或者负数!");
        }*/
        if (operateInfo.name.length() > 128) {
            throw new VciBaseException("名称长度不能超过128!");
        }
        if (operateInfo.desc.length() > 255) {
            throw new VciBaseException("描述长度不能超过255!");
        }
        if (operateInfo.alias.length() > 128) {
            throw new VciBaseException("别名长度不能超过255!");
        }
    }
    /**
@@ -279,7 +390,7 @@
        //写excel
        String excelPath = defaultTempFolder + File.separator + "module.xls";
        final List<String> columns = new ArrayList<String>(Arrays.asList("PLNAME","PLRESOURCEC","PLSUFFIXC","PLRESOURCEB",
                "PLSUFFIXB","PLMODULENO","PLDESC","PLISVALID","PLIMAGE","PLMODULESEQUENCE","PLALIASNAME",
                "PLSUFFIXB","PLDESC","PLISVALID","PLIMAGE","PLMODULESEQUENCE","PLALIASNAME",
                "PLMODULENAME","PLRESOURCEDOTNET","PLRESOURCEMOBIL","级别","别名","PLNO","PLISVALID",
                "PLNAME","PLUNIQUEFLAG","PLDESC","PLALIAS","PLSEQUENCE"));// è®¾ç½®è¡¨å•列名
        //int count = transmitTreeObject.getCurrentTreeNode().getChildCount();
@@ -316,7 +427,7 @@
                excelDataList.add(new WriteExcelData(row,6, ""+datas[i][6]));
                excelDataList.add(new WriteExcelData(row,7, ""+datas[i][7]));
                excelDataList.add(new WriteExcelData(row,8, ""+datas[i][8]));
                excelDataList.add(new WriteExcelData(row,9, ""+datas[i][9]));
                excelDataList.add(new WriteExcelData(row,9,""+datas[i][9]));
                excelDataList.add(new WriteExcelData(row,10,""+datas[i][10]));
                excelDataList.add(new WriteExcelData(row,11,""+datas[i][11]));
                excelDataList.add(new WriteExcelData(row,12,""+datas[i][12]));
@@ -329,7 +440,6 @@
                excelDataList.add(new WriteExcelData(row,19,""+datas[i][19]));
                excelDataList.add(new WriteExcelData(row,20,""+datas[i][20]));
                excelDataList.add(new WriteExcelData(row,21,""+datas[i][21]));
                excelDataList.add(new WriteExcelData(row,22,""+datas[i][22]));
            }
        }
        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
@@ -349,11 +459,10 @@
        boolean isSuccess = collectionDatas(files);
        logger.info("正在导入表单人员信息......");
        logger.info("count==="+count);
        boolean resBoolean = false;
        if(isSuccess == false){
            resBoolean = importExcelData(count);
            isSuccess = importExcelData(count);
        }
        return resBoolean ? BaseResult.success("导入成功!"):BaseResult.fail("导入失败!");
        return isSuccess ? BaseResult.success("导入成功!"):BaseResult.fail("导入失败!");
    }
    /**
@@ -361,7 +470,7 @@
     * @return
     */
    @Override
    public boolean updateAlias(MenuVO menuVO) throws VciException {
    public boolean updateAlias(MenuVO menuVO) throws VciBaseException {
        String alias = menuVO.getAlias();
        if ("".equals(alias)){
            throw new VciBaseException("请填写操作别名!");
@@ -371,29 +480,296 @@
        return foDelegate.updateFuncOperation(id , alias, isValid);
    }
    /**
     * æŸ¥è¯¢ç³»ç»Ÿé…ç½®æ ‘
     * @return
     */
    @Override
    public List<Object> getSysConfTree() {
        return null;
    public List<AppConfigCategoryInfo> getAppConfigCategoryInfo() {
        try {
            AppConfigCategoryInfo[] appConfigCategorys = foDelegate.getAppConfigCategorys();
            return Arrays.asList(appConfigCategorys);
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * æ ¹æ®åˆ†ç±»ID返回全部的 AppConfigDetail å¯¹è±¡
     * @return
     */
    @Override
    public boolean addSysConf() {
    public List<AppConfigDetailInfo> getAppConfigDetailsByID(String clsId) {
        try {
            AppConfigDetailInfo[] appConfigDetailInfos = foDelegate.getAppConfigDetailsByID(clsId);
            return Arrays.asList(appConfigDetailInfos);
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
    }
    /**
     * å¢žåŠ é…ç½®é¡¹åˆ†ç±»æˆ–é…ç½®é¡¹
     * @return
     */
    @Override
    public boolean addAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/) {
        VciBaseUtil.alertNotNull(appConfigDetailInfo,"添加的操作类型");
        boolean rs = false;
        try {
            String id = "";
            if(isConfCategorys){
                AppConfigCategoryInfo appConfigCategoryInfo = new AppConfigCategoryInfo();
                appConfigCategoryInfo.name = appConfigDetailInfo.name;
                appConfigCategoryInfo.desc = appConfigDetailInfo.desc;
                this.checkConf(appConfigCategoryInfo);
                id = foDelegate.saveAppConfigCategory(appConfigCategoryInfo);
            }else{
                this.checkConfItem(appConfigDetailInfo);
                id = foDelegate.saveAppConfigDetail(appConfigDetailInfo);
            }
            appConfigDetailInfo.id = id;
            rs = true;
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            rs = false;
            throw new VciBaseException(exceptionMessage);
        }
        return rs;
    }
    /**
     * ä¿®æ”¹é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    @Override
    public boolean updateAppConf(AppConfigDetailInfo appConfigDetailInfo,boolean isConfCategorys/*是否为操作配置项分配*/) {
        VciBaseUtil.alertNotNull(appConfigDetailInfo,"添加的操作类型");
        boolean rs = false;
        try {
            if(isConfCategorys){
                AppConfigCategoryInfo appConfigCategoryInfo = new AppConfigCategoryInfo();
                appConfigCategoryInfo.id = appConfigDetailInfo.id;
                appConfigCategoryInfo.name = appConfigDetailInfo.name;
                appConfigCategoryInfo.desc = appConfigDetailInfo.desc;
                this.checkConf(appConfigCategoryInfo);
                rs = foDelegate.updateAppConfigCategory(appConfigCategoryInfo);
            }else{
                this.checkConfItem(appConfigDetailInfo);
                rs = foDelegate.updateAppConfigDetail(appConfigDetailInfo);
            }
        } catch (VciBaseException e) {
            e.printStackTrace();
            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw new VciBaseException(exceptionMessage);
        }
        return rs;
    }
    /**
     * åˆ é™¤é…ç½®é¡¹åˆ†ç±»æˆ–配置项
     * @return
     */
    @Override
    public boolean delAppConf(String[] ids,boolean isConfCategorys/*是否为操作配置项分配*/) {
        VciBaseUtil.alertNotNull(ids,"待删除的主键列表");
        boolean res = false;
        if(isConfCategorys){
            if (this.hasAppConfigDetail(ids)) {
                throw new VciBaseException("删除的配置项分类下存在关联数据!");
            }
            res = foDelegate.deleteAppConfigCategory(ids);
        }else {
            res = foDelegate.deleteAppConfigDetail(ids);
        }
        return res;
    }
    /**
     * æ£€æŸ¥æ˜¯å¦å­˜åœ¨å¼•用关系
     * @param ids
     * @return
     */
    private boolean hasAppConfigDetail(final String[] ids){
        for (int i = 0; i < ids.length; i++) {
            AppConfigDetailInfo[] appConfigDetailsByID = foDelegate.getAppConfigDetailsByID(ids[i]);
            if(Func.isNotEmpty(appConfigDetailsByID)){
                return true;
            }
        }
        return false;
    }
    @Override
    public boolean updateSysConf() {
        return false;
    /**
     * é…ç½®é¡¹åˆ†ç±»æ ¡éªŒ
     * @param obj
     */
    private void checkConf(AppConfigCategoryInfo obj) {
        if ("".equals(obj.name)) {
            throw new VciBaseException("名称不能为空!");
        }
    }
    @Override
    public boolean delSysConf() {
        return false;
    /**
     * é…ç½®é¡¹æ ¡éªŒ
     * @param obj
     */
    private void checkConfItem(AppConfigDetailInfo obj) {
        if ("".equals(obj.name)) {
            throw new VciBaseException("名称不能为空!");
        }
        /*AppConfigDetailInfo[] appConfigDetailInfoByName = foDelegate.getAppConfigDetailInfoByName(obj.name);
        if(appConfigDetailInfoByName != null && appConfigDetailInfoByName.length > 0){
            throw new VciBaseException("配置项名称重复!");
        }*/
        if ("".equals(obj.key)){
            throw new VciBaseException("主键不能为空!");
        }
        if ("".equals(obj.value)){
            throw new VciBaseException("键值不能为空!");
        }
    }
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®
     * @param response
     * @return
     */
    @Override
    public String exportSysConf(HttpServletResponse response) {
        return null;
    public String exportSysConf(ExpExcelConditionVO expExcelConditionVO, HttpServletResponse response) throws IOException {
        //设置文件名和路径
        String expFileName = expExcelConditionVO.getExpFileName();
        if(Func.isNotBlank(expFileName) && expFileName.contains(".xls")){
            throw new VciBaseException("设置的文件名中未设置文件后缀,或后缀设置有误,当前仅支持导出.xls格式!");
        }
        expFileName = Func.isBlank(expFileName) ? "appConfig.xls":expFileName;
        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
        //写excel
        String excelPath = defaultTempFolder + File.separator + expFileName;
        //先判断是全部导出还是选择数据导出
        Map<String, Object> conditionMap = expExcelConditionVO.getConditionMap();
        if (Func.isEmpty(conditionMap)) {
            throw new VciBaseException("缺少必要导出条件!");
        }
        //指定导出的属性名
        List<String> expAttrNames = expExcelConditionVO.getExpAttrNames();
        if(Func.isEmpty(expAttrNames)){
            throw new VciBaseException("请选择您要导出的属性!");
        }
        //先区分是导出的配置项分类还是配置项详情
        boolean isExpAppConfDetail = (boolean) conditionMap.get("isExpAppConfDetail");
        //因为AppConfigDetailInfo中的属性包含了AppConfigCategoryInfo中的属性所以先通用了
        List<AppConfigDetailInfo> appConfigDetailInfos = new ArrayList<>();
        //选中导出数据的唯一标识
        List<String> selectDataIdentify = expExcelConditionVO.getSelectDataIdentify();
        //当前界面导出逻辑,只存在全部和选择导出
        String expType = expExcelConditionVO.getExpType();
        if(!isExpAppConfDetail){
            AppConfigCategoryInfo[] appConfigCategorys = foDelegate.getAppConfigCategorys();
            List<AppConfigCategoryInfo> filterAppConfigInfo = null;
            if("select".equals(expType)){
                filterAppConfigInfo = Arrays.stream(appConfigCategorys).filter(item -> {
                    if (selectDataIdentify.contains(item.id)) {
                        return true;
                    }
                    return false;
                }).collect(Collectors.toList());
            }else{
                filterAppConfigInfo = new ArrayList<>(Arrays.asList(appConfigCategorys));
            }
            if (Func.isNotEmpty(filterAppConfigInfo)) {
                filterAppConfigInfo.stream().forEach(item->{
                    AppConfigDetailInfo appConfigDetailInfo = new AppConfigDetailInfo();
                    appConfigDetailInfo.id = item.id;
                    appConfigDetailInfo.name = item.name;
                    appConfigDetailInfo.desc = item.desc;
                    appConfigDetailInfos.add(appConfigDetailInfo);
                });
            }
        }else{
            String clsId = (String)conditionMap.get("clsId");
            if(Func.isBlank(clsId)){
                throw new VciBaseException("未获取到查询配置项的配置项分类主键");
            }
            AppConfigDetailInfo[] configDetailInfos = foDelegate.getAppConfigDetailsByID(clsId);
            List<AppConfigDetailInfo> filterAppConfigInfo = null;
            if("select".equals(expType)){
                filterAppConfigInfo = Arrays.stream(configDetailInfos).filter(item -> {
                    if (selectDataIdentify.contains(item.id)) {
                        return true;
                    }
                    return false;
                }).collect(Collectors.toList());
            }else{
                filterAppConfigInfo = new ArrayList<>(Arrays.asList(configDetailInfos));
            }
            if (Func.isNotEmpty(filterAppConfigInfo)) {
                appConfigDetailInfos.addAll(filterAppConfigInfo);
            }
        }
        //设置列名
        List<String> columns = new ArrayList<>();
        //根据导出列设置列名
        Map<String,Integer> colAttrMap = new HashMap<>(); //导出的列和属性映射
        for (int i = 0; i < expAttrNames.size(); i++) {
            String attrName = expAttrNames.get(i);
            switch (attrName){
                case "name":
                    columns.add("名称");
                    break;
                case "key":
                    columns.add("key");
                    break;
                case "value":
                    columns.add("value");
                    break;
                case "desc":
                    columns.add("描述");
                    break;
            }
            colAttrMap.put(attrName,i);
        }
        new File(excelPath).createNewFile();
        //设置列
        List<WriteExcelData> excelDataList = new ArrayList<>();
        //设置列头
        for (int index = 0; index < columns.size(); index++) {
            excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
        }
        //处理数据导出
        if(Func.isEmpty(appConfigDetailInfos)){
            excelDataList.add(new WriteExcelData(1,1, "未获取到要导出的数据,请刷新后尝试重新导出!"));
        }else{
            for (int i = 0; i < appConfigDetailInfos.size(); i++) {
                AppConfigDetailInfo appConfigDetailInfo = appConfigDetailInfos.get(i);
                int row = i+1;
                if(Func.isNotEmpty(colAttrMap.get("name"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("name"), appConfigDetailInfo.name));
                }
                if(Func.isNotEmpty(colAttrMap.get("key"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("key"), appConfigDetailInfo.key));
                }
                if(Func.isNotEmpty(colAttrMap.get("value"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("value"), appConfigDetailInfo.value));
                }
                if(Func.isNotEmpty(colAttrMap.get("desc"))){
                    excelDataList.add(new WriteExcelData(row,colAttrMap.get("desc"), appConfigDetailInfo.desc));
                }
            }
        }
        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
        ExcelUtil.writeDataToFile(excelPath, excelOption);
        return excelPath;
    }
    /**
@@ -410,28 +786,26 @@
            if (sheetDataSets != null && !sheetDataSets.isEmpty()) {
                for (SheetDataSet sheet : sheetDataSets) {
                    // sheet不能为空并且必须有出表头外的一条数据
                    if (sheet != null && sheet.getDataSet() != null && sheet.getDataSet().size() > 1) {
                        List<String[]> dataSet = sheet.getDataSet();
                    if (sheet != null && sheet.getRowData() != null && sheet.getRowData().size() > 1) {
                        List<SheetRowData> dataSet = sheet.getRowData();
                        String fParentId=""; //第一级的id(第二级的parentid)
                        boolean boo=true;
                        boolean first=false;
                        String[] pd=new String[100];
                        int jibie=2;
                        for (int i = 1; i < dataSet.size(); i++) {
                            //fileDatas = new ArrayList<FunctionObject>();
                            String[] oneData = dataSet.get(i);
                        for (int i = 0; i < dataSet.size(); i++) {
                            Map<Integer, String> oneData = dataSet.get(i).getData();
                            String id = ObjectUtility.getNewObjectID36();
                            FunctionInfo funObj=new FunctionInfo();
                            boolean onebl=false;
                            boolean twobl=false;
                            boolean same=false;
                            String plName=oneData[0];
                            //TODO: è¿™é‡Œç»å¯¹ä¼šå‡ºé—®é¢˜ï¼Œå¯¼å‡ºçš„第一层的级别都是0,都不会存在等于1的,所以平台这儿等于1应该是不对的
                            if(oneData[14].equals("0")) {
                            String plName = Func.isBlank(oneData.get(0)) ? "":oneData.get(0);
                            if(oneData.get(14).equals("1")) {
                                try {
                                    onebl = foDelegate.firstLevel(plName);
                                } catch (VciException e) {
                                } catch (VciBaseException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
@@ -441,14 +815,13 @@
                                    try {
                                        fParentId = foDelegate.changeFirstLevel(funObj,plName);
                                        pd[2]=fParentId;
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    funObj.id = fParentId;
                                    fileFunctionDatas.add(funObj);
                                    first=true;
                                } else {
                                    funObj.id = id;
@@ -462,14 +835,14 @@
                            }
                            //#########################     åˆå¹¶     #########################
                            for(jibie=2;jibie<100;jibie++){
                                if(oneData[14].equals(String.valueOf(jibie))){
                                if(oneData.get(14).equals(String.valueOf(jibie))){
                                    if(first == true && boo == true){
                                        try {
                                            if(pd[jibie]==null){
                                                pd[jibie]="";
                                            }
                                            twobl=foDelegate.secondLevel(plName,pd[jibie]);
                                        } catch (VciException e) {
                                        } catch (VciBaseException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
@@ -495,12 +868,12 @@
                                }
                            }
                            if(oneData[14].equals("-1")) {
                            if(oneData.get(14).equals("-1")) {
                                importExcelData(count);
                                FuncOperationInfo foObj = new FuncOperationInfo();
                                int len=fileFunctionDatas.size();
                                //**************同一节点下不能有相同的操作类型********************
                                String dataOperName=oneData[18];
                                String dataOperName=oneData.get(18);
                                String plFuncOid=fileFunctionDatas.get(len-1).id;
                                try {
                                    same = foDelegate.selSameOper(dataOperName,plFuncOid);
@@ -513,29 +886,29 @@
                                    foObj.id = id;
                                    foObj.funcId = fileFunctionDatas.get(len-1).id;
                                    try {
                                        OperateInfo operObj = foDelegate.fetchOperateTypeByName(oneData[18]);
                                        OperateInfo operObj = foDelegate.fetchOperateTypeByName(oneData.get(18));
                                        foObj.operId = operObj.id;
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    foObj.number = Integer.parseInt(oneData[16]);
                                    foObj.operAlias = oneData[15];
                                    foObj.isValid = Integer.parseInt(oneData[17]) != 0;
                                    foObj.number = Integer.parseInt(oneData.get(16));
                                    foObj.operAlias = oneData.get(15);
                                    foObj.isValid = Integer.parseInt(oneData.get(17)) != 0;
                                    try {
                                        foDelegate.saveFuncOperation2(foObj);
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                } else {
                                    foObj.number = Integer.parseInt(oneData[16]);
                                    foObj.operAlias = oneData[15];
                                    foObj.isValid = Integer.parseInt(oneData[17]) != 0;
                                    foObj.number = Integer.parseInt(oneData.get(16));
                                    foObj.operAlias = oneData.get(15);
                                    foObj.isValid = Integer.parseInt(oneData.get(17)) != 0;
                                    try {
                                        foDelegate.updateOperation(foObj,dataOperName,plFuncOid);
                                    } catch (VciException e) {
                                    } catch (VciBaseException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
@@ -558,7 +931,7 @@
    private boolean importExcelData(int count) throws PLException {
        boolean b=false;
        try {
            b=    foDelegate.importModules(fileFunctionDatas.toArray(new FunctionInfo[]{}),count);
            b = foDelegate.importModules(fileFunctionDatas.toArray(new FunctionInfo[fileFunctionDatas.size()]),count);
        } catch (VciBaseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
@@ -576,13 +949,8 @@
     * @data 2014-3-11
     */
    private List<SheetDataSet> getFileList(File f) throws PLException, IOException {
        // èŽ·å–æµ
        BufferedInputStream fileInputStream = new BufferedInputStream(
                new FileInputStream(f));
        String name = f.getName();
        // èŽ·å–è¡¨list
        List<SheetDataSet> sheetDataSets = ExcelDocumentUtils
                .readExcelDocument(name, fileInputStream);
        List<SheetDataSet> sheetDataSets = ExcelUtil.readDataObjectFromExcel(f);
        return sheetDataSets;
    }
@@ -618,13 +986,13 @@
                if(isFunction){
                    if(!plDatas[i][16].trim().equals("") && plDatas[i][16]!=null && !plDatas[i][16].equals("-1")){
                        bw.write("insert into plfunction values('"+plDatas[i][0]+"','"+plDatas[i][1]+"',"+"'"+plDatas[i][2]+"',"+"'"+plDatas[i][3]+"',"+"'"+plDatas[i][4]+"',"
                                +"'"+plDatas[i][5]+"',"+"'"+plDatas[i][6]+"',"+"'"+plDatas[i][7]+"',"+"'"+plDatas[i][8]+"',"+"'"+plDatas[i][9]+"',"+"'"+plDatas[i][10]+"',"+"'"+plDatas[i][11]+"',"
                                +"'"+plDatas[i][12]+"',"+"'"+plDatas[i][13]+"',"+"'"+plDatas[i][14]+"',"+"'"+plDatas[i][15]+"');");
                                +"',"+"'"+plDatas[i][5]+"',"+"'"+plDatas[i][6]+"',"+"'"+plDatas[i][7]+"',"+"'"+plDatas[i][8]+"',"+"'"+plDatas[i][9]+"',"+"'"+plDatas[i][10]+"',"
                                +"'"+plDatas[i][11]+"',"+"'"+plDatas[i][12]+"',"+"'"+plDatas[i][13]+"',"+"'"+plDatas[i][14]+"');");
                        bw.write("\r\n");
                    }
                    if(!plDatas[i][16].trim().equals("") && plDatas[i][16]!=null && plDatas[i][16].equals("-1")){
                        bw.write("insert into plfuncoperation values('"+plDatas[i][17]+"','"+plDatas[i][18]+"',"+"'"+plDatas[i][19]+"',"+"'"+plDatas[i][20]+"',"+"'"+plDatas[i][21]+"',"
                                +"'"+plDatas[i][22]+"');");
                    if(!plDatas[i][15].trim().equals("") && plDatas[i][15]!=null && plDatas[i][15].equals("-1")){
                        bw.write("insert into plfuncoperation values('"+plDatas[i][16]+"','"+plDatas[i][17]+"',"+"'"+plDatas[i][18]+"',"+"'"+plDatas[i][19]+"',"+"'"+plDatas[i][20]+"',"
                                +"'"+plDatas[i][21]+"');");
                        bw.write("\r\n");
                    }
                }else{
@@ -695,20 +1063,19 @@
        return res;
    }
    public void fuzhi(FunctionInfo functionInfo,String[] oneData){
        functionInfo.name = oneData[0];
        functionInfo.resourceC = oneData[1];
        functionInfo.suffixC = oneData[2];
        functionInfo.desc = oneData[6];
        functionInfo.resourceB = oneData[3];
        functionInfo.suffixB = oneData[4];
        functionInfo.seq = Integer.parseInt(oneData[9]);
        //funObj.setModuleNo(Integer.parseInt(oneData[5]));
        functionInfo.image = oneData[8];
        functionInfo.isValid = Integer.parseInt(oneData[7]) != 0;
        functionInfo.aliasName = oneData[10];
        functionInfo.resourceDotNet = oneData[12];
        functionInfo.resourceMobile = oneData[13];
    public void fuzhi(FunctionInfo functionInfo,Map<Integer,String> oneData){
        functionInfo.name = oneData.get(0);
        functionInfo.resourceC = oneData.get(1);
        functionInfo.suffixC = oneData.get(2);
        functionInfo.desc = oneData.get(5);
        functionInfo.resourceB = oneData.get(3);
        functionInfo.suffixB = oneData.get(4);
        functionInfo.seq = Integer.parseInt(oneData.get(8));
        functionInfo.image = oneData.get(7);
        functionInfo.isValid = Integer.parseInt(oneData.get(6)) != 0;
        functionInfo.aliasName = oneData.get(9);
        functionInfo.resourceDotNet = oneData.get(11);
        functionInfo.resourceMobile = oneData.get(12);
    }
    /**
@@ -722,12 +1089,12 @@
         * @return
         * @throws VciException
         */
        public boolean firstLevel(String plName) throws VciException{
        public boolean firstLevel(String plName) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().firstLevel(plName);
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciException(String.valueOf(e.code), e.messages);
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
@@ -735,7 +1102,7 @@
         * è¦†ç›–重名的第一级数据
         * add by caill
         * */
        public String changeFirstLevel(FunctionInfo functionInfo,String plName) throws VciException{
        public String changeFirstLevel(FunctionInfo functionInfo,String plName) throws VciBaseException{
            String fParentId="";
            try {
                fParentId= platformClientUtil.getFrameworkService().changeFirstLevel(functionInfo, plName);
@@ -743,7 +1110,6 @@
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return fParentId;
        }
@@ -751,12 +1117,12 @@
         * åˆ¤æ–­ç¬¬äºŒçº§æ•°æ®æœ‰æ²¡æœ‰é‡åçš„
         * add by caill
         * */
        public boolean secondLevel(String plName,String fParentId) throws VciException{
        public boolean secondLevel(String plName,String fParentId) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().secondLevel(plName,fParentId);
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciException(String.valueOf(e.code), e.messages);
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
@@ -827,13 +1193,29 @@
        }
        /**
         * ç§»é™¤æ¨¡å—下的操作
         * @param funcOperationInfo
         * @return
         * @throws VciException
         */
        public boolean deleteFuncOperation(FuncOperationInfo funcOperationInfo) throws VciBaseException{
            boolean res = true;
            try{
                res = platformClientUtil.getFrameworkService().deleteFuncOperation(funcOperationInfo, this.getUserEntityInfo());
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * VO转DO对象
         * @return
         */
        public FunctionInfo menuVO2FunctionInfo(MenuVO object){
            FunctionInfo info = new FunctionInfo();
            info.id = object.getId() == null ? "" : object.getId();
            //info.layer = object.getLayer();
            info.name = object.getName() == null ? "" : object.getName();
            info.parentId = object.getParentId() == null ? "" : object.getParentId();
            info.resourceC = object.getPathC() == null ? "" : object.getPathC();
@@ -842,7 +1224,6 @@
            //info.suffixB = object.getSuffixB() == null ? "" : object.getSuffixB();
            info.desc = object.getRemark() == null ? "" : object.getRemark();
            info.seq = object.getSort();
            //info.moduleNo = object.getModuleNo();
            info.image = object.getSource() == null ? "" : object.getSource();
            info.isValid = object.getIsValid();
            info.aliasName = object.getAlias() == null ? "" : object.getAlias();
@@ -862,7 +1243,6 @@
         */
        private FunctionInfo check(MenuVO menuVO,String type) {
            FunctionInfo obj = new FunctionInfo();
            //获取表单输入的值
            String modelName = menuVO.getName();
            String csIdentity = menuVO.getPathC();
@@ -871,36 +1251,35 @@
            String resDotNet = menuVO.getResourceDotNet();
            String resMobile = menuVO.getResourceMobile();
            //int moduleNo = transferStringToNum(moduleNoTxt.getText());
            int sequence = menuVO.getSort();
            int sequence = Func.isNotEmpty(menuVO.getSort()) ? menuVO.getSort():1;
            String description = menuVO.getRemark();
            if("".equals(modelName) || "null".equals(modelName) || modelName == null) {
            if(Func.isBlank(modelName)) {
                throw new VciBaseException("模块名不能为空!");
            }else if(modelName.length() > 128) {
                throw new VciBaseException("模块名长度不能超过128!");
            }else if(description.length() > 255) {
            }else if(Func.isNotBlank(description) && description.length() > 255) {
                throw new VciBaseException("描述长度不能超过255!");
            }else if(csIdentity != null && !"".equals(csIdentity) && csIdentity.length() > 255) {
            }else if(Func.isNotBlank(csIdentity) && csIdentity.length() > 255) {
                throw new VciBaseException("C/S标识长度不能超过255!");
            } else if(resDotNet != null && !"".equals(resDotNet) && resDotNet.length() > 255) {
            } else if(Func.isNotBlank(resDotNet) && resDotNet.length() > 255) {
                throw new VciBaseException(".NET标识长度不能超过255!");
            }else if(resMobile != null && !"".equals(resMobile) && resMobile.length() > 255) {
            }else if(Func.isNotBlank(resMobile) && resMobile.length() > 255) {
                throw new VciBaseException("Mobile标识长度不能超过255!");
            } else if (sequence < 0) {
                throw new VciBaseException("序号不能小于0!");
            }
            if(type.equals("add")){
                //给object对象赋值
                String parentId = "";
                /*String parentId = "";
                if(menuVO.getModeType().equals("FunctionObject")) {
                    parentId = menuVO.getParentId();
                }else if("modelManagmentNode".equals(menuVO.getParentId())) {
                    parentId = "modelManagmentNode";
                }else if("systemManagmentNode".equals(menuVO.getParentId())) {
                    parentId = "systemManagmentNode";
                }
                obj.parentId = parentId;
                }*/
                obj.parentId = menuVO.getParentId();
            }else{
                obj.id = menuVO.getId();
                obj.parentId = menuVO.getParentId();
@@ -909,11 +1288,11 @@
            obj.resourceC = csIdentity;
            obj.desc = description;
            obj.resourceB = bsIdentity;
            obj.suffixC = "";
            obj.suffixB = "";
            /*obj.suffixC = "";
            obj.suffixB = "";*/
            obj.seq = sequence;
            obj.image = menuVO.getSource();
            obj.isValid = menuVO.getValid();//1有效0无效
            obj.isValid = Func.isNotEmpty(menuVO.getValid()) ? menuVO.getValid():false;
            obj.aliasName = aliasName;
            obj.resourceDotNet = resDotNet;
            obj.resourceMobile = resMobile;
@@ -939,7 +1318,7 @@
            int len = funObject.length;
            List<FunctionInfo> funInfoList = new ArrayList<FunctionInfo>();
            for(int i = count ; i<len ; i++){
                if(funObject[i].parentId!=null){
                if(Func.isNotBlank(funObject[i].parentId)){
                    FunctionInfo funInfo = funObject[i];
                    funInfoList.add(funInfo);
                }
@@ -974,7 +1353,7 @@
            return same;
        }
        public OperateInfo fetchOperateTypeByName(String name) throws VciException {
        public OperateInfo fetchOperateTypeByName(String name) throws VciBaseException {
            try{
                OperateInfo info =  platformClientUtil.getFrameworkService().fetchOperateTypeByName(name);
                return info;
@@ -988,12 +1367,13 @@
         * ä¿å­˜æ“ä½œç±»åž‹
         * add by caill
         * */
        public boolean saveFuncOperation2(FuncOperationInfo funcOperationInfo) throws VciException{
        public boolean saveFuncOperation2(FuncOperationInfo funcOperationInfo) throws VciBaseException{
            try {
                platformClientUtil.getFrameworkService().saveFuncOperation2(funcOperationInfo,this.getUserEntityInfo());
            } catch (PLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return true;
        }
@@ -1002,26 +1382,208 @@
         * è¦†ç›–操作类型
         * add by caill
         * */
        public String updateOperation(FuncOperationInfo funcOperationInfo,String dataOperName,String plFuncOid) throws VciException{
        public String updateOperation(FuncOperationInfo funcOperationInfo,String dataOperName,String plFuncOid) throws VciBaseException{
            try {
                platformClientUtil.getFrameworkService().updateOperation(funcOperationInfo,this.getUserEntityInfo(),dataOperName,plFuncOid);
            } catch (PLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return null;
        }
        public boolean updateFuncOperation(String id , String alias, boolean isSelected) throws VciException {
        public boolean updateFuncOperation(String id , String alias, boolean isSelected) throws VciBaseException {
            boolean res = false;
            try{
                res = platformClientUtil.getFrameworkService().updateFuncOperation(id, alias, isSelected, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciException(String.valueOf(e.code), e.messages);
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * ä¿å­˜æ“ä½œç±»åž‹
         *
         * @param operateInfo
         * @return
         * @throws VciException
         */
        public String saveOperate(OperateInfo operateInfo) throws VciBaseException {
            String res = "";
            try{
                res = platformClientUtil.getFrameworkService().saveOperate(operateInfo,this.getUserEntityInfo());
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * ä¿®æ”¹æ“ä½œç±»åž‹
         *
         * @param operateInfo
         * @return
         * @throws VciException
         */
        public String updateOperate(OperateInfo operateInfo) throws VciBaseException {
            String res = "";
            try{
                res = platformClientUtil.getFrameworkService().updateOperate(operateInfo,this.getUserEntityInfo());
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * åˆ é™¤æ“ä½œç±»åž‹
         *
         * @param id
         * @return
         * @throws VciException
         */
        public boolean deleteOperate(String id) throws VciBaseException {
            boolean res = true;
            try{
                res = platformClientUtil.getFrameworkService().deleteOperate(id,this.getUserEntityInfo());
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
            return res;
        }
        /**
         * æ£€æŸ¥æ“ä½œæ˜¯å¦è¢«å¼•用
         * @param operateId
         * @return 0表示无引用,1表示被模块引用,2表示有权限信息
         * @throws VciException
         */
        public int checkOperateIsReferenced(String operateId) throws VciBaseException {
            try{
                return (int)platformClientUtil.getFrameworkService().checkOperateIsReferenced(operateId);
            }catch (PLException e) {
                e.printStackTrace();
                throw new VciBaseException(String.valueOf(e.code),e.messages);
            }
        }
        /**
         * è¿”回全部的 AppConfigCategory å¯¹è±¡
         * @return
         * @throws VciException
         */
        public AppConfigCategoryInfo[] getAppConfigCategorys() throws VciBaseException{
            try{
                AppConfigCategoryInfo[] infos = platformClientUtil.getFrameworkService().getAppConfigCategorys(this.getUserEntityInfo());
                return infos;
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ®åˆ†ç±»ID返回全部的 AppConfigDetail å¯¹è±¡
         */
        public AppConfigDetailInfo[] getAppConfigDetailsByID(String clsfId) throws VciBaseException{
            try{
                AppConfigDetailInfo[] infos = platformClientUtil.getFrameworkService().getAppConfigDetailsByCatId(clsfId, this.getUserEntityInfo());
                return infos;
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ·»åŠ ã€ä¿å­˜ AppConfigCategory å¯¹è±¡
         * @param object AppConfigCategoryInfo å¯¹è±¡
         */
        public String saveAppConfigCategory(AppConfigCategoryInfo object) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().saveAppConfigCategory(object, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * ä¿®æ”¹ã€æ›´æ–° AppConfigCategory å¯¹è±¡
         * @param object AppConfigCategoryInfo å¯¹è±¡
         */
        public boolean updateAppConfigCategory(AppConfigCategoryInfo object) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().updateAppConfigCategory(object, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ®åç§°æŸ¥è¯¢é…ç½®é¡¹
         * @param name
         * @return
         * @throws VciBaseException
         */
        public AppConfigDetailInfo[] getAppConfigDetailInfoByName(String name) throws VciBaseException{
            try{
                AppConfigDetailInfo[] appConfigDetailsByName = platformClientUtil.getFrameworkService().getAppConfigDetailsByName(name, this.getUserEntityInfo());
                return appConfigDetailsByName;
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ® ID åˆ é™¤ AppConfigCategory å¯¹è±¡ï¼ˆæ‰¹é‡ï¼‰
         * @param ids AppConfigCategory å¯¹è±¡çš„ ID åˆ—表
         */
        public boolean deleteAppConfigCategory(String[] ids) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().deleteAppConfigCategory(ids, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /** æ·»åŠ ã€ä¿å­˜ AppConfigDetail å¯¹è±¡
        * @param info AppConfigDetailInfo å¯¹è±¡
        */
        public String saveAppConfigDetail(AppConfigDetailInfo info) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().saveAppConfigDetail(info, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * ä¿®æ”¹ã€æ›´æ–° AppConfigDetail å¯¹è±¡
         * @param info AppConfigDetailInfo å¯¹è±¡
         */
        public boolean updateAppConfigDetail(AppConfigDetailInfo info) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().updateAppConfigDetail(info, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
        /**
         * æ ¹æ® ID åˆ é™¤ AppConfigDetail å¯¹è±¡ï¼ˆæ‰¹é‡ï¼‰
         * @param ids AppConfigDetail å¯¹è±¡çš„ ID åˆ—表
         */
        public boolean deleteAppConfigDetail(String[] ids) throws VciBaseException{
            try{
                return platformClientUtil.getFrameworkService().deleteAppConfigDetail(ids, this.getUserEntityInfo());
            }catch(PLException e){
                throw new VciBaseException(String.valueOf(e.code), e.messages);
            }
        }
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java
@@ -1,8 +1,13 @@
package com.vci.web.controller;
import com.vci.constant.FrameWorkLangCodeConstant;
import com.vci.corba.framework.data.AppConfigDetailInfo;
import com.vci.corba.framework.data.FuncOperationInfo;
import com.vci.corba.framework.data.OperateInfo;
import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
import com.vci.frameworkcore.compatibility.SmHMSysModConfigServiceI;
import com.vci.pagemodel.AppConfigDetailInfoVO;
import com.vci.pagemodel.ExpExcelConditionVO;
import com.vci.pagemodel.MenuVO;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.exception.VciBaseException;
@@ -33,7 +38,6 @@
 */
@RestController
@RequestMapping("/hmSysModConfigController")
@VciUnCheckRight
public class HMSysModConfigController {
    /**
@@ -79,7 +83,7 @@
    @PostMapping("/addModel")
    public BaseResult addModel(@RequestBody MenuVO menuVO) {
        try {
            return BaseResult.success(hmSysModConfigService.addModule(menuVO),"模块增加成功");
            return BaseResult.success(hmSysModConfigService.addModule(menuVO),"模块增加成功!");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "增加模块时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
@@ -123,6 +127,23 @@
    }
    /**
     * åˆ é™¤æ¨¡å—下关联的操作类型
     * @param funcOperationInfo
     * @return
     */
    @DeleteMapping("/delFuncOperation")
    public BaseResult delFuncOperation(@RequestBody FuncOperationInfo funcOperationInfo) {
        try {
            return BaseResult.success(hmSysModConfigService.delFuncOperation(funcOperationInfo),"模块下操作类型删除成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "模块下操作类型删除时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * ç®¡ç†åŠŸèƒ½æ¨¡å—ã€ä¸šåŠ¡åŠŸèƒ½æ¨¡å—ä¸‹çš„å¶å­èŠ‚ç‚¹â€”ä¿®æ”¹æ“ä½œåˆ«åæŽ¥å£
     * @param menuVO
     * @return
@@ -133,7 +154,24 @@
            return BaseResult.success(hmSysModConfigService.updateAlias(menuVO),"操作别名修改成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "操作别名修改时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            String errorMsg = "操作类型别名修改时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * æ·»åŠ æ“ä½œç±»åž‹ä¸Žæ¨¡å—çš„å…³è”å…³ç³»
     * @param funcOperationInfoList
     * @return
     */
    @PostMapping("/addFuncOperationType")
    public BaseResult addFuncOperationType(@RequestBody List<FuncOperationInfo> funcOperationInfoList) {
        try {
            return BaseResult.success(hmSysModConfigService.addFuncOperationType(funcOperationInfoList),"为当前模块添加操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "为当前模块添加操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
@@ -141,16 +179,50 @@
    /**
     * æ·»åŠ æ“ä½œç±»åž‹
     * @param menuVOList
     * @param operateInfo
     * @return
     */
    @PostMapping("/addOperationType")
    public BaseResult addOperationType(@RequestBody List<MenuVO> menuVOList) {
    public BaseResult addOperationType(@RequestBody OperateInfo operateInfo) {
        try {
            return BaseResult.success(hmSysModConfigService.addOperationType(menuVOList),"操作类型添加成功");
            return BaseResult.success(hmSysModConfigService.addOperationType(operateInfo),"添加操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "删除模块时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @PutMapping("/updateOperationType")
    public BaseResult updateOperationType(@RequestBody OperateInfo operateInfo) {
        try {
            return BaseResult.success(hmSysModConfigService.updateOperationType(operateInfo),"修改操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "修改操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param operateInfo
     * @return
     */
    @DeleteMapping("/delOperationType")
    public BaseResult delOperationType(@RequestBody OperateInfo operateInfo) {
        try {
            return BaseResult.success(hmSysModConfigService.delOperationType(operateInfo),"删除操作类型成功");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "删除操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
@@ -234,7 +306,7 @@
     * å¯¼å…¥æ¨¡å—
     * @return
     */
    @GetMapping("/importModule")
    @PostMapping("/importModule")
    public BaseResult importModule(@RequestParam("files") List<MultipartFile> files) {
        LinkedList<File> fileList = new LinkedList<>();
        try {
@@ -244,7 +316,7 @@
                file.transferTo(file1);
                fileList.add(file1);
            }
            if(Func.isEmpty(fileList)){
            if(Func.isNotEmpty(fileList)){
                return hmSysModConfigService.importModule(fileList);
            } else {
                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"无导入的文件"});
@@ -256,4 +328,111 @@
        }
    }
    /**
     *查询系统配置树
     * @return
     */
    @GetMapping("/getAppConfigCategoryInfo")
    public BaseResult getAppConfigCategoryInfo() {
        try {
            return BaseResult.dataList(hmSysModConfigService.getAppConfigCategoryInfo());
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "查询系统配置列表时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     *根据分类ID返回全部的 AppConfigDetail å¯¹è±¡
     * @return
     */
    @GetMapping("/getAppConfigDetailsByID")
    public BaseResult getAppConfigDetailsByID(String clsId) {
        try {
            return BaseResult.dataList(hmSysModConfigService.getAppConfigDetailsByID(clsId));
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "查询配置项列表时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * æ·»åŠ æ“ä½œç±»åž‹
     * @param appConfigDetailInfoVO
     * @return
     */
    @PostMapping("/addAppConf")
    public BaseResult addAppConf(@RequestBody AppConfigDetailInfoVO appConfigDetailInfoVO) {
        try {
            boolean res = hmSysModConfigService.addAppConf(appConfigDetailInfoVO.getAppConfigDetailInfo(), appConfigDetailInfoVO.isConfCategorys());
            return res ? BaseResult.success("添加操作类型成功"):BaseResult.fail("添加操作类型失败!");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "添加操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * ä¿®æ”¹æ“ä½œç±»åž‹
     * @param appConfigDetailInfoVO
     * @return
     */
    @PutMapping("/updateAppConf")
    public BaseResult updateAppConf(@RequestBody AppConfigDetailInfoVO appConfigDetailInfoVO) {
        try {
            boolean res = hmSysModConfigService.updateAppConf(appConfigDetailInfoVO.getAppConfigDetailInfo(),appConfigDetailInfoVO.isConfCategorys());
            return res ? BaseResult.success("修改操作类型成功"):BaseResult.fail("修改操作类型失败!");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "修改操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * åˆ é™¤æ“ä½œç±»åž‹
     * @param ids
     * @param isConfCategorys
     * @return
     */
    @DeleteMapping("/delAppConf")
    public BaseResult delAppConf(String[] ids,boolean isConfCategorys) {
        try {
            return hmSysModConfigService.delAppConf(ids,isConfCategorys) ? BaseResult.success("删除操作类型成功"):BaseResult.fail("删除操作类型失败!");
        }catch (Exception e){
            e.printStackTrace();
            String errorMsg = "删除操作类型时出现错误,原因:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(errorMsg);
            throw new VciBaseException(errorMsg);
        }
    }
    /**
     * å¯¼å‡ºç³»ç»Ÿé…ç½®(配置项分类或配置项)
     * @return
     */
    @PostMapping("/exportSysConf")
    public void exportSysConf(@RequestBody ExpExcelConditionVO expExcelConditionVO, HttpServletResponse response) {
        try {
            String excelPath = hmSysModConfigService.exportSysConf(expExcelConditionVO,response);
            ControllerUtil.writeFileToResponse(response,excelPath);
        } catch (Exception e) {
            String msg = "导出系统配置时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            try {
                //出错时
                e.printStackTrace();
                ControllerUtil.writeDataToResponse(response,"error_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss") + ".txt", StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
@@ -1,16 +1,25 @@
package com.vci.web.controller;
import com.vci.corba.common.PLException;
import com.vci.dto.ClonePortalVIDTOList;
import com.vci.dto.DeletePortalVIDTOList;
import com.vci.dto.OsBtmTypeDTO;
import com.vci.dto.PortalVIDTO;
import com.vci.pagemodel.KeyValue;
import com.vci.pagemodel.PortalVIVO;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.annotation.log.VciBusinessLog;
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.VciBaseUtil;
import com.vci.web.enumpck.ItemDblEnum;
import com.vci.web.enumpck.ItemTypeEnum;
import com.vci.web.service.OsPortalVIServiceI;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -23,6 +32,12 @@
@RestController
@RequestMapping("/portalVIController")
public class WebPortalVIController {
    /**
     * æ—¥å¿—
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
   private OsPortalVIServiceI portalVIServiceI;
    /**
     * è¡¨å•列表
@@ -31,24 +46,93 @@
     * @param baseQueryObject æŸ¥è¯¢æ¡ä»¶
     * @return åˆ—表的内容
     */
    @GetMapping( "/referDataGrid")
    @GetMapping( "/gridPortalVIDatas")
    @VciBusinessLog(operateName = "表单/表格列表")
    public DataGrid<PortalVIVO> referDataGrid(BaseQueryObject baseQueryObject){
    public DataGrid<PortalVIVO> gridPortalVIDatas(BaseQueryObject baseQueryObject){
        return portalVIServiceI.gridPortalVIVOs(baseQueryObject);
    }
    /**
     *根据表单id获取具体数据
     * @param id
     * @return
     */
    @GetMapping( "/getPortalVIById")
    @VciBusinessLog(operateName = "获取表单/表格数据")
    public BaseResult getPortalVIById(@RequestBody String id,@RequestBody String viType){
        try{
            PortalVIVO portalVIVO=  portalVIServiceI.getPortalVIById(id,viType);
           return  BaseResult.success(portalVIVO);
        }catch (Throwable e){
            e.printStackTrace();
            String exceptionMessage = "创建业务类型时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * è¡¨å•/table保存
     * @param portalVIDTO
     * @return
     */
    @PostMapping("/savePortalVI")
    @VciBusinessLog(operateName = "添加表单/表格")
    @VciBusinessLog(operateName = "保存表单/表格")
    public BaseResult savePortalVI(@RequestBody PortalVIDTO portalVIDTO){
        if(StringUtils.isNotBlank(portalVIDTO.getId())){
            return portalVIServiceI.edit(portalVIDTO);
            return portalVIServiceI.editSave(portalVIDTO);
        }else{
            return portalVIServiceI.add(portalVIDTO);
            return portalVIServiceI.addSave(portalVIDTO);
        }
    }
    /**
     * ä¸šåŠ¡ç±»åž‹åˆ é™¤
     * btmTypeDTO ä¸šåŠ¡ç±»åž‹å¯¹è±¡
     * @return åˆ é™¤ç»“æžœ
     */
    @DeleteMapping("/delete")
    @VciBusinessLog(operateName = "删除表单/表格")
    public BaseResult delete(@RequestBody DeletePortalVIDTOList deletePortalVIDTOList){
        try {
            return portalVIServiceI.delete(deletePortalVIDTOList) ? BaseResult.success("删除成功!"):BaseResult.fail("删除失败!");
        } catch (PLException e) {
            e.printStackTrace();
            String exceptionMessage = "删除表单时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     * ä¸šåŠ¡ç±»åž‹åˆ é™¤
     * btmTypeDTO ä¸šåŠ¡ç±»åž‹å¯¹è±¡
     * @return åˆ é™¤ç»“æžœ
     */
    @DeleteMapping("/deleteByIds")
    @VciBusinessLog(operateName = "删除表单/表格")
    public BaseResult deleteByIds(@RequestBody String ids){
        try {
            return portalVIServiceI.delete(ids) ? BaseResult.success("删除成功!"):BaseResult.fail("删除失败!");
        } catch (PLException e) {
            e.printStackTrace();
            String exceptionMessage = "删除表单时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
    /**
     *
     */
    @PostMapping("/clone")
    @VciBusinessLog(operateName = "删除表单/表格")
    public BaseResult clone(@RequestBody ClonePortalVIDTOList portalVIDTOList){
        try {
            return portalVIServiceI.clone(portalVIDTOList) ? BaseResult.success("删除成功!"):BaseResult.fail("删除失败!");
        } catch (Throwable e) {
            e.printStackTrace();
            String exceptionMessage = "删除表单时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            return BaseResult.fail(exceptionMessage);
        }
    }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsPortalVIServiceI.java
@@ -1,5 +1,8 @@
package com.vci.web.service;
import com.vci.corba.common.PLException;
import com.vci.corba.portal.data.PortalVI;
import com.vci.dto.ClonePortalVIDTOList;
import com.vci.dto.DeletePortalVIDTOList;
import com.vci.dto.PortalVIDTO;
import com.vci.pagemodel.PortalVIVO;
import com.vci.starter.web.exception.VciBaseException;
@@ -23,7 +26,7 @@
     * @param baseQueryObject æŸ¥è¯¢å¯¹è±¡
     * @return é“¾æŽ¥ç±»åž‹çš„æ˜¾ç¤ºå¯¹è±¡
     */
    DataGrid<PortalVIVO> gridPortalVIVOs(BaseQueryObject baseQueryObject);
    DataGrid<PortalVIVO> gridPortalVIVOs(BaseQueryObject baseQueryObject)throws VciBaseException;
    /***
     * æ·»åŠ è¡¨å•/表格
@@ -31,15 +34,47 @@
     * @return
     * @throws VciBaseException
     */
    BaseResult add(PortalVIDTO portalVIDTO) throws VciBaseException;
    BaseResult addSave(PortalVIDTO portalVIDTO) throws VciBaseException;
    /***
     * èŽ·å–å•æ¡æ•°æ®
     * @param id
     * @return viType
     * @throws VciBaseException
     */
    PortalVIVO getPortalVIById(String  id,String viType) throws  PLException;
    /***
     * æ›´æ”¹è¡¨å•/表格
     * @param portalVIDTO
     * @return
     * @throws VciBaseException
     */
    BaseResult edit(PortalVIDTO portalVIDTO) throws VciBaseException;
    BaseResult editSave(PortalVIDTO portalVIDTO) throws VciBaseException;
    /**
     * åˆ é™¤æ•°æ®
     * @param portalVIDTOList
     * @return
     * @throws PLException
     */
    boolean  delete(DeletePortalVIDTOList portalVIDTOList)throws  PLException;
    /**
     * åˆ é™¤æ•°æ®
     * @param ids
     * @return
     * @throws PLException
     */
    boolean  delete(String ids)throws  PLException;
    /**
     * å…‹éš†æ•°æ®
     * @param portalVIDTOList
     * @return
     * @throws PLException
     */
    boolean  clone(ClonePortalVIDTOList portalVIDTOList)throws  Throwable;
    /**
     *查询所有表单或者表格
@@ -76,4 +111,17 @@
     * @return
     */
    public   PortalVI portalVIDTOO2VI(PortalVIDTO portalVIDTO);
    /**
     *  PortalVI转成DTO
     * @param PortalVIS
     * @return
     */
    public List<PortalVIDTO> portalVIO2DTOS(Collection<PortalVI> PortalVIS);
    /***
     * PortalVI转成DTO
     * @param portalVI
     * @return
     */
    public PortalVIDTO  portalVIO2DTO(PortalVI portalVI);
}
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
@@ -1311,8 +1311,8 @@
            String attrPath = attributeService.exportAttributes("btmattr",
                    attributes.stream().collect(Collectors.joining(",")),true);
            //移动属性到链接类型文件夹里面去
            cn.hutool.core.io.FileUtil.move(new File(attrPath), new File(defaultTempFolder),true);
            cn.hutool.core.io.FileUtil.del(attrPath.substring(0,attrPath.lastIndexOf("\\")));
            FileUtil.move(new File(attrPath), new File(defaultTempFolder),true);
            FileUtil.del(attrPath.substring(0,attrPath.lastIndexOf("\\")));
        }catch (IOException e) {
            throw new RuntimeException(e);
        }
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
@@ -5,9 +5,7 @@
import com.vci.corba.common.PLException;
import com.vci.corba.portal.PortalService.GetPagePortalVIArrayByPageInfoResult;
import com.vci.corba.portal.data.PortalVI;
import com.vci.dto.PRMDTO;
import com.vci.dto.PRMItemDTO;
import com.vci.dto.PortalVIDTO;
import com.vci.dto.*;
import com.vci.model.*;
import com.vci.pagemodel.*;
import com.vci.starter.web.exception.VciBaseException;
@@ -22,9 +20,12 @@
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.UITools;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -37,6 +38,10 @@
*/
@Service
public class OsPortalVIServiceImpl implements OsPortalVIServiceI  {
    /**
     * æ—¥å¿—
     */
    private Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * åŠ è½½è‡ªèº«
     */
@@ -72,19 +77,22 @@
        }
        String viName=StringUtils.isBlank(conditionMap.get("viName"))?"":conditionMap.get("viName");
        String viTypeLabel=StringUtils.isBlank(conditionMap.get("viType"))?"":conditionMap.get("viType");
        PortalVIType  portalVIType= PortalVIType.getByLabel(viTypeLabel);
        PortalVIType  portalVIType= PortalVIType.getByName(viTypeLabel);
        Short viType=-1;
        if(portalVIType!=null){
            viType=portalVIType.getIntVal();
        }
        String viTypeFlagLabel=StringUtils.isBlank(conditionMap.get("viTypeFlag"))?"":conditionMap.get("viTypeFlag");
        PortalVITypeFlag portalVITypeFlag= PortalVITypeFlag.getByLabel(viTypeFlagLabel);
        PortalVITypeFlag portalVITypeFlag= PortalVITypeFlag.getByName(viTypeFlagLabel);
        Short viTypeFlag=-1;
        if(portalVITypeFlag!=null){
            viTypeFlag=portalVITypeFlag.getIntVal();
        }
        long pageIndex=baseQueryObject.getPage();
        long pageSize=baseQueryObject.getLimit();
        if(pageSize==-1){
            pageSize=25;
        }
        DataGrid<PortalVIVO> dataGrid = new DataGrid<>();
        try {
            GetPagePortalVIArrayByPageInfoResult pagePortalVIArrayByPageInfoResult= platformClientUtil.getPortalService().getPagePortalVIArrayByPageInfo(typeName,viName,viType,viTypeFlag,pageIndex,pageSize);
@@ -110,9 +118,30 @@
     * @throws PLException
     */
    @Override
    public BaseResult add(PortalVIDTO portalVIDTO) throws VciBaseException {
    public BaseResult addSave(PortalVIDTO portalVIDTO) throws VciBaseException {
        return  savePortalVIDTO(portalVIDTO,false);
    }
    /**
     * æ ¹æ®è¡¨å•id获取具体数据
     * @param id
     * @param viType
     * @return
     * @throws VciBaseException
     */
    @Override
    public PortalVIVO getPortalVIById(String id,String viType) throws PLException {
        VciBaseUtil.alertNotNull(id,"主键为空!");
        String lableName=PortalVIType.Form.getLabel();
        if(PortalVIType.Table.getName()==viType){
            lableName=PortalVIType.Table.getLabel();
        }
        PortalVIVO portalVIVO=new PortalVIVO();
        PortalVI portalVI=  platformClientUtil.getPortalService().getPortalVIById(id);
        portalVIVO=portalVIDOO2VO(portalVI);
        return portalVIVO;
    }
    /***
     * è¡¨å•/表格更改
     * @param portalVIDTO
@@ -120,9 +149,102 @@
     * @throws PLException
     */
    @Override
    public BaseResult edit(PortalVIDTO portalVIDTO) throws VciBaseException {
    public BaseResult editSave(PortalVIDTO portalVIDTO) throws VciBaseException {
        return  savePortalVIDTO(portalVIDTO,true);
    }
    @Override
    public boolean delete(DeletePortalVIDTOList portalVIDTOList) throws PLException {
        if(portalVIDTOList==null||CollectionUtils.isEmpty(portalVIDTOList.getPortalVIDTOList())){
            VciBaseUtil.alertNotNull("请选择要删除的对象!");
        }
        try {
            for(PortalVIDTO portalVIDTO:portalVIDTOList.getPortalVIDTOList()) {
                boolean formFlag = false;
                short viType = portalVIDTO.getViType();
                String typeName = portalVIDTO.getTypeName();
                String viewName = portalVIDTO.getViName();
                String id = portalVIDTO.getId();
                if (viType == PortalVIType.Form.getIntVal()) {
                    // åˆ¤æ–­è¯¥è¡¨å•是否在表格中被引用
                    formFlag = platformClientUtil.getPortalService().judgeDeleteButton(id, typeName);
                    if (formFlag) {
                        throw new Throwable(viewName + "表单已经在表格中被引用,请重新选择要删除的对象!");
                    }
                }
                // åˆ¤æ–­è¯¥è¡¨å•或表格是否在UI定义时被引用
                formFlag = platformClientUtil.getPortalService().judgeUpdateButton(viType, viewName, typeName);
                if (formFlag) {
                    throw new Throwable(viewName + "数据已经被UI组件引用,请重新选择要删除的对象!");
                }
                UITools.getService().deletePortalVIByID(id);
            }
        }catch (Throwable e){
            String exceptionMessage = "删除表单时出现错误,原因:" + VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
            throw  new PLException("100",new String[]{exceptionMessage});
        }
        return true;
    }
    @Override
    public boolean delete(String ids) throws PLException {
        VciBaseUtil.alertNotNull(ids,"主键");
         List<String> idsList=  VciBaseUtil.str2List(ids);
        List<PortalVI> PortalVIList= new ArrayList<>();
        DeletePortalVIDTOList portalVIDTOList=new DeletePortalVIDTOList();
        idsList.stream().forEach(id->{
            PortalVI portalVI= null;
            try {
                portalVI = platformClientUtil.getPortalService().getPortalVIById(id);
                PortalVIList.add(portalVI);
            } catch (PLException e) {
                e.printStackTrace();
            }
        });
        portalVIDTOList.setPortalVIDTOList(portalVIO2DTOS(PortalVIList));
        return delete(portalVIDTOList);
    }
    /**
     * è¡¨å•/表格克隆
     * @param clonePortalVIDTOList
     * @return
     * @throws VciBaseException
     */
    @Override
    public boolean clone(ClonePortalVIDTOList clonePortalVIDTOList) throws VciBaseException {
        if(clonePortalVIDTOList==null||CollectionUtils.isEmpty(clonePortalVIDTOList.getClonePortalVIDTOList())){
            throw  new VciBaseException("请选择要克隆的对象!");
        }
        try {
            for (ClonePortalVIDTO clonedestObject : clonePortalVIDTOList.getClonePortalVIDTOList()) {
                String viName = clonedestObject.getViName();
                PortalVIDTO portalVIDTO = clonedestObject.getOldPortalVIDTO();
                String typeName = clonedestObject.getTypeName();
                short typeFlag = clonedestObject.getTypeFlag();
                if (viName != null) {
                    VciBaseUtil.alertNotNull(viName, "克隆名称不允许为空");
                    PortalVI portalVI = UITools.getService().getPortalVIById(portalVIDTO.getId());
                    portalVI.id = ObjectUtility.getNewObjectID36();
                    portalVI.viName = viName;
                    //如果克隆选择了业务类型则拷贝到新的业务类型下
                    if (StringUtils.isNotBlank(typeName)) {
                        portalVI.typeName = typeName;
                    }
                    if (typeFlag == PortalVITypeFlag.BtmType.getIntVal() || typeFlag == PortalVITypeFlag.LinkType.getIntVal()) {
                        portalVI.typeFlag = typeFlag;
                    }
                    UITools.getService().savePortalVI(portalVI);
                }
            }
        }catch (PLException e){
            throw new VciBaseException("克隆出现异常:"+e.getMessage());
        }
        return true;
    }
    private BaseResult savePortalVIDTO(PortalVIDTO portalVIDTO,boolean isEdit)  {
        boolean _isBtm=false;
@@ -158,7 +280,7 @@
                               throw  new Throwable("该"+labelName+"已经被引用,不能修改名称!");
                           }
                       } catch (PLException e) {
                           throw  new Throwable("查询");
                           throw  new Throwable("查询原有表单出现异常:"+e.getMessage());
                       }
                       if (!portalVI.id.equals(portalVIDTO.getId())) {
                           if (portalVI.viName.equals(portalVIDTO.getViName())) {
@@ -175,48 +297,29 @@
            }else{
                flag=platformClientUtil.getPortalService().judgeUpdateButton(portalVIDTO.getTypeFlag(), portalVIDTO.getViName(), portalVIDTO.getTypeName());
            }
            flag=  saveForm(portalVIDTO,isEdit);
            PortalVI pvi=portalVIDTOO2VI(portalVIDTO);
            if (!isEdit) {
                flag= platformClientUtil.getPortalService().savePortalVI(pvi);
            } else {
                flag= platformClientUtil.getPortalService().updatePortalVI(pvi);
            }
            if(flag){
                return  BaseResult.success("保存"+labelName+"成功!");
            }else{
                new Throwable("保存"+labelName+"失败!");
            }
        } catch (Throwable e) {
           // throw new VciBaseException("保存表单出现异常:"+e.getMessage());
          return    BaseResult.fail("保存"+labelName+"出现异常:"+e.getMessage());
            String exceptionMessage = "保存"+labelName+"出现异常:"+ VciBaseUtil.getExceptionMessage(e);
            logger.error(exceptionMessage);
          return    BaseResult.fail(exceptionMessage);
        }
        return  BaseResult.success("保存"+labelName+"成功!");
    }
    /**
     * è¡¨å•/表格
     * @param portalVIDTO
     * @param isEdit
     * @return
     */
    private boolean saveForm(PortalVIDTO portalVIDTO,boolean isEdit) {
        List<PRMItemDO> prmItemList = new ArrayList<PRMItemDO>();
        try {
            PortalVI pvi=portalVIDTOO2VI(portalVIDTO);
            boolean res=false;
            if (!isEdit) {
                res= platformClientUtil.getPortalService().savePortalVI(pvi);
            } else {
                res= platformClientUtil.getPortalService().updatePortalVI(pvi);
            }
            return res;
        } catch (Throwable e) {
             e.printStackTrace();
                return false;
        }
    }
    @Override
    public Map<String, PortalVIVO> selectAllPortalVIMap() throws VciBaseException {
        return null;
    }
    /**
     * åˆ¤æ–­æ¯é¡µè¡Œæ•°å®šä¹‰æ˜¯å¦æ­£ç¡®
@@ -294,6 +397,22 @@
        });
        return portalVIS;
    }
    /**
     * è¡¨å•的数据对象转换为显示对象
     * @param PortalVIS è¡¨å•的对象
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public List<PortalVIDTO> portalVIO2DTOS(Collection<PortalVI> PortalVIS) {
        List<PortalVIDTO>PortalVIDTOS  = new ArrayList<>();
        Optional.ofNullable(PortalVIS).orElseGet(()->new ArrayList<>()).stream().forEach(PortalVI -> {
            PortalVIDTO PPortalVIDTO = portalVIO2DTO(PortalVI);
            PortalVIDTOS.add(PPortalVIDTO);
        });
        return PortalVIDTOS;
    }
    /**
     * è¡¨å•的数据对象转换为显示对象
@@ -317,7 +436,24 @@
        }
        return portalVI;
    }
    /**
     * è¡¨å•的数据对象转换为显示对象
     * @param portalVI
     * @return
     */
    @Override
    public PortalVIDTO  portalVIO2DTO(PortalVI portalVI) {
        PortalVIDTO portalVIDTO=new PortalVIDTO();
        portalVIDTO.setId(portalVI.id);
        portalVIDTO.setTypeFlag(portalVI.typeFlag);
        portalVIDTO.setTypeName(portalVI.typeName);
        portalVIDTO.setViName(portalVI.viName);
        portalVIDTO.setViType(portalVI.viType);
        short viType =portalVIDTO.getViType();
        PRMDO prmdo=  UITools.getPRM(portalVI.prm);
        portalVIDTO.setPrm(prmDOO2DTOS(prmdo,viType));
        return portalVIDTO;
    }
    /**
     * è¡¨å•数据对象转换
     * @param prmdto
@@ -332,6 +468,20 @@
        return  prmdo;
    }
    /**
     * è¡¨å•数据对象转换
     * @param prmdo
     * @param viType
     * @return
     */
    private PRMDTO prmDOO2DTOS( PRMDO prmdo, short viType) {
        PRMDTO prmdto=new PRMDTO();
        prmdto.setShowCols(prmdo.getShowCols());
        prmdto.setFormQtName(prmdo.getFormQtName());
        prmdto.setPrmItemList(pRMItemDOO2DTOS(prmdo.getPrmItemList(),viType));
        return  prmdto;
    }
    @Override
    public  PortalVIVO portalVIDOO2VO(PortalVI portalVI) {
        PortalVIVO portalVIVO=new PortalVIVO();
@@ -341,8 +491,10 @@
        portalVIVO.setViName(portalVI.viName);
        portalVIVO.setViType(portalVI.viType);
        String  prm= portalVI.prm;
        PRMDO prmdo= UITools.getPRM(prm);
        portalVIVO.setPrm(prmDOO2VOS(prmdo,portalVI.viType));
        if(StringUtils.isNotBlank(prm)) {
            PRMDO prmdo = UITools.getPRM(prm);
            portalVIVO.setPrm(prmDOO2VOS(prmdo, portalVI.viType));
        }
        return portalVIVO;
    }
    private PRMVO prmDOO2VOS(PRMDO prmdo,short viType){
@@ -366,6 +518,15 @@
        Optional.ofNullable(prmItemDTOS).orElseGet(()->new ArrayList<>()).stream().forEach(PRMItemDTO -> {
            PRMItemDO PRMItemDO = pRMItemDTOO2DO(PRMItemDTO,viType);
            portalVIVOS.add(PRMItemDO);
        });
        return portalVIVOS;
    }
    public List<PRMItemDTO> pRMItemDOO2DTOS(Collection<PRMItemDO> prmItemDOS,short viType) {
        List<PRMItemDTO> portalVIVOS = new ArrayList<>();
        Optional.ofNullable(prmItemDOS).orElseGet(()->new ArrayList<>()).stream().forEach(prmItemDO -> {
            PRMItemDTO prmItemDTO = pRMItemDOO2DTO(prmItemDO,viType);
            portalVIVOS.add(prmItemDTO);
        });
        return portalVIVOS;
    }
@@ -501,7 +662,72 @@
        }
        return prmItemVO;
    }
    /**
     * æ•°æ®å¯¹è±¡è½¬æ¢
     * @param prmItemDO æ•°æ®å¯¹è±¡
     * @param viType è¡¨å•类型
     * @return
     */
    private PRMItemDTO pRMItemDOO2DTO(PRMItemDO prmItemDO,short viType) {
        PRMItemDTO prmItemDTO=new PRMItemDTO();
        prmItemDTO.setItemBat(prmItemDO.getItemBat());
        prmItemDTO.setItemCols(prmItemDO.getItemCols());
        prmItemDTO.setItemEQ(prmItemDO.getItemEQ());
        prmItemDTO.setItemDbl(prmItemDO.getItemDbl());
        prmItemDTO.setItemCut(prmItemDO.getItemCut());
        prmItemDTO.setItemOR(prmItemDO.getItemOR());
        prmItemDTO.setItemAddFilter(prmItemDO.getItemAddFilter());
        prmItemDTO.setItemField(prmItemDO.getItemField());
        prmItemDTO.setItemImgWH(prmItemDO.getItemImgWH());
        prmItemDTO.setItemCtrlDisplyCol(prmItemDO.getItemCtrlDisplyCol());//控制显示列
        prmItemDTO.setItemDateFormat(prmItemDO.getItemDateFormat());// æ•°æ®ä¸ºæ—¥æœŸç±»åž‹æ—¶çš„æ ¼å¼åŒ–字符串 å¦‚ yyyy-MM-dd HH:mm:ss
        prmItemDTO.setItemInObj(prmItemDO.getItemInObj());
        prmItemDTO.setItemName(prmItemDO.getItemName());
        prmItemDTO.setItemCustomClass(prmItemDO.getItemCustomClass());//自定义类路径
        prmItemDTO.setItemIsHidden(prmItemDO.getItemIsHidden());
        prmItemDTO.setItemIsEditable(prmItemDO.getItemIsEditable());
        prmItemDTO.setItemIsRequired(prmItemDO.getItemIsRequired());
        prmItemDTO.setItemFieldWidth(prmItemDO.getItemFieldWidth());
        prmItemDTO.setItemTxf(prmItemDO.getItemTxf());
        prmItemDTO.setItemRows(prmItemDO.getItemRows());
        prmItemDTO.setItemHrefConf(prmItemDO.getItemHrefConf());//超链接配置
        prmItemDTO.setItemTips(prmItemDO.getItemTips());
        prmItemDTO.setItemTrim(prmItemDO.getItemTrim());
        prmItemDTO.setItemDateFormat(prmItemDO.getItemDateFormat());
        prmItemDTO.setItemCtrlDisplyCondition(prmItemDO.getItemCtrlDisplyCondition());////控制显示条件
        prmItemDTO.setItemEditableProgram(prmItemDO.getItemEditableProgram());
        prmItemDTO.setItemEditCondition(prmItemDO.getItemEditCondition());
        prmItemDTO.setItemHrefFields(prmItemDO.getItemHrefFields());//超链接字段
        prmItemDTO.setItemValueList(prmItemDO.getItemValueList());
        prmItemDTO.setItemValue(prmItemDO.getItemValue());
        prmItemDTO.setItemStyle(prmItemDO.getItemStyle());
        prmItemDTO.setItemShowExpression(prmItemDO.getItemShowExpression());// æ˜¾ç¤ºè¡¨è¾¾å¼ ${aa}-${bb}
        prmItemDTO.setItemSeniorQueryColsCounts(prmItemDO.getItemSeniorQueryColsCounts());//高级查询各列使用次数
        prmItemDTO.setItemQuerySql(prmItemDO.getItemQuerySql());//高级查询sql
        prmItemDTO.setItemType(prmItemDO.getItemType());//属性基本类型
        prmItemDTO.setItemTypeText(ItemTypeEnum.getTextByValue(prmItemDO.getItemType()));//属性基本类型显示值
        prmItemDTO.setItemScript(prmItemDO.getItemScript());
        prmItemDTO.setItemRight(prmItemDO.getItemRight());
        prmItemDTO.setItemQueryRefFields(prmItemDO.getItemQueryRefFields());//查询关联列
        prmItemDTO.setItemQtName(prmItemDO.getItemQtName());
        prmItemDTO.setItemParentFolderName(prmItemDO.getItemParentFolderName());//父文件夹名称
        prmItemDTO.setItemPageSize(prmItemDO.getItemPageSize());
        prmItemDTO.setItemOutType(prmItemDO.getItemOutType());
        prmItemDTO.setItemOutFields(prmItemDO.getItemOutFields());
        prmItemDTO.setItemListVal(prmItemDO.getItemListVal());//参照值
        prmItemDTO.setItemListTxt(prmItemDO.getItemListTxt());
        prmItemDTO.setItemListTable(prmItemDO.getItemListTable());
        prmItemDTO.setItemKeyFields(prmItemDO.getItemKeyFields());
        prmItemDTO.setItemIsShowFolder(prmItemDO.getItemIsShowFolder());//是否显示文件夹
        prmItemDTO.setItemIsNavigatorExpand(prmItemDO.getItemIsNavigatorExpand());////查询区域显示控制
        prmItemDTO.setItemIsHttpSave(prmItemDO.getItemIsHttpSave());
        prmItemDTO.setItemHttpVolumnPath(prmItemDO.getItemHttpVolumnPath());
        prmItemDTO.setItemHttpPathField(prmItemDO.getItemHttpPathField());
        if(viType==PortalVIType.Table.getIntVal()) {//如果是表格
            initTableConfigDOO2VOData(prmItemDTO,prmItemDO);
        }
        return prmItemDTO;
    }
    /**
     * åˆå§‹åŒ–表格所用特殊字段配置
     * @param prmItemVO
@@ -510,9 +736,9 @@
    private void initTableConfigDOO2VOData(PRMItemVO prmItemVO,PRMItemDO prmItemDO){
        prmItemVO.setItemFieldWidthList(initItemFieldWidthList(prmItemDO.getItemOutFields(),prmItemDO.getItemFieldWidth()));//列显示宽段 itemOutFieldList ç›¸åŒ¹é…
        prmItemVO.setItemSeniorQueryBOS(initItemSeniorQueryBOData(prmItemDO.getItemSeniorQueryCols(),prmItemDO.getItemSeniorQueryColsCounts(),prmItemDO.getItemQuerySql()));//高级查询对象
        List<String> allKeyList= getRefFormVIName(prmItemVO.getItemInObj());
        List<String> itemOutFieldList =VciBaseUtil.str2List(prmItemVO.getItemOutFields());
        List<String> itemKeyFieldList =VciBaseUtil.str2List(prmItemVO.getItemKeyFields());
        List<String> allKeyList= getRefFormVIName(prmItemDO.getItemInObj());
        List<String> itemOutFieldList =VciBaseUtil.str2List(prmItemDO.getItemOutFields());
        List<String> itemKeyFieldList =VciBaseUtil.str2List(prmItemDO.getItemKeyFields());
        List<String> itemSelectoutFieldList= allKeyList.stream().filter(s ->!itemOutFieldList.stream().map(s1 -> s1).collect(Collectors.toList()).contains(s) ).collect(Collectors.toList());
        prmItemVO.setItemSelectoutFieldList(itemSelectoutFieldList);//待选择的属性字段
        prmItemVO.setItemOutFieldList(itemOutFieldList);//需要使用的集合
@@ -525,6 +751,24 @@
     * @param prmItemDTO
     * @param prmItemDO
     */
    private void initTableConfigDOO2VOData(PRMItemDTO prmItemDTO,PRMItemDO prmItemDO){
        prmItemDTO.setItemFieldWidthList(initItemFieldWidthList(prmItemDO.getItemOutFields(),prmItemDO.getItemFieldWidth()));//列显示宽段 itemOutFieldList ç›¸åŒ¹é…
        prmItemDTO.setItemSeniorQueryBOS(initItemSeniorQueryBOData(prmItemDO.getItemSeniorQueryCols(),prmItemDO.getItemSeniorQueryColsCounts(),prmItemDO.getItemQuerySql()));//高级查询对象
        List<String> allKeyList= getRefFormVIName(prmItemDO.getItemInObj());
        List<String> itemOutFieldList =VciBaseUtil.str2List(prmItemDO.getItemOutFields());
        List<String> itemKeyFieldList =VciBaseUtil.str2List(prmItemDO.getItemKeyFields());
        List<String> itemSelectoutFieldList= allKeyList.stream().filter(s ->!itemOutFieldList.stream().map(s1 -> s1).collect(Collectors.toList()).contains(s) ).collect(Collectors.toList());
        prmItemDTO.setItemSelectoutFieldList(itemSelectoutFieldList);//待选择的属性字段
        prmItemDTO.setItemOutFieldList(itemOutFieldList);//需要使用的集合
        List<String> itemSearchFieldList= itemOutFieldList.stream().filter(s ->!itemKeyFieldList.stream().map(s1 -> s1).collect(Collectors.toList()).contains(s) ).collect(Collectors.toList());
        prmItemDTO.setItemSearchFieldList(itemSearchFieldList);//待搜索字段
        prmItemDTO.setItemKeyFieldList(itemKeyFieldList);//搜索字段
    }
    /**
     * åˆå§‹åŒ–表格所用特殊字段配置
     * @param prmItemDTO
     * @param prmItemDO
     */
    private void initTableConfigDTOO2DOData(PRMItemDO prmItemDO,PRMItemDTO prmItemDTO){
        prmItemDO.setItemOutFields(VciBaseUtil.array2String(prmItemDTO.getItemOutFieldList().toArray(new String[]{})));//需要使用的字段
Source/plt-web/plt-web-parent/plt-web/src/main/resources/menuConfig.json
@@ -1,91 +1,141 @@
{
  "hasChildren": true,
  "children": [
    {
      "hasChildren": true,
      "children": [],
      "id": "systemManagmentNode",
      "name": "管理功能模块",
      "parentId": "VCIBaseTreeNode",
      "code": "systemManagmentNode",
      "alias": "system",
      "meta": {
        "keepAlive": false
  "sysModuleNode": {
    "hasChildren": true,
    "children": [
      {
        "hasChildren": true,
        "children": [],
        "id": "systemManagmentNode",
        "name": "管理功能模块",
        "parentId": "VCIBaseTreeNode",
        "code": "systemManagmentNode",
        "alias": "system",
        "meta": {
          "keepAlive": false
        },
        "sort": 2,
        "soruce": "",
        "path": "views/systemModel/mangeModel/index"
      },
      "sort": 2,
      "soruce": "",
      "path": "views/systemModel/mangeModel/index"
      {
        "hasChildren": true,
        "children": [],
        "id": "modelManagmentNode",
        "name": "业务功能模块",
        "parentId": "VCIBaseTreeNode",
        "code": "modelManagmentNode",
        "alias": "model",
        "meta": {
          "keepAlive": false
        },
        "sort": 3,
        "soruce": "",
        "path": "views/systemModel/businessModel/index"
      },
      {
        "hasChildren": true,
        "children": [],
        "id": "operateNode",
        "name": "操作类型管理",
        "parentId": "VCIBaseTreeNode",
        "code": "operateNode",
        "alias": "operate",
        "meta": {
          "keepAlive": false
        },
        "sort": 4,
        "soruce": "",
        "path": "views/systemModel/operateType/index"
      },
      {
        "hasChildren": false,
        "children": [],
        "id": "sysOptionNode",
        "name": "系统配置",
        "parentId": "VCIBaseTreeNode",
        "code": "sysOptionNode",
        "alias": "sysOption",
        "meta": {
          "keepAlive": false
        },
        "sort": 5,
        "soruce": "",
        "path": "views/systemModel/systemConfig/index"
      },
      {
        "hasChildren": false,
        "children": [],
        "id": "sysMonitorNode",
        "name": "系统运行监控",
        "parentId": "VCIBaseTreeNode",
        "code": "sysMonitorNode",
        "alias": "sysMonitor",
        "meta": {
          "keepAlive": false
        },
        "sort": 5,
        "soruce": "",
        "path": "views/systemModel/systemMonitor/index"
      }
    ],
    "id": "VCIBaseTreeNode",
    "name": "系统模块配置",
    "parentId": "systemManagmentNode",
    "code": "rootNode",
    "alias": "root",
    "meta": {
      "keepAlive": false
    },
    {
      "hasChildren": true,
      "children": [],
      "id": "modelManagmentNode",
      "name": "业务功能模块",
      "parentId": "VCIBaseTreeNode",
      "code": "modelManagmentNode",
      "alias": "model",
      "meta": {
        "keepAlive": false
      },
      "sort": 3,
      "soruce": "",
      "path": "views/systemModel/businessModel/index"
    },
    {
      "hasChildren": true,
      "children": [],
      "id": "operateNode",
      "name": "操作类型管理",
      "parentId": "VCIBaseTreeNode",
      "code": "operateNode",
      "alias": "operate",
      "meta": {
        "keepAlive": false
      },
      "sort": 4,
      "soruce": "",
      "path": "views/systemModel/operateType/index"
    },
    {
      "hasChildren": false,
      "children": [],
      "id": "sysOptionNode",
      "name": "系统配置",
      "parentId": "VCIBaseTreeNode",
      "code": "sysOptionNode",
      "alias": "sysOption",
      "meta": {
        "keepAlive": false
      },
      "sort": 5,
      "soruce": "",
      "path": "views/systemModel/systemConfig/index"
    },
    {
      "hasChildren": false,
      "children": [],
      "id": "sysMonitorNode",
      "name": "系统运行监控",
      "parentId": "VCIBaseTreeNode",
      "code": "sysMonitorNode",
      "alias": "sysMonitor",
      "meta": {
        "keepAlive": false
      },
      "sort": 5,
      "soruce": "",
      "path": "views/systemModel/systemMonitor/index"
    }
  ],
  "id": "VCIBaseTreeNode",
  "name": "系统模块配置",
  "parentId": "systemManagmentNode",
  "code": "rootNode",
  "alias": "root",
  "meta": {
    "keepAlive": false
    "sort": 0,
    "soruce": "",
    "path": ""
  },
  "sort": 0,
  "soruce": "",
  "path": ""
  "systemManagmentNode": {
    "hasChildren": true,
    "children": [],
    "childType": -1,
    "id": "systemManagmentNode",
    "name": "管理功能模块",
    "parentId": "VCIBaseTreeNode",
    "code": "systemManagmentNode",
    "alias": "system",
    "meta": {
      "keepAlive": false
    },
    "sort": 2,
    "soruce": "",
    "path": "views/systemModel/mangeModel/index"
  },
  "modelManagmentNode": {
    "hasChildren": true,
    "children": [],
    "childType": -1,
    "id": "modelManagmentNode",
    "name": "业务功能模块",
    "parentId": "VCIBaseTreeNode",
    "code": "modelManagmentNode",
    "alias": "model",
    "meta": {
      "keepAlive": false
    },
    "sort": 3,
    "soruce": "",
    "path": "views/systemModel/businessModel/index"
  },
  "operateNode": {
    "hasChildren": true,
    "children": [],
    "childType": -1,
    "id": "operateNode",
    "name": "操作类型管理",
    "parentId": "VCIBaseTreeNode",
    "code": "operateNode",
    "alias": "operate",
    "meta": {
      "keepAlive": false
    },
    "sort": 4,
    "soruce": "",
    "path": "views/systemModel/operateType/index"
  }
}
Source/plt-web/plt-web-ui/src/api/systemModel/mangeModel/api.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
import request from '@/router/axios';
// åˆ—表查询
export function getSysModelTreeMenuByPID(params) {
  return request({
    url: "/api/hmSysModConfigController/getSysModelTreeMenuByPID",
    method: "get",
    params
  });
}
// æ–°å¢ž
export function addModel(params) {
  return request({
    url: "/api/hmSysModConfigController/addModel",
    method: "post",
    data:params
  });
}
// ä¿®æ”¹
export function updateModel(params) {
  return request({
    url: "/api/hmSysModConfigController/updateModel",
    method: "put",
    data:params
  });
}
// åˆ é™¤
export function delModule(params) {
  return request({
    url: "/api/hmSysModConfigController/delModule",
    method: "delete",
    data:params
  });
}
// å¯¼å‡ºsql
export function exportFunctionSql (params) {
  return request({
    url: '/api/hmSysModConfigController/exportFunctionSql',
    method: 'get',
    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
    responseType: 'blob',
    params
  })
}
// å¢žåŠ æ“ä½œç±»åž‹
export function addOperationType(data) {
  return request({
    url: "/api/hmSysModConfigController/addOperationType",
    method: "post",
    data
  });
}
Source/plt-web/plt-web-ui/src/views/systemModel/businessModel/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,456 @@
<template>
  <el-container>
    <el-aside>
      <basic-container>
        <div style="max-height: calc(100vh - 170px);overflow: auto">
          <avue-tree :key="refresh" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
          <span slot-scope="{ node, data }" class="el-tree-node__label">
           <span style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
                {{ (node || {}).label }}
            </span>
          </span>
          </avue-tree>
        </div>
      </basic-container>
    </el-aside>
    <el-main>
      <basic-container>
        <el-form ref="form" :model="form" label-width="85px" style="height: 79vh">
          <span v-if="form.childType !== 0">
            <el-form-item label="模块名:">
            <el-input v-model="form.name" placeholder="请输入模块名"></el-input>
          </el-form-item>
          <el-form-item label="模块别名:">
            <el-input v-model="form.alias" placeholder="模块别名用来记录日志使用"></el-input>
          </el-form-item>
                <el-form-item label="C/S:">
            <el-input v-model="form.pathC" :rows="3" placeholder="请输入C/S路径" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="B/S:">
            <el-input v-model="form.path" :rows="3" placeholder="请输入B/S路径" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label=".NET:">
            <el-input v-model="form.resourceDotNet" :rows="3" placeholder="请输入.NET" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="Mobile:">
            <el-input v-model="form.resourceMobile" :rows="3" placeholder="请输入Mobile" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="序号:">
            <el-input v-model="form.sort" placeholder="数字,描述该模块在其父模块下的显示顺序"></el-input>
          </el-form-item>
          <el-form-item label="简图:">
            <el-input v-model="form.source"></el-input>
          </el-form-item>
          <el-form-item label="描述:">
            <el-input v-model="form.remark" :rows="3" placeholder="请输入描述" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="是否有效:">
            <el-switch
              v-model="form.isValid"
              active-color="#13ce66"
              inactive-color="#ff4949">
            </el-switch>
            <el-link :underline="false" style="margin-left: 20px" type="danger">不生效(不选择)时,该模块在功能模块授权里不显示</el-link>
          </el-form-item>
          </span>
          <span v-if="form.childType === 0">
            <el-form-item label="名称:">
            <el-input v-model="form.name" :disabled="form.childType === 0" placeholder="请输入名称"></el-input>
            </el-form-item>
            <el-form-item label="标识:">
            <el-input v-model="form.code" :disabled="form.childType === 0" placeholder="请输入标识"></el-input>
            </el-form-item>
            <el-form-item label="别名:">
            <el-input v-model="form.alias" placeholder="请输入别名"></el-input>
            </el-form-item>
            <el-form-item label="编号:">
            <el-input v-model="form.sort" :disabled="form.childType === 0" placeholder="请输入编号"></el-input>
            </el-form-item>
            <el-form-item label="描述:">
            <el-input v-model="form.remark" :disabled="form.childType === 0" placeholder="请输入描述"></el-input>
            </el-form-item>
            <el-form-item label="是否有效:">
            <el-switch
              v-model="form.isValid"
              active-color="#13ce66"
              inactive-color="#ff4949">
            </el-switch>
          </el-form-item>
          </span>
        </el-form>
        <div v-if="form.childType && form.childType !== 0" class="btnBox">
          <el-button v-if="!addStatus" :disabled="mangeShowBtn ? false : !childTypeBtn" icon="el-icon-plus" plain
                     size="small"
                     type="primary" @click="addClickHandler">增加
          </el-button>
          <el-button v-if="addStatus" icon="el-icon-check" plain size="small"
                     type="success" @click="addSaveClickHandler">保存
          </el-button>
          <el-button v-if="!editStatus" :disabled="mangeShowBtn" icon="el-icon-edit" plain size="small" type="primary"
                     @click="editClickHandler">修改
          </el-button>
          <el-button v-if="editStatus" icon="el-icon-check" plain size="small"
                     type="success" @click="editSaveClickHandler">保存
          </el-button>
          <el-button :disabled="mangeShowBtn" icon="el-icon-close" plain size="small" type="danger"
                     @click="delClickHandler">删除
          </el-button>
          <el-button :disabled="mangeShowBtn ? true : childTypeBtn" icon="el-icon-circle-plus-outline" plain
                     size="small"
                     type="primary" @click="addMethodsClickHandler">增加操作类型
          </el-button>
          <el-button v-if="this.form.childType ? mangeShowBtn :true" icon="el-icon-circle-close" plain size="small"
                     type="danger"
                     @click="addClickHandler">删除非系统模块
          </el-button>
          <el-button v-if="this.form.childType ? mangeShowBtn :true" icon="el-icon-circle-close" plain size="small"
                     type="danger"
                     @click="addClickHandler">删除业务模块
          </el-button>
          <el-button :disabled="!mangeShowBtn" icon="el-icon-upload2" plain size="small" type="primary"
                     @click="upLoadClickHandler">导入
          </el-button>
          <el-button :disabled="!mangeShowBtn" icon="el-icon-download" plain size="small" type="primary"
                     @click="exportClickHandler">导出
          </el-button>
          <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="sqlClickExportClick">导出sql
          </el-button>
        </div>
        <div v-if="form.childType === 0" class="btnBox">
          <el-button icon="el-icon-edit" plain size="small" type="primary">修改别名
          </el-button>
          <el-button icon="el-icon-close" plain size="small" type="danger">删除
          </el-button>
        </div>
      </basic-container>
    </el-main>
    <el-dialog
      v-dialogDrag
      :visible.sync="methodsVisble"
      append-to-body="true"
      class="avue-dialog"
      title="操作分类"
      width="60%"
    >
      <avue-crud
        ref="methodsCrud"
        :data="methodsData"
        :option="methodsOption"
        :table-loading="methodsLoading"
        @row-click="rowMethodsClickHandler"
        @selection-change="selectMethodsChange">
      </avue-crud>
      <span slot="footer" class="dialog-footer">
         <el-button @click="methodsVisble = false">取 æ¶ˆ</el-button>
         <el-button type="primary" @click="methodsSaveClickHandler">保 å­˜</el-button>
        </span>
    </el-dialog>
  </el-container>
</template>
<script>
//管理功能模块
import {
  getSysModelTreeMenuByPID,
  addModel,
  updateModel,
  delModule,
  exportFunctionSql,
  addOperationType
} from "@/api/systemModel/mangeModel/api"
import func from "@/util/func";
import basicOption from "@/util/basic-option";
export default {
  name: "index",
  data() {
    return {
      lastIndex: null,
      methodsList: [],
      methodsData: [],
      methodsOption: {
        ...basicOption,
        addBtn: false,
        menu: false,
        height: 500,
        column: [
          {
            label: '操作分类',
            prop: 'name',
            sortable: true,
          }
        ]
      },
      methodsLoading: false,
      methodsVisble: false,
      defalutName: ['name', 'alias', 'pathC', 'path', 'resourceDotNet', 'resourceMobile', 'sort', 'source', 'remark', 'code'],
      refresh: Math.random(),
      addStatus: false,
      editStatus: false,
      nodeRow: {},
      form: {},
      treeData: [],
      treeOption: {
        height: 'auto',
        menu: false,
        addBtn: false,
        defaultExpandAll: false,
        props: {
          label: 'name',
          value: 'id',
          children: 'children',
        },
        lazy: true,
        treeLoad: (node, resolve) => {
          const params = {
            parentId: node.level === 0 ? "modelManagmentNode" : node.data.id,
            modeType: node.level === 0 ? "firstNode" : node.data.modeType,
          }
          getSysModelTreeMenuByPID(params).then(res => {
            resolve(res.data.data.map(item => {
              return {
                ...item,
                id: item.id,
                name: item.name,
                leaf: !item.hasChildren
              }
            }))
          })
        }
      },
    }
  },
  created() {
  },
  computed: {
    /**
     * childType
     * ä¸º-1   å…¨éƒ¨æŒ‰é’®å±•示 ç¦ç”¨ä¿®æ”¹ åˆ é™¤ å¢žåŠ æ“ä½œç±»åž‹
     * ä¸ä¸º-1 éšè— åˆ é™¤éžç³»ç»Ÿæ¨¡å— åˆ é™¤ä¸šåŠ¡æ¨¡å—
     * ä¸º1时 ç¦ç”¨æ“ä½œç±»åž‹ã€å¯¼å…¥ã€å¯¼å‡º
     * ä¸º2时 ç¦ç”¨å¢žåŠ  å¯¼å…¥ å¯¼å‡º
     * mangeShowBtn ä¸º true è¯´æ˜Žæ˜¯é¡¶å±‚节点 å…¨éƒ¨æŒ‰é’®å±•示 ç¦ç”¨ä¿®æ”¹ åˆ é™¤ å¢žåŠ æ“ä½œç±»åž‹
     * @returns {Number}
     */
    mangeShowBtn() {
      return this.form.childType === -1;
    },
    childTypeBtn() {
      return this.form.childType === 1;
    }
  },
  methods: {
    // æ ‘行点击
    nodeClick(row) {
      console.log(row.childType);
      this.form = {...row};
      this.nodeRow = {...row};
      this.addStatus = false;
      this.editStatus = false;
    },
    // æ–°å¢žæŒ‰é’®
    addClickHandler() {
      this.resetFormValue();
      this.addStatus = true;
      this.editStatus = false;
    },
    // æ¸…空表单绑定值
    resetFormValue() {
      this.defalutName.forEach(key => {
        this.form[key] = null;
      })
      this.form.isValid = false;
    },
    // æ–°å¢žä¿å­˜æŒ‰é’®
    addSaveClickHandler() {
      if (!this.form.name) {
        this.$message.error('模块名不能为空');
        return
      }
      if (this.form.name.length > 128) {
        this.$message.error('模块名长度超过128!');
        return
      }
      if (this.form.remark && this.form.remark.length > 255) {
        this.$message.error('描述长度超过255!');
        return
      }
      if (this.form.resourceDotNet && this.form.resourceDotNet.length > 255) {
        this.$message.error('.NET标识长度不能255!');
        return
      }
      if (this.form.pathC && this.form.pathC.length > 255) {
        this.$message.error('C/S标识长度不能255!');
        return
      }
      if (this.form.resourceMobile && this.form.resourceMobile.length > 255) {
        this.$message.error('Mobile标识长度不能255!');
        return
      }
      this.form.parentId = this.form.id;
      addModel(this.form).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.msg);
          this.addStatus = false;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
        }
      })
    },
    // ä¿®æ”¹æŒ‰é’®
    editClickHandler() {
      console.log(this.form);
      this.editStatus = true;
      this.addStatus = false;
    },
    // ä¿®æ”¹ä¿å­˜
    editSaveClickHandler() {
      if (!this.form.name) {
        this.$message.error('模块名不能为空');
        return
      }
      if (this.form.name.length > 128) {
        this.$message.error('模块名长度超过128!');
        return
      }
      if (this.form.remark && this.form.remark.length > 255) {
        this.$message.error('描述长度超过255!');
        return
      }
      if (this.form.resourceDotNet && this.form.resourceDotNet.length > 255) {
        this.$message.error('.NET标识长度不能255!');
        return
      }
      if (this.form.pathC && this.form.pathC.length > 255) {
        this.$message.error('C/S标识长度不能255!');
        return
      }
      if (this.form.resourceMobile && this.form.resourceMobile.length > 255) {
        this.$message.error('Mobile标识长度不能255!');
        return
      }
      updateModel(this.form).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.msg);
          this.editStatus = false;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
        }
      })
    },
    // åˆ é™¤æŒ‰é’®
    delClickHandler() {
      this.$confirm('您确定要删除所选择的数据吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        delModule(this.form).then(res => {
          console.log(res);
          if (res.data.code === 200) {
            this.$message.success(res.data.msg);
            this.resetFormValue();
            this.addStatus = false;
            this.editStatus = false;
            this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          }
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // å¯¼å‡ºsql
    sqlClickExportClick() {
      exportFunctionSql({isFunction: true}).then(res => {
        func.downloadFileByBlobHandler(res);
        this.$message.success('导出成功');
      }).catch(err => {
        this.$message.error(err);
      });
    },
    // æ“ä½œåˆ†ç±»å¤šé€‰
    selectMethodsChange(list) {
      this.methodsList = list;
    },
    // å¢žåŠ æ“ä½œç±»åž‹
    addMethodsClickHandler() {
      this.methodsLoading = true;
      getSysModelTreeMenuByPID({parentId: 'sysOptionNode'}).then(res => {
        if (res.data.code === 200) {
          this.methodsVisble = true;
          const data = res.data.data[0].children;
          this.methodsData = data;
          this.methodsLoading = false;
        }
      })
    },
    // å¢žåŠ æ“ä½œç±»åž‹ä¿å­˜
    methodsSaveClickHandler() {
      let list = this.methodsList.map(item => {
        return {
          funcId: this.nodeRow.id,
          operId: item.id,
          operName: item.name,
          operIndentify: item.code,
          operAlias: item.alias,
          operDesc: item.remark
        }
      })
      addOperationType(list).then(res => {
        console.log(res)
        if (res.data.code === 200) {
          this.methodsVisble = false;
          this.$message.success(res.data.msg);
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.resetFormValue();
          this.form.childType = null;
        }
      })
    },
    // ç‚¹å‡»è¡Œ
    rowMethodsClickHandler(row) {
      func.rowClickHandler(
        row,
        this.$refs.methodsCrud,
        this.lastIndex,
        (newIndex) => {
          this.lastIndex = newIndex;
        },
        () => {
          this.methodsList = [];
        }
      );
    },
  }
}
</script>
<style lang="scss" scoped>
::v-deep {
  .el-form-item .el-select {
    width: 100%;
  }
}
.btnBox {
  display: flex;
  justify-content: center;
}
</style>
Source/plt-web/plt-web-ui/src/views/systemModel/mangeModel/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,456 @@
<template>
  <el-container>
    <el-aside>
      <basic-container>
        <div style="max-height: calc(100vh - 170px);overflow: auto">
          <avue-tree :key="refresh" ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
          <span slot-scope="{ node, data }" class="el-tree-node__label">
           <span style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
                {{ (node || {}).label }}
            </span>
          </span>
          </avue-tree>
        </div>
      </basic-container>
    </el-aside>
    <el-main>
      <basic-container>
        <el-form ref="form" :model="form" label-width="85px" style="height: 79vh">
          <span v-if="form.childType !== 0">
            <el-form-item label="模块名:">
            <el-input v-model="form.name" placeholder="请输入模块名"></el-input>
          </el-form-item>
          <el-form-item label="模块别名:">
            <el-input v-model="form.alias" placeholder="模块别名用来记录日志使用"></el-input>
          </el-form-item>
                <el-form-item label="C/S:">
            <el-input v-model="form.pathC" :rows="3" placeholder="请输入C/S路径" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="B/S:">
            <el-input v-model="form.path" :rows="3" placeholder="请输入B/S路径" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label=".NET:">
            <el-input v-model="form.resourceDotNet" :rows="3" placeholder="请输入.NET" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="Mobile:">
            <el-input v-model="form.resourceMobile" :rows="3" placeholder="请输入Mobile" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="序号:">
            <el-input v-model="form.sort" placeholder="数字,描述该模块在其父模块下的显示顺序"></el-input>
          </el-form-item>
          <el-form-item label="简图:">
            <el-input v-model="form.source"></el-input>
          </el-form-item>
          <el-form-item label="描述:">
            <el-input v-model="form.remark" :rows="3" placeholder="请输入描述" type="textarea"></el-input>
          </el-form-item>
          <el-form-item label="是否有效:">
            <el-switch
              v-model="form.isValid"
              active-color="#13ce66"
              inactive-color="#ff4949">
            </el-switch>
            <el-link :underline="false" style="margin-left: 20px" type="danger">不生效(不选择)时,该模块在功能模块授权里不显示</el-link>
          </el-form-item>
          </span>
          <span v-if="form.childType === 0">
            <el-form-item label="名称:">
            <el-input v-model="form.name" :disabled="form.childType === 0" placeholder="请输入名称"></el-input>
            </el-form-item>
            <el-form-item label="标识:">
            <el-input v-model="form.code" :disabled="form.childType === 0" placeholder="请输入标识"></el-input>
            </el-form-item>
            <el-form-item label="别名:">
            <el-input v-model="form.alias" placeholder="请输入别名"></el-input>
            </el-form-item>
            <el-form-item label="编号:">
            <el-input v-model="form.sort" :disabled="form.childType === 0" placeholder="请输入编号"></el-input>
            </el-form-item>
            <el-form-item label="描述:">
            <el-input v-model="form.remark" :disabled="form.childType === 0" placeholder="请输入描述"></el-input>
            </el-form-item>
            <el-form-item label="是否有效:">
            <el-switch
              v-model="form.isValid"
              active-color="#13ce66"
              inactive-color="#ff4949">
            </el-switch>
          </el-form-item>
          </span>
        </el-form>
        <div v-if="form.childType && form.childType !== 0" class="btnBox">
          <el-button v-if="!addStatus" :disabled="mangeShowBtn ? false : !childTypeBtn" icon="el-icon-plus" plain
                     size="small"
                     type="primary" @click="addClickHandler">增加
          </el-button>
          <el-button v-if="addStatus" icon="el-icon-check" plain size="small"
                     type="success" @click="addSaveClickHandler">保存
          </el-button>
          <el-button v-if="!editStatus" :disabled="mangeShowBtn" icon="el-icon-edit" plain size="small" type="primary"
                     @click="editClickHandler">修改
          </el-button>
          <el-button v-if="editStatus" icon="el-icon-check" plain size="small"
                     type="success" @click="editSaveClickHandler">保存
          </el-button>
          <el-button :disabled="mangeShowBtn" icon="el-icon-close" plain size="small" type="danger"
                     @click="delClickHandler">删除
          </el-button>
          <el-button :disabled="mangeShowBtn ? true : childTypeBtn" icon="el-icon-circle-plus-outline" plain
                     size="small"
                     type="primary" @click="addMethodsClickHandler">增加操作类型
          </el-button>
          <el-button v-if="this.form.childType ? mangeShowBtn :true" icon="el-icon-circle-close" plain size="small"
                     type="danger"
                     @click="addClickHandler">删除非系统模块
          </el-button>
          <el-button v-if="this.form.childType ? mangeShowBtn :true" icon="el-icon-circle-close" plain size="small"
                     type="danger"
                     @click="addClickHandler">删除业务模块
          </el-button>
          <el-button :disabled="!mangeShowBtn" icon="el-icon-upload2" plain size="small" type="primary"
                     @click="upLoadClickHandler">导入
          </el-button>
          <el-button :disabled="!mangeShowBtn" icon="el-icon-download" plain size="small" type="primary"
                     @click="exportClickHandler">导出
          </el-button>
          <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="sqlClickExportClick">导出sql
          </el-button>
        </div>
        <div v-if="form.childType === 0" class="btnBox">
          <el-button icon="el-icon-edit" plain size="small" type="primary">修改别名
          </el-button>
          <el-button icon="el-icon-close" plain size="small" type="danger">删除
          </el-button>
        </div>
      </basic-container>
    </el-main>
    <el-dialog
      v-dialogDrag
      :visible.sync="methodsVisble"
      append-to-body="true"
      class="avue-dialog"
      title="操作分类"
      width="60%"
    >
      <avue-crud
        ref="methodsCrud"
        :data="methodsData"
        :option="methodsOption"
        :table-loading="methodsLoading"
        @row-click="rowMethodsClickHandler"
        @selection-change="selectMethodsChange">
      </avue-crud>
      <span slot="footer" class="dialog-footer">
         <el-button @click="methodsVisble = false">取 æ¶ˆ</el-button>
         <el-button type="primary" @click="methodsSaveClickHandler">保 å­˜</el-button>
        </span>
    </el-dialog>
  </el-container>
</template>
<script>
//管理功能模块
import {
  getSysModelTreeMenuByPID,
  addModel,
  updateModel,
  delModule,
  exportFunctionSql,
  addOperationType
} from "@/api/systemModel/mangeModel/api"
import func from "@/util/func";
import basicOption from "@/util/basic-option";
export default {
  name: "index",
  data() {
    return {
      lastIndex: null,
      methodsList: [],
      methodsData: [],
      methodsOption: {
        ...basicOption,
        addBtn: false,
        menu: false,
        height: 500,
        column: [
          {
            label: '操作分类',
            prop: 'name',
            sortable: true,
          }
        ]
      },
      methodsLoading: false,
      methodsVisble: false,
      defalutName: ['name', 'alias', 'pathC', 'path', 'resourceDotNet', 'resourceMobile', 'sort', 'source', 'remark', 'code'],
      refresh: Math.random(),
      addStatus: false,
      editStatus: false,
      nodeRow: {},
      form: {},
      treeData: [],
      treeOption: {
        height: 'auto',
        menu: false,
        addBtn: false,
        defaultExpandAll: false,
        props: {
          label: 'name',
          value: 'id',
          children: 'children',
        },
        lazy: true,
        treeLoad: (node, resolve) => {
          const params = {
            parentId: node.level === 0 ? "systemManagmentNode" : node.data.id,
            modeType: node.level === 0 ? "firstNode" : node.data.modeType,
          }
          getSysModelTreeMenuByPID(params).then(res => {
            resolve(res.data.data.map(item => {
              return {
                ...item,
                id: item.id,
                name: item.name,
                leaf: !item.hasChildren
              }
            }))
          })
        }
      },
    }
  },
  created() {
  },
  computed: {
    /**
     * childType
     * ä¸º-1   å…¨éƒ¨æŒ‰é’®å±•示 ç¦ç”¨ä¿®æ”¹ åˆ é™¤ å¢žåŠ æ“ä½œç±»åž‹
     * ä¸ä¸º-1 éšè— åˆ é™¤éžç³»ç»Ÿæ¨¡å— åˆ é™¤ä¸šåŠ¡æ¨¡å—
     * ä¸º1时 ç¦ç”¨æ“ä½œç±»åž‹ã€å¯¼å…¥ã€å¯¼å‡º
     * ä¸º2时 ç¦ç”¨å¢žåŠ  å¯¼å…¥ å¯¼å‡º
     * mangeShowBtn ä¸º true è¯´æ˜Žæ˜¯é¡¶å±‚节点 å…¨éƒ¨æŒ‰é’®å±•示 ç¦ç”¨ä¿®æ”¹ åˆ é™¤ å¢žåŠ æ“ä½œç±»åž‹
     * @returns {Number}
     */
    mangeShowBtn() {
      return this.form.childType === -1;
    },
    childTypeBtn() {
      return this.form.childType === 1;
    }
  },
  methods: {
    // æ ‘行点击
    nodeClick(row) {
      console.log(row.childType);
      this.form = {...row};
      this.nodeRow = {...row};
      this.addStatus = false;
      this.editStatus = false;
    },
    // æ–°å¢žæŒ‰é’®
    addClickHandler() {
      this.resetFormValue();
      this.addStatus = true;
      this.editStatus = false;
    },
    // æ¸…空表单绑定值
    resetFormValue() {
      this.defalutName.forEach(key => {
        this.form[key] = null;
      })
      this.form.isValid = false;
    },
    // æ–°å¢žä¿å­˜æŒ‰é’®
    addSaveClickHandler() {
      if (!this.form.name) {
        this.$message.error('模块名不能为空');
        return
      }
      if (this.form.name.length > 128) {
        this.$message.error('模块名长度超过128!');
        return
      }
      if (this.form.remark && this.form.remark.length > 255) {
        this.$message.error('描述长度超过255!');
        return
      }
      if (this.form.resourceDotNet && this.form.resourceDotNet.length > 255) {
        this.$message.error('.NET标识长度不能255!');
        return
      }
      if (this.form.pathC && this.form.pathC.length > 255) {
        this.$message.error('C/S标识长度不能255!');
        return
      }
      if (this.form.resourceMobile && this.form.resourceMobile.length > 255) {
        this.$message.error('Mobile标识长度不能255!');
        return
      }
      this.form.parentId = this.form.id;
      addModel(this.form).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.msg);
          this.addStatus = false;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
        }
      })
    },
    // ä¿®æ”¹æŒ‰é’®
    editClickHandler() {
      console.log(this.form);
      this.editStatus = true;
      this.addStatus = false;
    },
    // ä¿®æ”¹ä¿å­˜
    editSaveClickHandler() {
      if (!this.form.name) {
        this.$message.error('模块名不能为空');
        return
      }
      if (this.form.name.length > 128) {
        this.$message.error('模块名长度超过128!');
        return
      }
      if (this.form.remark && this.form.remark.length > 255) {
        this.$message.error('描述长度超过255!');
        return
      }
      if (this.form.resourceDotNet && this.form.resourceDotNet.length > 255) {
        this.$message.error('.NET标识长度不能255!');
        return
      }
      if (this.form.pathC && this.form.pathC.length > 255) {
        this.$message.error('C/S标识长度不能255!');
        return
      }
      if (this.form.resourceMobile && this.form.resourceMobile.length > 255) {
        this.$message.error('Mobile标识长度不能255!');
        return
      }
      updateModel(this.form).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.msg);
          this.editStatus = false;
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
        }
      })
    },
    // åˆ é™¤æŒ‰é’®
    delClickHandler() {
      this.$confirm('您确定要删除所选择的数据吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        delModule(this.form).then(res => {
          console.log(res);
          if (res.data.code === 200) {
            this.$message.success(res.data.msg);
            this.resetFormValue();
            this.addStatus = false;
            this.editStatus = false;
            this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          }
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // å¯¼å‡ºsql
    sqlClickExportClick() {
      exportFunctionSql({isFunction: true}).then(res => {
        func.downloadFileByBlobHandler(res);
        this.$message.success('导出成功');
      }).catch(err => {
        this.$message.error(err);
      });
    },
    // æ“ä½œåˆ†ç±»å¤šé€‰
    selectMethodsChange(list) {
      this.methodsList = list;
    },
    // å¢žåŠ æ“ä½œç±»åž‹
    addMethodsClickHandler() {
      this.methodsLoading = true;
      getSysModelTreeMenuByPID({parentId: 'sysOptionNode'}).then(res => {
        if (res.data.code === 200) {
          this.methodsVisble = true;
          const data = res.data.data[0].children;
          this.methodsData = data;
          this.methodsLoading = false;
        }
      })
    },
    // å¢žåŠ æ“ä½œç±»åž‹ä¿å­˜
    methodsSaveClickHandler() {
      let list = this.methodsList.map(item => {
        return {
          funcId: this.nodeRow.id,
          operId: item.id,
          operName: item.name,
          operIndentify: item.code,
          operAlias: item.alias,
          operDesc: item.remark
        }
      })
      addOperationType(list).then(res => {
        console.log(res)
        if (res.data.code === 200) {
          this.methodsVisble = false;
          this.$message.success(res.data.msg);
          this.refresh = Math.random(); // åˆ·æ–°å·¦ä¾§æ ‘
          this.resetFormValue();
          this.form.childType = null;
        }
      })
    },
    // ç‚¹å‡»è¡Œ
    rowMethodsClickHandler(row) {
      func.rowClickHandler(
        row,
        this.$refs.methodsCrud,
        this.lastIndex,
        (newIndex) => {
          this.lastIndex = newIndex;
        },
        () => {
          this.methodsList = [];
        }
      );
    },
  }
}
</script>
<style lang="scss" scoped>
::v-deep {
  .el-form-item .el-select {
    width: 100%;
  }
}
.btnBox {
  display: flex;
  justify-content: center;
}
</style>
Source/plt-web/plt-web-ui/src/views/systemModel/operateType/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,189 @@
<template>
  <el-container>
    <el-aside>
      <basic-container>
        <div style="max-height: calc(100vh - 170px);overflow: auto">
          <avue-tree ref="tree" :data="treeData" :option="treeOption" @node-click="nodeClick">
          <span slot-scope="{ node, data }" class="el-tree-node__label">
           <span style="font-size: 15px">
              <i class="el-icon-s-promotion"></i>
                {{ (node || {}).label }}
            </span>
          </span>
          </avue-tree>
        </div>
      </basic-container>
    </el-aside>
    <el-main>
      <basic-container>
        <el-form ref="form" :model="form" label-width="85px" style="height: 79vh">
          <el-form-item label="名称:">
            <el-input v-model="form.name" placeholder="请输入名称"></el-input>
          </el-form-item>
          <el-form-item label="标识:">
            <el-input v-model="form.code" placeholder="请输入标识"></el-input>
          </el-form-item>
          <el-form-item label="别名:">
            <el-input v-model="form.alias" placeholder="请输入别名"></el-input>
          </el-form-item>
          <el-form-item label="编号:">
            <el-input v-model="form.sort" placeholder="请输入编号"></el-input>
          </el-form-item>
          <el-form-item label="描述:">
            <el-input v-model="form.remark" placeholder="请输入描述"></el-input>
          </el-form-item>
        </el-form>
        <div class="btnBox">
          <el-button v-if="!addStatus" :disabled="mangeShowBtn ? false : !childTypeBtn" icon="el-icon-plus" plain
                     size="small"
                     type="primary" @click="addClickHandler">增加
          </el-button>
          <el-button v-if="addStatus" icon="el-icon-check" plain size="small"
                     type="success" @click="addSaveClickHandler">保存
          </el-button>
          <el-button :disabled="mangeShowBtn" icon="el-icon-edit" plain size="small" type="primary"
                     @click="addClickHandler">修改
          </el-button>
          <el-button :disabled="mangeShowBtn" icon="el-icon-close" plain size="small" type="danger"
                     @click="addClickHandler">删除
          </el-button>
          <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="upLoadClickHandler">导入sql
          </el-button>
        </div>
      </basic-container>
    </el-main>
  </el-container>
</template>
<script>
//管理功能模块
import {getSysModelTreeMenuByPID, addModel} from "@/api/systemModel/mangeModel/api"
export default {
  name: "index",
  data() {
    return {
      addStatus: false,
      nodeRow: {},
      form: {},
      treeData: [],
      treeOption: {
        height: 'auto',
        menu: false,
        addBtn: false,
        defaultExpandAll: false,
        props: {
          label: 'name',
          value: 'id',
          children: 'children',
        },
        lazy: true,
        treeLoad: (node, resolve) => {
          const params = {
            parentId: node.level === 0 ? "operateNode" : node.data.id,
            modeType: node.level === 0 ? "firstNode" : node.data.modeType,
          }
          getSysModelTreeMenuByPID(params).then(res => {
            resolve(res.data.data.map(item => {
              return {
                ...item,
                id: item.id,
                name: item.name,
                leaf: !item.hasChildren
              }
            }))
          })
        }
      },
    }
  },
  created() {
  },
  computed: {
    /**
     * childType
     * ä¸º-1   å…¨éƒ¨æŒ‰é’®å±•示 ç¦ç”¨ä¿®æ”¹ åˆ é™¤ å¢žåŠ æ“ä½œç±»åž‹
     * ä¸ä¸º-1 éšè— åˆ é™¤éžç³»ç»Ÿæ¨¡å— åˆ é™¤ä¸šåŠ¡æ¨¡å—
     * ä¸º1时 ç¦ç”¨æ“ä½œç±»åž‹ã€å¯¼å…¥ã€å¯¼å‡º
     * ä¸º2时 ç¦ç”¨å¢žåŠ  å¯¼å…¥ å¯¼å‡º
     * mangeShowBtn ä¸º true è¯´æ˜Žæ˜¯é¡¶å±‚节点 å…¨éƒ¨æŒ‰é’®å±•示 ç¦ç”¨ä¿®æ”¹ åˆ é™¤ å¢žåŠ æ“ä½œç±»åž‹
     * @returns {Number}
     */
    mangeShowBtn() {
      return this.form.childType === -1;
    },
    childTypeBtn() {
      return this.form.childType === 1;
    }
  },
  methods: {
    // æ ‘行点击
    nodeClick(row) {
      console.log(row);
      this.form = {...row};
      this.nodeRow = {...row};
      this.addStatus = false;
    },
    // æ–°å¢žæŒ‰é’®
    addClickHandler() {
      for (const key in this.form) {
        if (this.form.hasOwnProperty(key)) {
          this.form[key] = null;
        }
      }
      this.addStatus = true;
    },
    // ä¿å­˜æŒ‰é’®
    addSaveClickHandler() {
      console.log(this.form)
      if (!this.form.name) {
        this.$message.error('模块名不能为空');
        return
      }
      if (this.form.name.length > 128) {
        this.$message.error('模块名长度超过128!');
        return
      }
      if (this.form.remark && this.form.remark.length > 255) {
        this.$message.error('描述长度超过255!');
        return
      }
      if (this.form.resourceDotNet && this.form.resourceDotNet.length > 255) {
        this.$message.error('.NET标识长度不能255!');
        return
      }
      if (this.form.pathc && this.form.pathc.length > 255) {
        this.$message.error('C/S标识长度不能255!');
        return
      }
      if (this.form.resourceMobile && this.form.resourceMobile.length > 255) {
        this.$message.error('Mobile标识长度不能255!');
        return
      }
      console.log(this.nodeRow);
      this.form.parentId = this.nodeRow.id;
      this.form.modeType = this.nodeRow.modeType;
      addModel(this.form).then(res => {
        console.log(res)
        this.addStatus = false;
      })
    }
  }
}
</script>
<style lang="scss" scoped>
::v-deep {
  .el-form-item .el-select {
    width: 100%;
  }
}
.btnBox {
  display: flex;
  justify-content: center;
}
</style>
Source/plt-web/plt-web-ui/src/views/systemModel/systemConfig/index.vue
Source/plt-web/plt-web-ui/src/views/systemModel/systemMonitor/index.vue
Source/plt-web/plt-web-ui/src/views/systemModule/businessModel/index.vue
ÎļþÒÑɾ³ý
Source/plt-web/plt-web-ui/src/views/systemModule/mangeModel/index.vue
ÎļþÒÑɾ³ý
Source/plt-web/plt-web-ui/src/views/systemModule/operateType/index.vue
ÎļþÒÑɾ³ý