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