ludc
2025-01-16 986aa62ed00bee39363bab41b4eeb8259d446efd
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
package com.vci.client.uif.actions.client.chageowner;
 
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 com.vci.client.bof.ClientBusinessObject;
import com.vci.client.bof.ClientBusinessObjectOperation;
import com.vci.client.bof.ClientLinkObject;
import com.vci.client.common.objects.UserObject;
import com.vci.client.common.oq.OQTool;
import com.vci.client.oq.QTClient;
import com.vci.client.portal.constants.QueryConditionConstants;
import com.vci.client.ui.process.QANProcessBar;
import com.vci.client.ui.process.QANProcessBarFrame;
import com.vci.client.ui.swing.components.VCIJDialog.DialogResult;
import com.vci.client.uif.actions.client.AbstractBatchBusionessOperationAction;
import com.vci.client.uif.actions.client.RightCheckConstants;
import com.vci.client.uif.actions.client.UIFUtils;
import com.vci.client.uif.engine.client.UIHelper;
import com.vci.client.uif.engine.common.IDataNode;
import com.vci.common.qt.object.QueryTemplate;
import com.vci.corba.common.VCIError;
import com.vci.corba.query.data.BOAndLO;
import com.vci.mw.ClientContextVariable;
 
/**
 * 标准的更改业务对象的所有者action<br/>
 * 如果选择的数据是BO,则修改选择BO对象的OWNER<br/>
 * 如果选择的数据是BO,且cascade=true,此时修改选择BO对象及其子对象的OWNER。需要linkType、fromType、toType、f_oid、t_oid等参数的协同支持<br/>
 * 如果选择的数据是LO,且direction的参数值(默认按positive处理)<br/>
 * <ul>
 * <li>all:
 * <li>positive:
 * <li>opposite:
 * </ul>
 * @author xchao
 * @since 2014.06.16
 *
 */
public class ChangeOwnerAction extends AbstractBatchBusionessOperationAction {
 
    public static final String CASCADE_KEY = "cascade";
    public static final String CASCADE_VALUE = "true";
    public static final String DIRECTION_KEY = "direction";
    public static final String DIRECTION_POSITIVE = "positive";
    public static final String DIRECTION_OPPOSITE = "opposite";
    public static final String LINK_TYPE = QueryConditionConstants.LO_TYPE;
    public static final String FROM_TYPE = "fromType";
    public static final String TO_TYPE = "toType";
    
    @Override
    public String getKey() {
        return "changeowner";
    }
 
    /**
     * 是否显示级联更改选项
     * @return
     */
    protected boolean isCascade(){
        boolean res = false;
        String cfgVal = getButtonParamBy(CASCADE_KEY);
        if(cfgVal != null && CASCADE_VALUE.equalsIgnoreCase(cfgVal)){
            res = true;
        }
        return res;
    }
    
    protected String getDirection(){
        return getButtonParamBy(DIRECTION_KEY);
    }
    
    protected String getLinkType(){
        return getButtonParamBy(LINK_TYPE);
    }
    
    protected String getFromType(){
        return getButtonParamBy(FROM_TYPE);
    }
    
    protected String getToType(){
        return getButtonParamBy(TO_TYPE);
    }
    
    protected String getButtonParamBy(String key){
        String configValue = getParameterValue(ValueType.ButtonConfig, key, 0);
        String res = "";
        if(configValue != null && !"".equalsIgnoreCase(configValue)){
            return configValue;
        }
        return res;
    }
    
    @Override
    public boolean checkHasRight(){
        // 按BO进行数据权限检查
        setDataRightCheckType(RightCheckConstants.RIGHT_CHECK_TYPE_B);
        return super.checkHasRight();
    }
    
