package com.vci.client.portal.utility; import java.io.ByteArrayInputStream; import java.io.ObjectInputStream; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.dom4j.DocumentException; import org.omg.CORBA.IntHolder; import com.vci.corba.omd.atm.AttribItem; import com.vci.corba.omd.btm.BtmAndApName; import com.vci.corba.omd.btm.BtmItem; import com.vci.corba.omd.data.BusinessObject; import com.vci.corba.omd.data.LinkObject; import com.vci.corba.omd.etm.EnumChild; import com.vci.corba.omd.etm.EnumItem; import com.vci.corba.omd.ltm.LinkType; import com.vci.corba.omd.stm.StatePool; import com.vci.corba.query.ObjectQueryService.FindBTMObjectsV3Result; import com.vci.corba.query.ObjectQueryService.FindLTObjectsV2Result; import com.vci.corba.query.data.BtmRefQueryOption; import com.vci.corba.query.data.RefPath; import com.vci.omd.utils.ObjectTool; import com.vci.client.common.oq.OQTool; import com.vci.client.common.providers.ServiceProvider; import com.vci.client.omd.attribpool.ui.APClient; import com.vci.client.omd.btm.ui.BtmClient; import com.vci.client.omd.linktype.LinkTypeStart; import com.vci.client.omd.statepool.StatePoolStart; import com.vci.client.oq.QTClient; import com.vci.client.portal.custom.CustomChangeDataByExprission; import com.vci.client.portal.custom.ICustomDefine; import com.vci.client.portal.utility.tabledata.DefaultTableDataQueryParam; import com.vci.client.portal.utility.tabledata.ITableDataQueryParam; import com.vci.client.utils.TimeMonitor; import com.vci.common.qt.object.Condition; import com.vci.common.qt.object.OrderInfo; import com.vci.common.qt.object.PageInfo; import com.vci.common.qt.object.QTConstants; import com.vci.common.qt.object.QueryTemplate; import com.vci.common.util.CollectionUtils; import com.vci.common.utility.ObjectUtility; import com.vci.corba.common.VCIError; public class TableDataUtil { public final String LCSTATUS = "lcstatus"; private HashMap> typeAttrEnumValueToNameMap = new HashMap>(); private HashMap> typeAttrEnumNameToValueMap = new HashMap>(); private Map showExpressMap = new HashMap(); /** * 查询历史数据对应的详细信息 * @param sourceDataOid, 选择数据的oid * @param showType, 显示类型 * @param queryColumnsMap, 查询列, key为查询列名,value为显示名称 * @param customMap, 自定义列 * @return * @throws VCIError * @throws DocumentException */ public List> getHistoryObjectDataList(String sourceDataOid,String showType, Map queryColumnsMap, Map customMap, Map fileMap) throws VCIError, DocumentException { //查询历史数据 BusinessObject[] bos = getHistroyBusinessObject(sourceDataOid); DataModelProcessor processor = new DataModelProcessor(); List> datas = getObjectDataSecondList(processor, bos, showType, queryColumnsMap); if (customMap != null && customMap.size() > 0) { getCustomValue(customMap, datas); } if (fileMap != null && fileMap.size() > 0) { getFileColValue(fileMap, datas); } return datas; } /** * 获取对象对应的历史信息 * @param objOid 历史数据oid * @return * @throws VCIError */ private BusinessObject[] getHistroyBusinessObject(String objOid) throws VCIError { Map conditionMap = new HashMap(); conditionMap.put("hoid", objOid); QueryTemplate qt = this.getHistoryBOQueryTemplate(conditionMap); return this.getHistoryBusinessObject(qt); } /** * 获取 objecthistoryinfo 对应的 实际业务类型历史版本数据(返回的是 plhistory 对应的 BusinessObject) * @param objHisOid objecthistoryinfo 对象的oid * @return * @throws VCIError */ public BusinessObject[] getHistroyBusinessObjectByObjHistoryOid(String objHisOid) throws VCIError { Map conditionMap = new HashMap(); conditionMap.put("oid", objHisOid); QueryTemplate qt = this.getHistoryBOQueryTemplate(conditionMap); return this.getHistoryBusinessObject(qt); } private BusinessObject[] getHistoryBusinessObject(QueryTemplate qt) throws VCIError{ List result = new ArrayList(); try { BusinessObject[] bos = QTClient.getService().findBTMObjects(qt.getId(), OQTool.qtTOXMl(qt).asXML()); for(int i = 0; i < bos.length; i++) { String s = ObjectTool.getBOAttributeValue(bos[i], "plhistory"); byte[] bs = URLDecoder.decode(s, "UTF-8").getBytes("ISO-8859-1"); if(bs!= null && bs.length>0){ BusinessObject obj = (BusinessObject)this.getObj(bs); result.add(obj); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); VCIError vcierror = new VCIError("获取历史信息时,发生转码错误!",new String[]{e.getMessage()}); throw vcierror; } return result.toArray(new BusinessObject[0]); } /** * 从clob中读取历史信息对象 * @param bs * @return * @throws VCIError */ private Object getObj(byte[] bs) throws VCIError { try { ByteArrayInputStream bais = new ByteArrayInputStream(bs); ObjectInputStream ips = new ObjectInputStream(bais); Object bo = ips.readObject(); ips.close(); bais.close(); return bo; } catch (Exception e) { e.printStackTrace(); VCIError vcierror = new VCIError("读取历史信息出错!",new String[]{e.getMessage()}); throw vcierror; } } private QueryTemplate getHistoryBOQueryTemplate(Map conditionMap) { QueryTemplate qt = new QueryTemplate(); qt.setId("historyBOQueryTemplate"); qt.setBtmType("objecthistoryinfo"); qt.setType("btm"); List clauseList = new ArrayList(); clauseList.add("*"); qt.setClauseList(clauseList); qt.setQueryChildrenFlag(false); qt.setRightFlag(false); qt.setVersion(1); OrderInfo oi = new OrderInfo(); oi.setOrderField("createtime"); oi.setOrderMode("desc"); oi.setLevel(0); List orderInfoList = new ArrayList(); orderInfoList.add(oi); if (orderInfoList != null && orderInfoList.size() > 0) { qt.setOrderInfoList(orderInfoList); } if (conditionMap != null && conditionMap.size() > 0) { Condition cond = OQTool.getCondition(conditionMap); qt.setCondition(cond); } return qt; } /** * 返回 表格业务对象数据结果(V3) * @param queryParam 表格数据查询参照 * @return 返回 List> 每条数据 以Map(key:itemField value:属性的值)的形式存在于List中 * @throws VCIError * @throws DocumentException * @see com.vci.client.portal.utility.tabledata.ITableDataQueryParam */ public List> getObjectDataListV3(ITableDataQueryParam queryParam) throws VCIError, DocumentException { return this.getObjectDataListV4(queryParam, new IntHolder(0)); } /** * 返回 表格业务对象数据结果(V3) * @param queryParam 表格数据查询参照 * @return 返回 List> 每条数据 以Map(key:itemField value:属性的值)的形式存在于List中 * @throws VCIError * @throws DocumentException * @see com.vci.client.portal.utility.tabledata.ITableDataQueryParam */ public List> getObjectDataListV4(ITableDataQueryParam queryParam, IntHolder count) throws VCIError, DocumentException { return this.getObjectDataListExecV2(queryParam, count); } //add by caill start 2017.3.20 public List> getObjectDataListV2(String qtName, Map replaceMap, Map conditionMap, PageInfo pageInfo, List orderInfos, String showType, Map queryColumnsMap, Map customMap, Map fileMap,Map showExpressMap) throws VCIError, DocumentException { ITableDataQueryParam p = new DefaultTableDataQueryParam(); p.setQueryTemplateName(qtName); p.setReplaceMap(replaceMap); p.setConditionMap(conditionMap); p.setPageInfo(pageInfo); p.setOrderInfos(orderInfos); p.setShowType(showType); p.setQueryColumnsMap(queryColumnsMap); p.setCustomMap(customMap); p.setFileMap(fileMap); p.setShowExpressMap(showExpressMap); return this.getObjectDataListV3(p); } //add by caill end /** * 查询业务对象的详细信息 * @param qtName, 查询模版 * @param replaceMap, 替换map * @param conditionMap, 附加条件 * @param pageInfo, 翻页信息 * @param orderInfos, 排序信息 * @param showType, 显示类型 * @param queryColumnsMap, 查询列, key为查询列名,value为显示名称 * @param customMap, 自定义列 * @return * @throws VCIError * @throws DocumentException */ public List> getObjectDataList(String qtName, Map replaceMap, Map conditionMap, PageInfo pageInfo, List orderInfos, String showType, Map queryColumnsMap, Map customMap, Map fileMap) throws VCIError, DocumentException { ITableDataQueryParam p = new DefaultTableDataQueryParam(); p.setQueryTemplateName(qtName); p.setReplaceMap(replaceMap); p.setConditionMap(conditionMap); p.setPageInfo(pageInfo); p.setOrderInfos(orderInfos); p.setShowType(showType); p.setQueryColumnsMap(queryColumnsMap); p.setCustomMap(customMap); p.setFileMap(fileMap); p.setShowExpressMap(showExpressMap); return this.getObjectDataListV3(p); } protected List> getObjectDataListExec(ITableDataQueryParam queryParam) throws VCIError{ return getObjectDataListExecV2(queryParam, new IntHolder(0)); } protected List> getObjectDataListExecV2(ITableDataQueryParam queryParam, IntHolder count) throws VCIError{ this.showExpressMap = queryParam.getShowExpressMap(); return this.getObjectDataListDetailExecCoreV2(queryParam, count); } protected List> getObjectDataListDetailExecCore(ITableDataQueryParam queryParam) throws VCIError{ return getObjectDataListDetailExecCoreV2(queryParam, new IntHolder(0)); } protected List> getObjectDataListDetailExecCoreV2(ITableDataQueryParam queryParam, IntHolder count) throws VCIError{ DataModelProcessor processor = new DataModelProcessor(); // 根据查询模板、查询条件、替换条件、分页信息、排序信息查询出数据 // add by xchao 2017.05.26 begin // 优先使用查询参数对象中的查询模板 QueryTemplate qt = queryParam.getQueryTemplate(); if(qt == null || "".equals(qt.getId())){ // 构建查询模板对象 qt = processor.getCustomQt( queryParam.getQueryTemplateName(), queryParam.getReplaceMap(), queryParam.getConditionMap(), queryParam.getPageInfo(), queryParam.getOrderInfos()); } // 根据要查询显示的列确定后端数据查询 boolean hasRefQuery = false; List refOpts = new ArrayList(); List showFields =queryParam.getShowFields(); if(CollectionUtils.isEmpty(showFields)){ showFields = new ArrayList(); if(!CollectionUtils.isEmpty(queryParam.getQueryColumnsMap())){ for(String key : queryParam.getQueryColumnsMap().keySet()){ showFields.add(key); } } } if(showFields != null && showFields.size() > 0){ Iterator its = showFields.iterator(); while(its.hasNext()){ String clause = its.next(); if(clause.indexOf(".") >= 0){ // 只设置一次 if(!hasRefQuery){ hasRefQuery = true; } String[] kvs = clause.split("\\."); int len = kvs.length; if(len == 2){ // 一层参照 a.b // 第二个参数给空,是此不处从属性中查其参数的业务类型,由下下专用掊中进行处理 BtmRefQueryOption refOpt = new BtmRefQueryOption( kvs[0], "", new String[]{kvs[1]} ); refOpts.add(refOpt); } else if(len == 3){ // 二层参照 a.b.c // TODO 需要支持两层参照 } else { // 三层以的参照 a.b.c.d a.b.c.d.e // TODO 需要支持三层以及以上的参照 } its.remove(); } } // update by xchao 20167.12.20 end qt.setClauseList(showFields); } // add by xchao 2017.05.26 end List> datas = new ArrayList>(); // if(hasRefQuery){ FindBTMObjectsV3Result result = QTClient.getService().findBTMObjectsV3( qt.getId(), OQTool.qtTOXMl(qt).asXML(), refOpts.toArray(new BtmRefQueryOption[0])); BusinessObject[] objs = result.returnValue; count.value = (int)result.count; datas = Arrays.asList(CBOHelper.getBOValueMap(objs)); // } else { // BusinessObject[] objs = QTClient.getService().findBTMObjectsV2( // qt.getId(), plm.oq.objectQuery.common.Tool.qtTOXMl(qt).asXML(), count); // datas = getObjectDataSecondList( // processor, objs, // queryParam.getShowType(), queryParam.getQueryColumnsMap()); // } datas = getCommonProcessedDatas(queryParam, datas); return datas; } protected List> getCommonProcessedDatas( ITableDataQueryParam queryParam, List> datas) throws VCIError{ Map customMap = queryParam.getCustomMap(); if (customMap != null&&customMap.size()>0) { getCustomValue(customMap, datas); } Map showExpressMap = queryParam.getShowExpressMap(); //根据freemarker配置修改datas add by wang1 if(showExpressMap != null && showExpressMap.size() > 0){ getFreeMarkerData(showExpressMap,datas); } // update by xchao 2017.12.19 begin // 基于选项确定是否要对文件属性进行处理 if(!queryParam.isIgnoreFileColumn()){ Map fileMap = queryParam.getFileMap(); if (fileMap != null && fileMap.size() > 0) { getFileColValue(fileMap, datas); } } // update by xchao 2017.12.19 end return datas; } /** * 查询业务对象的详细信息 * @param qtName, 查询模版 * @param replaceMap, 替换map * @param conditionMap, 附加条件 * @param pageInfo, 翻页信息 * @param orderInfos, 排序信息 * @param showType, 显示类型 * @param queryColumnsMap, 查询列, key为查询列名,value为显示名称 * @param customMap, 自定义列 * @return * @throws VCIError * @throws DocumentException */ public List> getNewObjectDataList(String qtName, Map replaceMap, Map> conditionMap, PageInfo pageInfo, List orderInfos, String showType, Map queryColumnsMap, Map customMap, Map fileMap) throws VCIError { DataModelProcessor processor = new DataModelProcessor(); BusinessObject[] objs = processor.getNewBusinessObjectByQueryTemplate(qtName, replaceMap, conditionMap, pageInfo, orderInfos); List> datas = getObjectDataSecondList(processor, objs, showType, queryColumnsMap); if (customMap != null && customMap.size() > 0) { getCustomValue(customMap, datas); } if (fileMap != null && fileMap.size() > 0) { getFileColValue(fileMap, datas); } return datas; } /** * 直接根据查询模板对象查询业务数据 ADD BY ZhongGY 2015-04-14 * @Title :getObjectDataList * @Description : * @param qt * @param showType * @param queryColumnsMap * @param customMap * @param fileMap * @return * @throws VCIError * @throws DocumentException */ public List> getObjectDataList(QueryTemplate qt, String showType,Map queryColumnsMap, Map customMap, Map fileMap) throws VCIError, DocumentException { DataModelProcessor processor = new DataModelProcessor(); BusinessObject[] objs = processor.getBusinessObjectByQueryTemplate(qt); List> datas = getObjectDataSecondList(processor, objs, showType, queryColumnsMap); if (customMap != null&&customMap.size()>0) { getCustomValue(customMap, datas); } //根据freemarker配置修改datas add by wang1 if(customMap!=null&&customMap.size()>0){ getFreeMarkerData(customMap,datas); } if (fileMap != null && fileMap.size() > 0) { getFileColValue(fileMap, datas); } return datas; } /** * 获取业务对象二次查询的结果 * @param processor * @param objs, 业务对象 * @param showType, 显示类型 * @param formColumnsMap,key为内部主键,value为显示名称(在此过程中暂不使用,可以传入空值) */ private List> getObjectDataSecondList( DataModelProcessor processor, BusinessObject[] objs, String showType, Map queryColumnsMap){ @SuppressWarnings("unchecked") Map[] res = new LinkedHashMap[0]; res = CBOHelper.getBOValueMap(objs); Map> referenceKeyMap = processor.getReferenceCol(queryColumnsMap); if (referenceKeyMap != null && referenceKeyMap.size() > 0) { TimeMonitor tm = new TimeMonitor(); String tmkey = "secondQuery";; tm.begin(tmkey); Iterator referenceKey = referenceKeyMap.keySet().iterator(); List referenceList = new LinkedList(); while (referenceKey.hasNext()) { referenceList.add(referenceKey.next()); } Map> rowRefMap = new LinkedHashMap>(); Map emptyCheckMap = new LinkedHashMap(); for (BusinessObject obj : objs) { String boOid = obj.oid; Map refMap = new LinkedHashMap(); for (int j = 0; j < referenceList.size(); j++) { String refKey = referenceList.get(j); String refVal = ObjectTool.getBOAttributeValue(obj, refKey); if (refVal == null) { refVal = ""; emptyCheckMap.put(refVal, true); } else { emptyCheckMap.put(refKey, false); } refMap.put(refKey, refVal); } rowRefMap.put(boOid, refMap); } Map emptyMap = new HashMap(); Iterator emptyCheckItor = emptyCheckMap.keySet().iterator(); List delKeyList = new ArrayList(); while (emptyCheckItor.hasNext()) { String emptyCheckKey = emptyCheckItor.next(); boolean emptyCheckVal = emptyCheckMap.get(emptyCheckKey); if (!emptyCheckVal) { continue; } List list = referenceKeyMap.get(emptyCheckKey); emptyMap.put(emptyCheckKey, ""); for (int j = 0; j < list.size(); j++) { emptyMap.put(list.get(j), ""); } referenceKeyMap.remove(emptyCheckKey); delKeyList.add(emptyCheckKey); } if (delKeyList.size() > 0) { Iterator itor = rowRefMap.keySet().iterator(); while (itor.hasNext()) { Map crowMap = rowRefMap.get(itor.next()); for (int i = 0; i < delKeyList.size(); i++) { crowMap.remove(delKeyList.get(i)); } } } Map secQueryMap = processor.getQueryBusinessObjectCondition(showType, rowRefMap, referenceKeyMap); RefPath[] refPaths = processor.queryReference(secQueryMap, showType); connectSecondQueryResult(res, refPaths, secQueryMap, referenceKeyMap); tm.end(tmkey); //System.out.println(tm.toString()); } List> listRes = new LinkedList>(); for (Map resMap : res) { listRes.add(resMap); } return listRes; } /** * 将二次查询结果拼接到一次查询结果中 * @param res * @param refPaths * @param secQueryMap * @param referenceKeyMap */ private void connectSecondQueryResult(Map[] res, RefPath[] refPaths, Map secQueryMap, Map> referenceKeyMap) { if (refPaths != null) { int colNum = secQueryMap.size(); for (int i = 0; i < res.length; i++) { Map rowVal = res[i]; for (int j = 0; j < colNum; j++) { String key = secQueryMap.keySet().toArray(new String[colNum])[j]; if (referenceKeyMap.containsKey(key)) { continue; } if (refPaths[j].values.length <= i) { continue; } String cVal = refPaths[j].values[i].value; rowVal.put(secQueryMap.keySet().toArray(new String[colNum])[j], cVal); } } } } /** * 获取自定义列的值 * @param customMap, 自定义查询列 * @param datas, 查询结果 * @throws VCIError */ private void getCustomValue(Map customMap, List> datas) throws VCIError { Iterator itor = customMap.keySet().iterator(); while (itor.hasNext()) { String key = itor.next(); PRMItem prm = customMap.get(key); String customCls = prm.getItemCustomClass(); if(customCls == null || "".equals(customCls)){ continue; } executeSetCustomValue(customCls, key, customMap, datas); } } /** * 根据freeMaker配置的值处理dataModel * @param showExpressionList,freeMarker配置的值 * @param dataModel,需要处理的数据 * @throws VCIError */ private void getFreeMarkerData(Map showExpressMap, List> dataModel) throws VCIError { if(dataModel==null||dataModel.size()==0){ return ; } new CustomChangeDataByExprission().getCustomValue("", showExpressMap, dataModel); } /** * 执行自定义列类获取具体的值 * @param customCls, 自定义类 * @param key, 自定义列主键 * @param customMap, 自定义列对应的Map * @param datas, 数据 */ private void executeSetCustomValue(String customCls, String key, Map customMap, List> datas){ try { int paramIndex = customCls.indexOf("?"); String param = ""; if(paramIndex > 0){ param = customCls.substring(paramIndex + 1); customCls = customCls.substring(0, paramIndex); } Class cls = Class.forName(customCls); ICustomDefine custom = (ICustomDefine)cls.getConstructor().newInstance(); if(param != null && !"".equals(param)){ key = key + "?" + param; } custom.getCustomValue(key, customMap, datas); } catch (Exception e){ e.printStackTrace(); } } private void getFileColValue(Map fileMap, List> datas) throws VCIError { try { Iterator itor = fileMap.keySet().iterator(); while (itor.hasNext()) { String key = itor.next(); PRMItem prm = fileMap.get(key); String customCls = prm.getItemCustomClass(); if(customCls == null || "".equals(customCls)){ customCls = "plm.portal.custom.CustomFileInterceptor"; } executeSetCustomValue(customCls, key, fileMap, datas); } } catch (Exception e){ e.printStackTrace(); } } /** * 获取链接对象的详细信息 * @param qtName, 查询模版 * @param replaceMap, 替换map * @param conditionMap, 附加条件 * @param linkType, 显示类型 * @param isForward, 方向 * @param queryColumnsMap, 查询列 * @param customMap, 自定义列 * @return * @throws VCIError * @throws DocumentException */ public List> getLinkDataList(String qtName, Map replaceMap, Map conditionMap, boolean isForward, String linkType, Map queryColumnsMap, Map customMap, Map fileMap) throws VCIError, DocumentException { DataModelProcessor processor = new DataModelProcessor(); LinkObject[] los = processor.getLinkObjectByQueryTemplate(qtName, replaceMap, conditionMap); List> datas = getLinkDataSecondList(processor, los, isForward, linkType, queryColumnsMap); if (customMap != null&&customMap.size()>0) { getCustomValue(customMap, datas); } if (fileMap != null && fileMap.size() > 0) { getFileColValue(fileMap, datas); } return datas; } /** * 获取链接对象的详细信息 * @param qtName, 查询模版 * @param replaceMap, 替换map * @param conditionMap, 附加条件 * @param linkType, 显示类型 * @param isForward, 方向 * @param queryColumnsMap, 查询列 * @param customMap, 自定义列 * @param pageInfo 分页信息 * @return * @throws VCIError * @throws DocumentException */ public List> getLinkDataListV2(String qtName, Map replaceMap, Map conditionMap, boolean isForward, String linkType, Map queryColumnsMap, Map customMap, Map fileMap,PageInfo pageInfo,Map showExpressMap) throws VCIError, DocumentException { ITableDataQueryParam p = new DefaultTableDataQueryParam(); p.setQueryTemplateName(qtName); p.setReplaceMap(replaceMap); p.setConditionMap(conditionMap); p.setPageInfo(pageInfo); p.setQueryColumnsMap(queryColumnsMap); p.setCustomMap(customMap); p.setFileMap(fileMap); p.setShowExpressMap(showExpressMap); return getLinkDataListV3(p); } public List> getLinkDataListV3(ITableDataQueryParam queryParam) throws VCIError, DocumentException { return getLinkDataListV4(queryParam, new IntHolder(0)); } public List> getLinkDataListV4(ITableDataQueryParam queryParam, IntHolder count) throws VCIError, DocumentException { return getLinkDataListExecV2(queryParam, count); } public List> getLinkDataList(String qtName, Map replaceMap, Map conditionMap, boolean isForward, String linkType, Map queryColumnsMap, Map customMap, Map fileMap,PageInfo pageInfo) throws VCIError, DocumentException { return this.getLinkDataListV2(qtName, replaceMap, conditionMap, isForward, linkType, queryColumnsMap, customMap, fileMap, pageInfo, fileMap); } private boolean isForward(QueryTemplate qt){ boolean res = false; if(qt == null){ return res; } String direction = qt.getDirection(); if(StringUtils.isNotEmpty(direction) && direction.equalsIgnoreCase(QTConstants.DIRECTION_POSITIVE)){ res = true; } return res; } protected List> getLinkDataListExec(ITableDataQueryParam queryParam) throws VCIError{ return this.getLinkDataListExecV2(queryParam, new IntHolder(0)); } protected List> getLinkDataListExecV2(ITableDataQueryParam queryParam, IntHolder count) throws VCIError{ DataModelProcessor processor = new DataModelProcessor(); // 根据查询模板、查询条件、替换条件、分页信息、排序信息查询出数据 // add by xchao 2017.05.26 begin // 优先使用查询参数对象中的查询模板 QueryTemplate qt = queryParam.getQueryTemplate(); if(qt == null || "".equals(qt.getId())){ // 构建查询模板对象 qt = processor.getCustomQt( queryParam.getQueryTemplateName(), queryParam.getReplaceMap(), queryParam.getConditionMap(), queryParam.getPageInfo(), queryParam.getOrderInfos()); } // 根据要查询显示的列确定后端数据查询 List showFields = queryParam.getShowFields(); if(showFields != null && showFields.size() > 0){ qt.setClauseList(showFields); } // add by xchao 2017.05.26 end FindLTObjectsV2Result result = QTClient.getService().findLTObjectsV2(qt.getId(), OQTool.qtTOXMl(qt).asXML()); LinkObject[] los = result.returnValue; count.value = (int)result.count; List> datas = getLinkDataSecondList(processor, los, isForward(queryParam.getQueryTemplate()), queryParam.getLinkType(), queryParam.getQueryColumnsMap()); datas = getCommonProcessedDatas(queryParam, datas); return datas; } /** * 返回LO二次查询结果 * @param processor * @param los * @param isForward * @param linkType * @param formColumnsMap * @return */ private List> getLinkDataSecondList( DataModelProcessor processor, LinkObject[] los, boolean isForward, String linkType, Map queryColumnsMap){ @SuppressWarnings("unchecked") Map[] res = new LinkedHashMap[0]; Map> referenceKeyMap = processor.getReferenceCol(queryColumnsMap); res = CBOHelper.getLOValueMap(los); if (res == null || res.length == 0) { return new LinkedList>(); } if (referenceKeyMap.containsKey("t_oid")) { Map rowRefMap = new LinkedHashMap(); Map rowKeyMap = new LinkedHashMap(); String[] cTypes = new String[los.length]; String cType = los[0].toBTName; boolean isSingleType = true; for (int i = 0; i < los.length; i++) { String loOid = los[i].toOid; String refKey = "t_oid"; rowRefMap.put(loOid, refKey); rowKeyMap.put(ObjectUtility.getNewObjectID36(), loOid); if (!cType.equals(los[i].toBTName)) { isSingleType = false; } cTypes[i] = los[i].toBTName; } Map secQueryMap = processor.getQueryLinkObjectCondition(linkType, rowKeyMap, rowRefMap, referenceKeyMap); RefPath[] refPaths; if (isSingleType) { refPaths = processor.queryReference(secQueryMap, cType); } else { refPaths = processor.queryReference(secQueryMap, cTypes); } connectSecondQueryResult(res, refPaths, secQueryMap, referenceKeyMap); referenceKeyMap.remove("t_oid"); } if (referenceKeyMap.containsKey("f_oid")) { Map rowRefMap = new LinkedHashMap(); Map rowKeyMap = new LinkedHashMap(); String[] cTypes = new String[los.length]; String cType = los[0].fromBTName; boolean isSingleType = true; for (int i = 0; i < los.length; i++) { String loOid = los[i].fromOid; String refKey = "f_oid"; rowRefMap.put(loOid, refKey); rowKeyMap.put(ObjectUtility.getNewObjectID36(), loOid); if (!cType.equals(los[i].fromBTName)) { isSingleType = false; } cTypes[i] = los[i].fromBTName; } Map secQueryMap = processor.getQueryLinkObjectCondition(linkType, rowKeyMap, rowRefMap, referenceKeyMap); RefPath[] refPaths; if (isSingleType) { refPaths = processor.queryReference(secQueryMap, cType); } else { refPaths = processor.queryReference(secQueryMap, cTypes); } connectSecondQueryResult(res, refPaths, secQueryMap, referenceKeyMap); referenceKeyMap.remove("f_oid"); } Iterator referenceKey = referenceKeyMap.keySet().iterator(); List referenceList = new LinkedList(); while (referenceKey.hasNext()) { referenceList.add(referenceKey.next()); } if (referenceList.size() > 0) { Map> rowRefMap = new LinkedHashMap>(); for (int i = 0; i < los.length; i++) { String boOid = los[i].oid; Map refMap = new LinkedHashMap(); for (int j = 0; j < referenceList.size(); j++) { String refKey = referenceList.get(j); String refVal = ObjectTool.getLOAttributeValue(los[i], refKey); if (refVal == null) { refVal = ""; } refMap.put(refKey, refVal); } rowRefMap.put(boOid, refMap); } Map secQueryMap = processor.getQueryBusinessObjectCondition(linkType, rowRefMap, referenceKeyMap); RefPath[] refPaths = processor.queryReference(secQueryMap, ""); connectSecondQueryResult(res, refPaths, secQueryMap, referenceKeyMap); } List> listRes = new LinkedList>(); for (Map resMap : res) { listRes.add(resMap); } return listRes; } /** * 国际化生命周期状态 * @param datas */ Map statePoolsMap=new HashMap(); public void displayLifeCycleStatus(List> datas) { if (statePoolsMap.size()==0) { statePoolsMap = getAllStatusInfo(); } for (Map data : datas) { Iterator itor = data.keySet().iterator(); while (itor.hasNext()) { String key = itor.next(); if (!key.equalsIgnoreCase(LCSTATUS) && !key.toLowerCase().endsWith("." + LCSTATUS)) { continue; } String value = data.get(key); if (statePoolsMap.containsKey(value)) { data.put(key, statePoolsMap.get(value).tag); } } } } /** * 获取所有的生命周期状态 * @return */ private Map getAllStatusInfo() { Map statePoolsMap = new HashMap(); try { StatePool[] statePools = StatePoolStart.getService().getStatePools(); for(StatePool sp:statePools){ statePoolsMap.put(sp.name, sp); } } catch (VCIError e) { e.printStackTrace(); } return statePoolsMap; } /** * 显示链接类型数据的枚举值 * @param datas * @param linkType * @param toDoTaskOneToOne */ public void displayLinkObjectEnumValue(List> datas, String linkType, String toDoTaskOneToOne) { TimeMonitor tm = new TimeMonitor(); if ("true".equals(toDoTaskOneToOne) && datas != null && datas.size() > 0) {//一对一 Map map = datas.get(0); String f_btwname = map.get("f_btwname");//add by liyp 获取f_btwname t_btwname String t_btwname = map.get("t_btwname"); calcAttrEnumMapForLinkTypeOneToOne(linkType,t_btwname,f_btwname); }else { String[] linktypes = new String[1]; linktypes[0] = linkType; calcAttrEnumMapForLinkType(linktypes); } getEnumValue(datas); } /** * 显示业务类型数据的枚举值 * @param datas * @param type */ public void displayBusinessObjectEnumValue(List> datas, String type) { String[] types = new String[1]; types[0] = type; calcAttrEnumMapForBtmType(types); getEnumValue(datas); } private void getEnumValue(List> datas) { for (Map data : datas) { Iterator itor = data.keySet().iterator(); while (itor.hasNext()) { String key = itor.next(); String ckey = ""; if (typeAttrEnumValueToNameMap.containsKey(key)) { ckey = key; } else if (key.indexOf(".") > 0){ ckey = key.substring(key.lastIndexOf(".") + 1); if (!typeAttrEnumValueToNameMap.containsKey(ckey)) { continue; } } else { continue; } String value = data.get(key); HashMap enumValue = typeAttrEnumValueToNameMap.get(ckey); if (enumValue.containsKey(value)) { value = enumValue.get(value); } data.put(key, value); } } } /** * 计算指定链接类型 枚举属性的值map * @param types 业务类型名称集合 */ public void calcAttrEnumMapForLinkType(String[] linkTypes){ try { LinkType[] lts = LinkTypeStart.getService().getLinkTypes(); for(String type : linkTypes){ for(LinkType lt : lts){ if(type.equals(lt.name)){ calcAttrEnumMapCommonLogic(lt.name, lt.attributes); calcAttrEnumMapForBtmType(lt.btmItemsFrom); calcAttrEnumMapForBtmType(lt.btmItemsTo); } } } } catch (VCIError e) { e.printStackTrace(); } } Map linkTypeMap = new HashMap(); /** * 计算指定链接类型 枚举属性的值map 一对一查询 * @param types 业务类型名称集合 * @author liyp */ private void calcAttrEnumMapForLinkTypeOneToOne(String linkType,String t_btwname,String f_btwname){ try { if(linkTypeMap.containsKey(linkType)){ return; } LinkType lt = LinkTypeStart.getService().getLinkType(linkType);//.getLinkTypeByBtmName(t_btwname,""); linkTypeMap.put(linkType, lt); if(linkType.equals(lt.name)){ calcAttrEnumMapCommonLogic(lt.name, lt.attributes); calcAttrEnumMapForBtmTypeOneToOne(f_btwname); calcAttrEnumMapForBtmTypeOneToOne(t_btwname);//改为固定的to端 从datas中查询出来的 } } catch (VCIError e) { e.printStackTrace(); } } /** * 计算指定业务类型 枚举属性的值map * @param types 业务类型名称集合 */ Map BtmAndApMap = new HashMap(); public void calcAttrEnumMapForBtmType(String[] btmTypes){ try { for(String type : btmTypes){ if(BtmAndApMap.containsKey(type)){ continue; } //BtmAndApName[] baans = BtmClient.getService().getBtmAndApNameArray(type); BtmItem bt = BtmClient.getService().getBtmItemByName(type); BtmAndApName[] baans = new BtmAndApName[] {new BtmAndApName(bt.name, bt.apNameArray)}; BtmAndApMap.put(type, baans); for(BtmAndApName baan : baans) { calcAttrEnumMapCommonLogic(baan.btmName, baan.apName); } } } catch (VCIError e) { e.printStackTrace(); } } Map btmAndApNameMap = new HashMap(); /** * 计算指定业务类型 枚举属性的值map * @param types 业务类型名称集合 */ private void calcAttrEnumMapForBtmTypeOneToOne(String btmType){ try { if(btmAndApNameMap.containsKey(btmType)||StringUtils.isEmpty(btmType)){ return; } //BtmAndApName[] baans = BtmClient.getService().getBtmAndApNameArray(btmType); BtmItem bt = BtmClient.getService().getBtmItemByName(btmType); BtmAndApName[] baans = new BtmAndApName[] {new BtmAndApName(bt.name, bt.apNameArray)}; btmAndApNameMap.put(btmType, baans); for(BtmAndApName baan : baans) { calcAttrEnumMapCommonLogic(baan.btmName, baan.apName); } } catch (VCIError e) { e.printStackTrace(); } } private void calcAttrEnumMapCommonLogic(String type, String[] attrNames) throws VCIError{ AttribItem[] arItems = APClient.getService().getAttribItemsByNames(attrNames); for(AttribItem ai : arItems){ //allowNull = yes;enumName = parttypeenum String[] others = ai.other.split(";"); for(String other : others){ String[] cvs = other.split("="); if(cvs[0].trim().equalsIgnoreCase("enumName")){ String enumName = cvs[1].trim(); if(typeAttrEnumNameToValueMap.containsKey(enumName)){ continue; } HashMap enumValueToName = new HashMap(); HashMap enumNameToValue = new HashMap(); getEnumValueOrNameMap(enumName, enumValueToName, enumNameToValue); HashMap> fieldToEnumValuetoNameMap = new HashMap>(); fieldToEnumValuetoNameMap.put(ai.name, enumValueToName); typeAttrEnumValueToNameMap.putAll(fieldToEnumValuetoNameMap); HashMap> fieldToEnumNameToValueMap = new HashMap>(); fieldToEnumNameToValueMap.put(ai.name, enumNameToValue); typeAttrEnumNameToValueMap.putAll(fieldToEnumNameToValueMap); break; } } } } // private HashMap enumItemMap = new HashMap(); private HashMap getEnumValueOrNameMap(String enumName, HashMap enumValueToName, HashMap enumNameToValue ){ HashMap map = new HashMap(); try { // if(enumItemMap.size() == 0){ String filter = enumName; EnumItem[] enumItems = ServiceProvider.getOMDService().getEnumService().getEmItems(filter, 1, 1); for(EnumItem ei : enumItems){ // enumItemMap.put(ei.name, ei); for(EnumChild ec : ei.children){ enumValueToName.put(ec.value, ec.name); enumNameToValue.put(ec.name, ec.value); } } // } // if(enumItemMap.containsKey(enumName)){ // EnumItem ei = enumItemMap.get(enumName); // } } catch (VCIError e) { e.printStackTrace(); } return map; } public void displayBSDataFileURL(List> datas, Map fileMap) { Iterator fileKeys = fileMap.keySet().iterator(); while (fileKeys.hasNext()) { String key = fileKeys.next(); PRMItem item = fileMap.get(key); for (int i = 0 ; i < datas.size(); i++) { Map data = datas.get(i); if (!data.containsKey(key)) { continue; } String value = data.get(key); if (value == null || value.trim().equals("")) { continue; } String[] values = value.split(","); StringBuffer href = new StringBuffer(); boolean isFirst = true; for (String cValue : values) { if (!isFirst) { href.append("
"); } String displayVal = "浏览"; String[] sValues = cValue.split(":"); if (sValues.length == 2) { displayVal = sValues[1]; } href.append("").append(displayVal).append(""); isFirst = false; } data.put(key, href.toString()); } } } }