package com.vci.client.workflow.template;
|
|
import java.awt.Color;
|
import java.awt.Dimension;
|
import java.awt.Insets;
|
import java.awt.Toolkit;
|
import java.awt.image.BufferedImage;
|
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayOutputStream;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.Enumeration;
|
import java.util.Hashtable;
|
import java.util.Locale;
|
import java.util.Map;
|
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipFile;
|
import java.util.zip.ZipInputStream;
|
|
import javax.imageio.ImageIO;
|
import javax.swing.JDialog;
|
|
import org.dom4j.Document;
|
import org.dom4j.DocumentHelper;
|
import org.dom4j.Element;
|
import org.w3c.dom.Node;
|
|
import com.mxgraph.io.mxCodec;
|
import com.mxgraph.model.mxIGraphModel;
|
import com.mxgraph.swing.mxGraphComponent;
|
import com.mxgraph.util.mxUtils;
|
import com.mxgraph.view.mxGraph;
|
import com.vci.client.LogonApplication;
|
import com.vci.client.ui.exception.VCIException;
|
import com.vci.client.ui.swing.VCIOptionPane;
|
import com.vci.client.ui.tree.VCIBaseTreeNode;
|
import com.vci.client.workflow.commom.ClientHelper;
|
import com.vci.client.workflow.delegate.ProcessCustomClientDelegate;
|
import com.vci.client.workflow.editor.EditorCreateXmlToJbpm;
|
import com.vci.client.workflow.editor.FlowCellRenderer;
|
import com.vci.client.workflow.editor.FlowDesigner;
|
import com.vci.client.workflow.editor.TaskDescCObject;
|
import com.vci.client.workflow.editor.ZipUtil;
|
import com.vci.client.workflow.template.object.ProcessCategoryObject;
|
import com.vci.client.workflow.template.object.ProcessDefinitionObject;
|
import com.vci.corba.common.VCIError;
|
import com.vci.corba.workflow.data.CustomInfo;
|
import com.vci.corba.workflow.data.ProcessTaskInfo;
|
import com.vci.corba.workflow.data.PropertyInfo;
|
|
public class ProcessCustomOperate {
|
|
private ProcessCustomToolBar toolBar;
|
private static final String RECYCLEID = "00001";
|
public ProcessCustomOperate(ProcessCustomToolBar toolBar) {
|
this.toolBar = toolBar;
|
}
|
|
|
/**
|
* 流程模板导入
|
* @throws Exception
|
*/
|
public void importTemplate() throws Exception{
|
Object selectedObj = toolBar.getMainPanel().getCurrentSelectedObject();
|
if (selectedObj instanceof ProcessCategoryObject) {
|
try {
|
FileChooseDiaog fileChooserdialog = new FileChooseDiaog(
|
"import");
|
String fileName = fileChooserdialog.getFileName();
|
String filePath = fileChooserdialog.getFilepath();
|
if(filePath==null||"".equals(filePath)){
|
return;
|
}
|
//读取zip文件
|
ZipFile zf = new ZipFile(filePath+"\\"+fileName);
|
//zip中文件条数
|
int filesize = zf.size();
|
Enumeration<? extends ZipEntry> entries = zf.entries();
|
//流程图graphXml
|
byte[] graphXml = null;
|
//流程模板xml
|
byte[] processXml = null;
|
//objectXml
|
byte[] objectXml = null;
|
//遍历zip文件
|
for (Enumeration e = entries ; e.hasMoreElements() ;) {
|
ZipEntry nextElement = (ZipEntry) e.nextElement();
|
String name = nextElement.getName();
|
System.out.println(name);
|
ZipEntry entry = zf.getEntry(name);
|
InputStream inputStream = zf.getInputStream(entry);
|
if(name.contains(".graph")){
|
graphXml = InputStreamToByte(inputStream);
|
}
|
else if(name.contains(".jpdl.xml")){
|
processXml = InputStreamToByte(inputStream);
|
}
|
else if(name.contains(".xml")){
|
objectXml = InputStreamToByte(inputStream);
|
}
|
}
|
|
|
JDialog dialog = new JDialog(LogonApplication.frame);
|
dialog.setTitle(getI18nString("processCustom"));
|
dialog.setModal(true);
|
FlowDesigner designer = new FlowDesigner();
|
designer.setFlowCategory((ProcessCategoryObject) selectedObj);
|
ProcessDefinitionObject pd = new ProcessDefinitionObject();
|
String substring = fileName.substring(0,fileName.lastIndexOf("."));
|
pd.setName(substring);
|
pd.setKey(substring);
|
pd.setVersion(1);
|
designer.setProcessDefinition(graphXml, processXml,pd,objectXml);
|
designer.updatePanel(null);
|
designer.isEdit(false);
|
|
dialog.setContentPane(designer);
|
Insets screenInsets = Toolkit.getDefaultToolkit()
|
.getScreenInsets(
|
LogonApplication.frame
|
.getGraphicsConfiguration());
|
Dimension screenSize = Toolkit.getDefaultToolkit()
|
.getScreenSize();
|
dialog.setLocation(0, 0);
|
// dialog.setResizable(false);
|
dialog.setSize((int) screenSize.getWidth(),
|
(int) (screenSize.getHeight() - screenInsets.bottom));
|
dialog.setVisible(true);
|
// 刷新节点
|
refreshProcessCategory();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
} else {
|
VCIOptionPane.showMessage(LogonApplication.frame,
|
ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + "pleaseChooseProcessCategoryNode", toolBar.getLocale()));
|
}
|
}
|
/**
|
* 将输入流转换为字节数组
|
* @param is
|
* @return
|
* @throws IOException
|
*/
|
private static byte[] InputStreamToByte(InputStream is) throws IOException {
|
ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
|
int ch;
|
while ((ch = is.read()) != -1) {
|
bytestream.write(ch);
|
}
|
byte imgdata[] = bytestream.toByteArray();
|
bytestream.close();
|
return imgdata;
|
}
|
/**
|
* 模板导出
|
* @throws Exception
|
*/
|
public void exportTemplate() throws Exception{
|
Object selectedObj = toolBar.getMainPanel().getCurrentSelectedObject();
|
boolean flag = false;
|
if (selectedObj instanceof ProcessDefinitionObject) {
|
FileChooseDiaog dialog = new FileChooseDiaog("export");
|
String filepath = dialog.getFilepath();
|
String zipName = dialog.getFileName();
|
if(filepath==null||"".equals(filepath)){
|
return;
|
}
|
ProcessDefinitionObject flowCategory = ( ProcessDefinitionObject) selectedObj;
|
String templateName = flowCategory.getName();
|
//设置Designer对象
|
FlowDesigner designer = new FlowDesigner();
|
VCIBaseTreeNode selectedTreeNode = toolBar.getMainPanel().getCurrentSelectedTreeNode();
|
Object parentObj = ((VCIBaseTreeNode)selectedTreeNode.getParent()).getObj();
|
designer.setFlowCategory((ProcessCategoryObject)parentObj);
|
designer.setProcessDefinition((ProcessDefinitionObject) selectedObj);
|
//获取graph对象
|
mxGraphComponent graphComponent = designer.getGraphComponent();
|
mxGraph graph = designer.getGraphComponent().getGraph();
|
BufferedImage image = FlowCellRenderer.createBufferedImage(graph, null, 1, Color.decode("#FFFBFF"), graphComponent.isAntiAlias(), graphComponent.getCanvas());
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
try {
|
//获取流程图片
|
ImageIO.write(image, "png", baos);
|
byte[] jbpmImage = baos.toByteArray();
|
|
//获取流程模板xml文件
|
EditorCreateXmlToJbpm getXml = new EditorCreateXmlToJbpm(designer);
|
String jbpmXml = getXml.getsXml();
|
|
//获取流程图xml文件
|
mxCodec codec = new mxCodec();
|
mxIGraphModel model = designer.getGraphComponent().getGraph().getModel();
|
Node encode = codec.encode(model);
|
String graphXml = mxUtils.getXml(encode);
|
|
//创建对象xml
|
Document document = DocumentHelper.createDocument();
|
Element rootElement = document.addElement("root");
|
//流程部署ID
|
String jbpmDeploymentId = ((ProcessDefinitionObject) selectedObj).getJbpmDeploymentId();
|
|
//获取所有任务名称
|
String[] allTaskNames = new ProcessCustomClientDelegate().getAllTaskNames(jbpmDeploymentId);
|
for(String taskName :allTaskNames){
|
//流程任务信息
|
ProcessTaskInfo processTaskInfo = new ProcessCustomClientDelegate().findById(jbpmDeploymentId, taskName);
|
CustomInfo[] customUserInfos = processTaskInfo.customUserInfos;
|
PropertyInfo[] taskTypeProperties = processTaskInfo.taskTypeProperties;
|
//任务描述策略信息
|
TaskDescCObject[] taskDescCObject = new ProcessCustomClientDelegate(LogonApplication.getUserEntityObject()).getTaskDescList(jbpmDeploymentId, taskName);
|
|
//任务节点
|
// taskName = taskName.replaceAll(" ", "");
|
// Element taskNameElement = rootElement.addElement(taskName);
|
//ProcessTaskInfo节点
|
Element processTaskInfoEle = rootElement.addElement("ProcessTaskInfo");
|
processTaskInfoEle.addAttribute("id", processTaskInfo.id);
|
processTaskInfoEle.addAttribute("deploymentId", processTaskInfo.deploymentId);
|
processTaskInfoEle.addAttribute("taskName", processTaskInfo.taskName);
|
processTaskInfoEle.addAttribute("taskType", processTaskInfo.taskType);
|
processTaskInfoEle.addAttribute("taskDesc", processTaskInfo.taskDesc);
|
processTaskInfoEle.addAttribute("pltreatment", String.valueOf(processTaskInfo.pltreatment));
|
processTaskInfoEle.addAttribute("popUserDialog", processTaskInfo.popUserDialog);
|
|
//CustomInfo节点
|
for(int i =0;i<customUserInfos.length;i++){
|
Element customInfoEle = processTaskInfoEle.addElement("CustomInfo");
|
customInfoEle.addAttribute("className", String.valueOf(customUserInfos[i].className));
|
customInfoEle.addAttribute("value", customUserInfos[i].value);
|
}
|
//PropertyInfo节点
|
for(int i =0;i<taskTypeProperties.length;i++){
|
Element taskpropertyEle = processTaskInfoEle.addElement("PropertyInfo");
|
taskpropertyEle.addAttribute("property", String.valueOf(taskTypeProperties[i].property));
|
taskpropertyEle.addAttribute("value", taskTypeProperties[i].value);
|
}
|
//TaskDescCObject节点
|
for(int i =0;i<taskDescCObject.length;i++){
|
Element taskDescEle = processTaskInfoEle.addElement("TaskDescCObject");
|
taskDescEle.addAttribute("id", String.valueOf(taskDescCObject[i].getId()));
|
taskDescEle.addAttribute("pltaskdesc", taskDescCObject[i].getPltaskdesc());
|
taskDescEle.addAttribute("pljbpmdeploymentid", String.valueOf(taskDescCObject[i].getPljbpmdeploymentid()));
|
taskDescEle.addAttribute("pltask", taskDescCObject[i].getPltask());
|
taskDescEle.addAttribute("pltreatment", String.valueOf(taskDescCObject[i].getPltreatment()));
|
taskDescEle.addAttribute("popUserDialog", taskDescCObject[i].getPopUserDialog());
|
taskDescEle.addAttribute("plcustomclassname", taskDescCObject[i].getPlcustomclassname());
|
taskDescEle.addAttribute("plcustomparam", taskDescCObject[i].getPlcustomparam());
|
}
|
|
}
|
|
String taskObjectXML = document.asXML();
|
flag = exportWorkFlowTemplate(filepath, zipName, templateName, jbpmImage, jbpmXml, graphXml, taskObjectXML);
|
} catch (IOException e) {
|
e.printStackTrace();
|
flag = false;
|
} catch (VCIException e) {
|
e.printStackTrace();
|
flag = false;
|
} catch (VCIError e) {
|
e.printStackTrace();
|
flag = false;
|
}
|
if(flag){
|
VCIOptionPane.showMessage(LogonApplication.frame, "导出成功");
|
}else{
|
VCIOptionPane.showMessage(LogonApplication.frame, "导出失败");
|
}
|
} else {
|
VCIOptionPane.showMessage(LogonApplication.frame,
|
"请选择模板进行导出");
|
}
|
}
|
|
/**
|
* 创建对象xml
|
* @param taskeNames
|
* @param propertys
|
* @param map
|
*/
|
private String creatXml(String[] taskeNames,String[] propertys,Map<String,String> map){
|
Document document = DocumentHelper.createDocument();
|
Element rootElement = document.addElement("root");
|
for(String taskeName : taskeNames){
|
Element taskNameElement = rootElement.addElement(taskeName);
|
for(int i=0;i<propertys.length;i++){
|
Element propertyElement = taskNameElement.addElement(propertys[i]);
|
propertyElement.setText(map.get(propertys[i]));
|
}
|
}
|
return document.asXML();
|
}
|
|
/**
|
* 工作流模板导出
|
* @param name TODO
|
* @param taskObjectXML TODO
|
* @return
|
*/
|
public boolean exportWorkFlowTemplate(String path,String name, String templateName, final byte[] jbpmImage, String jbpmXml, String graphXml, String taskObjectXML){
|
try {
|
templateName = "flow" + System.currentTimeMillis();
|
// String path = CommonProperties.getStringProperty("workflow.UserDialog") + name;
|
// 如果目录不存在,创建目录
|
// if (!new File(path).getParentFile().exists()) {
|
// new File(path).mkdirs();
|
// }
|
if(name.contains(".zip")){
|
name = name.substring(0,name.lastIndexOf("."));
|
}
|
Map<String, InputStream> map = new Hashtable<String, InputStream>();
|
InputStream is = new ByteArrayInputStream(jbpmImage);
|
map.put(templateName + ".png", is);
|
InputStream jpdlIs = new ByteArrayInputStream(
|
jbpmXml.getBytes("utf-8"));
|
map.put(templateName + ".jpdl.xml", jpdlIs);
|
InputStream graphIs = new ByteArrayInputStream(
|
graphXml.getBytes("utf-8"));
|
map.put(templateName + ".graph", graphIs);
|
InputStream taskObjectIs = new ByteArrayInputStream(
|
taskObjectXML.getBytes("utf-8"));
|
map.put(templateName + ".xml", taskObjectIs);
|
ZipUtil.saveZip(path+"\\"+name + ".zip", map);
|
File file = new File(path+"\\"+name + ".zip");
|
FileInputStream fis = new FileInputStream(file);
|
ZipInputStream zin = new ZipInputStream(fis);
|
} catch (Throwable e) {
|
e.printStackTrace();
|
}
|
return true;
|
}
|
|
/**
|
* 创建模板分类
|
*/
|
public void createProcessCategory() {
|
javax.swing.SwingUtilities.invokeLater(new Runnable() {
|
public void run() {
|
showCreateDialog();
|
}
|
});
|
}
|
|
private void showCreateDialog() {
|
showProcessCategoryDialog("create", null);
|
}
|
|
private void showProcessCategoryDialog(String optType, ProcessCategoryObject selectedObj) {
|
try {
|
Object currObject = toolBar.getMainPanel().getCurrentSelectedObject();
|
if(!(currObject instanceof String)){
|
if(currObject instanceof ProcessCategoryObject){
|
if(RECYCLEID.equals(((ProcessCategoryObject)currObject).getId())){
|
VCIOptionPane.showMessage(LogonApplication.frame, "不能添加分类!");
|
return;
|
}
|
}else{
|
VCIOptionPane.showMessage(LogonApplication.frame, "不能添加分类!");
|
return;
|
}
|
}
|
ProcessCategoryDialog dialog = new ProcessCategoryDialog("", optType, selectedObj, this);
|
dialog.setVisible(true);
|
} catch (VCIException exp) {
|
VCIOptionPane.showError(LogonApplication.frame, "RMIPWorkflow", exp);
|
}
|
}
|
|
/**
|
* 修改流程分类
|
*/
|
public void editProcessCategory() {
|
javax.swing.SwingUtilities.invokeLater(new Runnable() {
|
public void run() {
|
showModifyDialog();
|
}
|
});
|
}
|
|
private void showModifyDialog() {
|
Object selectedObj = toolBar.getMainPanel().getCurrentSelectedObject();
|
if (selectedObj instanceof ProcessCategoryObject) {
|
if(RECYCLEID.equals(((ProcessCategoryObject) selectedObj).getId())){
|
VCIOptionPane.showMessage(LogonApplication.frame, "不能修改!");
|
return;
|
}
|
showProcessCategoryDialog("modify", (ProcessCategoryObject) selectedObj);
|
} else {
|
VCIOptionPane.showMessage(LogonApplication.frame,
|
ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + "pleaseChooseProcessCategoryNode", toolBar.getLocale()));
|
}
|
}
|
|
public void deleteProcessCategoryButton_mouseEntered() {
|
Object selectedObject = toolBar.getMainPanel().getCurrentSelectedObject();
|
if (selectedObject instanceof ProcessCategoryObject) {
|
ProcessCategoryObject object = (ProcessCategoryObject) selectedObject;
|
|
if(RECYCLEID.equals(object.getId())){
|
VCIOptionPane.showMessage(LogonApplication.frame, "不能删除!");
|
return;
|
}
|
if (VCIOptionPane.showQuestion(LogonApplication.frame,
|
ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + "deleteProcessCategoryConfirmMessage", toolBar.getLocale())) != 0) {
|
return;
|
}
|
deleteProcessCategoryClassify(object.getId());
|
} else if (selectedObject instanceof ProcessDefinitionObject) {
|
if (VCIOptionPane.showQuestion(LogonApplication.frame,
|
ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + "deleteProcessDefinitionConfirmMessage", toolBar.getLocale())) != 0) {
|
return;
|
}
|
try {
|
int checkSubprocessQuote = new ProcessCustomClientDelegate().checkSubprocessQuote(((ProcessDefinitionObject) selectedObject).getId());
|
if(checkSubprocessQuote>0){
|
VCIOptionPane.showMessage(LogonApplication.frame, "此流程被其他流程所引用!");
|
return;
|
}
|
} catch (VCIError e) {
|
e.printStackTrace();
|
}
|
|
ProcessDefinitionObject object = (ProcessDefinitionObject) selectedObject;
|
deleteProcessDefinition(object.getJbpmDeploymentId(), object.getId());
|
} else {
|
VCIOptionPane.showError(LogonApplication.frame,
|
ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + "pleaseChooseNotRootTreeNode", toolBar.getLocale()));
|
}
|
}
|
|
private void deleteProcessCategoryClassify(String id) {
|
try {
|
ProcessCustomClientDelegate delegate = new ProcessCustomClientDelegate(LogonApplication.getUserEntityObject());
|
boolean rs = delegate.deleteProcessCategory(id);
|
if (rs) {
|
VCIBaseTreeNode node = toolBar.getMainPanel().getCurrentSelectedTreeNode();
|
toolBar.getMainPanel().removeNode(node);
|
toolBar.getMainPanel().setEmptyPanel();
|
}
|
} catch (VCIException exp) {
|
VCIOptionPane.showError(LogonApplication.frame, "RMIPWorkflow", exp);
|
}
|
}
|
|
private void deleteProcessDefinition(String deployId, String pdId) {
|
try {
|
ProcessCustomClientDelegate delegate = new ProcessCustomClientDelegate(LogonApplication.getUserEntityObject());
|
boolean rs = delegate.deleteProcessDefinition(deployId, pdId);
|
if (rs) {
|
VCIBaseTreeNode node = toolBar.getMainPanel().getCurrentSelectedTreeNode();
|
toolBar.getMainPanel().removeNode(node);
|
toolBar.getMainPanel().setEmptyPanel();
|
}
|
} catch (VCIException exp) {
|
VCIOptionPane.showError(LogonApplication.frame, "RMIPWorkflow", exp);
|
} catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
}
|
|
public void refreshProcessCategory() {
|
toolBar.getMainPanel().updateTree();
|
}
|
|
public ProcessCustomToolBar getToolBar() {
|
return this.toolBar;
|
}
|
|
public void addProcessProcessDefinition() throws VCIError {
|
// 选择模板
|
Object selectedObj = toolBar.getMainPanel().getCurrentSelectedObject();
|
if (selectedObj instanceof ProcessCategoryObject) {
|
JDialog dialog = new JDialog(LogonApplication.frame);
|
dialog.setTitle(getI18nString("processCustom"));
|
dialog.setModal(true);
|
FlowDesigner designer = new FlowDesigner();
|
designer.setFlowCategory((ProcessCategoryObject) selectedObj);
|
designer.isEdit(false);
|
|
dialog.setContentPane(designer);
|
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(LogonApplication.frame.getGraphicsConfiguration());
|
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
|
dialog.setLocation(0, 0);
|
// dialog.setResizable(false);
|
dialog.setSize((int)screenSize.getWidth(), (int)(screenSize.getHeight() - screenInsets.bottom));
|
dialog.setVisible(true);
|
// 刷新节点
|
refreshProcessCategory();
|
} else {
|
VCIOptionPane.showMessage(LogonApplication.frame,
|
ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + "pleaseChooseProcessCategoryNode", toolBar.getLocale()));
|
}
|
}
|
|
public void editProcessProcessDefinition() throws Exception {
|
// 选择模板
|
Object selectedObj = toolBar.getMainPanel().getCurrentSelectedObject();
|
if (selectedObj instanceof ProcessDefinitionObject) {
|
JDialog dialog = new JDialog(LogonApplication.frame);
|
dialog.setTitle(getI18nString("processCustom"));
|
dialog.setModal(true);
|
FlowDesigner designer = new FlowDesigner();
|
VCIBaseTreeNode selectedTreeNode = toolBar.getMainPanel().getCurrentSelectedTreeNode();
|
Object parentObj = ((VCIBaseTreeNode)selectedTreeNode.getParent()).getObj();
|
designer.setFlowCategory((ProcessCategoryObject)parentObj);
|
designer.setProcessDefinition((ProcessDefinitionObject) selectedObj);
|
designer.updatePanel(null);
|
designer.isEdit(true);//编辑状态
|
|
dialog.setContentPane(designer);
|
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(LogonApplication.frame.getGraphicsConfiguration());
|
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
|
dialog.setLocation(0, 0);
|
// dialog.setResizable(false);
|
dialog.setSize((int)screenSize.getWidth(), (int)(screenSize.getHeight() - screenInsets.bottom));
|
dialog.setVisible(true);
|
// 刷新节点
|
refreshProcessCategory();
|
} else {
|
VCIOptionPane.showMessage(LogonApplication.frame,
|
ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + "pleaseChooseProcessCategoryNode", toolBar.getLocale()));
|
}
|
}
|
|
private String getI18nString(String spCode){
|
return ClientHelper.getI18nStringForWorkflow(this.getClass().getName() + "." + spCode, Locale.getDefault());
|
}
|
|
}
|