package com.vci.web.service.impl; import com.alibaba.fastjson.JSONObject; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder; import com.thoughtworks.xstream.io.xml.XppDriver; 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.*; 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.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; import com.vci.web.xmlmodel.UIComponentDetailXO; import com.vci.web.xmlmodel.UIComponentItemXO; 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.stream.Collectors; import static com.vci.constant.EnumIdConstant.LC_STATUS_SUBFIX; /** * UI引擎服务,以前平台封装到action里的, * @author weidy * */ @Service public class UIEngineServiceImpl implements UIEngineServiceI { /** * 是否从缓存中查询 */ public static boolean QUERY_BY_CACHE = true; /** * 平台调用工具类 */ @Autowired private PlatformClientUtil platformClientUtil; /** * 日志对象 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 加载自身 */ @Lazy @Autowired(required = false) private UIEngineServiceI self; /** * 属性的服务 */ @Autowired private OsAttributeServiceI attributeService; /** * 业务类型的服务 */ @Autowired private OsBtmServiceI btmService; /** * 属性的服务 */ @Autowired private OsAttributeServiceI attrService; /** * UI定义管理服务 */ @Autowired private UIManagerServiceI uiManagerServiceI; /** * 表单的字段类型映射 */ private static Map formFieldTypeMap = new HashMap(){ { put("text","text"); put("textarea","textarea"); put("number","text"); put("password","password"); put("radio","radio"); put("checkbox","checkbox"); put("select","combox"); put("webeditor","webeditor"); put("date","date"); put("time","time"); put("datetime","datetime"); put("hidden","hidden"); put("file","file"); put("multiFile","multiFile"); put("custom","custom"); } }; /** * 默认的时间格式 */ private static Map dateDefaultFormatMap = new HashMap(){ { put("date",VciDateUtil.DateFormat); put("time",VciDateUtil.TimeFormat); put("datetime",VciDateUtil.DateTimeFormat); } }; /** * 检查无效的xml */ @Override public void checkInvalidXmlVI() { PortalVI[] portalVIS = null; try { portalVIS = platformClientUtil.getUIService().getAllPortalVI(); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } for(int i = 0 ; i < portalVIS.length ; i++){ PortalVI portalVI = portalVIS[i]; try { UIComponentDetailXO detailXO = readInfoFromXML(portalVI.prm, UIComponentDetailXO.class); }catch (Throwable e){ logger.error(portalVI.typeName + " ----" + portalVI.viName); } } } /** * 查询所有的表单定义 * * @return 显示对象 */ @Override @VciUnLog public List selectAllForm() { PortalVI[] portalVIS = null; try { portalVIS = platformClientUtil.getUIService().getAllPortalVI(); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } List portalVIList = Arrays.stream(portalVIS).filter(portal -> 1 == portal.viType).collect(Collectors.toList()); return formDO2VOs(portalVIList); } /** * 查询所有的表单定义的映射 * * @return key是表单英文名称 */ @Override public Map selectAllFormMap() { return Optional.ofNullable(self.selectAllForm()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getBtmType().toLowerCase() + SEP + s.getId().toLowerCase(),t->t,(o1,o2)->o1)); } /** * 表单数据对象转换为显示对象 * * @param portalVIS 数据对象 * @return 显示对象 */ @Override public List formDO2VOs(Collection portalVIS) { List formDefineVOList = new ArrayList<>(); Optional.ofNullable(portalVIS).orElseGet(()->new ArrayList()).stream().forEach(portal->{ try { UIFormDefineVO defineVO = formDO2VO(portal); formDefineVOList.add(defineVO); }catch (Throwable e){ if(logger.isErrorEnabled()){ logger.error("表单的内容有错误,这个表单没有成功被查询"); } } }); return formDefineVOList; } /** * 表单数据对象转换为显示对象 * * @param portal 数据对象 * @return 显示对象 */ @Override @VciUnLog public UIFormDefineVO formDO2VO(PortalVI portal) { if(portal == null ||StringUtils.isBlank(portal.prm)){ throw new VciBaseException("表单可能不存在,因为未能获取到它的信息"); } UIFormDefineVO formDefineVO = new UIFormDefineVO(); formDefineVO.setOid(portal.id); formDefineVO.setId(portal.viName); formDefineVO.setBtmType(portal.typeName); formDefineVO.setLinkTypeFlag(1 == portal.typeFlag); UIComponentDetailXO detailXO = readInfoFromXML(portal.prm,UIComponentDetailXO.class); if(detailXO == null){ throw new VciBaseException("读取{0}里{1}表单的信息错误,内容不是完整的xml格式",new String[]{formDefineVO.getBtmType(),formDefineVO.getOid()}); } formDefineVO.setQueryTemplateName(detailXO.getFormQueryTemplateName()); formDefineVO.setColumnOneRow(WebUtil.getInt(detailXO.getShowColsCount())); List items = new ArrayList<>(); Optional.ofNullable(detailXO.getItems()).orElseGet(()->new ArrayList<>()).stream().forEach(itemXO->{ UIFormItemVO itemVO = new UIFormItemVO(); itemVO.setField(itemXO.getField()); itemVO.setText(itemXO.getName()); itemVO.setReadOnly("1".equalsIgnoreCase(itemXO.getEditable())); itemVO.setRequired("1".equalsIgnoreCase(itemXO.getRequired())); itemVO.setDefaultValue(itemXO.getDefaultValue()); itemVO.setType(formFieldTypeMap.getOrDefault(itemXO.getDisplayType(),"text")); itemVO.setHidden(!"1".equalsIgnoreCase(itemXO.getHidden())); itemVO.setVerify(itemXO.getScriptValid()); if("number".equalsIgnoreCase(itemXO.getDisplayType())){ List verifys = VciBaseUtil.str2List(itemVO.getVerify()); if(verifys == null){ verifys = new ArrayList<>(); } verifys.add("number"); itemVO.setVerify(verifys.stream().collect(Collectors.joining(","))); } if("hidden".equalsIgnoreCase(itemXO.getDisplayType())){ itemVO.setType(UIFieldTypeEnum.TEXT.getValue()); itemVO.setHidden(true); } if (VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(itemVO.getField().toLowerCase())) { //生命周期的加下拉菜单的key itemVO.setComboxKey(formDefineVO.getBtmType() + LC_STATUS_SUBFIX); } itemVO.setDisplayExtension(itemXO.getDisplayExpression()); itemVO.setDateFormate(itemXO.getDateFormat()); if(StringUtils.isBlank(itemVO.getDateFormate())){ itemVO.setDateFormate(dateDefaultFormatMap.get(itemXO.getDisplayType().toLowerCase())); if("createtime".equalsIgnoreCase(itemVO.getField()) || "lastmodifytime".equalsIgnoreCase(itemVO.getField()) ){ itemVO.setDateFormate(VciDateUtil.DateTimeFormat); } } itemVO.setTooltips(itemVO.getTooltips()); if("custom".equalsIgnoreCase(itemXO.getDisplayType())){ itemVO.setType(UIFieldTypeEnum.TEXT.getValue()); itemVO.setCustomClass(itemVO.getCustomClass()); } if(StringUtils.isNotBlank(itemXO.getRefer())){ itemVO.setType("refer"); UIFormReferVO referVO = new UIFormReferVO(); if(StringUtils.isNotBlank(itemXO.getReferFieldName())){ referVO.setTextField(itemXO.getReferFieldName()); } if("layuirefer".equalsIgnoreCase(itemXO.getRefer())){ //说明是新的参照的方式 referVO.setType(itemXO.getSecondRefer()); if(StringUtils.isNotBlank(itemXO.getExtendAttr())) { if(itemXO.getExtendAttr().startsWith("{") && itemXO.getExtendAttr().endsWith("}")) { //要json的形式 JSONObject jsonObject = null; try { jsonObject = JSONObject.parseObject(itemXO.getExtendAttr()); } catch (Throwable e) { if (logger.isErrorEnabled()) { logger.error("转换Json的格式出错", e); } } if (jsonObject != null) { referVO.setType(jsonObject.containsKey("type")?jsonObject.getString("type"):""); referVO.setMuti(jsonObject.containsKey("muti")?VciBaseUtil.getBoolean(jsonObject.getString("muti")):false); referVO.setUrl(jsonObject.containsKey("url")?jsonObject.getString("url"):""); referVO.setBackPath(jsonObject.containsKey("backPath")?jsonObject.getString("backPath"):""); referVO.setMethod(jsonObject.containsKey("method")?jsonObject.getString("method"):""); referVO.setHeight(jsonObject.containsKey("height") ? WebUtil.getInt(jsonObject.getString("height")) : null); referVO.setReferType(jsonObject.containsKey("referType")?jsonObject.getString("referType"):null); referVO.setReferContent(jsonObject.containsKey("referContent")?jsonObject.getString("referContent"):null); referVO.setParentFieldName(jsonObject.containsKey("parentFieldName")?jsonObject.getString("parentFieldName"):null); referVO.setParentValue(jsonObject.containsKey("parentValue")?jsonObject.getString("parentValue"):null); referVO.setLoadType(jsonObject.containsKey("loadType")?jsonObject.getString("loadType"):null); referVO.setOnlyLeaf(jsonObject.containsKey("onlyLeaf")?Boolean.valueOf(jsonObject.getString("onlyLeaf")):true); referVO.setDisplayTable(jsonObject.containsKey("displayTable")?jsonObject.getString("displayTable"):null); referVO.setTextField(jsonObject.containsKey("textField")?jsonObject.getString("textField"):null); referVO.setValueField(jsonObject.containsKey("valueField")?jsonObject.getString("valueField"):null); if (jsonObject.containsKey("tableConfig")) { referVO.setTableConfig(JSONObject.parseObject(jsonObject.getString("tableConfig"), UITableCustomDefineVO.class)); } } }else{ referVO.setType(itemXO.getExtendAttr()); } } }else{ referVO.setType("stand"); referVO.setReferType(itemXO.getRefer()); referVO.setReferContent(itemXO.getExtendAttr()); } itemVO.setReferConfig(referVO); itemVO.setShowField(itemVO.getField() +"." + referVO.getTextField()); }else{ String field = itemVO.getField(); if(itemVO.getField().toLowerCase().startsWith("t_oid.") ||itemVO.getField().toLowerCase().startsWith("f_oid.")){ //说明是链接类型 field = field.substring("t_oid.".length()); } // 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()) &&"combox".equalsIgnoreCase(itemVO.getType())){ //走默认的参照 itemVO.setType("refer"); referVO.setType("default"); referVO.setTextField("name"); referVO.setReferContent(itemXO.getExtendAttr()); referVO.setReferType(attributeVO.getBtmTypeId()); itemVO.setReferConfig(referVO); itemVO.setShowField(itemVO.getField() +"." + referVO.getTextField()); } if(StringUtils.isNotBlank(itemXO.getExtendAttr())){ if(itemXO.getExtendAttr().startsWith("{") && itemXO.getExtendAttr().endsWith("}")){ //是json Map attrMap = new HashMap<>(); Map innerMap = JSONObject.parseObject(itemXO.getExtendAttr()).getInnerMap(); innerMap.forEach((key,value)->{ attrMap.put(key,WebUtil.getStringValueFromObject(value)); }); itemVO.setExtendAttrMap(attrMap); }else{ Map extendAttrMap = new HashMap<>(); Arrays.stream(itemXO.getExtendAttr().split("&")).forEach(attr->{ if(StringUtils.isNotBlank(attr) && attr.contains("=")) { extendAttrMap.put(attr.split("=")[0], attr.split("=")[1]); }else{ itemVO.setExtendAttrString(attr); } }); itemVO.setExtendAttrMap(extendAttrMap); } } } if("radio".equalsIgnoreCase(itemVO.getType()) || "checkbox".equalsIgnoreCase(itemVO.getType()) || "combox".equalsIgnoreCase(itemVO.getType())){ //看看有没有单独设置 // if(StringUtils.isNotBlank(itemXO.getComboxKey())){ // itemVO.setComboxKey(itemXO.getComboxKey()); if(StringUtils.isNotBlank(itemXO.getComboxItems())){ List keyValues = new ArrayList<>(); for (String keyValue : itemXO.getComboxItems().split(";")) { KeyValue kv = new KeyValue(); String[] split = keyValue.split("\\{"); kv.setKey(split[0]); kv.setValue(split[1].substring(0,split[1].length()-1)); keyValues.add(kv); } itemVO.setData(keyValues); }else{ String attr = itemVO.getField(); if(itemVO.getField().toLowerCase().startsWith("t_oid.") ||itemVO.getField().toLowerCase().startsWith("f_oid.")){ //说明是链接类型 attr = attr.substring("t_oid.".length()); } OsAttributeVO attributeVO = attributeService.getAttr(attr); if (attributeVO != null) { itemVO.setComboxKey(attributeVO.getEnumId()); } } } items.add(itemVO); }); formDefineVO.setItems(items); return formDefineVO; } /** * 使用表单的英文名称获取表单 * * @param btmId 业务类型 * @param id 表单的英文名称 * @return 表单的定义 */ @Override public UIFormDefineVO getFormById(String btmId, String id) { if(StringUtils.isBlank(btmId) || StringUtils.isBlank(id)){ return null; } PortalVI portalVI = null; try { portalVI = platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmId, id); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } return formDO2VO(portalVI); } /** * 使用表单的英文名称获取表单 * * @param btmId 业务类型编号 * @param ids 表单的英文名称 * @return 表单的定义 */ @Override public List listFormByIds(String btmId, Collection ids) { if(StringUtils.isBlank(btmId) || CollectionUtils.isEmpty(ids)){ return null; } Map formDefineVOMap = self.selectAllFormMap(); List defineVOS = new ArrayList<>(); ids.stream().forEach(id->{ String key = btmId.toLowerCase()+SEP + id.toLowerCase(); if(formDefineVOMap.containsKey(key)){ defineVOS.add(formDefineVOMap.get(key)); } }); return defineVOS; } /** * 查询所有的表格 * * @return 表格的定义 */ @Override @VciUnLog public List selectAllTable() { PortalVI[] portalVIS = null; try { portalVIS = platformClientUtil.getUIService().getAllPortalVI(); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } List portalVIList = Arrays.stream(portalVIS).filter(portal -> 0 == portal.viType).collect(Collectors.toList()); return tableDO2VOs(portalVIList,false); } /** * 查询所有的表格 * * @return 表格的定义,key是表格的英文名称 */ @Override public Map selectAllTableMap() { return Optional.ofNullable(self.selectAllTable()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getBtmType().toLowerCase() + SEP + s.getId().toLowerCase(),t->t,(o1,o2)->o1)); } /** * 表格数据对象转换为显示对象 * * @param prms 数据对象 * @param queryDetail 查询明细 * @return 显示对象 */ @Override @VciUnLog public List tableDO2VOs(Collection prms, boolean queryDetail) { List tableDefineVOList = new ArrayList<>(); Optional.ofNullable(prms).orElseGet(()->new ArrayList()).stream().forEach(portal->{ UITableDefineVO defineVO = null; try { defineVO = tableDO2VO(portal,queryDetail,null); } catch (PLException e) { throw new RuntimeException(e); } tableDefineVOList.add(defineVO); }); return tableDefineVOList; } /** * 表格的数据对象转换为显示对象 * * @param portal 数据对象 * @param queryDetail 查询明细 * @return 显示对象 */ @Override @VciUnLog public UITableDefineVO tableDO2VO(PortalVI portal, boolean queryDetail, Map attributeVOMap) throws PLException { UITableDefineVO tableDefineVO = new UITableDefineVO(); tableDefineVO.setOid(portal.id); tableDefineVO.setId(portal.viName); tableDefineVO.setBtmType(portal.typeName); tableDefineVO.setLinkTypeFlag(1 == portal.typeFlag); UIComponentDetailXO detailXO = null; try { detailXO = readInfoFromXML(portal.prm, UIComponentDetailXO.class); }catch (Throwable e){ logger.error("{}里的表格{}读取xml失败",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId()}); throw e; } if(detailXO == null){ throw new VciBaseException("读取{0}里{1}表格的信息错误,内容不是完整的xml格式",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getOid()}); } tableDefineVO.setQueryTemplateName(detailXO.getFormQueryTemplateName()); //表格的这个item只有一个 UIComponentItemXO itemXO = detailXO.getItems().get(0); if(StringUtils.isNotBlank(itemXO.getQueryTemplateName())){ //这个是表格的查询模板,外面还有一个UI的查询模板 tableDefineVO.setQueryTemplateName(itemXO.getQueryTemplateName()); } String formOid = itemXO.getBindFormOid(); //获取表单的信息,用来获取字段的信息 UIFormDefineVO formDefineVO = null; if(!queryDetail){ self.selectAllForm().stream().filter(s -> formOid.equalsIgnoreCase(s.getOid())).findAny().orElseGet(() -> null); }else{ try { formDefineVO = formDO2VO(platformClientUtil.getUIService().getPortalVIById(formOid)); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } if(formDefineVO == null){ logger.error("{}里的表格{}所需的表单{}不存在",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId(),formOid}); //throw new VciBaseException("{0}里的表格{1}所需的表单{2}不存在",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId(),formOid}); }else { if (StringUtils.isNotBlank(itemXO.getPageSize())) { //xxx,yy,zz#aa的格式 List limitList = null; int pageSize = 0; if (!itemXO.getPageSize().contains("#")) { pageSize = WebUtil.getInt(itemXO.getPageSize()); limitList = new ArrayList<>(); limitList.add("15"); limitList.add("50"); limitList.add("100"); limitList.add("500"); limitList.add("1000"); }else{ pageSize = WebUtil.getInt(itemXO.getPageSize().split("#")[1]); limitList = WebUtil.str2List(itemXO.getPageSize().split("#")[0]); } List limitIntList = new ArrayList<>(); limitList.stream().forEach(limit -> { int limitInt = WebUtil.getInt(limit); if(limitInt<=1000) { limitIntList.add(limitInt); } }); if (pageSize > 0) { UITablePageVO pageVO = new UITablePageVO(); pageVO.setLimit(pageSize); pageVO.setPage(1); tableDefineVO.setPageVO(pageVO); } tableDefineVO.setLimits(limitIntList.stream().sorted().collect(Collectors.toList()).toArray(new Integer[0])); } tableDefineVO.setWhereSql(itemXO.getWhereSql()); tableDefineVO.setDisplayQueryArea(Boolean.valueOf(itemXO.getDisplayQueryArea())); tableDefineVO.setDisplayFolder(Boolean.valueOf(itemXO.getDisplayFolder())); tableDefineVO.setFolderParentField(itemXO.getParentFolderName()); //处理列。平台不支持多行的情况 List tableFieldVOList = new ArrayList<>(); if (StringUtils.isBlank(itemXO.getDisplayFields())) { logger.error("{},{}列表没有显示的列.或者没有设置宽度",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId()}); }else { //严格按照数组的顺序,因为宽度是按照这个来的 String[] fields = itemXO.getDisplayFields().split(","); String[] fieldWidths = StringUtils.isBlank(itemXO.getFieldWidths()) ? new String[0] : itemXO.getFieldWidths().split(","); Map formFieldMap = formDefineVO.getItems().stream().collect(Collectors.toMap(s -> s.getField().toLowerCase(), t -> t, (o1, o2) -> o1)); for (int i = 0; i < fields.length; i++) { String fieldName = fields[i]; if (formFieldMap.containsKey(fieldName.toLowerCase())) { //throw new VciBaseException("{0}里{1}表格的字段{2}在对应的表单中没有找到",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId(),fieldName}); UIFormItemVO itemVO = formFieldMap.get(fieldName.toLowerCase()); UITableFieldVO fieldVO = new UITableFieldVO(); if ("combox".equalsIgnoreCase(itemVO.getType())) { fieldVO.setField(fieldName + "text"); fieldVO.setComboxKey(itemVO.getComboxKey()); fieldVO.setSortField(fieldName); fieldVO.setEdit("combox"); } else if ("refer".equalsIgnoreCase(itemVO.getType())) { fieldVO.setField(fieldName + "." + itemVO.getShowField()); fieldVO.setSortField(fieldName); fieldVO.setEdit("refer"); } else if (VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(fieldName.toLowerCase())) { fieldVO.setField(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase()); fieldVO.setSortField(fieldName); fieldVO.setEdit("combox"); //肯定是业务类型,因为链接类型没有这个字段 OsBtmTypeVO btmTypeVO = btmService.btmDO2VO(platformClientUtil.getBtmService().getBizTypeByName(tableDefineVO.getBtmType()),attributeVOMap); if(btmTypeVO!=null && StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){ fieldVO.setComboxKey(btmTypeVO.getLifeCycleId() + LC_STATUS_SUBFIX); } }else if("creator".equalsIgnoreCase(fieldName)){ fieldVO.setField("creator_name,(,creator,)"); fieldVO.setSortField(fieldName); } else if("lastmodifier".equalsIgnoreCase(fieldName)){ fieldVO.setField("lastmodifier_name,(,lastmodifier,)"); fieldVO.setSortField(fieldName); } else { fieldVO.setField(fieldName); } if("text".equalsIgnoreCase(itemVO.getType())){ fieldVO.setDateFormate(itemVO.getDateFormate()); } if("number".equalsIgnoreCase(itemVO.getType())){ fieldVO.setEdit("number"); } fieldVO.setTitle(itemVO.getText()); if (fieldWidths.length > i) { fieldVO.setWidth(WebUtil.getInt(fieldWidths[i])); } if ("date".equalsIgnoreCase(itemVO.getType()) || "time".equalsIgnoreCase(itemVO.getType()) || "datetime".equalsIgnoreCase(itemVO.getType())) { fieldVO.setDateFormate(itemVO.getDateFormate()); fieldVO.setEdit("date"); if(StringUtils.isBlank(itemVO.getDateFormate())){ fieldVO.setDateFormate(dateDefaultFormatMap.get(itemVO.getType().toLowerCase())); } } if(StringUtils.countMatches(fieldVO.getField(),".")>1 ){ fieldVO.setShowField(StringUtils.isBlank(fieldVO.getShowField())?fieldVO.getField().replace(".","--"):fieldVO.getShowField().replace(".","--")); } fieldVO.setFieldType(itemVO.getType()); tableFieldVOList.add(fieldVO); } else { logger.error("{}里{}表格的字段{}在对应的表单中没有找到", new String[]{tableDefineVO.getBtmType(), tableDefineVO.getId(), fieldName}); } } List> cols = new ArrayList<>(); cols.add(tableFieldVOList); tableDefineVO.setCols(cols); List canQueryFields = new ArrayList<>(); tableFieldVOList.stream().filter(s -> !UIFieldTypeEnum.FILE.getValue().equalsIgnoreCase(s.getFieldType()) && !UIFieldTypeEnum.MULTI_FILE.getValue().equalsIgnoreCase(s.getFieldType()) && !UIFieldTypeEnum.CUSTOM.getValue().equalsIgnoreCase(s.getFieldType())).forEach(fieldVO->{ //列表里面不放edit,而查询里面需要放edit UITableFieldVO queryFieldVO = new UITableFieldVO(); BeanUtilForVCI.convert(fieldVO,queryFieldVO); canQueryFields.add(queryFieldVO); }); tableDefineVO.setSeniorQueryColumns(canQueryFields); //要把列上的edit去掉,因为暂时不支持列表直接编辑 tableFieldVOList.stream().forEach(fieldVO->{ fieldVO.setEdit(""); }); //查询的列 if (StringUtils.isNotBlank(itemXO.getQueryFields())) { String[] queryFields = itemXO.getQueryFields().split(","); List queryFieldVOs = new ArrayList<>(); for (int i = 0; i < queryFields.length; i++) { String fieldName = fields[i]; if (!formFieldMap.containsKey(fieldName.toLowerCase())) { logger.error("{}里{}表格的字段{}在对应的表单中没有找到", new String[]{tableDefineVO.getBtmType(), tableDefineVO.getOid(), fieldName}); } else { UIFormItemVO itemVO = formFieldMap.get(fieldName.toLowerCase()); UITableFieldVO fieldVO = new UITableFieldVO(); if ("combox".equalsIgnoreCase(itemVO.getType())) { fieldVO.setField(fieldName + "text"); fieldVO.setSortField(fieldName); fieldVO.setComboxKey(itemVO.getComboxKey()); fieldVO.setData(itemVO.getData()); fieldVO.setEdit("combox"); } else if ("refer".equalsIgnoreCase(itemVO.getType())) { fieldVO.setField(fieldName + "." + itemVO.getShowField()); fieldVO.setSortField(fieldName); fieldVO.setShowField(itemVO.getShowField()); fieldVO.setReferConfig(itemVO.getReferConfig()); fieldVO.setEdit("refer"); } else if (VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(fieldName.toLowerCase())) { fieldVO.setField(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase()); fieldVO.setSortField(fieldName); //肯定是业务类型,因为链接类型没有这个字段 OsBtmTypeVO btmTypeVO = btmService.getBtmById(tableDefineVO.getBtmType()); if(btmTypeVO!=null && StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){ fieldVO.setComboxKey(btmTypeVO.getLifeCycleId() + LC_STATUS_SUBFIX); } fieldVO.setEdit("combox"); } else { fieldVO.setField(fieldName); } if("number".equalsIgnoreCase(itemVO.getType())){ fieldVO.setEdit("number"); } fieldVO.setQueryField(fieldName); fieldVO.setTitle(itemVO.getText()); if ("date".equalsIgnoreCase(itemVO.getType()) || "time".equalsIgnoreCase(itemVO.getType()) || "datetime".equalsIgnoreCase(itemVO.getType())) { fieldVO.setDateFormate(itemVO.getDateFormate()); fieldVO.setEdit("date"); } queryFieldVOs.add(fieldVO); } } tableDefineVO.setQueryColumns(queryFieldVOs); } } } return tableDefineVO; } /** * 使用表格的英文名称获取表单 * * @param btmId 业务类型 * @param id 表格的英文名称 * @return 表单的定义 */ @Override 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 = platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmId, id); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } return tableDO2VO(portalVI,true,null); } return self.selectAllTableMap().getOrDefault(btmId.toLowerCase()+SEP+id.toLowerCase(),null); } /** * 使用表格的英文名称获取表单 * * @param btmId 业务类型编号 * @param ids 表格的英文名称 * @return 表单的定义 */ @Override public List listTableByIds(String btmId, Collection ids) { if(StringUtils.isBlank(btmId) || CollectionUtils.isEmpty(ids)){ return null; } Map tableDefineVOMap = self.selectAllTableMap(); List defineVOS = new ArrayList<>(); ids.stream().forEach(id->{ String key = btmId.toLowerCase()+SEP + id.toLowerCase(); if(tableDefineVOMap.containsKey(key)){ defineVOS.add(tableDefineVOMap.get(key)); } }); return defineVOS; } /** * 查询所有的action * * @return 显示对象 */ @Override @VciUnLog public List selectAllAction() { try { return actionDO2VOs(Arrays.stream(platformClientUtil.getUIService().getAllPLAction()).collect(Collectors.toList())); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } /** * 查询所有的action * * @return 显示对象,key是action的主键 */ @Override public Map selectAllActionMap() { return Optional.ofNullable(self.selectAllAction()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getOid(),t->t)); } /** * action数据对象转换为显示对象 * * @param actions 数据对象 * @return 显示对象 */ @Override @VciUnLog public List actionDO2VOs(Collection actions) { List actionVOS = new ArrayList<>(); Optional.ofNullable(actions).orElseGet(()->new ArrayList<>()).stream().forEach(action->{ UIActionVO actionVO = actionDO2VO(action); actionVOS.add(actionVO); }); return actionVOS; } /** * action数据对象转换为显示对象 * * @param action 数据对象 * @return 显示对象 */ @Override @VciUnLog public UIActionVO actionDO2VO(PLAction action) { UIActionVO actionVO = new UIActionVO(); if(action!=null){ actionVO.setOid(action.plOId); actionVO.setId(action.plCode); actionVO.setName(action.plName); actionVO.setBsUrl(StringUtils.isBlank(action.plBSUrl)?"":action.plBSUrl); actionVO.setCsClass(StringUtils.isBlank(action.plCSClass)?"":action.plCSClass); actionVO.setDescription(action.plDesc); actionVO.setActionUsedType(action.plTypeType); actionVO.setCreator(action.plCreateUser); actionVO.setLastModifier(action.plModifyUser); try { actionVO.setCreateTime(new Date(action.plCreateTime)); actionVO.setLastModifyTime(new Date(action.plCreateTime)); }catch (Throwable e){ logger.error("转换时间",e); } actionVO.setActionCls(action.plActionCls); } return actionVO; } /** * 清除缓存 */ @Override public void clearCache() { } /** * 查询所有的UI上下文 * * @return 显示对象 */ @Override @VciUnLog public List selectAllUIContent() { try { return UIContentDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLUILayouts()).collect(Collectors.toList())); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } /** * ui上下文 数据对象转换为显示对象 * @param pageLayoutDefinations 上下文UI对象 * @return 显示对象 */ private List UIContentDO2VOs(Collection pageLayoutDefinations){ List contentVOS = new ArrayList<>(); Optional.ofNullable(pageLayoutDefinations).orElseGet(()->new ArrayList()).stream().forEach(pageLayout->{ contentVOS.add(UIContentDO2VO(pageLayout,false,null)); }); if(!CollectionUtils.isEmpty(contentVOS)) { Map> layoutMap = batchListLayoutByContent(contentVOS.stream().map(UIContentVO::getOid).collect(Collectors.toSet())); contentVOS.stream().forEach(contentVO-> { List layoutVOS = layoutMap.getOrDefault(contentVO.getOid(), new ArrayList<>()); if(!CollectionUtils.isEmpty(layoutVOS)){ Map> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType)); contentVO.setWestAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.WEST.getValue(),new ArrayList<>())); contentVO.setNorthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.NORTH.getValue(),new ArrayList<>())); contentVO.setCenterAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.CENTER.getValue(),new ArrayList<>())); contentVO.setSouthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.SOUTH.getValue(),new ArrayList<>())); } }); } return contentVOS; } /** * ui上下文 数据对象转换为显示对象 * @param pageLayoutDefination 上下文UI对象 * @param queryDetail 是否查询区域 * @return 显示对象 */ @VciUnLog @Override public UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail,Map> roleRightMap){ UIContentVO contentVO = new UIContentVO(); if(pageLayoutDefination !=null){ contentVO.setOid(pageLayoutDefination.plOId); contentVO.setId(pageLayoutDefination.plCode); contentVO.setName(pageLayoutDefination.plName); contentVO.setBtmTypeId(pageLayoutDefination.plRelatedType); contentVO.setDescription(pageLayoutDefination.plDesc); contentVO.setCreator(pageLayoutDefination.plCreateUser); try { contentVO.setCreateTime(new Date(pageLayoutDefination.plCreateTime)); contentVO.setLastModifyTime(new Date(pageLayoutDefination.plModifyTime)); } catch (Exception e) { e.printStackTrace(); } contentVO.setLastModifier(pageLayoutDefination.plModifyUser); if(queryDetail){ //查询包含的内容 List layoutVOS = null; //判断是否根据权限返回 layoutVOS = listLayoutByContent(contentVO.getOid(),roleRightMap); if(!CollectionUtils.isEmpty(layoutVOS)){ if(layoutVOS.size() == 1){ //只有一个区域 UILayoutVO layoutVO = layoutVOS.get(0); List componentVOs = layoutVO.getComponentVOs(); //第一个作为center UIComponentVO firstCompVO = componentVOs.stream().min(Comparator.comparing(UIComponentVO::getOrderNum)).get(); List southCompVO = componentVOs.stream().filter(s->!s.getOid().equals(firstCompVO.getOid())).collect(Collectors.toList()); UILayoutVO centerVO = new UILayoutVO(); BeanUtilForVCI.convert(layoutVO,centerVO); centerVO.setOid(centerVO.getOid() + "_center"); centerVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue()); centerVO.setOrderNum(0); List centerCompVOS = new ArrayList<>(); centerCompVOS.add(firstCompVO); centerVO.setComponentVOs(centerCompVOS); centerVO.setTitle(firstCompVO.getName()); List centerLayoutVOs = new ArrayList<>(); centerLayoutVOs.add(centerVO); contentVO.setCenterAreas(centerLayoutVOs); contentVO.setWestAreas(null); contentVO.setNorthAreas(null); contentVO.setSouthAreas(null); //其余的作为south if(!CollectionUtils.isEmpty(southCompVO)) { UILayoutVO southVO = new UILayoutVO(); BeanUtilForVCI.convert(layoutVO, southVO); southVO.setOid(centerVO.getOid() + "_south"); southVO.setLayoutAreaType(UILayoutAreaTypeEnum.SOUTH.getValue()); southVO.setOrderNum(0); southVO.setComponentVOs(southCompVO); List southLayoutVOs = new ArrayList<>(); southLayoutVOs.add(southVO); contentVO.setSouthAreas(southLayoutVOs); } }else { //我们需要过滤一遍是否每个区域都包含 Map> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType)); if(pageLayoutDefination.plIsShowNavigator ==1) { contentVO.setWestAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.WEST.getValue(), new ArrayList<>())); } contentVO.setNorthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.NORTH.getValue(), new ArrayList<>())); if(pageLayoutDefination.plIsShowForm == 1) { contentVO.setCenterAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.CENTER.getValue(), new ArrayList<>())); } if(pageLayoutDefination.plIsShowTab == 1) { contentVO.setSouthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.SOUTH.getValue(), new ArrayList<>())); } if(CollectionUtils.isEmpty(contentVO.getCenterAreas()) && !CollectionUtils.isEmpty(contentVO.getSouthAreas())){ //有操作区但是没有控制器的情况 contentVO.getSouthAreas().stream().forEach(layoutVO->{ layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue()); }); contentVO.setCenterAreas(contentVO.getSouthAreas()); contentVO.setSouthAreas(null); } if(CollectionUtils.isEmpty(contentVO.getCenterAreas()) && !CollectionUtils.isEmpty(contentVO.getWestAreas())){ //只有导航区 contentVO.getWestAreas().stream().forEach(layoutVO->{ layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue()); }); contentVO.setCenterAreas(contentVO.getWestAreas()); contentVO.setWestAreas(null); } } } //contentVO.setLayouts(listLayoutByContent(contentVO.getOid())); } } return contentVO; } // private List swapLayArea(List layoutVOS){ // List layoutVOList = new ArrayList<>(); // //1 导航区 // //2 主内容区 // //3 页签区 // if(!CollectionUtils.isEmpty(layoutVOS)){ // //只有一个区域的时候,都放在center里,哪怕本身是导航区 // if(layoutVOS.size() == 1){ // layoutVOS.get(0).setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue()); // layoutVOList.add(layoutVOS.get(0)); // }else{ // Map> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType)); // if(layoutAreaMap.containsKey("1")){ // // // } // } // } // } /** * 获取某个UI上下文的区域,根据权限控制返回 * @param pkContent UI上下文的主键 * @return 上下文 */ private List listLayoutByContent(String pkContent,Map> roleRightMap){ try { List 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 filterTabPageByRoleRight(List tabPageList, Map> roleRightMap){ if(Func.isEmpty(roleRightMap) || Func.isEmpty(tabPageList)){ return tabPageList; } List 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 filterPageDefByRoleRight(List plPageDefinationList, Map> roleRightMap){ if(Func.isEmpty(roleRightMap) || Func.isEmpty(plPageDefinationList)){ return plPageDefinationList; } List 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; } /** * 批量获取UI上下文的区域 * @param pkContents ui上下文主键 * @return key是ui上下文的主键 */ private Map> batchListLayoutByContent(Collection pkContents){ Map> layoutMap = self.selectAllUILayoutMap(); List layoutVOS = new ArrayList<>(); pkContents.stream().forEach(pkContent->{ if(layoutMap.containsKey(pkContent)){ layoutVOS.addAll(layoutMap.get(pkContent)); } }); return layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getPkContent)); } /** * 分隔符 */ public static final String SEP = "${uiContent}"; /** * 查询所有的UI上下文的映射 * * @return 显示对象,key业务类型+${uiContent}+上下文的Id */ @Override public Map selectAllUIContentMap() { return Optional.ofNullable(self.selectAllUIContent()).orElseGet(()->new ArrayList()).stream().collect(Collectors.toMap(s->s.getBtmTypeId() + SEP + s.getId(),t->t)); } /** * 查询所有的上下文的区域 * * @return 区域的显示对象 */ @Override public List selectAllUILayout() { // try { // return UILayoutDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLTabPages()).collect(Collectors.toList()),true); // } catch (PLException vciError) { // throw WebUtil.getVciBaseException(vciError); // } return null; } /** * UI区域数据对象转换为显示对象 * @param pages 区域的数据对象 * @return 显示对象 */ private List UILayoutDO2VOs(Collection pages, boolean queryDetail, Map> roleRightMap){ List contentVOS = new ArrayList<>(); Map attributeVOMap; if(pages != null && pages.size() > 0){ attributeVOMap = attrService.selectAllAttributeMap(); Map actionVOMap = AllActionThreadLocal.get(); if(actionVOMap == null || actionVOMap.isEmpty()){ actionVOMap = selectAllActionMap(); AllActionThreadLocal.set(actionVOMap); } }else{ attributeVOMap = null; } Optional.ofNullable(pages).orElseGet(()->new ArrayList()).stream().forEach(page->{ UILayoutVO layoutVO = UILayoutDO2VO(page, queryDetail,attributeVOMap,roleRightMap); if(layoutVO.isEnableStatus()) { contentVOS.add(layoutVO); } }); if(!queryDetail) { Map> uiComponentMap = self.selectAllUIComponentMap(); contentVOS.stream().forEach(layout -> { if (uiComponentMap.containsKey(layout.getOid())) { layout.setComponentVOs(uiComponentMap.get(layout.getOid())); } }); } AllActionThreadLocal.remove(); return contentVOS; } /** * UI上下文的区域 * @param page 布局区域 * @param queryDetail 是否查询组件的信息 * @return 区域的显示对象 */ @VciUnLog private UILayoutVO UILayoutDO2VO(PLTabPage page, boolean queryDetail,Map attributeVOMap, Map> roleRightMap){ UILayoutVO layoutVO = new UILayoutVO(); if(page !=null ){ layoutVO.setOid(page.plOId); layoutVO.setId(page.plCode); layoutVO.setName(page.plName); layoutVO.setEnableStatus(1 == page.plIsOpen?true:false); if(!layoutVO.isEnableStatus()){ //没有启动直接返回了,别查下面了 return layoutVO; } layoutVO.setTitle(page.plLabel); if(StringUtils.isBlank(layoutVO.getTitle())){ layoutVO.setTitle(layoutVO.getName()); } layoutVO.setDescription(page.plDesc); layoutVO.setOrderNum(page.plSeq); layoutVO.setPkContent(page.plOId); layoutVO.setLayoutAreaType(page.plAreaType+""); if(1 == page.plAreaType) { layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.WEST.getValue()); }else if(2 == page.plAreaType){ layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue()); }else{ layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.SOUTH.getValue()); } layoutVO.setCreator(page.plCreateUser); try { layoutVO.setCreateTime(new Date(page.plCreateTime)); layoutVO.setLastModifyTime(new Date(page.plModifyTime)); } catch (Exception e) { e.printStackTrace(); } layoutVO.setLastModifier(page.plModifyUser); layoutVO.setDisplayExpression(page.plOpenExpression); layoutVO.setUiParseClass(page.plUIParser); layoutVO.setExtendAttr(page.plExtAttr); if(queryDetail){ //单个的,直接获取 try { List pageDefinationList = Arrays.stream(platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList()); pageDefinationList = this.filterPageDefByRoleRight(pageDefinationList,roleRightMap); List uiComponentVOS = uiComponentDO2VOs(pageDefinationList, true, attributeVOMap,roleRightMap); layoutVO.setComponentVOs(uiComponentVOS); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } } return layoutVO; } /** * 查询所有的上下文的区域的映射 * * @return 区域的显示对象 ,key是所属UI上下文的主键 */ @Override public Map> selectAllUILayoutMap() { return Optional.ofNullable(self.selectAllUILayout()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.groupingBy(s->s.getPkContent())); } /** * 查询所有的组件 * * @return UI组件 */ @Override public List selectAllUIComponent() { // try { // return uiComponentDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLPageDefinations()).collect(Collectors.toList()),false); // } catch (PLException vciError) { // throw WebUtil.getVciBaseException(vciError); // } return null; } /** * 使用主键获取 * * @param componentOid 组件的主键 * @return 主键的显示对象 */ @Override public UIComponentVO getComponentByOid(String componentOid, Map attributeVOMap) { if(StringUtils.isBlank(componentOid)){ return null; } try { return uiComponentDO2VO(platformClientUtil.getUIService().getPLPageDefinationById(componentOid),true,attributeVOMap,null); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } /** * 组件的数据对象转换为显示对象 * @param pages 数据对象 * @return 显示对象 */ private List uiComponentDO2VOs(Collection pages, boolean queryDetail,Map attributeVOMap, Map> roleRightMap){ List componentVOS = new ArrayList<>(); pages.stream().forEach(page->{ componentVOS.add(uiComponentDO2VO(page,queryDetail,attributeVOMap,roleRightMap)); }); return componentVOS; } /** * 组件的数据对象转换为显示对象 * @param page 数据对象 * @return 显示对象 */ @VciUnLog private UIComponentVO uiComponentDO2VO(PLPageDefination page, boolean queryDetail, Map attributeVOMap, Map> roleRightMap){ UIComponentVO componentVO = new UIComponentVO(); if(page !=null){ componentVO.setOid(page.plOId); componentVO.setPkLayout(page.plTabPageOId); componentVO.setName(page.name); componentVO.setDescription(page.desc); componentVO.setOrderNum((int) page.seq); UIComponentDefineXO componentDefineXO = null; try { componentDefineXO = readInfoFromXML(page.plDefination, UIComponentDefineXO.class); }catch (Throwable e){ logger.error("读取xml出错",e); return null; } //自定义查询方式 componentVO.setBsDataModel(componentDefineXO.getBsDataModel()); //之前的类型的值是1,2,3等看着不直观 UIComponentTypeEnum componentTypeEnum = null; if("1".equals(componentDefineXO.getTemplateType())){ //说明这个表格的类型 componentTypeEnum = UIComponentTypeEnum.TABLE; //查询表格相关的配置 String btmType ; if("1".equals(componentDefineXO.getSearchTarger())){ //本对象,就是业务类型 btmType = componentDefineXO.getShowType(); }else{ //链接类型 btmType = componentDefineXO.getLinkType(); } if(!queryDetail) { //从缓存里获取 Map tableDefineVOMap = self.selectAllTableMap(); String key = btmType.toLowerCase() + SEP + componentDefineXO.getTemplateId().toLowerCase(); if (!tableDefineVOMap.containsKey(key)) { throw new VciBaseException("{0}里的表格{1}不存在", new String[]{btmType, componentDefineXO.getTemplateId()}); } componentVO.setTableDefineVO(tableDefineVOMap.get(key)); }else{ try { componentVO.setTableDefineVO(tableDO2VO(platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true,attributeVOMap)); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } if(StringUtils.isNotBlank(componentDefineXO.getQueryTemplateName())){ componentVO.getTableDefineVO().setQueryTemplateName(componentDefineXO.getQueryTemplateName()); } }else if("2".equals(componentDefineXO.getTemplateType())){ //自定义 componentTypeEnum = UIComponentTypeEnum.CUSTOMER; componentVO.setCustomClass(componentDefineXO.getControlPath()); }else if("3".equals(componentDefineXO.getTemplateType())){ //树表 componentTypeEnum = UIComponentTypeEnum.TREE_GRID; //查询表格相关的配置 String btmType ; boolean isLink = false; if("1".equals(componentDefineXO.getSearchTarger())){ //本对象,就是业务类型 btmType = componentDefineXO.getShowType(); }else{ //链接类型 btmType = componentDefineXO.getLinkType(); isLink = true; } UITableDefineVO tableDefineVO = null; if(!queryDetail) { Map tableDefineVOMap = self.selectAllTableMap(); String key = btmType.toLowerCase() + SEP + componentDefineXO.getTemplateId().toLowerCase(); if (!tableDefineVOMap.containsKey(key)) { throw new VciBaseException("{0}里的表格{1}不存在", new String[]{btmType, componentDefineXO.getTemplateId()}); } tableDefineVO= tableDefineVOMap.get(key); }else{ try { tableDefineVO = tableDO2VO(platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true,null); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } if(tableDefineVO != null) { UITreeTableDefineVO treeTableDefineVO = new UITreeTableDefineVO(); BeanUtilForVCI.convert(tableDefineVO, treeTableDefineVO); if(isLink){ treeTableDefineVO.setTreeCurrentField("t_oid"); treeTableDefineVO.setTreeParentField("f_oid"); treeTableDefineVO.setTreeFieldName(componentDefineXO.getExpandCols()); }else{ if(componentDefineXO.getExpandCols().contains(",")){ treeTableDefineVO.setTreeParentField(componentDefineXO.getExpandCols().split(",")[0]); treeTableDefineVO.setTreeFieldName(componentDefineXO.getExpandCols().split(",")[1]); }else{ treeTableDefineVO.setTreeParentField("parentOid"); treeTableDefineVO.setTreeFieldName(componentDefineXO.getExpandCols()); } } //现在树表只支持全部展开 componentVO.setTreeTableDefineVO(treeTableDefineVO); }else{ logger.error("{},{}里的信息不正确",new String[]{btmType,}); } if(StringUtils.isNotBlank(componentDefineXO.getQueryTemplateName())){ componentVO.getTreeTableDefineVO().setQueryTemplateName(componentDefineXO.getQueryTemplateName()); } }else if ("4".equals(componentDefineXO.getTemplateType())){ //表单 componentTypeEnum = UIComponentTypeEnum.FORM; //查询表单相关的配置 String btmType ; if("1".equals(componentDefineXO.getSearchTarger())){ //本对象,就是业务类型 btmType = componentDefineXO.getShowType(); }else{ //链接类型 btmType = componentDefineXO.getLinkType(); } if(!queryDetail) { Map formDefineVOMap = self.selectAllFormMap(); String key = btmType.toLowerCase() + SEP + componentDefineXO.getTemplateId().toLowerCase(); if (!formDefineVOMap.containsKey(key)) { throw new VciBaseException("{0}里的表格{1}不存在", new String[]{btmType, componentDefineXO.getTemplateId()}); } componentVO.setFormDefineVO(formDefineVOMap.get(key)); }else{ try { componentVO.setFormDefineVO(formDO2VO(platformClientUtil.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()))); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } }else if("5".equals(componentDefineXO.getTemplateType())){ //树 componentTypeEnum = UIComponentTypeEnum.TREE; UITreeDefineVO treeDefineVO = new UITreeDefineVO(); treeDefineVO.setBtmType(componentDefineXO.getShowType()); treeDefineVO.setLinkType(componentDefineXO.getLinkType()); treeDefineVO.setLoadType("1".equalsIgnoreCase(componentDefineXO.getExpandMode())?"node":"all"); //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()); treeDefineVO.setQueryTemplateName(componentDefineXO.getTemplateId()); treeDefineVO.setTreeNodeExpression(componentDefineXO.getShowAbs()); treeDefineVO.setShowLinkAbs(componentDefineXO.getShowLinkAbs()); componentVO.setTreeDefineVO(treeDefineVO); }else{ throw new VciBaseException("UI组件的类型不支持,{0}",new String[]{componentDefineXO.getTemplateType()}); } componentVO.setUiComponentType(componentTypeEnum.getValue()); componentVO.setUiComponentTypeText(componentTypeEnum.getText()); //显示类型现在用来做啥的呢 UIComponentDisplayTypeEnum displayTypeEnum = null; if("1".equals(componentDefineXO.getNavigatorType())){ displayTypeEnum = UIComponentDisplayTypeEnum.NONE; }else if("2".equals(componentDefineXO.getNavigatorType())){ displayTypeEnum = UIComponentDisplayTypeEnum.ROLE; }else if("3".equals(componentDefineXO.getNavigatorType())){ displayTypeEnum = UIComponentDisplayTypeEnum.FOLDER; } componentVO.setUiParseClass(componentDefineXO.getUIParser()); componentVO.setExtendAttr(componentDefineXO.getExtAttr()); componentVO.setButtons(listButtonByComponent(componentVO.getOid(),roleRightMap)); } return componentVO; } /** * 获取某个组件的按钮(根据权限过滤) * @param pkComponent 组件的主键 * @return 按钮的信息 */ @Override public List listButtonByComponent(String pkComponent, Map> roleRightMap){ try { List 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 buttonDefineVO = buttonDefineVOS.iterator(); while (buttonDefineVO.hasNext()){ UIButtonDefineVO buttonDefine = buttonDefineVO.next(); if(roleRightMap.containsKey(buttonDefine.getPkComponent())) { List 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; } List childrens = buttonDefineVOS.stream().filter(s -> StringUtils.isNotBlank(s.getPkParentOid())).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(childrens)){ buttonDefineVOS = buttonDefineVOS.stream().filter( s->StringUtils.isBlank(s.getPkParentOid())).collect(Collectors.toList()); //只支持一级.多了也不好看 buttonDefineVOS.stream().forEach(buttonVO->{ buttonVO.setChildren(childrens.stream().filter(s->buttonVO.getOid().equals(s.getPkParentOid())).collect(Collectors.toList())); }); return buttonDefineVOS; }else{ return buttonDefineVOS; } } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } } /** * 按钮的数据对象转换为显示对象 * @param buttons 按钮的数据对象 * @return 显示对象 */ @Override public List buttonDO2VOs(Collection buttons){ List buttonDefineVOS = new ArrayList<>(); if(buttons != null && buttons.size() > 0){ // Map actionVOMap = self.selectAllActionMap(); Map actionVOMap = null; actionVOMap = AllActionThreadLocal.get(); if(actionVOMap == null ){ actionVOMap = self.selectAllActionMap(); } Map finalActionVOMap = actionVOMap; Optional.ofNullable(buttons).orElseGet(()->new ArrayList<>()).stream().forEach(button->{ buttonDefineVOS.add(buttonDO2VO(button, finalActionVOMap)); }); } return buttonDefineVOS; } /** * 按钮的数据对象转换为显示对象 * @param button 按钮的数据对象 * @return 显示对象 */ @Override public UIButtonDefineVO buttonDO2VO(PLTabButton button, Map actionVOMap) { UIButtonDefineVO buttonVO = new UIButtonDefineVO(); // Map actionVOMap = ServiceProvider.getUIService().getAllPLAction(); if(button !=null){ buttonVO.setOid(button.plOId); buttonVO.setPkComponent(button.plTableOId); buttonVO.setName(button.plLabel); buttonVO.setDescription(button.plDesc); buttonVO.setOrderNum((int) button.plSeq); buttonVO.setCreator(button.plCreateUser); buttonVO.setLastModifier(button.plModifyUser); try{ buttonVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(button.plCreateTime),VciDateUtil.DateTimeFormat)); buttonVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(button.plModifyTime),VciDateUtil.DateTimeFormat)); }catch (Throwable e){ } buttonVO.setPkParentOid(button.plParentOid); buttonVO.setDisplayMode(button.displayMode); buttonVO.setIconPath(button.iconPath); buttonVO.setAuthorization("0".equalsIgnoreCase(button.authorization)); buttonVO.setHidden(!"0".equalsIgnoreCase(button.show)); //查询action buttonVO.setAreaType(button.plAreaType); if(StringUtils.isNotBlank(button.plActionOId) && actionVOMap.containsKey(button.plActionOId)){ UIActionVO actionVO = actionVOMap.get(button.plActionOId); buttonVO.setActionVO(actionVO); buttonVO.setId(actionVO.getId()); buttonVO.setUrl(actionVO.getBsUrl()); buttonVO.setCsUrl(actionVO.getCsClass()); //查找参数 Map params = new HashMap<>(); try { PLCommandParameter[] parameters = platformClientUtil.getUIService().getPLCommandParametersByCommandOId(buttonVO.getOid()); if(parameters!=null && parameters.length > 0){ for(PLCommandParameter parameter: parameters){ params.put(parameter.plKey,parameter.plValue); } } } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } buttonVO.setParamVOS(params); if(StringUtils.isBlank(buttonVO.getIconPath()) && (params.containsKey("icon") || params.containsKey("iconPath") || params.containsKey("iconCls"))){ buttonVO.setIconPath(params.getOrDefault("icon",params.getOrDefault("iconPath",params.getOrDefault("iconCls","")))); } } } return buttonVO; } /** * 从xml的信息中读取对象 * @param xmlInfo xml的信息 * @param xoClass 对象的class * @param 对象的 * @return 对象 * @throws VciBaseException 转换出错会抛出异常 */ private T readInfoFromXML(String xmlInfo,Class xoClass) throws VciBaseException{ XStream xStream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-","_"))); xStream.setClassLoader(getClass().getClassLoader()); xStream.processAnnotations(xoClass); xStream.ignoreUnknownElements(); try{ return (T)xStream.fromXML(xmlInfo); }catch (Throwable e){ String error = LangBaseUtil.getErrorMsg(e); if(logger.isErrorEnabled()){ logger.error(error,e); logger.error(xmlInfo); } throw new VciBaseException(error,new String[0],e); } } /** * 查询所有的组件 * * @return key是所属的区域, */ @Override public Map> selectAllUIComponentMap() { return Optional.ofNullable(self.selectAllUIComponent()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.groupingBy(UIComponentVO::getPkLayout)); } /** * 使用业务类型或者链接类型,以及UI上下文的编号,获取相应的信息 * * @param btmType 业务类型 * @param id 主键 * @return UI上下文的信息 */ @Override public UIContentVO getUIContentByBtmTypeAndId(String btmType, String id) throws PLException { WebUtil.alertNotNull(btmType,"业务类型或者链接类型",id,"UI上下文的编号"); PLUILayout[] obj = null; try { obj = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(btmType); } catch (PLException vciError) { throw WebUtil.getVciBaseException(vciError); } // 1、根据当前角色判断是管理人员还是普通用户(正常来说只有普通用户才会用到该查询接口) Map> 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)) { context = obj[i]; break; } } // 4、每一个菜单查询的都是一个UI上下文,所以UI上下文是有功能授权控制的,只需要控制后面的页签、页面、按钮的权限。 return UIContentDO2VO(context, true,roleRightMap); } }