Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java
@@ -4,25 +4,21 @@
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.vci.client.common.providers.ServiceProvider;
import com.vci.corba.common.PLException;
import com.vci.corba.framework.data.RoleRightInfo;
import com.vci.corba.portal.data.*;
import com.vci.pagemodel.*;
import com.vci.starter.web.annotation.log.VciUnLog;
import com.vci.starter.web.exception.VciBaseException;
import com.vci.starter.web.util.BeanUtil;
import com.vci.starter.web.util.LangBaseUtil;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.starter.web.util.VciDateUtil;
import com.vci.starter.web.util.*;
import com.vci.starter.web.util.Lcm.Func;
import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
import com.vci.web.enumpck.UIComponentDisplayTypeEnum;
import com.vci.web.enumpck.UIComponentTypeEnum;
import com.vci.web.enumpck.UIFieldTypeEnum;
import com.vci.web.enumpck.UILayoutAreaTypeEnum;
import com.vci.web.pageModel.*;
import com.vci.web.service.OsAttributeServiceI;
import com.vci.web.service.OsBtmServiceI;
import com.vci.web.service.UIEngineServiceI;
import com.vci.web.service.WebBoServiceI;
import com.vci.web.other.AllActionThreadLocal;
import com.vci.web.service.*;
import com.vci.web.util.PlatformClientUtil;
import com.vci.web.util.WebUtil;
import com.vci.web.xmlmodel.UIComponentDefineXO;
@@ -39,7 +35,7 @@
import java.util.*;
import java.util.stream.Collectors;
import static com.vci.web.constant.EnumIdConstant.LC_STATUS_SUBFIX;
import static com.vci.constant.EnumIdConstant.LC_STATUS_SUBFIX;
/**
 * UI引擎服务,以前平台封装到action里的,
@@ -85,10 +81,16 @@
   private OsBtmServiceI btmService;
   /**
    * 业务类型的服务
    * 属性的服务
    */
   @Autowired
   private WebBoServiceI boService;
   private OsAttributeServiceI attrService;
   /**
    * UI定义管理服务
    */
   @Autowired
   private UIManagerServiceI uiManagerServiceI;
   /**
    * 表单的字段类型映射
@@ -131,8 +133,7 @@
   public void checkInvalidXmlVI() {
      PortalVI[] portalVIS = null;
      try {
         portalVIS = ServiceProvider.getUIService().getAllPortalVI();
         // portalVIS = platformClientUtil.getPortalService().getAllPortalVI();
         portalVIS = platformClientUtil.getUIService().getAllPortalVI();
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
@@ -156,7 +157,7 @@
   public List<UIFormDefineVO> selectAllForm() {
      PortalVI[] portalVIS = null;
      try {
         portalVIS = ServiceProvider.getUIService().getAllPortalVI();
         portalVIS = platformClientUtil.getUIService().getAllPortalVI();
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
@@ -319,7 +320,13 @@
               //说明是链接类型
               field = field.substring("t_oid.".length());
            }
            OsAttributeVO attributeVO = attributeService.getAttr(field);
//            OsAttributeVO attributeVO = attributeService.getAttr(field);
            OsAttributeVO attributeVO = null;
            try {
               attributeVO = attributeService.attributeDO2VO(platformClientUtil.getAttributeService().getAttributeDefByName(field));
            } catch (PLException e) {
               throw new RuntimeException(e);
            }
            UIFormReferVO referVO = new UIFormReferVO();
            if(attributeVO !=null && StringUtils.isNotBlank(attributeVO.getBtmTypeId())
                  && StringUtils.isBlank(itemXO.getRefer())
@@ -402,16 +409,13 @@
      if(StringUtils.isBlank(btmId) || StringUtils.isBlank(id)){
         return null;
      }
      if(!QUERY_BY_CACHE){
         PortalVI portalVI = null;
         try {
            portalVI = ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
         } catch (PLException vciError) {
            throw WebUtil.getVciBaseException(vciError);
         }
         return formDO2VO(portalVI);
      PortalVI portalVI = null;
      try {
         portalVI = platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
      return self.selectAllFormMap().getOrDefault(btmId.toLowerCase()+SEP+id.toLowerCase(),null);
      return formDO2VO(portalVI);
   }
   /**
@@ -447,7 +451,7 @@
   public List<UITableDefineVO> selectAllTable() {
      PortalVI[] portalVIS = null;
      try {
         portalVIS = ServiceProvider.getUIService().getAllPortalVI();
         portalVIS = platformClientUtil.getUIService().getAllPortalVI();
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
@@ -477,7 +481,12 @@
   public List<UITableDefineVO> tableDO2VOs(Collection<PortalVI> prms, boolean queryDetail) {
      List<UITableDefineVO> tableDefineVOList = new ArrayList<>();
      Optional.ofNullable(prms).orElseGet(()->new ArrayList<PortalVI>()).stream().forEach(portal->{
         UITableDefineVO defineVO = tableDO2VO(portal,queryDetail);
         UITableDefineVO defineVO = null;
         try {
            defineVO = tableDO2VO(portal,queryDetail,null);
         } catch (PLException e) {
            throw new RuntimeException(e);
         }
         tableDefineVOList.add(defineVO);
      });
      return tableDefineVOList;
@@ -492,7 +501,7 @@
    */
   @Override
   @VciUnLog
   public UITableDefineVO tableDO2VO(PortalVI portal, boolean queryDetail) {
   public UITableDefineVO tableDO2VO(PortalVI portal, boolean queryDetail, Map<String, OsAttributeVO> attributeVOMap) throws PLException {
      UITableDefineVO tableDefineVO = new UITableDefineVO();
      tableDefineVO.setOid(portal.id);
      tableDefineVO.setId(portal.viName);
@@ -523,7 +532,7 @@
         self.selectAllForm().stream().filter(s -> formOid.equalsIgnoreCase(s.getOid())).findAny().orElseGet(() -> null);
      }else{
         try {
            formDefineVO = formDO2VO(ServiceProvider.getUIService().getPortalVIById(formOid));
            formDefineVO = formDO2VO(platformClientUtil.getUIService().getPortalVIById(formOid));
         } catch (PLException vciError) {
            throw WebUtil.getVciBaseException(vciError);
         }
@@ -597,7 +606,7 @@
                     fieldVO.setSortField(fieldName);
                     fieldVO.setEdit("combox");
                     //肯定是业务类型,因为链接类型没有这个字段
                     OsBtmTypeVO btmTypeVO = btmService.getBtmById(tableDefineVO.getBtmType());
                     OsBtmTypeVO btmTypeVO = btmService.btmDO2VO(platformClientUtil.getBtmService().getBizTypeByName(tableDefineVO.getBtmType()),attributeVOMap);
                     if(btmTypeVO!=null && StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){
                        fieldVO.setComboxKey(btmTypeVO.getLifeCycleId() + LC_STATUS_SUBFIX);
                     }
@@ -646,7 +655,7 @@
                  && !UIFieldTypeEnum.CUSTOM.getValue().equalsIgnoreCase(s.getFieldType())).forEach(fieldVO->{
               //列表里面不放edit,而查询里面需要放edit
               UITableFieldVO queryFieldVO = new UITableFieldVO();
               BeanUtil.convert(fieldVO,queryFieldVO);
               BeanUtilForVCI.convert(fieldVO,queryFieldVO);
               canQueryFields.add(queryFieldVO);
            });
            tableDefineVO.setSeniorQueryColumns(canQueryFields);
@@ -716,18 +725,18 @@
    * @return 表单的定义
    */
   @Override
   public UITableDefineVO getTableById(String btmId, String id) {
   public UITableDefineVO getTableById(String btmId, String id) throws PLException {
      if(StringUtils.isBlank(btmId) || StringUtils.isBlank(id)){
         return null;
      }
      if(!QUERY_BY_CACHE){
         PortalVI portalVI = null;
         try {
            portalVI = ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
            portalVI = platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
         } catch (PLException vciError) {
            throw WebUtil.getVciBaseException(vciError);
         }
         return tableDO2VO(portalVI,true);
         return tableDO2VO(portalVI,true,null);
      }
      return self.selectAllTableMap().getOrDefault(btmId.toLowerCase()+SEP+id.toLowerCase(),null);
   }
@@ -764,8 +773,7 @@
   @VciUnLog
   public List<UIActionVO> selectAllAction() {
      try {
//         return actionDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLAction()).collect(Collectors.toList()));
         return actionDO2VOs(Arrays.stream(ServiceProvider.getUIService().getAllPLAction()).collect(Collectors.toList()));
         return actionDO2VOs(Arrays.stream(platformClientUtil.getUIService().getAllPLAction()).collect(Collectors.toList()));
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
@@ -860,7 +868,7 @@
   private List<UIContentVO> UIContentDO2VOs(Collection<PLUILayout> pageLayoutDefinations){
      List<UIContentVO> contentVOS = new ArrayList<>();
      Optional.ofNullable(pageLayoutDefinations).orElseGet(()->new ArrayList<PLUILayout>()).stream().forEach(pageLayout->{
         contentVOS.add(UIContentDO2VO(pageLayout,false));
         contentVOS.add(UIContentDO2VO(pageLayout,false,null));
      });
      if(!CollectionUtils.isEmpty(contentVOS)) {
         Map<String, List<UILayoutVO>> layoutMap = batchListLayoutByContent(contentVOS.stream().map(UIContentVO::getOid).collect(Collectors.toSet()));
@@ -886,7 +894,7 @@
    */
   @VciUnLog
   @Override
   public UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail){
   public UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail,Map<String, List<RoleRightVO>> roleRightMap){
      UIContentVO contentVO = new UIContentVO();
      if(pageLayoutDefination !=null){
         contentVO.setOid(pageLayoutDefination.plOId);
@@ -904,18 +912,20 @@
         contentVO.setLastModifier(pageLayoutDefination.plModifyUser);
         if(queryDetail){
            //查询包含的内容
            List<UILayoutVO> layoutVOS = listLayoutByContent(contentVO.getOid());
            List<UILayoutVO> layoutVOS = null;
            //判断是否根据权限返回
            layoutVOS = listLayoutByContent(contentVO.getOid(),roleRightMap);
            if(!CollectionUtils.isEmpty(layoutVOS)){
               if(layoutVOS.size() == 1){
                  //只有一个区域
                  UILayoutVO layoutVO = layoutVOS.get(0);
                  List<UIComponentVO> componentVOs = layoutVO.getComponentVOs();
                  //第一个作为center
                  UIComponentVO firstCompVO = componentVOs.stream().min((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum())).get();
                  UIComponentVO firstCompVO = componentVOs.stream().min(Comparator.comparing(UIComponentVO::getOrderNum)).get();
                  List<UIComponentVO> southCompVO = componentVOs.stream().filter(s->!s.getOid().equals(firstCompVO.getOid())).collect(Collectors.toList());
                  UILayoutVO centerVO = new UILayoutVO();
                  BeanUtil.convert(layoutVO,centerVO);
                  BeanUtilForVCI.convert(layoutVO,centerVO);
                  centerVO.setOid(centerVO.getOid() + "_center");
                  centerVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
                  centerVO.setOrderNum(0);
@@ -933,7 +943,7 @@
                  //其余的作为south
                  if(!CollectionUtils.isEmpty(southCompVO)) {
                     UILayoutVO southVO = new UILayoutVO();
                     BeanUtil.convert(layoutVO, southVO);
                     BeanUtilForVCI.convert(layoutVO, southVO);
                     southVO.setOid(centerVO.getOid() + "_south");
                     southVO.setLayoutAreaType(UILayoutAreaTypeEnum.SOUTH.getValue());
                     southVO.setOrderNum(0);
@@ -1000,16 +1010,79 @@
   //   }
   /**
    * 获取某个UI上下文的区域
    * 获取某个UI上下文的区域,根据权限控制返回
    * @param pkContent UI上下文的主键
    * @return 上下文
    */
   private List<UILayoutVO> listLayoutByContent(String pkContent){
   private List<UILayoutVO> listLayoutByContent(String pkContent,Map<String, List<RoleRightVO>> roleRightMap){
      try {
         return UILayoutDO2VOs(Arrays.stream(ServiceProvider.getUIService().getPLTabPagesByPageDefinationOId(pkContent)).collect(Collectors.toList()),true);
         List<PLTabPage> tabPageList = Arrays.stream(platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(pkContent)).collect(Collectors.toList());
         //过滤掉没有访问权限的UI
         tabPageList = this.filterTabPageByRoleRight(tabPageList,roleRightMap);
         return UILayoutDO2VOs(tabPageList,true,roleRightMap);
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
   }
   /**
    * 根据权限集合过滤掉没有访问权限的页签数据
    * @param tabPageList
    * @param roleRightMap
    */
   private List<PLTabPage> filterTabPageByRoleRight(List<PLTabPage> tabPageList, Map<String, List<RoleRightVO>> roleRightMap){
      if(Func.isEmpty(roleRightMap) || Func.isEmpty(tabPageList)){
         return tabPageList;
      }
      List<PLTabPage> filterList = new ArrayList<>();
      for (int i = 0; i < tabPageList.size(); i++) {
         PLTabPage tabPage = tabPageList.get(i);
         if(roleRightMap.containsKey(tabPage.plOId)){
            filterList.add(tabPage);
         }
         /*if(roleRightMap.containsKey(tabPage.plContextOId)) {
            Long rightValue = roleRightMap.get(tabPage.plContextOId).getRightValue();
            int nodeValue = tabPage.plSeq;
            if (nodeValue >= 0 && nodeValue <= 63) {
               //进行位与操作,如果相等则表示具有当前操作的权限
               long preValue = (rightValue >> nodeValue) & 1;
               if (preValue != 1) {
                  tabPageList.remove(tabPage);
               }
            }
         }*/
      }
      return filterList;
   }
   /**
    * 根据权限集合过滤掉没有访问权限的页面定义数据
    * @param plPageDefinationList
    * @param roleRightMap
    */
   private List<PLPageDefination> filterPageDefByRoleRight(List<PLPageDefination> plPageDefinationList, Map<String, List<RoleRightVO>> roleRightMap){
      if(Func.isEmpty(roleRightMap) || Func.isEmpty(plPageDefinationList)){
         return plPageDefinationList;
      }
      List<PLPageDefination> filterList = new ArrayList<>();
      for (int i = 0; i < plPageDefinationList.size(); i++) {
         PLPageDefination plPageDefination = plPageDefinationList.get(i);
         if(roleRightMap.containsKey(plPageDefination.plOId)){
            filterList.add(plPageDefination);
         }
         /*if(roleRightMap.containsKey(plPageDefination.plTabPageOId)) {
            Long rightValue = roleRightMap.get(plPageDefination.plTabPageOId).getRightValue();
            int nodeValue = plPageDefination.seq;
            if (nodeValue >= 0 && nodeValue <= 63) {
               //进行位与操作,如果相等则表示具有当前操作的权限
               long preValue = (rightValue >> nodeValue) & 1;
               if (preValue != 1) {
                  plPageDefinationList.remove(plPageDefination);
               }
            }
         }*/
      }
      return filterList;
   }
   /**
@@ -1063,10 +1136,21 @@
    * @param pages 区域的数据对象
    * @return 显示对象
    */
   private List<UILayoutVO> UILayoutDO2VOs(Collection<PLTabPage> pages, boolean queryDetail){
   private List<UILayoutVO> UILayoutDO2VOs(Collection<PLTabPage> pages, boolean queryDetail, Map<String, List<RoleRightVO>> roleRightMap){
      List<UILayoutVO> contentVOS = new ArrayList<>();
      Map<String, OsAttributeVO> attributeVOMap;
      if(pages != null && pages.size() > 0){
         attributeVOMap = attrService.selectAllAttributeMap();
         Map<String, UIActionVO> actionVOMap = AllActionThreadLocal.get();
         if(actionVOMap == null || actionVOMap.isEmpty()){
            actionVOMap = selectAllActionMap();
            AllActionThreadLocal.set(actionVOMap);
         }
      }else{
         attributeVOMap = null;
      }
      Optional.ofNullable(pages).orElseGet(()->new ArrayList<PLTabPage>()).stream().forEach(page->{
         UILayoutVO layoutVO = UILayoutDO2VO(page, queryDetail);
         UILayoutVO layoutVO = UILayoutDO2VO(page, queryDetail,attributeVOMap,roleRightMap);
         if(layoutVO.isEnableStatus()) {
            contentVOS.add(layoutVO);
         }
@@ -1079,6 +1163,7 @@
            }
         });
      }
      AllActionThreadLocal.remove();
      return contentVOS;
   }
@@ -1089,7 +1174,7 @@
    * @return 区域的显示对象
    */
   @VciUnLog
   private UILayoutVO UILayoutDO2VO(PLTabPage page, boolean queryDetail){
   private UILayoutVO UILayoutDO2VO(PLTabPage page, boolean queryDetail,Map<String, OsAttributeVO> attributeVOMap, Map<String, List<RoleRightVO>> roleRightMap){
      UILayoutVO layoutVO = new UILayoutVO();
      if(page !=null ){
         layoutVO.setOid(page.plOId);
@@ -1129,8 +1214,10 @@
         if(queryDetail){
            //单个的,直接获取
            try {
               layoutVO.setComponentVOs(uiComponentDO2VOs(Arrays.stream(ServiceProvider.getUIService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList()),true));
//               layoutVO.setComponentVOs(uiComponentDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList()),true));
               List<PLPageDefination> pageDefinationList = Arrays.stream(platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList());
               pageDefinationList = this.filterPageDefByRoleRight(pageDefinationList,roleRightMap);
               List<UIComponentVO> uiComponentVOS = uiComponentDO2VOs(pageDefinationList, true, attributeVOMap,roleRightMap);
               layoutVO.setComponentVOs(uiComponentVOS);
            } catch (PLException vciError) {
               throw WebUtil.getVciBaseException(vciError);
            }
@@ -1138,6 +1225,7 @@
      }
      return layoutVO;
   }
   /**
    * 查询所有的上下文的区域的映射
    *
@@ -1170,24 +1258,15 @@
    * @return 主键的显示对象
    */
   @Override
   public UIComponentVO getComponentByOid(String componentOid) {
   public UIComponentVO getComponentByOid(String componentOid, Map<String, OsAttributeVO> attributeVOMap) {
      if(StringUtils.isBlank(componentOid)){
         return null;
      }
      if(!QUERY_BY_CACHE){
         try {
            return uiComponentDO2VO(ServiceProvider.getUIService().getPLPageDefinationById(componentOid),true);
         } catch (PLException vciError) {
            throw WebUtil.getVciBaseException(vciError);
         }
      }else{
         List<UIComponentVO> componentVOS = self.selectAllUIComponent();
         List<UIComponentVO> componentVOList = Optional.ofNullable(componentVOS).orElseGet(() -> new ArrayList<>()).stream().filter(s -> s.getOid().equalsIgnoreCase(componentOid)).collect(Collectors.toList());
         if(!CollectionUtils.isEmpty(componentVOList)){
            return componentVOList.get(0);
         }
      try {
         return uiComponentDO2VO(platformClientUtil.getUIService().getPLPageDefinationById(componentOid),true,attributeVOMap,null);
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
      return null;
   }
   /**
@@ -1195,10 +1274,10 @@
    * @param pages 数据对象
    * @return 显示对象
    */
   private List<UIComponentVO> uiComponentDO2VOs(Collection<com.vci.corba.portal.data.PLPageDefination> pages, boolean queryDetail){
   private List<UIComponentVO> uiComponentDO2VOs(Collection<PLPageDefination> pages, boolean queryDetail,Map<String, OsAttributeVO> attributeVOMap, Map<String, List<RoleRightVO>> roleRightMap){
      List<UIComponentVO> componentVOS = new ArrayList<>();
      pages.stream().forEach(page->{
         componentVOS.add(uiComponentDO2VO(page,queryDetail));
         componentVOS.add(uiComponentDO2VO(page,queryDetail,attributeVOMap,roleRightMap));
      });
      return componentVOS;
   }
@@ -1209,7 +1288,7 @@
    * @return 显示对象
    */
   @VciUnLog
   private UIComponentVO uiComponentDO2VO(PLPageDefination page, boolean queryDetail){
   private UIComponentVO uiComponentDO2VO(PLPageDefination page, boolean queryDetail, Map<String, OsAttributeVO> attributeVOMap, Map<String, List<RoleRightVO>> roleRightMap){
      UIComponentVO componentVO = new UIComponentVO();
      if(page !=null){
         componentVO.setOid(page.plOId);
@@ -1217,6 +1296,7 @@
         componentVO.setName(page.name);
         componentVO.setDescription(page.desc);
         componentVO.setOrderNum((int) page.seq);
         UIComponentDefineXO componentDefineXO = null;
         try {
            componentDefineXO = readInfoFromXML(page.plDefination, UIComponentDefineXO.class);
@@ -1224,6 +1304,8 @@
            logger.error("读取xml出错",e);
            return  null;
         }
         //自定义查询方式
         componentVO.setBsDataModel(componentDefineXO.getBsDataModel());
         //之前的类型的值是1,2,3等看着不直观
         UIComponentTypeEnum componentTypeEnum = null;
         if("1".equals(componentDefineXO.getTemplateType())){
@@ -1248,8 +1330,7 @@
               componentVO.setTableDefineVO(tableDefineVOMap.get(key));
            }else{
               try {
                  componentVO.setTableDefineVO(tableDO2VO(ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true));
                  //componentVO.setTableDefineVO(tableDO2VO(platformClientUtil.getPortalService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true));
                  componentVO.setTableDefineVO(tableDO2VO(platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true,attributeVOMap));
               } catch (PLException vciError) {
                  throw WebUtil.getVciBaseException(vciError);
               }
@@ -1285,7 +1366,7 @@
               tableDefineVO= tableDefineVOMap.get(key);
            }else{
               try {
                  tableDefineVO = tableDO2VO(ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true);
                  tableDefineVO = tableDO2VO(platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true,null);
               } catch (PLException vciError) {
                  throw WebUtil.getVciBaseException(vciError);
               }
@@ -1293,7 +1374,7 @@
            if(tableDefineVO != null) {
               UITreeTableDefineVO treeTableDefineVO = new UITreeTableDefineVO();
               BeanUtil.convert(tableDefineVO, treeTableDefineVO);
               BeanUtilForVCI.convert(tableDefineVO, treeTableDefineVO);
               if(isLink){
                  treeTableDefineVO.setTreeCurrentField("t_oid");
                  treeTableDefineVO.setTreeParentField("f_oid");
@@ -1336,7 +1417,7 @@
               componentVO.setFormDefineVO(formDefineVOMap.get(key));
            }else{
               try {
                  componentVO.setFormDefineVO(formDO2VO(ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId())));
                  componentVO.setFormDefineVO(formDO2VO(platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId())));
               } catch (PLException vciError) {
                  throw WebUtil.getVciBaseException(vciError);
               }
@@ -1348,7 +1429,8 @@
            treeDefineVO.setBtmType(componentDefineXO.getShowType());
            treeDefineVO.setLinkType(componentDefineXO.getLinkType());
            treeDefineVO.setLoadType("1".equalsIgnoreCase(componentDefineXO.getExpandMode())?"node":"all");
            treeDefineVO.setOrientation("positive".equalsIgnoreCase(componentDefineXO.getOrientation())?false:true);
            //TODO:这个属性现在由链接类型查询模板配置上控制,不在页面定义控制了,但是为了兼容以前的UI定义所以需要考虑保留
            treeDefineVO.setOrientation(componentDefineXO.getOrientation());
            treeDefineVO.setShowImage("1".equalsIgnoreCase(componentDefineXO.getIsShowImage())?true:false);
            treeDefineVO.setRootContent(componentDefineXO.getRootContent());
            treeDefineVO.setFieldSep(StringUtils.isBlank(componentDefineXO.getSeparator())?",":componentDefineXO.getSeparator());
@@ -1373,20 +1455,49 @@
         }
         componentVO.setUiParseClass(componentDefineXO.getUIParser());
         componentVO.setExtendAttr(componentDefineXO.getExtAttr());
         componentVO.setButtons(listButtonByComponent(componentVO.getOid()));
         componentVO.setButtons(listButtonByComponent(componentVO.getOid(),roleRightMap));
      }
      return componentVO;
   }
   /**
    * 获取某个组件的按钮
    * 获取某个组件的按钮(根据权限过滤)
    * @param pkComponent 组件的主键
    * @return 按钮的信息
    */
   @Override
   public List<UIButtonDefineVO> listButtonByComponent(String pkComponent){
   public List<UIButtonDefineVO> listButtonByComponent(String pkComponent, Map<String, List<RoleRightVO>> roleRightMap){
      try {
         List<UIButtonDefineVO> buttonDefineVOS = buttonDO2VOs(Arrays.stream(ServiceProvider.getUIService().getPLTabButtonsByTableOId(pkComponent)).collect(Collectors.toSet())).stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
         List<UIButtonDefineVO> buttonDefineVOS = buttonDO2VOs(Arrays.stream(platformClientUtil.getUIService().getPLTabButtonsByTableOId(pkComponent)).collect(Collectors.toSet())).stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
         if(Func.isEmpty(roleRightMap)){
            roleRightMap = uiManagerServiceI.getRoleRightMap(null);
         }
         //循环对按钮权限进行判断,没有权限的将移除buttonDefineVOS对象
         Iterator<UIButtonDefineVO> buttonDefineVO = buttonDefineVOS.iterator();
         while (buttonDefineVO.hasNext()){
            UIButtonDefineVO buttonDefine = buttonDefineVO.next();
            if(roleRightMap.containsKey(buttonDefine.getPkComponent())) {
               List<Long> rightValues = roleRightMap.get(buttonDefine.getPkComponent()).stream()
                     .map(e -> e.getRightValue()).collect(Collectors.toList());
               int nodeValue = buttonDefine.getOrderNum();
               if (nodeValue >= 0 && nodeValue <= 63) {
                  boolean authFlag = false;
                  //进行位与操作,如果相等则表示具有当前操作的权限
                  for (Long rightValue : rightValues) {
                     long preValue = (rightValue >> nodeValue) & 1;
                     if (preValue == 1) {
                        authFlag = true;
                        break;
                     }
                  }
                  if(!authFlag){
                     buttonDefineVO.remove();
                  }
               }
            }
         }
         if(CollectionUtils.isEmpty(buttonDefineVOS)){
            return buttonDefineVOS;
         }
@@ -1412,11 +1523,21 @@
    * @return 显示对象
    */
   @Override
   public List<UIButtonDefineVO> buttonDO2VOs(Collection<com.vci.corba.portal.data.PLTabButton> buttons){
   public List<UIButtonDefineVO> buttonDO2VOs(Collection<PLTabButton> buttons){
      List<UIButtonDefineVO> buttonDefineVOS = new ArrayList<>();
      Optional.ofNullable(buttons).orElseGet(()->new ArrayList<>()).stream().forEach(button->{
         buttonDefineVOS.add(buttonDO2VO(button));
      });
      if(buttons != null && buttons.size() > 0){
//         Map<String, UIActionVO> actionVOMap = self.selectAllActionMap();
         Map<String, UIActionVO> actionVOMap = null;
         actionVOMap = AllActionThreadLocal.get();
         if(actionVOMap == null ){
            actionVOMap = self.selectAllActionMap();
         }
         Map<String, UIActionVO> finalActionVOMap = actionVOMap;
         Optional.ofNullable(buttons).orElseGet(()->new ArrayList<>()).stream().forEach(button->{
            buttonDefineVOS.add(buttonDO2VO(button, finalActionVOMap));
         });
      }
      return buttonDefineVOS;
   }
@@ -1426,9 +1547,8 @@
    * @return 显示对象
    */
   @Override
   public UIButtonDefineVO buttonDO2VO(com.vci.corba.portal.data.PLTabButton button)  {
   public UIButtonDefineVO buttonDO2VO(PLTabButton button, Map<String, UIActionVO> actionVOMap)  {
      UIButtonDefineVO buttonVO = new UIButtonDefineVO();
      Map<String, UIActionVO> actionVOMap = self.selectAllActionMap();
//      Map<String, UIActionVO> actionVOMap = ServiceProvider.getUIService().getAllPLAction();
      if(button !=null){
         buttonVO.setOid(button.plOId);
@@ -1460,8 +1580,7 @@
            //查找参数
            Map<String,String> params = new HashMap<>();
            try {
               //PLCommandParameter[] parameters = platformClientUtil.getPortalService().getPLCommandParametersByCommandOId(buttonVO.getOid());
               PLCommandParameter[] parameters = ServiceProvider.getUIService().getPLCommandParametersByCommandOId(buttonVO.getOid());
               PLCommandParameter[] parameters = platformClientUtil.getUIService().getPLCommandParametersByCommandOId(buttonVO.getOid());
               if(parameters!=null && parameters.length > 0){
                  for(PLCommandParameter parameter: parameters){
                     params.put(parameter.plKey,parameter.plValue);
@@ -1522,17 +1641,18 @@
    * @return UI上下文的信息
    */
   @Override
   public UIContentVO getUIContentByBtmTypeAndId(String btmType, String id) {
   public UIContentVO getUIContentByBtmTypeAndId(String btmType, String id) throws PLException {
      WebUtil.alertNotNull(btmType,"业务类型或者链接类型",id,"UI上下文的编号");
      PLUILayout[] obj = null;
      try {
         obj = ServiceProvider.getUIService().getPLUILayoutsByRelatedType(btmType);
//         obj = platformClientUtil.getPortalService().getPLPageLayoutDefinationsByRelatedType(btmType);
//         obj = ServiceProvider.geT(btmType);
         obj = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(btmType);
      } catch (PLException vciError) {
         throw WebUtil.getVciBaseException(vciError);
      }
      // 1、根据当前角色判断是管理人员还是普通用户(正常来说只有普通用户才会用到该查询接口)
      Map<String, List<RoleRightVO>> roleRightMap = uiManagerServiceI.getRoleRightMap(null);
      // 2、按照当前登录用户查询权限(功能权限和UI授权的授权信息都是放在同一张表里的)
      // 3、找出当前要查询的UI上下文
      PLUILayout context = null;
      for (int i = 0; i < obj.length; i++) {
         if (obj[i].plCode.equals(id)) {
@@ -1540,8 +1660,9 @@
            break;
         }
      }
      return UIContentDO2VO(context,true);
//      return UIContentDO2VO(null,true);
      // 4、每一个菜单查询的都是一个UI上下文,所以UI上下文是有功能授权控制的,只需要控制后面的页签、页面、按钮的权限。
      return UIContentDO2VO(context, true,roleRightMap);
   }
}