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
* 如果选择的数据是BO,则修改选择BO对象的OWNER
* 如果选择的数据是BO,且cascade=true,此时修改选择BO对象及其子对象的OWNER。需要linkType、fromType、toType、f_oid、t_oid等参数的协同支持
* 如果选择的数据是LO,且direction的参数值(默认按positive处理)
*
* - all:
*
- positive:
*
- opposite:
*
* @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 cboList = new LinkedList();
StringBuffer sbNames = new StringBuffer();
HashMap selectedCBOMap = new LinkedHashMap();
HashMap selectedCLOMap = new HashMap();
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 changeCBOList = new LinkedList();
List newOwnerList = new LinkedList();
Iterator 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 selectedCBOMap,
boolean isCascade, String newOwner, QANProcessBarFrame frame){
if(!isCascade) return;
}
/**
* 级联处理选择的BO对象的子对象
* @param cboMap
* @param isCascade
* @param newOwner
*/
protected void boCascadeProcess(HashMap selectedCBOMap,
boolean isCascade, String newOwner, QANProcessBarFrame frame){
if(!isCascade) return;
String direction = getDirection();
String linkType = getLinkType();
String fromType = getFromType();
String toType = getToType();
Iterator 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 selectedCBOMap,
ClientBusinessObject cbo, String oid, String direction,
String linkType, String fromType, String toType,
QANProcessBarFrame frame){
QueryTemplate qt9 = new QueryTemplate();
qt9.setId("id");
List clauseList = new ArrayList();
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 conditionMap = new HashMap();
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 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 cboList, List 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;
}
}