package com.vci.web.service.impl; import com.vci.common.utility.ObjectUtility; import com.vci.corba.common.PLException; import com.vci.corba.framework.data.RoleRightInfo; import com.vci.corba.omd.btm.BizType; import com.vci.corba.portal.PortalService; import com.vci.corba.portal.data.*; import com.vci.dto.RoleRightDTO; import com.vci.dto.UIAuthorDTO; import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI; import com.vci.model.PLDefination; import com.vci.pagemodel.PLDefinationVO; import com.vci.pagemodel.PLUILayoutCloneVO; import com.vci.pagemodel.RoleRightVO; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.*; import com.vci.starter.web.pagemodel.BaseQueryObject; import com.vci.starter.web.pagemodel.BaseResult; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.SessionInfo; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.util.VciDateUtil; import com.vci.starter.web.util.WebThreadLocalUtil; import com.vci.web.service.OsBtmServiceI; import com.vci.web.service.UIManagerServiceI; import com.vci.web.util.*; import org.apache.commons.lang3.StringUtils; import com.vci.web.util.Func; import com.vci.web.util.PlatformClientUtil; import com.vci.web.util.UITools; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; import java.util.regex.Pattern; /** * UI定义服务界面相关接口 * @author ludc * @date 2024/8/28 17:05 */ @Service public class UIManagerServiceImpl implements UIManagerServiceI { /** * 平台的调用工具类 */ @Resource private PlatformClientUtil platformClientUtil; /** * 角色 */ @Resource private SmRoleQueryServiceI smRoleQueryServiceI; /** * 业务类型 */ @Resource private OsBtmServiceI osBtmServiceI; /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 排序比较器 */ private Comparator pageLayoutComparator = new Comparator() { @Override public int compare(PLUILayout o1, PLUILayout o2) { return o1.plCode.compareTo(o2.plCode); } }; /** * 根据业务类型名查询ui上下文数据 * @param baseQueryObject * @return * @throws PLException */ @Override public DataGrid gridUIContextData(BaseQueryObject baseQueryObject) throws PLException { VciBaseUtil.alertNotNull(baseQueryObject,"条件对象"); int page = baseQueryObject.getPage(); int limit = baseQueryObject.getLimit(); Map conditionMap = baseQueryObject.getConditionMap(); String btmName = conditionMap.getOrDefault("btmName",""); if(Func.isEmpty(conditionMap) || Func.isBlank(btmName)){ throw new PLException("500",new String[]{"未获取到业务类型名称!"}); } String txtName = conditionMap.getOrDefault("txtName","").trim(); String txtCode = conditionMap.getOrDefault("txtCode","").trim(); PortalService.GetPLUILayoutsByRelatedTypeAndQueryInfoResult result = platformClientUtil.getUIService() .getPLUILayoutsByRelatedTypeAndQueryInfo(btmName, txtName, txtCode, page, limit); DataGrid dataGrid = new DataGrid<>(); int total = (int)result.total; dataGrid.setTotal(total); dataGrid.setLimit(limit); dataGrid.setPage(page); PLUILayout[] res = result.returnValue; Arrays.sort(res,pageLayoutComparator); List pluiLayouts = Arrays.asList(res); dataGrid.setData(pluiLayouts); return dataGrid; } /** * ton通过业务类型和名称查询 * @param btemName * @param context * @return * @throws PLException */ public List getUIContextDataByBtName(String btemName,String context) throws PLException { VciBaseUtil.alertNotNull(btemName,"业务类型"); List pluiLayoutList=new ArrayList<>(); List contextList= VciBaseUtil.str2List(context); if(StringUtils.isNotBlank(context)){ contextList=VciBaseUtil.str2List(context); }else{ contextList.add(""); } contextList.stream().forEach(code->{ PLUILayout[] pluiLayouts= new PLUILayout[0]; try { pluiLayouts = platformClientUtil.getUIService().getPLUILayoutEntityByTypeAndCode(btemName,code); } catch (PLException e) { e.printStackTrace(); } if(pluiLayouts!=null&&pluiLayouts.length>0) { pluiLayoutList.addAll(Arrays.stream(pluiLayouts).collect(Collectors.toList())); } }); return pluiLayoutList; } /** * 给业务类型下添加ui上下文 * @param pluiLayout * @return * @throws PLException */ @Override public boolean saveUIContextData(PLUILayout pluiLayout) throws VciBaseException { try { //ui上下文对象校验 canContinue(pluiLayout); String code = pluiLayout.plCode; String name = pluiLayout.plName; boolean isExist = nameOrCodeIsExist(pluiLayout, false); //是否存在校验 if (isExist){ throw new VciBaseException("上下文编码或名称已经存在,请检查!"); } PLUILayout pld = new PLUILayout(); pld.plOId = ObjectUtility.getNewObjectID36(); pld.plCode = code; pld.plName = name; pld.plRelatedType = pluiLayout.plRelatedType; pld.plDesc = pluiLayout.plDesc; SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread(); pld.plCreateUser = sessionInfo.getUserId(); pld.plModifyUser = sessionInfo.getUserId(); //导航区 pld.plIsShowForm = pluiLayout.plIsShowForm; //控制区 pld.plIsShowNavigator = pluiLayout.plIsShowNavigator; //操作区 pld.plIsShowTab = pluiLayout.plIsShowTab; //执行保存 return platformClientUtil.getUIService().savePLUILayout(pld); } catch (PLException e) { e.printStackTrace(); String exceptionMessage = VciBaseUtil.getExceptionMessage(e); logger.error(exceptionMessage); throw new VciBaseException(exceptionMessage); } } /** * 修改ui上下文 * @param pluiLayout * @return * @throws PLException */ @Override public boolean updateUIContextData(PLUILayout pluiLayout) throws VciBaseException { this.canContinue(pluiLayout); try { String code = pluiLayout.plCode; String name = pluiLayout.plName; boolean isExist = nameOrCodeIsExist(pluiLayout, true); if (isExist){ throw new VciBaseException("上下文编码或名称已经存在,请检查!"); } PLUILayout pld = new PLUILayout(); pld.plOId = pluiLayout.plOId; pld.plCode = code; pld.plName = name; pld.plRelatedType = pluiLayout.plRelatedType; pld.plDesc = pluiLayout.plDesc; pld.plCreateUser = pluiLayout.plCreateUser; pld.plModifyUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(); //导航区 pld.plIsShowForm = pluiLayout.plIsShowForm; //控制区 pld.plIsShowNavigator = pluiLayout.plIsShowNavigator; //操作区 pld.plIsShowTab = pluiLayout.plIsShowTab; //执行修改 return platformClientUtil.getUIService().updatePLUILayout(pld); } catch (PLException e) { e.printStackTrace(); String exceptionMessage = VciBaseUtil.getExceptionMessage(e); logger.error(exceptionMessage); throw new VciBaseException(exceptionMessage); } } /** * 根据主键和业务类型oid删除ui上下文数据 * @return */ @Override public boolean delUIContextData(String[] oids,String plRelatedType) throws PLException { VciBaseUtil.alertNotNull(oids,"待删除的对象列表"); //删除方法中有关联数据删除的操作逻辑,但是这个方法存在问题就是删除的数据并没有将缓存的东西清理干净 return platformClientUtil.getUIService().deletePLUILayoutByOidsForCascade(oids); } /** * 克隆ui上下文(具备关联数据的克隆) * @param pluiLayoutCloneVO * @return */ @Override public boolean cloneUIContextData(PLUILayoutCloneVO pluiLayoutCloneVO) throws PLException { VciBaseUtil.alertNotNull( pluiLayoutCloneVO,"克隆参数对象", pluiLayoutCloneVO.getSourcePLUILayout(),"克隆的源对象信息", pluiLayoutCloneVO.getCloneName(),"克隆的对象名称", pluiLayoutCloneVO.getCloneContextCode(),"克隆的对象上下文编码" ); PLUILayout pluiLayout = new PLUILayout(); PLUILayout sourcePLUILayout = pluiLayoutCloneVO.getSourcePLUILayout(); pluiLayout.plRelatedType = pluiLayoutCloneVO.getCloneTargetName(); //如果选择克隆目标,则克隆到选择的类型下,如果没有选择克隆目标,则克隆到当前类型下 if(Func.isBlank(pluiLayoutCloneVO.getCloneTargetName())){ pluiLayout.plRelatedType = sourcePLUILayout.plRelatedType; } //克隆的名称和ui上下文编号查重 String cloneName = pluiLayoutCloneVO.getCloneName(); String cloneContextCode = pluiLayoutCloneVO.getCloneContextCode(); pluiLayout.plOId = ObjectUtility.getNewObjectID36(); pluiLayout.plName = cloneName; pluiLayout.plCode = cloneContextCode; pluiLayout.plIsShowTab = sourcePLUILayout.plIsShowTab; pluiLayout.plIsShowNavigator = sourcePLUILayout.plIsShowNavigator; pluiLayout.plIsShowForm = sourcePLUILayout.plIsShowForm; pluiLayout.plDesc = sourcePLUILayout.plDesc; SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread(); pluiLayout.plCreateUser = sessionInfo.getUserId(); pluiLayout.plModifyUser = sessionInfo.getUserId(); //克隆目标下ui名称和编号查重 this.checkCodeName(pluiLayout); //1、先保存ui上下文 boolean res = platformClientUtil.getUIService().savePLUILayout(pluiLayout); if(!res){ return res; } //2、再考虑子节点的克隆 PLTabPage[] pages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(sourcePLUILayout.plOId); //控制区节点及其子节点的克隆 if(pages == null){ return true; } try { for (PLTabPage page : pages) { savePlpageLayoutDefinationRelation(page,pluiLayout.plOId); } return true; }catch (Exception e){ e.printStackTrace(); String exceptionMessage = VciBaseUtil.getExceptionMessage(e); logger.error(exceptionMessage); throw new VciBaseException(exceptionMessage); } } /** * 导出ui上下文(勾选的要导出的控制区的数据) * oids * @return */ @Override public void expUIContextData(String[] oids, HttpServletResponse response) throws PLException, IOException { } /** * 导入UI上下文 * @param file * @return */ @Override public BaseResult impUIContextData(MultipartFile file) { return null; } /** * 根据上下文ID和区域类型,按顺序获取当前区域的tab页 */ @Override public List getTabByContextIdAndType(String contextId, int areaType) throws PLException { VciBaseUtil.alertNotNull(contextId,"上下文主键",areaType,"区域类型"); PLTabPage[] plTabPages = platformClientUtil.getUIService().getTabPagesByContextIdAndType(contextId, (short) areaType); return Arrays.asList(plTabPages); } /** * 添加区域数据 * @param plTabPage * @return */ @Override public boolean addTabData(PLTabPage plTabPage) throws PLException { VciBaseUtil.alertNotNull(plTabPage,"添加区域数据"); SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread(); plTabPage.plCreateUser = sessionInfo.getUserId(); plTabPage.plModifyUser = sessionInfo.getUserId(); plTabPage.plOId = ObjectUtility.getNewObjectID36(); //新增和修改前检查,出错直接抛出异常 checkEdit(plTabPage); return platformClientUtil.getUIService().savePLTabPage(plTabPage); } /** * 修改区域数据 * @param plTabPage * @return */ @Override public boolean updateTabData(PLTabPage plTabPage) throws PLException { VciBaseUtil.alertNotNull(plTabPage,"添加区域数据"); SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread(); plTabPage.plModifyUser = sessionInfo.getUserId(); //新增和修改前检查,出错直接抛出异常 checkEdit(plTabPage); return platformClientUtil.getUIService().updatePLTabPage(plTabPage); } /** * 删除区域数据 * @param oids * @return */ @Override public boolean deleteTabData(String[] oids) throws PLException { VciBaseUtil.alertNotNull(oids,"待删除的主键列表"); return platformClientUtil.getUIService().deletePLTabPageByOidsForCascade(oids); } /** * 扩展属性合规检测 * @param extAttr * @return */ public BaseResult checkTabPageExtAttrIsOk(String extAttr){ // 数据格式:ext1:xx;ext2;ext3:xx;ext4:xxx;extn:xxx; boolean res = checkExtValIsOk(extAttr); return res ? BaseResult.success(true,"扩展属性数据格式正确!"):BaseResult.fail("扩展属性数据格式不正确!!"); } /** * 查询页面设计定义 * @param plPageContextOId * @return */ @Override public List getPLPageDefinations(String plPageContextOId) { return null; } /** * 添加页面定义 * @param pdVO * @return */ @Override public boolean addPageDefination(PLDefinationVO pdVO) throws Throwable { VciBaseUtil.alertNotNull(pdVO,"页面定义对象",pdVO.getSeq(),"编号",pdVO.getName(),"名称"); PLDefination d = new PLDefination(); PLPageDefination pd = new PLPageDefination(); pd.plTabPageOId = pdVO.getTabPageOId(); pd.plOId = ObjectUtility.getNewObjectID36(); //不能为空属性检查 if(!this.baseInfoIsOk(pd,false)){ return false; } pd.name = pdVO.getName().trim(); pd.seq = Short.valueOf(pdVO.getSeq().trim()); pd.desc = pdVO.getDescription(); pd.plType = Short.parseShort(pdVO.getTemplateType()); d.setName(pdVO.getName().trim()); d.setUiParser(pdVO.getUiParser().trim()); d.setExtAttr(pdVO.getExtAttr().trim()); d.setTemplateType(pdVO.getTemplateType()); //名称和编号查重 newPLDefinationIsOk(pdVO, false); // 检查各个类型下的数据是否输入或有效,一共6种类型按类型检验 short plType = pd.plType; switch (plType){ //Table(表格) case 1: //From(表单) case 4: TableComptCheckInput tci = new TableComptCheckInput( pdVO.getSearchTarger() ,pdVO.getBtmType() ,pdVO.getLinkType() ,pdVO.getTemplateId() ,pdVO.getQueryTemplateName() ); if(!tci.checkInputIsOk()){ return false; } d = tci.getNewPLDefination(d); break; //Custom(自定义模板) case 2: //只检查控制路径不能为空,有问题会直接报错 CustomComptCheckInput ccci = new CustomComptCheckInput(pdVO.getControlPath()); if(!ccci.checkInputIsOk()){ return false; } d = ccci.getNewPLDefination(d); break; //TreeTable(树表) case 3: TreeTableComptCheckInput ttcci = new TreeTableComptCheckInput( pdVO.getSearchTarger() ,pdVO.getBtmType() ,pdVO.getLinkType() ,pdVO.getTemplateId() ,pdVO.getQueryTemplateName() ,pdVO.getExpandCols() ,pdVO.getExpandMode() ); if(!ttcci.checkInputIsOk()){ return false; } d = ttcci.getNewPLDefination(d); break; //Tree(树) case 5: TreeComptCheckInput tcci = new TreeComptCheckInput( pdVO.getBtmType(), pdVO.getLinkType(), pdVO.getQueryTemplateName(), pdVO.getShowExpressionRoot(), pdVO.getShowExpression(), pdVO.getRefTreeSet(), pdVO.getSeparator(), pdVO.getExpandMode() ); if(!tcci.checkInputIsOk()){ return false; } d = tcci.getNewPLDefination(d); break; //UILayout(UI定义) case 6: UILayoutComptCheckInput ulci = new UILayoutComptCheckInput( pdVO.getSearchTarger(), pdVO.getBtmType(), pdVO.getUiLayout(), pdVO.getQueryTemplateName(), pdVO.getQryType() ); if(!ulci.checkInputIsOk()){ return false; } d = ulci.getNewPLDefination(d); break; } d = setEventDataToPLDefination(d,pdVO); //转xml赋值到plDefination中 pd.plDefination = UITools.getPLDefinationText(d); //执行保存 return platformClientUtil.getUIService().savePLPageDefination(pd); } /** * 修改页面定义 * @param pdVO * @return */ @Override public boolean updatePageDefination(PLDefinationVO pdVO) throws Throwable { /*PLPageDefination pd = getPageDefination(); PLDefination d = UITools.getPLDefination(pd.plDefination); //不能为空属性检查 if(!this.baseInfoIsOk(pd,true)){ return false; } setUIValueToObject(pd, d); this.newPLDefinationIsOk(pdVO, true); // 检查各个组件内部的数据是否有效 int plType = pdVO.getType(); switch (plType){ //Table(表格) case 1: //From(表单) case 4: TableComptCheckInput tci = new TableComptCheckInput( pdVO.getSearchTarger() ,pdVO.getBtmType() ,pdVO.getLinkType() ,pdVO.getTemplateId() ,pdVO.getQueryTemplateName() ); if(!tci.checkInputIsOk()){ return false; } d = tci.getNewPLDefination(d); break; //Custom(自定义模板) case 2: //只检查控制路径不能为空,有问题会直接报错 CustomComptCheckInput ccci = new CustomComptCheckInput(pdVO.getControlPath()); if(!ccci.checkInputIsOk()){ return false; } d = ccci.getNewPLDefination(d); break; //TreeTable(树表) case 3: TreeTableComptCheckInput ttcci = new TreeTableComptCheckInput( pdVO.getSearchTarger() ,pdVO.getBtmType() ,pdVO.getLinkType() ,pdVO.getTemplateId() ,pdVO.getQueryTemplateName() ,pdVO.getExpandCols() ,pdVO.getExpandMode() ); if(!ttcci.checkInputIsOk()){ return false; } d = ttcci.getNewPLDefination(d); break; //Tree(树) case 5: TreeComptCheckInput tcci = new TreeComptCheckInput( pdVO.getBtmType(), pdVO.getLinkType(), pdVO.getQueryTemplateName(), pdVO.getShowExpressionRoot(), pdVO.getShowExpression(), pdVO.getRefTreeSet(), pdVO.getSeparator(), pdVO.getExpandMode() ); if(!tcci.checkInputIsOk()){ return false; } d = tcci.getNewPLDefination(d); break; //UILayout(UI定义) case 6: UILayoutComptCheckInput ulci = new UILayoutComptCheckInput( pdVO.getSearchTarger(), pdVO.getBtmType(), pdVO.getUiLayout(), pdVO.getQueryTemplateName(), pdVO.getQryType() ); if(!ulci.checkInputIsOk()){ return false; } d = ulci.getNewPLDefination(d); break; } d = comptPanel.getNewPLDefination(d); d = setEventDataToPLDefination(d,pdVO); pd.plDefination = UITools.getPLDefinationText(d);*/ boolean res = true;//platformClientUtil.getUIService().updatePLPageDefination(pd); return res; } /** * 处理配置的event事件 * @param d * @param pdVO * @return */ private PLDefination setEventDataToPLDefination(PLDefination d,PLDefinationVO pdVO){ Map eventMap = pdVO.getEventMap(); if(Func.isNotEmpty(eventMap)){ String eventKey = eventMap.keySet().stream().collect(Collectors.joining(",")); d.setEventKey(eventKey); String eventValue = eventMap.values().stream().collect(Collectors.joining(",")); d.setEventValue(eventValue); }else{ d.setEventKey(""); d.setEventValue(""); } return d; } private boolean baseInfoIsOk(PLPageDefination pd, boolean isEdit) throws PLException{ boolean res = false; if(!checkRequiredIsOk("名称", pd.name)){ return false; } //short类型的就不用检查了 /*else if(!checkRequiredIsOk("编号", pd.seq)){ return false; }*/ res = true; return res; } private boolean checkRequiredIsOk(String tip, String txt) throws PLException { boolean res = false; if(Func.isBlank(txt)){ throw new PLException("500", new String[]{tip + " 不能为空!"}); } else { res = true; } return res; } /** * 删除页面定义 * @param oids * @return */ @Override public boolean delPageDefination(String[] oids) throws PLException { VciBaseUtil.alertNotNull(oids,"删除的页面定义主键"); boolean res = platformClientUtil.getUIService().deletePLUILayoutByOidsForCascade(oids); return res; } /** * 页面定义名称和编号查重 * @param pd * @param isEdit * @throws PLException */ private void newPLDefinationIsOk(PLDefinationVO pd, boolean isEdit) throws PLException{ boolean res = false; boolean nameExist = false; boolean seqExist = false; PLPageDefination[] pds = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(pd.getTabPageOId()); for (PLPageDefination pdGet : pds) { if(!isEdit){ if(pd.getName().equals(pdGet.name)){ nameExist = true; } else if(Short.parseShort(pd.getSeq()) == pdGet.seq){ seqExist = true; } } else { if(!pd.getId().equals(pdGet.plOId)){ if(pd.getName().equals(pdGet.name)){ nameExist = true; } else if(Short.parseShort(pd.getSeq()) == pdGet.seq){ seqExist = true; } } } if(nameExist || seqExist){ break; } } if(nameExist){ throw new VciBaseException("名称已经存在!"); } if(seqExist){ throw new VciBaseException("编号已经存在!"); } } /** * 给区域中添加数据前校验 * @param plTabPage * @return */ private void checkEdit(PLTabPage plTabPage) throws PLException { /*if(plTabPage.plSeq >= 0){ throw new VciBaseException("序号不能为空!"); }else if(!isNumber(plseq.getText().trim())){ throw new VciBaseException("序号只能是数字,请重新填写!"); }*/ if(!checkTabPageUIParserIsOk(plTabPage)){ throw new VciBaseException("UI解析类格式不正确,请重新填写!"); } //独立出来单独做一个接口让前端进行调用 /*else if(!checkTabPageExtAttrIsOk(plTabPage)){ //给出提示,对于mpm配置可以允许其保存,具体解析mpm自己控制 by liucq int confirm = VCIOptionPane.showConfirmDialog(PLTApplication.frame, "扩展属性数据格式不正确\n是否继续保存?", "系统提示", JOptionPane.YES_NO_OPTION); }*/ PLTabPage[] tps = platformClientUtil.getUIService().getTabPagesByContextIdAndType(plTabPage.plContextOId, plTabPage.plAreaType); for (PLTabPage tp : tps) { if(tp.plSeq == plTabPage.plSeq && !tp.plOId.equals(plTabPage.plOId)){ throw new VciBaseException("序号重复!"); } if(tp.plName.equalsIgnoreCase(plTabPage.plName) && !tp.plOId.equals(plTabPage.plOId)){ throw new VciBaseException("名称重复!"); } if(tp.plCode.equalsIgnoreCase(plTabPage.plCode) && !tp.plOId.equals(plTabPage.plOId)){ throw new VciBaseException("页面编码重复!"); } } } /** * 检查UI解析类是否合规 * @param tabPage * @return */ private boolean checkTabPageUIParserIsOk(PLTabPage tabPage){ // 数据格式: java_cs:xxx;java_bs:xxx;net_cs:xxx;net_bs:xxx;mobile_cs:xx;mobile_bs:xxx; String uiParser = tabPage.plUIParser; return checkExtValIsOk(uiParser); } /** * UI解析类正则检查 * @param value * @return */ private boolean checkExtValIsOk(String value){ boolean res = true; if(value == null || "".equals(value)){ return res; } Pattern ptn = Pattern.compile("([\\w\\.\\_\\-\\+]+:[\\w\\.\\_\\-\\+]+(;)?)+"); res = ptn.matcher(value).matches(); return res; } /** * 获取UI授权树 * @param treeQueryObject * @return * @throws Exception */ @Override public List getUIAuthor(BaseQueryObject treeQueryObject) throws Exception { Map conditionMap = treeQueryObject.getConditionMap(); if (conditionMap == null) { conditionMap = new HashMap<>(); } String roleId = StringUtils.isBlank(conditionMap.get("roleId")) ? "" : conditionMap.get("roleId"); String type = StringUtils.isBlank(conditionMap.get("type")) ? "" : conditionMap.get("type"); String context = StringUtils.isBlank(conditionMap.get("context")) ? "" : conditionMap.get("context"); boolean showCheckBox = Boolean.parseBoolean(conditionMap.get("showCheckBox")); Map roleRightVOMap=new HashMap<>(); if(StringUtils.isNotBlank(roleId)){ String userName= WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(); RoleRightInfo[] rightInfos= platformClientUtil.getFrameworkService().getRoleRightList(roleId,userName); List roleRightVOList=roleRightDOO2VOS(Arrays.asList(rightInfos)); roleRightVOMap=roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVO)); } BizType[] bizTypes=osBtmServiceI.getBizTypes(type); List treeList=new ArrayList<>(); Tree rootNode =new Tree("root","功能模块","root"); rootNode.setLevel(0); rootNode.setShowCheckbox(true); rootNode.setExpanded(true); List childList=new ArrayList<>(); for (int i = 0; i < bizTypes.length; i++) { Tree bizTypeTree = new Tree(bizTypes[i].oid,bizTypes[i].name,bizTypes[i]);//(btmItems[i].label+" ["+ btmItems[i].name+"]", btmItems[i]); bizTypeTree.setLevel(1); bizTypeTree.setShowCheckbox(true); bizTypeTree.setParentId(rootNode.getOid()); bizTypeTree.setParentName(rootNode.getText()); bizTypeTree.setShowCheckbox(true); bizTypeTree.setParentBtmName(bizTypes[i].name); childList.add(bizTypeTree); if(roleRightVOMap.containsKey(bizTypes[i].oid)){ ListcontextList=getUIContextDataByBtName(bizTypes[i].name,context); List btmChildList=new ArrayList<>(); btmChildList.add(bizTypeTree); setChildNode(btmChildList,contextList,roleRightVOMap,showCheckBox); } } rootNode.setChildren(childList); treeList.add(rootNode); return treeList; } @Override public boolean authorizedUI(UIAuthorDTO uiAuthorDTO) throws Exception { boolean res=false; if(uiAuthorDTO==null||CollectionUtil.isEmpty(uiAuthorDTO.getSelectTreeList())){ throw new VciBaseException("请选择节点进行授权!"); } BaseQueryObject treeQueryObject=new BaseQueryObject(); Map conditionMap = new HashMap<>(); conditionMap.put("roleId",uiAuthorDTO.getRoleId()); conditionMap.put("type",uiAuthorDTO.getType()); conditionMap.put("context",uiAuthorDTO.getContext()); conditionMap.put("showCheckBox","true"); treeQueryObject.setConditionMap(conditionMap); List treeList=this.getUIAuthor(treeQueryObject); HashMap allTreeMap=new HashMap<>(); if(!CollectionUtil.isEmpty(treeList)){ convertTreeDOO2Map(treeList,allTreeMap); List roleRightDTOList=new ArrayList<>(); List selectTreeList= uiAuthorDTO.getSelectTreeList(); getRoleRightDTOS(uiAuthorDTO.getRoleId(),selectTreeList,allTreeMap,roleRightDTOList); } return res; } private void getRoleRightDTOS(String roleOid,List selectTreeList,HashMap allTreeMap, List roleRightDTOList){ selectTreeList.stream().forEach(tree -> { RoleRightDTO roleRightDTO=new RoleRightDTO(); String id=ObjectUtility.getNewObjectID36(); Object data= tree.getData(); if (data instanceof BizType) {//业务类型 BizType bizType=(BizType)data; roleRightDTO.setId(id);//主键 roleRightDTO.setCreateUser(null);//创建者 roleRightDTO.setCreateTime(null);//创建时间 roleRightDTO.setModifyUser(null);//修改者 roleRightDTO.setModifyTime(null);//修改时间 roleRightDTO.setRoleId(roleOid);//角色ID roleRightDTO.setRightValue(1);// 权限值 roleRightDTO.setRightType((short) -1);//权限类型 权限类型,超级管理员给管理员授权为1,管理员给普通用户授权为2 roleRightDTO.setFuncId(null); roleRightDTO.setLicensor(null); }else if (data instanceof PLUILayout){//UI }else if (data instanceof PLTabPage) {//UI上下文 }else if (data instanceof PLPageDefination) {// }else if (data instanceof PLTabButton) {//按钮 } }); } /** * * @param treeList 树节点 * @param allTreeMap,所有的节点 */ private void convertTreeDOO2Map(List treeList,Map allTreeMap){ Optional.ofNullable(treeList).orElseGet(()->new ArrayList()).stream().forEach(tree -> { List childTreeList= tree.getChildren(); allTreeMap.put(tree.getOid(),tree); if(!CollectionUtil.isEmpty(childTreeList)){ convertTreeDOO2Map(childTreeList,allTreeMap); } }); } private void setChildNode(List parentTree, ListcontextList,Map roleRightVOMap,boolean isShowCheckBox){ Optional.ofNullable(parentTree).orElseGet(()->new ArrayList()).stream().forEach(pTree -> { Object funcObj= pTree.getData(); List chiledTreeList=new ArrayList<>(); if (funcObj instanceof BizType) {//业务类型 BizType bizType = (BizType) funcObj; if(!CollectionUtil.isEmpty(contextList)) { contextList.stream().forEach(context->{ Tree childTree=new Tree(context.plOId,context.plName+"("+context.plCode+")",context); childTree.setParentName(pTree.getText()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setParentId(pTree.getOid()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); chiledTreeList.add(childTree); }); pTree.setChildren(chiledTreeList); } if(!CollectionUtil.isEmpty(chiledTreeList)) { setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox); } }else if (funcObj instanceof PLUILayout){//UI PLUILayout context = (PLUILayout) funcObj; PLTabPage[] pages = new PLTabPage[0]; try { pages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(context.plOId); } catch (PLException e) { e.printStackTrace(); } if(pages!=null&&pages.length>0){ List plTabPageList= Arrays.stream(pages).collect(Collectors.toList()); plTabPageList.stream().forEach(plTabPage -> { Tree childTree=new Tree(plTabPage.plOId,plTabPage.plName,plTabPage); childTree.setParentName(pTree.getText()); childTree.setParentId(pTree.getOid()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); chiledTreeList.add(childTree); }); pTree.setChildren(chiledTreeList); } if(!CollectionUtil.isEmpty(chiledTreeList)) { setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox); } }else if (funcObj instanceof PLTabPage) {//上下文 PLTabPage plTabPage = (PLTabPage) funcObj; ListplPageDefinationList=new ArrayList<>(); try { PLPageDefination[] pLPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(plTabPage.plOId); if(pLPageDefinations!=null&&pLPageDefinations.length>0){ plPageDefinationList= Arrays.stream(pLPageDefinations).collect(Collectors.toList()); plPageDefinationList.stream().forEach(plPageDefination -> { Tree childTree=new Tree(plPageDefination.plOId,plPageDefination.name,plPageDefination); childTree.setParentName(pTree.getText()); childTree.setParentId(pTree.getOid()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); chiledTreeList.add(childTree); }); pTree.setChildren(chiledTreeList); } if(!CollectionUtil.isEmpty(chiledTreeList)) { setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox); } } catch (PLException e) { e.printStackTrace(); } }else if (funcObj instanceof PLPageDefination) {// PLPageDefination plPageDefination = (PLPageDefination) funcObj; try { ListplTabButtonList=new ArrayList<>(); PLTabButton[] pLTabButtons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(plPageDefination.plOId); if(pLTabButtons!=null&&pLTabButtons.length>0){ plTabButtonList= Arrays.stream(pLTabButtons).collect(Collectors.toList()); plTabButtonList.stream().forEach(plTabButton -> { Tree childTree=new Tree(plTabButton.plOId,plTabButton.plLabel,plTabButton); childTree.setParentName(pTree.getText()); childTree.setParentId(pTree.getOid()); childTree.setParentBtmName(pTree.getParentBtmName()); childTree.setLevel(pTree.getLevel()+1); childTree.setShowCheckbox(isShowCheckBox); childTree.setLeaf(true); chiledTreeList.add(childTree); }); pTree.setChildren(chiledTreeList); } if(!CollectionUtil.isEmpty(chiledTreeList)) { setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox); } } catch (PLException e) { e.printStackTrace(); } }else if (funcObj instanceof PLTabButton) {//按钮 PLTabButton plTabButton= (PLTabButton) funcObj; String id =plTabButton.plTableOId; if(roleRightVOMap.containsKey(id)){ RoleRightVO roleRightVO = roleRightVOMap.get(id); Long rightValue = roleRightVO.getRightValue(); int nodeValue = plTabButton.plSeq; if (nodeValue >= 0 && nodeValue <= 63) { long preValue = (rightValue >> nodeValue) & 1; if (preValue == 1) { pTree.setChecked(true); } } }else{ pTree.setChecked(false); } } }); } /** * UI角色对象转换 * @param infos * @return */ private List roleRightDOO2VOS(List infos){ List roleRightVOS=new ArrayList<>(); Optional.ofNullable(infos).orElseGet(()->new ArrayList<>()).stream().forEach(info -> { RoleRightVO vo=roleRightDOO2VO(info); roleRightVOS.add(vo); }); return roleRightVOS; } /** * UI角色对象转换 * @param info * @return */ private RoleRightVO roleRightDOO2VO(RoleRightInfo info){ RoleRightVO vo=new RoleRightVO(); vo.setId(info.id); vo.setCreateTime(VciDateUtil.date2Str(VciDateUtil.long2Date(info.createTime),"")); vo.setCreateUser(info.createUser); vo.setRoleId(info.roleId); vo.setRightType(info.rightType); vo.setLicensor(info.licensor); vo.setRightValue(info.rightValue); vo.setFuncId(info.funcId); vo.setModifyTime(VciDateUtil.date2Str(VciDateUtil.long2Date(info.modifyTime),"")); vo.setModifyUser(info.modifyUser); return vo; } /** * 控制区节点及其子节点的克隆 * @param obj */ private void savePlpageLayoutDefinationRelation(Object obj,String plUILayoutId) { PLTabPage tabPage = (PLTabPage)obj; try { PLPageDefination[] pLPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(tabPage.plOId); tabPage.plOId = ObjectUtility.getNewObjectID36(); tabPage.plContextOId = plUILayoutId; //add by caill start 2016.8.15 导航区、控制区、操作区在没有子节点的情况下的克隆 if(pLPageDefinations.length==0){ platformClientUtil.getUIService().savePLTabPage(tabPage); } //add by caill end for(int j=0;j 0; }catch(Exception ex){ ex.printStackTrace(); } return res; } /** * 检查表单输入是否有效 * @param tip * @param txtVIName * @param btmLinkType * @return */ protected boolean checkPortalVITxtIsOk(String tip, String txtVIName, String btmLinkType) throws PLException { boolean res = false; if(tip == null) return true; if(txtVIName == null) return true; if(!checkRequiredIsOk(tip, txtVIName)){ res = false; } else if(!checkPortalVIIsExist(tip, txtVIName, btmLinkType)){ res = false; } else { res = true; } return res; } /** * 检查模板 * @param tip * @param txtVIName * @param btmLinkType * @return */ protected boolean checkPortalVIIsExist(String tip, String txtVIName, String btmLinkType) throws PLException { boolean res = false; String sql = "select count(1) count_ from plportalvi vi " + "where vi.typename='" + btmLinkType.trim() + "' " + "and vi.viname='" + txtVIName.trim() + "'"; res = checkCountNotEqualZero(sql); if(!res){ throw new PLException("500", new String[]{String.format("%s %s 无效!", tip, txtVIName)}); } else { res = true; } return res; } /** * 检查查询模板输入是否有效 * @param tip 输入框的名称,用来提示 * @param txtQTName 查询模板 * @param btmLinkType * @return */ protected boolean checkQTNameTxtIsOk(String tip, String txtQTName, String btmLinkType) throws PLException { boolean res = false; if(tip == null) return true; if(txtQTName == null) return true; if(!checkRequiredIsOk(tip, txtQTName)){ res = false; } else if(Func.isBlank(txtQTName) && !checkQTIsExist(tip, txtQTName, btmLinkType)){ res = false; } else { res = true; } return res; } /** * 检查表单输入是否有效 * @param tip * @param uiName * @param btmLinkType * @return */ protected boolean checkUILayoutTxtIsOk(String tip, String uiName, String btmLinkType) throws PLException { boolean res = false; if(tip == null) return true; if(uiName == null) return true; if(!checkRequiredIsOk(tip, uiName)){ res = false; } else if(!checkUILayoutIsExist(tip, uiName, btmLinkType)){ res = false; } else { res = true; } return res; } private boolean checkUILayoutIsExist(String tip, String uiName, String txtType) throws PLException { boolean res = false; String sql = "select count(1) count_ from PLUILAYOUT ui " + "where ui.PLRELATEDTYPE='" + txtType.trim() + "' " + "and ui.plcode='" + uiName.trim() + "'"; res = checkCountNotEqualZero(sql); if(!res){ throw new PLException("500", new String[]{String.format("%s %s 无效!", tip, uiName)}); } else { res = true; } return res; } /** * 检查当前输入的查询模板是否存在 * @param tip * @param txtQTName * @param txtType * @return */ protected boolean checkQTIsExist(String tip, String txtQTName, String txtType) throws PLException { boolean res = false; String sql = "select count(1) count_ from PL_QTEMPLATE qt " + "where qt.btmname ='" + txtType.trim() + "' " + "and qt.qtname='" + txtQTName.trim() + "'"; if(!res){ throw new PLException("500", new String[]{String.format("%s %s 无效!", tip, txtQTName)}); } else { res = true; } return res; } /** * 检查LinkType输入是否有效 * @param tip * @param linkTypeName * @return */ protected boolean checkLinkTypeTxtIsOk(String tip, String linkTypeName) throws PLException { boolean res = false; if(tip == null) return true; if(linkTypeName == null) return true; if(!checkRequiredIsOk(tip, linkTypeName)){ res = false; } else if(!checkLinkTypeIsExist(tip, linkTypeName)){ res = false; } else { res = true; } return res; } private boolean checkLinkTypeIsExist(String tip, String linkTypeName) throws PLException { boolean res = false; String sql = "select count(1) count_ from pllinktype lt " + "where lt.name ='" + linkTypeName.trim() + "'"; res = checkCountNotEqualZero(sql); if(!res){ throw new PLException("500", new String[]{String.format("%s %s 无效!", tip, linkTypeName)}); } else { res = true; } return res; } } //模板类型为Custom类型时校验输入 @AllArgsConstructor @NoArgsConstructor private class CustomComptCheckInput extends BaseComptInter{ /** * 控制路径 */ private String ctrlPath; @Override public boolean checkInputIsOk() throws PLException { boolean res = true; if(!checkRequiredIsOk(this.ctrlPath)){ res = false; } return res; } /** * 控制路径必输检查 * @param ctrlPath * @return */ protected boolean checkRequiredIsOk(String ctrlPath) throws PLException { boolean res = false; String text = ctrlPath.trim(); if(Func.isBlank(text)){ throw new PLException("500", new String[]{"控制路径不能为空!"}); } else { res = true; } return res; } @Override public PLDefination getNewPLDefination(PLDefination d) { if(d == null){ d = new PLDefination(); } d.setControlPath(ctrlPath); return d; } } @AllArgsConstructor @NoArgsConstructor private class TableComptCheckInput extends BaseComptInter{ /** * 搜索类型:本对象属性:1,关联对象属性:2 */ private String searchTarger; /** * 业务类型 */ private String btmType; /** * 链接类型 */ private String linkType; /** * 选择模板 */ private String txtVIName; /** * 查询模板 */ private String txtQTName; @Override public boolean checkInputIsOk() throws PLException { boolean res = false; if(searchTarger.equals("1")){ res = checkBtmTypeInputIsOk(btmType,txtVIName,txtQTName); } else if(searchTarger.equals("2")){ res = checkLinkTypeInputIsOk(txtVIName,txtQTName,btmType); } return res; } @Override public PLDefination getNewPLDefination(PLDefination d) { if(d == null){ d = new PLDefination(); } if("1".equals(searchTarger)){ d.setSearchTarger("1"); d.setShowType(btmType.trim()); d.setTemplateId(txtVIName); d.setQueryTemplateName(txtQTName); } else if("2".equals(searchTarger)){ d.setSearchTarger("2"); d.setShowType(btmType); d.setLinkType(linkType); d.setTemplateId(txtVIName); d.setQueryTemplateName(txtQTName); } return d; } /** * 检查业务类型是否输入,是否存在 * @param txtVIName * @param btmType * @param txtQTName * @return */ private boolean checkBtmTypeInputIsOk(String btmType,String txtVIName/*选择模板*/,String txtQTName/*查询模板*/) throws PLException { boolean res = false; if(!super.checkBtmTypeTxtIsOk("业务类型", btmType)){ res = false; } else if(!super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType)){ res = false; } else if(!super.checkQTNameTxtIsOk("查询模板", txtQTName, btmType)){ res = false; } else { res = true; } return res; } /** * 检查链接类型是否输入,是否存在 * @param txtVIName * @param txtQTName * @param btmType * @return */ private boolean checkLinkTypeInputIsOk(String txtVIName/*选择的模板*/,String txtQTName/*查询模板*/,String btmType) throws PLException { boolean res = false; if(!(this.checkBtmTypeTxtIsOk("目标对象", linkType))){ res = false; } else if(!(this.checkPortalVITxtIsOk("选择模板", txtVIName, linkType))){ res = false; } else if(!(this.checkQTNameTxtIsOk("查询模板", txtQTName, linkType))){ res = false; } else { res = true; } return res; } } @AllArgsConstructor @NoArgsConstructor private class TreeTableComptCheckInput extends BaseComptInter{ /** * 搜索类型:本对象属性:1,关联对象属性:2 */ private String searchTarger; /** * 业务类型 */ private String btmType; /** * 链接类型 */ private String linkType; /** * 选择模板 */ private String txtVIName; /** * 查询模板 */ private String txtQTName; /** * 树形结构展开列 */ private String expandCols; /** * 展开形式:逐级展开 1,全部展开 0 */ private String expandMode; @Override public boolean checkInputIsOk() throws PLException { boolean res = false; if(searchTarger.equals("1")){ res = this.checkBtmTypeInputIsOk(); } else if(searchTarger.equals("2")){ res = checkLinkTypeInputIsOk(); } return res; } @Override public PLDefination getNewPLDefination(PLDefination d) { if(d == null){ d = new PLDefination(); } //属性赋值重叠,所以这儿改变了逻辑 d.setSearchTarger(searchTarger); d.setShowType(btmType); d.setTemplateId(txtVIName); d.setQueryTemplateName(txtQTName); d.setExpandCols(expandCols); d.setExpandMode(expandMode); if("2".equals(searchTarger)){ d.setLinkType(linkType); } return d; } private boolean checkBtmTypeInputIsOk() throws PLException { boolean res = false; if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", btmType))){ res = false; } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, btmType))){ res = false; } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName , btmType))){ res = false; } else { res = true; } return res; } private boolean checkLinkTypeInputIsOk() throws PLException { boolean res = false; if(!(super.checkBtmTypeTxtIsOk("顶级节点显示类型", linkType))){ res = false; } else if(!(super.checkPortalVITxtIsOk("选择模板", txtVIName, linkType))){ res = false; } else if(!(super.checkQTNameTxtIsOk("查询模板", txtQTName, linkType))){ res = false; } else { res = true; } return res; } } @AllArgsConstructor @NoArgsConstructor private class TreeComptCheckInput extends BaseComptInter{ /** * 业务类型 */ private String btmType; /** * 链接类型 */ private String linkType; /** * 查询模板 */ private String queryTemplateName; /** * 根节点显示表达式 */ private String showExpressionRoot; /** * 树节点显示表达式 */ private String showExpression; /** * 参照树设置 */ private String refTreeSet; /** * 分隔符 */ private String splitChar; /** * 展开方式:逐级展开 1,全部展开 0 */ private String expandMode; @Override public boolean checkInputIsOk() throws PLException { return checkBtmTypeInputIsOk(); } @Override public PLDefination getNewPLDefination(PLDefination d) { if(d == null){ d = new PLDefination(); } d.setShowType(btmType); d.setLinkType(linkType); d.setTemplateId(queryTemplateName); d.setRootContent(showExpressionRoot.trim()); d.setShowAbs(showExpression.trim()); d.setShowLinkAbs(refTreeSet.trim()); d.setSeparator(splitChar.trim()); d.setExpandMode(expandMode); return d; } private boolean checkBtmTypeInputIsOk() throws PLException { boolean res = false; if(!(super.checkBtmTypeTxtIsOk("业务类型", btmType))){ res = false; return res; } // 链接类型不为空时,需要同时检查链接类型及链接类型下的查询模板是否有效 if(Func.isBlank(linkType)){ if(!(super.checkLinkTypeTxtIsOk("链接类型", linkType))){ res = false; return res; } else if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, linkType))){ res = false; return res; } } else { // 链接类型为空时,只需要检查业务类型下的查询模板是否有效 if(!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, btmType))){ res = false; return res; } } if(!super.checkRequiredIsOk("根节点显示表达式", showExpressionRoot)){ res = false; } else if(!super.checkRequiredIsOk("树节点显示表达式", showExpression)){ res = false; } else if(!super.checkRequiredIsOk("参照树设置", refTreeSet)){ res = false; } else { res = true; } return res; } } @AllArgsConstructor @NoArgsConstructor private class UILayoutComptCheckInput extends BaseComptInter{ /** * 搜索类型:本对象属性:1,关联对象属性:2 * 查询类型也是赋值到这个属性上: 业务类型:1,链接类型:2 */ private String searchTarger; /** * 对象类型 */ private String uiBtmType; /** * UI定义 */ private String uiLayout; /** * 查询模板 */ private String queryTemplateName; /** * 查询对象类型 */ private String qryType; @Override public boolean checkInputIsOk() throws PLException{ return checkUILayoutInputIsOk(); } @Override public PLDefination getNewPLDefination(PLDefination d) { if (d == null) { d = new PLDefination(); } d.setSearchTarger(searchTarger); d.setSubUiObjType(uiBtmType.trim()); d.setSubUILayout(uiLayout.trim()); if (searchTarger.equals("1")) { d.setShowType(qryType.trim()); } else { d.setLinkType(qryType.trim()); } d.setQueryTemplateName(queryTemplateName.trim()); return d; } private boolean checkUILayoutInputIsOk() throws PLException { boolean res = false; if (!(super.checkBtmTypeTxtIsOk("对象类型", uiBtmType))) { res = false; } else if (!(super.checkUILayoutTxtIsOk("UI定义", uiLayout, uiBtmType))) { res = false; } else if (!(super.checkQTNameTxtIsOk("查询模板", queryTemplateName, qryType))) { res = false; } else { res = true; } return res; } } }