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
|
* <p>
|
* 1、基于选定数据进行的操作
|
* </p>
|
* <p>
|
* 2、可以选择多条数据进行此操作
|
* </p>
|
*
|
* @author xiongchao
|
*
|
*/
|
public class LaunchWorkFlowAction extends AbstractBatchBusionessOperationAction {
|
|
/**
|
* 按钮参数
|
*/
|
private Map<String, String> 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<String, Map<String, String>> values = new HashMap<String, Map<String, String>>();
|
|
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<String, List<String>> taskAndUserMap = dialog
|
.getTaskAndUserMap();
|
// 流程名称:加版本号
|
String processDefinitionKey = dialog.getProcessTemplateName();
|
int taskIndex = 0;
|
// 任务名称数组
|
String[] tasknames = new String[taskAndUserMap.size()];
|
// 任务对应的用户数组
|
String[][] taskUserNames = new String[taskAndUserMap.size()][];
|
for (Entry<String, List<String>> entrySet : taskAndUserMap
|
.entrySet()) {
|
tasknames[taskIndex] = entrySet.getKey();
|
List<String> 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<String[]> vals = new ArrayList<String[]>();
|
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<String, String> 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<String[]> vals) {
|
for (int i = 0; i < objId.length; i++) {
|
Map<String, String> oneValues = new HashMap<String, String>();
|
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<String> clauseList = new ArrayList<String>();
|
clauseList.add("*");
|
qt9.setClauseList(clauseList);
|
qt9.setVersion(Version.lastRevLastVer);
|
qt9.setBtmType("workitem");
|
qt9.setRightFlag(false);
|
qt9.setId("d");
|
qt9.setType("btm");
|
|
Map<String, String> conditions = new HashMap<String, String>();
|
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;
|
}
|
}
|