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 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 map){ Document document = DocumentHelper.createDocument(); Element rootElement = document.addElement("root"); for(String taskeName : taskeNames){ Element taskNameElement = rootElement.addElement(taskeName); for(int i=0;i map = new Hashtable(); 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()); } }