wangting
2024-12-26 fa261e8c1220b31af54e8167e4de9c3320b1af27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
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());
    }
}