package com.vci.client.uif.engine.common; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.vci.client.common.oq.OQTool; import com.vci.common.qt.object.Condition; import com.vci.common.qt.object.Connector; import com.vci.common.qt.object.QueryTemplate; import com.vci.common.qt.object.Version; import com.vci.corba.common.VCIError; import com.vci.corba.omd.data.BusinessObject; import com.vci.corba.query.ObjectQueryServicePrx; /** * UIFUtils 通用接口基类 * @author xiongchao * */ public abstract class UIFUtilsCommon { public UIFUtilsCommon(){ } protected final int IN_MAX_COUNT = 900; public abstract ObjectQueryServicePrx getQTService() throws VCIError; /** * 批量查询BO * @param btmName BO业务类型 * @param conditionMap 过滤条件 *

key:要过滤的属性字段(内部名称)

*

value:过滤值

* @return * @throws VCIError */ public BusinessObject[] getBusinessObject( String btmName, Map> conditionMap) throws VCIError{ QueryTemplate qt = getBtmQueryTemplate(btmName); Iterator its = conditionMap.keySet().iterator(); Condition condition = new Condition(); while(its.hasNext()){ String key = its.next(); List values = conditionMap.get(key); Condition cond = new Condition(); if(values.size() < IN_MAX_COUNT){ cond = getSingleCondition(key, values); } else if(values.size() >= IN_MAX_COUNT){ cond = getMergedCondition(key, values); } condition = OQTool.mergeCondition(cond, condition, Connector.AND); } return getBusinessObject(qt, condition); } /** * 返回单一in形式的过滤条件 * @param key 属性内部名称 * @param values 过滤条件值 * @return */ private Condition getSingleCondition(String key, List values){ StringBuffer sb = new StringBuffer(); int size = values.size(); for (int i = 0; i < size;i++) { sb.append("'").append(values.get(i)).append("'"); if(i != size - 1){ sb.append(","); } } String value = sb.toString(); if(value.endsWith(",")){ value = value.substring(0, value.length() - 1); } if("".equals(value)){ value = "''"; } Map map = new HashMap(); map.put(key, "\\IN(" + value + ")"); return OQTool.getCondition(map); } /** * 返回合并后的过滤条件 * @param key 属性内部名称 * @param values 过滤条件值 * @return */ private Condition getMergedCondition(String key, List values){ int size = values.size(); int sp = size / IN_MAX_COUNT; int spx = size % IN_MAX_COUNT; int loopCount = sp + (spx == 0 ? 0 : 1); Condition condition = new Condition(); for (int i = 1; i <= loopCount; i++) { Condition cond = getSingleCondition(key, splitList(values,((i - 1) * IN_MAX_COUNT), (i * IN_MAX_COUNT - 1)) ); condition = OQTool.mergeCondition(cond, condition, Connector.OR); } return condition; } /** * 截取list * @param srcList 源列表 * @param start 开始索引 * @param end 结束索引 * @return 截取后的list */ private List splitList(List srcList, int start, int end){ List list = new LinkedList(); int size = srcList.size(); for (int i = start; i <= end && i <= size - 1; i++) { list.add(srcList.get(i)); } return list; } /** * 返回查询指定业务类型的查询模板 * @param btmName 业务类型名称 * @param version * @return 查询模板基础结构 */ public QueryTemplate getBtmQueryTemplate(String btmName, int version){ QueryTemplate qt = new QueryTemplate(); qt.setId("qt"); qt.setType("btm"); qt.setBtmType(btmName); qt.setVersion(version); qt.setClauseList(Arrays.asList(new String[]{"*"})); // 忽略对象的数据权限检查 qt.setRightFlag(false); qt.setQueryChildrenFlag(true); return qt; } /** * 返回查询指定业务类型的查询模板 * @param btmName 业务类型名称 * @return 查询模板基础结构 */ public QueryTemplate getBtmQueryTemplate(String btmName){ return getBtmQueryTemplate(btmName, Version.lastRevLastVer); } /** * 单一查询BO * @param qt 查询模板对象 * @param conditionMap 标准简单过滤条件 * @return 满足条件的BO * @throws VCIError */ public BusinessObject[] getBusinessObject(QueryTemplate qt, Map conditionMap) throws VCIError{ return getBusinessObject(qt, OQTool.getCondition(conditionMap)); } /** * 根据查询模板、查询条件返回数据 * @param qt 查询模板对象 * @param condition 查询条件对象 * @return 满足条件的BO * @throws VCIError */ public BusinessObject[] getBusinessObject(QueryTemplate qt, Condition condition) throws VCIError{ qt.setCondition(condition); return getQTService().findBTMObjects(qt.getId(), OQTool.qtTOXMl(qt).asXML()); } }