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 过滤条件
|
* <p>key:要过滤的属性字段(内部名称)</p>
|
* <p>value:过滤值</p>
|
* @return
|
* @throws VCIError
|
*/
|
public BusinessObject[] getBusinessObject(
|
String btmName, Map<String, List<String>> conditionMap) throws VCIError{
|
QueryTemplate qt = getBtmQueryTemplate(btmName);
|
Iterator<String> its = conditionMap.keySet().iterator();
|
Condition condition = new Condition();
|
while(its.hasNext()){
|
String key = its.next();
|
List<String> 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<String> 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<String, String> map = new HashMap<String, String>();
|
map.put(key, "\\IN(" + value + ")");
|
return OQTool.getCondition(map);
|
}
|
|
/**
|
* 返回合并后的过滤条件
|
* @param key 属性内部名称
|
* @param values 过滤条件值
|
* @return
|
*/
|
private Condition getMergedCondition(String key, List<String> 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<String> splitList(List<String> srcList, int start, int end){
|
List<String> list = new LinkedList<String>();
|
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<String, String> 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());
|
}
|
}
|