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