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处理)
* * @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; } }