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());
}
}