package com.vci.client.uif.actions.client; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.swing.JFrame; import org.apache.commons.lang3.StringUtils; import com.vci.client.bof.ClientBusinessObject; import com.vci.client.bof.ClientLinkObject; import com.vci.client.common.objects.UserEntityObject; import com.vci.client.common.oq.OQTool; import com.vci.client.oq.QTClient; import com.vci.client.ui.exception.VCIException; import com.vci.client.ui.process.QANProcessBar; import com.vci.client.ui.process.QANProcessBarFrame; import com.vci.client.uif.engine.common.IDataNode; import com.vci.client.workflow.delegate.ProcessCustomClientDelegate; import com.vci.client.workflow.launch.LaunchDialog; import com.vci.common.qt.object.Condition; 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.workflow.data.FlowInstanceInfo; import com.vci.corba.workflow.data.MapTransfersInfo; import com.vci.corba.workflow.data.ProcessTaskInfo; import com.vci.mw.ClientContextVariable; /** * 启动工作流程 Action *

* 1、基于选定数据进行的操作 *

*

* 2、可以选择多条数据进行此操作 *

* * @author xiongchao * */ public class LaunchWorkFlowAction extends AbstractBatchBusionessOperationAction { /** * 按钮参数 */ private Map paramsMap = null; /** * 按钮配置的dialog列头。 */ private String headers = ""; /** * 按钮配置的dialog列头对应的mapvalue中的key。 */ private String keys = ""; /** * 登陆人员信息 */ private String loginUserName = ""; private String processType = ""; private String boType = ""; private String[] objId = null; /** * dialog窗口数据。 */ private Map> values = new HashMap>(); private String workflowStartState = "Working"; /** * dialog窗口table列头。 */ private String[] heads = null; private boolean errorNameFlag = false;//用于标记当对象为已发布,但无法取其标示时为true; // private String[] ids; LaunchDialog dialog = null; @Override public String getKey() { return "launchworkflow"; } /* * (non-Javadoc) * * @see plm.uif.actions.client.BusinessOperationAction#doPost() */ @SuppressWarnings("deprecation") @Override public boolean doPost() { preLoadMessage(); try { if(dialog == null){ return false; } if(!dialog.isSaveFlag()){ return false; } String processName = dialog.getProcessName(); String processDec = dialog.getProcessDec(); while(dialog.isSaveFlag() && checkProcessNameIsExist(dialog)){ dialog.setSaveFlag(false); dialog.setVisible(true); processName = dialog.getProcessName(); } if(!dialog.isSaveFlag()){ return false; } Map> taskAndUserMap = dialog .getTaskAndUserMap(); // 流程名称:加版本号 String processDefinitionKey = dialog.getProcessTemplateName(); int taskIndex = 0; // 任务名称数组 String[] tasknames = new String[taskAndUserMap.size()]; // 任务对应的用户数组 String[][] taskUserNames = new String[taskAndUserMap.size()][]; for (Entry> entrySet : taskAndUserMap .entrySet()) { tasknames[taskIndex] = entrySet.getKey(); List list = entrySet.getValue(); String[] array = list.toArray(new String[] {}); String[] userNames = new String[array.length]; for (int userIndex = 0; userIndex < array.length; userIndex++) { userNames[userIndex] = array[userIndex]; } taskUserNames[taskIndex] = userNames; taskIndex++; } // 用户名 String[] userName = new String[] {}; ProcessCustomClientDelegate delegate = createProcessCustomClientDelegate(); String deploymentID = delegate .getDeploymentID(processDefinitionKey); ProcessTaskInfo firstProcessTask = delegate .getFirstProcessTask(deploymentID); for (int i = 0; i < tasknames.length; i++) { if (firstProcessTask.taskName.equals(tasknames[i])) { userName = new String[taskUserNames[i].length]; for (int j = 0; j < taskUserNames[i].length; j++) { userName[j] = taskUserNames[i][j]; } } } // 流程实例对象 FlowInstanceInfo flowInstanceInfo = new FlowInstanceInfo(); flowInstanceInfo.creator = loginUserName; flowInstanceInfo.templatePuid = ""; flowInstanceInfo.clsfOid = ""; flowInstanceInfo.tableName = processType; flowInstanceInfo.applicant = loginUserName; flowInstanceInfo.desc = processDec == null ? "" : processDec; flowInstanceInfo.processType = boType; flowInstanceInfo.templateName = ""; flowInstanceInfo.partList = ""; flowInstanceInfo.processName = processName == null ? "" : processName; MapTransfersInfo[] mapTransfersInfos = new MapTransfersInfo[1]; MapTransfersInfo info = new MapTransfersInfo(); info.key = "boType"; info.value = boType; mapTransfersInfos[0] = info; String outcome = ""; return startPocess(delegate, processDefinitionKey, flowInstanceInfo, objId, userName, outcome, tasknames, taskUserNames, mapTransfersInfos); } catch (VCIError e) { e.printStackTrace(); UIFUtils.showErrorMessage(ClientContextVariable.getFrame(), e); return false; } catch (VCIException e) { e.printStackTrace(); UIFUtils.showErrorMessage(ClientContextVariable.getFrame(), e); return false; } } private void preLoadMessage() { final QANProcessBarFrame frame = new QANProcessBarFrame(); final QANProcessBar bar = new QANProcessBar(new Thread(new Runnable() { @SuppressWarnings("deprecation") @Override public void run() { try { frame.setContent("正在校验数据......"); // 获取选择的数据 // 数据的实际类型一般为 IDataNode Object[] objs = getDataModel().getSelectObjects(); paramsMap = getButtonParams(); String cWorkflowStartState = paramsMap.get("workflowStartState"); if (cWorkflowStartState != null && !cWorkflowStartState.equals("")) { workflowStartState = cWorkflowStartState; } if(paramsMap.containsKey("header")){ headers = paramsMap.get("header");// 获取设置列头 } if(paramsMap.containsKey("keys")){ keys = paramsMap.get("keys"); // 获取列头对应的属性值。 } // 获取 if (headers.equals("")) { headers = "编码##代号##名称"; } if(keys.equals("")){ keys = "code##id##name"; } setLaunchDialogMessage(objs); dialog = new LaunchDialog(processType, heads, values); } catch (VCIError e) { e.printStackTrace(); frame.setProcessBarCancel(true); UIFUtils.showErrorMessage(ClientContextVariable.getFrame(), e); return; }finally{ frame.setProcessBarCancel(true); } } }), (JFrame) ClientContextVariable.getFrame(), frame, "启动流程", false); bar.setVisible(true); if(dialog != null){ dialog.setVisible(true); } } private boolean startPocess( final ProcessCustomClientDelegate delegate, final String processDefinitionKey, final FlowInstanceInfo flowInstanceInfo, final String[] objId, final String[] userName, final String outcome, final String[] tasknames, final String[][] taskUserNames, final MapTransfersInfo[] mapTransfersInfos) { final boolean[] ress = {false}; final QANProcessBarFrame frame = new QANProcessBarFrame(); final QANProcessBar bar = new QANProcessBar(new Thread(new Runnable() { @SuppressWarnings("deprecation") @Override public void run() { try{ frame.setContent("正在提交流程,请稍等..."); String processInstansId = delegate.startPocessByPLM( processDefinitionKey, flowInstanceInfo, objId, userName, outcome, tasknames, taskUserNames, mapTransfersInfos); ress[0] = true; frame.setProcessBarCancel(true); UIFUtils.showMessage(ClientContextVariable.getFrame(), "流程启动成功!\n【流程执行ID:" + processInstansId + "】"); }catch(VCIError e){ frame.setProcessBarCancel(true); UIFUtils.showErrorMessage(ClientContextVariable.getFrame(), e); } finally{ frame.setProcessBarCancel(true); } } }), (JFrame) ClientContextVariable.getFrame(), frame, "启动流程", false); bar.setVisible(true); return ress[0]; } private void setLaunchDialogMessage(Object[] objs) throws VCIError { heads = headers.split("##"); String[] key = keys.split("##"); if(heads.length != key.length){ throw new VCIError("plm.uif.actions.client.LaunchWorkFlowAction.headerNoEqualsKey", new String[]{}); } int len = key.length; ArrayList vals = new ArrayList(); objId = new String[objs.length]; String boOid = ""; String boLcstatus = ""; StringBuffer processDataSb = new StringBuffer(); for (int objectIndex = 0; objectIndex < objs.length; objectIndex++) { IDataNode idn = (IDataNode) objs[objectIndex]; Map valueMap = idn.getValueMap(); String[] val = new String[len]; String keyNotExist = ""; for (int i = 0; i < len; i++) { if(valueMap.containsKey(key[i])){ val[i] = valueMap.get(key[i]); }else{ keyNotExist +="["+ key[i]+"]"; } } if(!keyNotExist.equals("")){ //抛出异常,key值不存在 throw new VCIError("plm.uif.actions.client.LaunchWorkFlowAction.keyPropertyIsNull", new String[]{"{"+keyNotExist+"}"}); } vals.add(val); boType = getBoType(idn); boOid = getBoOid(idn); boLcstatus = getBoLcStatus(boLcstatus, idn); if(StringUtils.isNotEmpty(workflowStartState)){ if (!boLcstatus.toLowerCase().equals(workflowStartState.toLowerCase())) { processDataSb.append(idn.toString()).append(","); } } objId[objectIndex] = boOid; } checkDataIfInProcess(processDataSb); createDatasForDialog(objId, heads, vals); // 分类名称 processType = boType; } /** * 判断是否发起过流程 * * @param processDataSb * 发起国流程的对象名称字符串。 * @throws VCIError */ private void checkDataIfInProcess(StringBuffer processDataSb) throws VCIError { if(errorNameFlag){ throw new VCIError("所选数据中存在处于不能发起流程状态的数据,请重新选择!", new String[]{}); }else if (processDataSb != null && processDataSb.length() > 0) { String mes = processDataSb.substring(0, processDataSb.length()-1); throw new VCIError("所选数据[ "+mes+" ]的状态不能启动流程,请重新选择!", new String[]{}); } } private ProcessCustomClientDelegate createProcessCustomClientDelegate() { UserEntityObject userEntityObject = new UserEntityObject(); String ip = ClientContextVariable.getInvocationInfo().clientIPInfo; loginUserName = ClientContextVariable.getInvocationInfo().userName; userEntityObject.setIp(ip); userEntityObject.setUserName(loginUserName); userEntityObject.setModules(""); return new ProcessCustomClientDelegate(userEntityObject); } private void createDatasForDialog( String[] objId, String[] headers, ArrayList vals) { for (int i = 0; i < objId.length; i++) { Map oneValues = new HashMap(); for (int j = 0; j < headers.length; j++) { oneValues.put(headers[j], vals.get(i)[j]); } values.put(objId[i], oneValues); } } private String getBoType(IDataNode idn) { String boType = ""; if (idn.getMaterObject() instanceof ClientBusinessObject) { boType = ((ClientBusinessObject) idn.getMaterObject()).getBtmName(); } else if (idn.getMaterObject() instanceof ClientLinkObject) { if (idn.isForward()) { boType = ((ClientLinkObject) idn.getMaterObject()) .getToBTMName(); } else { boType = ((ClientLinkObject) idn.getMaterObject()) .getFromBTMName(); } } return boType; } private String getBoOid(IDataNode idn) { String boOid = ""; if (idn.getMaterObject() instanceof ClientBusinessObject) { boOid = ((ClientBusinessObject) idn.getMaterObject()).getOid(); } else if (idn.getMaterObject() instanceof ClientLinkObject) { if (idn.isForward()) { boOid = ((ClientLinkObject) idn.getMaterObject()).getToOid(); } else { boOid = ((ClientLinkObject) idn.getMaterObject()).getFromOid(); } } return boOid; } private String getBoLcStatus(String boLcstatus, IDataNode idn) { if (idn.getMaterObject() instanceof ClientBusinessObject) { boLcstatus = ((ClientBusinessObject) idn.getMaterObject()) .getLcStatus(); } else if (idn.getMaterObject() instanceof ClientLinkObject) { if (idn.isForward()) { boLcstatus = idn.getValueMap().get("t_oid.lcstatus"); } else { boLcstatus = idn.getValueMap().get("f_oid.lcstatus"); } } return boLcstatus; } @SuppressWarnings("deprecation") private boolean checkProcessNameIsExist(LaunchDialog dialog) throws VCIError{ if(!dialog.isSaveFlag()) return false; String processName = dialog.getProcessName(); boolean res = false; QueryTemplate qt9 = new QueryTemplate(); List clauseList = new ArrayList(); clauseList.add("*"); qt9.setClauseList(clauseList); qt9.setVersion(Version.lastRevLastVer); qt9.setBtmType("workitem"); qt9.setRightFlag(false); qt9.setId("d"); qt9.setType("btm"); Map conditions = new HashMap(); conditions.put("name", "*" + processName + "-*"); conditions.put("workType", "2"); conditions.put("businesstype", "5"); Condition cond = OQTool.getCondition(conditions); qt9.setCondition(cond); BusinessObject[] d = QTClient.getService().findBTMObjects(qt9.getId(), OQTool.qtTOXMl(qt9).asXML()); res = d.length > 0; if(res){ UIFUtils.showMessage(ClientContextVariable.getFrame(), "流程名称:‘" + processName + "’已经存在,不允许出现重复的流程名称!"); } return res; } }