package plm.portal.utility; import java.util.ArrayList; 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.dom4j.DocumentException; import com.vci.base.server.utility.ObjectUtility; import com.vci.corba.common.VCIError; import plm.bs.bom.common.BusinessObject; import plm.bs.bom.common.LinkObject; import plm.bs.bom.common.constants.ObjectTool; import plm.bs.omd.linktype.client.LinkTypeStart; import plm.bs.omd.statepool.client.StatePoolStart; import plm.corba.attribpool.AttribItem; import plm.corba.btm.BtmAndApName; import plm.corba.enumManager.EnumChild; import plm.corba.enumManager.EnumItem; import plm.corba.enumManager.EnumItemFilter; import plm.corba.linkTypeManager.LinkType; import plm.corba.refquery.RefPath; import plm.corba.statePoolManager.StatePool; import plm.oq.objectQuery.common.OrderInfo; import plm.oq.objectQuery.common.PageInfo; import plm.portal.custom.ICustomDefine; import plm.portal.utility.DataModelProcessor; import plm.portal.utility.PRMItem; import plm.uif.engine.common.CBOHelper; import plm.vo.omd.attribpool.ui.APClient; import plm.vo.omd.btm.ui.BtmClient; import plm.vo.omd.enumManager.ui.EnumClient; public class TableDataUtil { public final String LCSTATUS = "lcstatus"; private HashMap> typeAttrEnumValueToNameMap = new HashMap>(); private HashMap> typeAttrEnumNameToValueMap = new HashMap>(); /** * 查询业务对象的详细信息 * @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 { DataModelProcessor processor = new DataModelProcessor(); BusinessObject[] objs = processor.getBusinessObjectByQueryTemplate( 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; } /** * 获取业务对象二次查询的结果 * @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) { 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); } 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); } } /** * 执行自定义列类获取具体的值 * @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) { getCustomValue(customMap, datas); } if (fileMap != null && fileMap.size() > 0) { getFileColValue(fileMap, 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 (referenceKeyMap.containsKey("t_oid")) { Map rowRefMap = new LinkedHashMap(); Map rowKeyMap = new LinkedHashMap(); String[] cTypes = new String[los.length]; String cType = los[0].toBTMName; 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(new ObjectUtility().getNewObjectID36(), loOid); if (!cType.equals(los[i].toBTMName)) { isSingleType = false; } cTypes[i] = los[i].toBTMName; } 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].fromBTMName; 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(new ObjectUtility().getNewObjectID36(), loOid); if (!cType.equals(los[i].fromBTMName)) { isSingleType = false; } cTypes[i] = los[i].fromBTMName; } 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 */ public void displayLifeCycleStatus(List> datas) { Map 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 */ public void displayLinkObjectEnumValue(List> datas, String linkType) { 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 * @param types 业务类型名称集合 */ public void calcAttrEnumMapForBtmType(String[] btmTypes){ try { for(String type : btmTypes){ BtmAndApName[] baans = BtmClient.getService().getBtmAndApNameArray(type); 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(); HashMap enumValueToName = getEnumValueOrNameMap(enumName, true); HashMap> fieldToEnumValuetoNameMap = new HashMap>(); fieldToEnumValuetoNameMap.put(ai.name, enumValueToName); typeAttrEnumValueToNameMap.putAll(fieldToEnumValuetoNameMap); HashMap enumNameToValue = getEnumValueOrNameMap(enumName, false); HashMap> fieldToEnumNameToValueMap = new HashMap>(); fieldToEnumNameToValueMap.put(ai.name, enumNameToValue); typeAttrEnumNameToValueMap.putAll(fieldToEnumNameToValueMap); } } } } private HashMap enumItemMap = new HashMap(); private HashMap getEnumValueOrNameMap(String enumName, boolean valueToName){ HashMap map = new HashMap(); try { if(enumItemMap.size() == 0){ EnumItemFilter filter = new EnumItemFilter(); EnumItem[] enumItems = EnumClient.getService().getEmItems(filter, 1, 1); for(EnumItem ei : enumItems){ enumItemMap.put(ei.name, ei); } } if(enumItemMap.containsKey(enumName)){ EnumItem ei = enumItemMap.get(enumName); for(EnumChild ec : ei.children){ if(valueToName){ map.put(ec.value, ec.name); } else { map.put(ec.name, ec.value); } } } } catch (VCIError e) { e.printStackTrace(); } return map; } }