開發與設計公文流程在全部的政府oa項目上都少不了此需求,而能靈活定義一個在線的公文發文與收文流程尤爲重要,J.Office經過過Velocity模板技術進行表單定義,同時結合WebOffice能很是容易實如今線公文的擬稿、保留修改痕跡、而且進行套紅、套打功能。 java
在介紹本文以前,咱們先看一下其中一個發文流程: web
這是一個稍爲複雜的發文流程,用jbpm工具發這個流程並不成問題,問題是這個流程設計好,其裏面的每一個任務如何跟公文系統的數據進行對應起來。 app
J.Office提供了流程的表單技術,經過Velocity,能夠把表單裏面對應的任務直接保存至公文系統,而且同時讓流程跳轉至下一步。 工具
如其中一個任務表單的設計: this
- FlowPanel=Ext.extend(Ext.form.FormPanel,{
- constructor:function(cfg){
- this.officePanel=new OfficePanel({
- height:490,
- filePath:'${doc_path}',
- showToolbar:true
- });
- FlowPanel.superclass.constructor.call(this,{
- bodyStyle:'padding:5px',
- title:'辦公室主任審覈',
- height:600,
- width:800,
- layout:'form',
- items:[
- {
- fieldLabel:'審覈意見',
- name:'zr_option',
- xtype:'textarea',
- width:400,
- allowBlank:false,
- anchor:'98%,98%'
- },this.officePanel.panel
- ]
- });
- },
- save:function(){
- if(!this.getForm().isValid()) return;
- //TODO 保存個人流程表單至個人自定義表
- this.officePanel.saveDoc({
- fileCat : 'archIssue',
- docPath:this.officePanel.filePath
- });
- return true;
- }
- })
FlowPanel=Ext.extend(Ext.form.FormPanel,{
constructor:function(cfg){
this.officePanel=new OfficePanel({
height:490,
filePath:'${doc_path}',
showToolbar:true
});
FlowPanel.superclass.constructor.call(this,{
bodyStyle:'padding:5px',
title:'辦公室主任審覈',
height:600,
width:800,
layout:'form',
items:[
{
fieldLabel:'審覈意見',
name:'zr_option',
xtype:'textarea',
width:400,
allowBlank:false,
anchor:'98%,98%'
},this.officePanel.panel
]
});
},
save:function(){
if(!this.getForm().isValid()) return;
//TODO 保存個人流程表單至個人自定義表
this.officePanel.saveDoc({
fileCat : 'archIssue',
docPath:this.officePanel.filePath
});
return true;
}
})
對應的界面以下所示: url
在以上能夠比較容易在進行流程的跳轉前,咱們能夠在這裏處理咱們的公文,如保存,套紅,修改等操做,完成後再進行下一步的跳轉處理。 spa
注意,在VM模板中,咱們也使用了${doc_path}這些變量,其值來自流程表單的提交,而且會在流程跳轉過程當中一直存在,以方便流程讀取這些變量。 設計
其餘表單的設計也相似。 code
鑑於之前使用的WebOffice控件封裝得不太好,如今附上一個封裝較好的使用代碼示例: orm
- OfficePanel=function(conf){
-
- var officeObj = document.createElement('object');
- officeObj.width = "100%";
- officeObj.height = "100%";
- officeObj.classid= "clsid:E77E049B-23FC-4DB8-B756-60529A35FAD5";
- officeObj.codebase = __ctxPath+'/js/core/weboffice/weboffice_V6.0.4.6.cab#V6,0,4,6';
-
- var panelConf={border:false,layout:'fit'};
-
- if(conf.showToolbar){
- panelConf.tbar=new Ext.Toolbar({
- items:[
- {
- text : '保留修改痕跡',
- iconCls : 'btn-archive-save-trace',
- handler : function() {
- officeObj.SetTrackRevisions(1);
- officeObj.SetCurrUserName(curUserInfo.fullname);
- }
- }, '-', {
- text : '取消保留痕跡',
- iconCls : 'btn-archive-cancel-trace',
- handler : function() {
- officeObj.SetTrackRevisions(0);
- }
- }, '-',{
- text : '清除痕跡',
- iconCls : 'btn-archive-eraser',
- handler : function() {
- officeObj.SetTrackRevisions(4);
- }
- }, '-',{
- text:'加入套紅模板',
- iconCls:'',
- handler:function(){
- new ArchTemplateSelector({
- callback : function(tempPath) {
- var filePath=conf.filePath?__fullPath+'/attachFiles/'+conf.filePath:'';
- officeObj.LoadOriginalFile(__fullPath+"/attachFiles/" + tempPath,'doc');
- officeObj.SetFieldValue("contents",filePath, "::FILE::");
- //officeObj.SetFieldValue("red_header","","::ADDMARK::");
- //officeObj.SetFieldValue("red_header",__fullPath+"/attachFiles/" + tempPath, "::FILE::");
- }
- }
- ).show();
- }
- }
- ]
- });
- }
-
- Ext.applyIf(panelConf,conf);
-
- var panel=new Ext.Panel(panelConf);
- panel.on('afterrender',function(){
- panel.body.appendChild(officeObj);
- panel.doLayout();
- var filePath=conf.filePath?__fullPath+'/attachFiles/'+conf.filePath:'';
- var docType=conf.docType?conf.docType:'doc';
- officeObj.LoadOriginalFile(filePath,docType);
- panel.doLayout();
-
- });
- panel.on('destroy',function(){
- try {
- officeObj.Close();
- } catch (ex) {}
- });
-
- window.onunload=function(){
- try {
- officeObj.Close();
- } catch (ex) {}
- };
-
- //對外公共方法
- return {
- panel:panel,
- officeObj:officeObj,
- filePath:conf.filePath,
- openDoc:function(path,type){
- var vType='doc';
- if(type){
- vType=type;
- }
- officeObj.LoadOriginalFile(path,type);
- },
- saveDoc:function(config){
- config=config||{};
- officeObj.HttpInit();
- officeObj.HttpAddPostString('file_cat', config.fileCat);
- //overwrite file path
- if(config.docPath!=null && config.docPath!=''){
- officeObj.HttpAddPostString('file_path', config.docPath);
- }
- officeObj.HttpAddPostCurrFile('AipFile','');
- var url=config.url ? config.url: __fullPath + '/file-upload';
- // 提交上傳文件
- returnValue = officeObj.HttpPost(url);
- var obj;
- eval('obj='+returnValue+";");
- return obj;
- }
- };
- };
-
- //Ext.reg('officepanel',OfficePanel);