package com.vci.web.service.impl; import com.sun.jnlp.ApiDialog; import com.vci.client.mw.ClientContextVariable; 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.frameworkcore.compatibility.SmRoleQueryServiceI; import com.vci.pagemodel.OsBtmTypeVO; import com.vci.pagemodel.PLUILayoutCloneVO; import com.vci.pagemodel.RoleRightVO; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.BaseQueryObject; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.SessionInfo; import com.vci.starter.web.pagemodel.Tree; 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 org.apache.poi.ss.formula.functions.T; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; /** * 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 code * @return * @throws PLException */ public List getUIContextDataByBtName(String btemName,String code) throws PLException { List pluiLayoutList=new ArrayList<>(); PLUILayout[] pluiLayouts= platformClientUtil.getUIService().getPLUILayoutEntityByTypeAndCode(btemName,code); if(pluiLayouts!=null&&pluiLayouts.length>0){ pluiLayoutList= Stream.of(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) 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(); //如果选择克隆目标,则克隆到选择的类型下,如果没有选择克隆目标,则克隆到当前类型下 if(Func.isBlank(pluiLayoutCloneVO.getCloneTargetOid())){ 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); //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); } } @Override public void expUiContextData(String[] oids, HttpServletResponse response) throws PLException, IOException { } /** * 获取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); childList.add(bizTypeTree); 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; } 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.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.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.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.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) {//按钮 String id = ((PLTabButton) funcObj).plTableOId; if(roleRightVOMap.containsKey(id)){ 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