    @Override
    public boolean doPost() {
        Object[] objs = getDataModel().getSelectObjects();
        // 是否显示级联
        boolean cascade = isCascade();
        ChangeOwnerDialog cod = new ChangeOwnerDialog();
        cod.setShowCascadeCheckbox(cascade);
        cod.buildDialog();
        cod.setSize(UIHelper.DIALOG_DEFAULT_WIDTH/2, UIHelper.DIALOG_DEFAULT_HEIGHT/2);
        cod.setLocationRelativeTo(ClientContextVariable.getFrame());
        cod.setVisible(true);
        DialogResult dialogResult = cod.getDialogResult();
        if(dialogResult.equals(DialogResult.CANCEL)) return false;
        // 基于选择,是否级联
        cascade = cod.isCascade();
        return doPostProcessBar(objs, cod.getNewOwner(), cascade);
    }
    
    protected boolean doPostProcessBar(final Object[] objs, final String newOwner, final boolean cascade){
        final boolean[] ress = new boolean[1];
        final QANProcessBarFrame frame = new QANProcessBarFrame();
        Thread t = new Thread() {
            public void run() {
                frame.setContent("正在执行修改所有者,请稍等......");
                try {
                    ress[0] = updateObjectOwner(objs, newOwner, cascade, frame);
                } catch (Exception e) {
                    UIFUtils.showErrorMessage(null, e);
                    ress[0] = false;
                } finally {
                    frame.setProcessBarCancel(true);
                }
            }
        };
        QANProcessBar bar = new QANProcessBar(t, frame, frame, "修改所有者", false);
        bar.setVisible(true);
        return ress[0];
    }
    /**
     * 根据选择的数据,执行相应的判断逻辑,调用更新接口
     * @param objs
     * @param newOwner
     * @param isCascade
     * @return
     */
    protected boolean updateObjectOwner(Object[] objs, String newOwner, boolean isCascade, QANProcessBarFrame frame){
        LinkedList<ClientBusinessObject> cboList = new LinkedList<ClientBusinessObject>();
        StringBuffer sbNames = new StringBuffer();
        HashMap<String, ClientBusinessObject> selectedCBOMap = new LinkedHashMap<String, ClientBusinessObject>();
        HashMap<String, ClientLinkObject> selectedCLOMap = new HashMap<String, ClientLinkObject>();
        for(Object obj : objs){
            if(!(obj instanceof IDataNode)) continue;
            IDataNode data = (IDataNode)obj;
            ClientBusinessObject cbo = null;
            if(data.getMaterObject() instanceof ClientBusinessObject){
                cbo = (ClientBusinessObject)(data.getMaterObject());
            } else if(data.getMaterObject() instanceof ClientLinkObject){
                // link 对象对应CBO
                ClientLinkObject clo = (ClientLinkObject)data.getMaterObject();
                cbo = data.getClientBusinessObject();
                selectedCLOMap.put(clo.getOid(), clo);
            }
            cboList.add(cbo);
            sbNames.append(cbo.getBusinessObject().name).append("\n");
            selectedCBOMap.put(cbo.getOid(), cbo);
        }
        boCascadeProcess(selectedCBOMap, isCascade, newOwner, frame);
        frame.setContent("正在设置数据的所有者");
        List<ClientBusinessObject> changeCBOList = new LinkedList<ClientBusinessObject>();
        List<UserObject> newOwnerList = new LinkedList<UserObject>();
        Iterator<String> its = selectedCBOMap.keySet().iterator();
        while(its.hasNext()){
            String oid = its.next();
            ClientBusinessObject cbo = selectedCBOMap.get(oid);
            changeCBOList.add(cbo);
            
            UserObject userObj = new UserObject();
            userObj.setUserName(newOwner);
            newOwnerList.add(userObj);
        }
        frame.setContent("正在执行修改所有者");
        boolean updateRes = executeUpdateOwner(changeCBOList, newOwnerList);
        if(updateRes){
            UIFUtils.showMessage(getParentComponent(), "uifmodel.plm.uif.actions.changeownersuccessmsg", sbNames.toString());
        }
        return updateRes;
    }
    
    protected void loCascadeProcess(HashMap<String, ClientBusinessObject> selectedCBOMap, 
            boolean isCascade, String newOwner, QANProcessBarFrame frame){
        if(!isCascade) return;
    }
    /**
     * 级联处理选择的BO对象的子对象
     * @param cboMap
     * @param isCascade
     * @param newOwner
     */
    protected void boCascadeProcess(HashMap<String, ClientBusinessObject> selectedCBOMap, 
            boolean isCascade, String newOwner, QANProcessBarFrame frame){
        if(!isCascade) return;
        
        String direction = getDirection();
        String linkType = getLinkType();
        String fromType = getFromType();
        String toType = getToType();
        
        Iterator<String> its = selectedCBOMap.keySet().iterator();
        while(its.hasNext()){
            String oid = its.next();
            ClientBusinessObject cbo = selectedCBOMap.get(oid);
            frame.setContent("正在查询 ‘" + cbo.getName() + "’ 的子数据");
            getChildCBOS(selectedCBOMap, cbo, cbo.getOid(), direction, linkType, fromType, toType, frame);
        }
    }
    
    protected void getChildCBOS(
            HashMap<String, ClientBusinessObject> selectedCBOMap,
            ClientBusinessObject cbo, String oid, String direction, 
            String linkType, String fromType, String toType, 
            QANProcessBarFrame frame){
        QueryTemplate qt9 = new QueryTemplate();
        qt9.setId("id");
        List<String> clauseList = new ArrayList<String>();
        clauseList.add("*");
        qt9.setClauseList(clauseList);
        qt9.setLinkType(linkType);
        qt9.setBtmType(toType);
        qt9.setRightFlag(false);
        qt9.setType("link");
        // 如果参数 direction为空,则默认按正向
        if("".equals(direction)){
            direction = DIRECTION_POSITIVE;
        }
        // 设置方向
        qt9.setDirection(direction);
        // 全递归,查出全部的子
        qt9.setLevel(-1);
        Map<String, String> conditionMap = new HashMap<String, String>();
        conditionMap.put("f_oid", oid);
        qt9.setCondition(OQTool.getCondition(conditionMap));
        try {
            BOAndLO[] blos = QTClient.getService().getBOAndLOS(qt9.getId(), OQTool.qtTOXMl(qt9).asXML(), cbo.getOid());
            frame.setContent("查询到 ‘" + cbo.getName() + "’共计有 " + blos.length + " 条子件");
            filterOnwerNotEqualsCurrentUser(selectedCBOMap, cbo, blos, frame);
        } catch (VCIError e) {
            e.printStackTrace();
        }
    }
 
    private void filterOnwerNotEqualsCurrentUser(
            HashMap<String, ClientBusinessObject> selectedCBOMap,
            ClientBusinessObject cbo,
            BOAndLO[] blos, QANProcessBarFrame frame){
        String currentUserName = ClientContextVariable.getInvocationInfo().userName;
        frame.setContent("正在过滤 ‘" + cbo.getName() + "’的子件中与选择的数据重复、以及所有者不是当前用户‘" + currentUserName + "’的数据");
        for(BOAndLO blo : blos){
            if(selectedCBOMap.containsKey(blo.bo.oid)) continue;
            if(!currentUserName.equals(blo.bo.owner)) continue;
            ClientBusinessObject cboChild = new ClientBusinessObject();
            cboChild.setBusinessObject(blo.bo);
            selectedCBOMap.put(blo.bo.oid, cboChild);
        }
    }
    
    /**
     * 调用接口,执行更新
     * @param cboList
     * @param newOwnerList
     * @return
     */
    protected boolean executeUpdateOwner(List<ClientBusinessObject> cboList, List<UserObject> newOwnerList){
        boolean updateRes = false;
        try {
            updateRes = new ClientBusinessObjectOperation().batchChangeBusinessObjectOwner(
                    cboList.toArray(new ClientBusinessObject[]{}), newOwnerList.toArray(new UserObject[]{}));
        } catch (VCIError e) {
            UIFUtils.showErrorMessage(getParentComponent(), e);
        }
        return updateRes;
    }
}