OpenJWeb簡易審批流設置
本文介紹在OpenJWeb平臺中如何進行簡易審批流的配置。用戶可自定義流程狀態位、審批流設置,在列表頁中生成審批按鈕,並執行審批操作。
一、前提條件
用戶已經在openjweb平臺中生成了數據庫表、增刪改查頁面,見下圖:
此功能對應的數據庫表yk_user,對應的子系統yktxcms,列表頁和編輯頁分別對應:
D:\project\openjweb\webapps\WEB-INF\jsp\yktxcms\listYkUser.jsp和editYkUser.jsp
二、增加流程狀態位定義
流程狀態包括初始(00)、審批通過(01)、審批拒絕(02)、凍結3天(03)。
找到下面的功能菜單:
說明:00狀態系統已默認生成。可錄入其他狀態位,見下圖:
注意類屬性名使用系統默認的flowStatus,其他未填寫的字段可忽略。
填寫完成以後,演客空間有以下狀態字段:
下面定義審批流,打開左側菜單的業務流程設置:
需要定義以下幾種審批流:
00-01 審批通過 前置狀態:初始,後置狀態:審批通過
00-02 審批拒絕 前置狀態:初始,後置狀態:審批拒絕
01-03 凍結3天 前置狀態:審批通過,後置狀態:凍結3天
03-01 取消凍結 前置狀態:凍結3天,後置狀態:審批通過
點業務流程設置界面的“增加”按鈕,見下圖:
字段說明:
狀態位字段名:統一爲flowStatus
前置狀態:審批操作前的flowStatus狀態位的值
結果狀態:審批操作後的flowStatus狀態位的值
動作碼:主要用於列表頁JS中傳遞動作參數。
動作名稱及頁面按鈕文字中文:按鈕顯示的名稱。
按鈕順序:在列表頁中的按鈕順序。
權限碼:設置權限碼。如果設置了權限碼,只有把此權限碼授權給指定的人或角色才能顯示相應的審批按鈕。
下面是設置好了流程狀態的審批流列表:
三、代碼修改
3.1 修改jsp文件
目前簡易審批流暫時沒有自動生成代碼,可參考以下過程修改。
打開D:\project\openjweb\webapps\WEB-INF\jsp\yktxcms\listYkUser.jsp,找到
${listButtonExpr} ,在這段字段串上一行插入${chkHtmlStr}
注意最好是用editplus打開文件,openjweb中生成的jsp文件絕大部分都是utf-8字符集。
3.2 修改action文件
打開D:\project\openjweb\src\java\com\yktx\action\YkUserAction.java
找到protected void initAction() 方法,在此方法末尾
this.setPageLoader(loader);
下面增加一行:
this.createSimpleFlowButton();//生成簡易審批流按鈕
然後將下面兩個方法的代碼加到YkUserAction.java代碼最後的}的上面:
private void createSimpleFlowButton()
{
logger.info("開始調用createSimpleFlowButton.............");
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean(this.getDbService());
try
{
List flowList = service.findByHqlQuery("from org.openjweb.core.entity.WfStatusFlow where entityName='com.yktx.entity.YkUser' order by sortNo");
this.chkHtmlStr="";
if(flowList!=null&&flowList.size()>0)
{
CommUser tmpUser = null;
try
{
tmpUser = (CommUser) (SecurityContextHolder.getContext()
.getAuthentication().getPrincipal());//用於數據權限
}
catch(Exception ex)
{
//用戶超時
logger.info("用戶超時,無法獲得列表權限!");
}
for(int i=0;i<flowList.size();i++)
{
WfStatusFlow flowEnt = (WfStatusFlow)flowList.get(i);
String sTmp = "";
String sAuthCode = flowEnt.getAuthCode();
//如果沒設置按鈕權限,則允許顯示按鈕
if(sAuthCode==null||sAuthCode.trim().length()==0||(sAuthCode!=null&&sAuthCode.trim().length()>0&&tmpUser!=null&&tmpUser.hasAuth(sAuthCode)))
{
//logger.info("sAuthCode:");
//logger.info(sAuthCode);
//sTmp = " <input style=\" color:#000000; font-size:12px; width:61px; height:20px; padding:3px; border:0px;background-image:url("+request.getContextPath()+"/images/bt.gif)\" name=\"\" type=\"button\" value=\""+flowEnt.getBtnTextCn()
//+"\" οnclick=\"doBatchWorkFlow('"+flowEnt.getActionCode()+"','"+flowEnt.getResultStatus()+"','"+flowEnt.getActionName()+"')\"/>\r\n";
sTmp = " <input class=\"button\" name=\"\" type=\"button\" value=\""+flowEnt.getBtnTextCn()
+"\" οnclick=\"doBatchWorkFlow('"+flowEnt.getActionCode()+"','"+flowEnt.getResultStatus()+"','"+flowEnt.getActionName()+"')\"/>\r\n";
}
else
{
//logger.info("other...........");
}
this.chkHtmlStr+=sTmp;
}
}
}
catch(Exception ex)
{
logger.error(ex.toString());
this.addActionError(ex.toString());
}
}
public String doBatchWorkFlow() throws DataAccessException, Exception
{
this.initAction();
IDBSupportService service = (IDBSupportService)ServiceLocator.getBean(this.getDbService());
map = DropdownListBoxUtil.getListMaps(this.getDbService(),this.getEntityClassName(), request);
try
{
if(this.getSelectedIds()!=null&&this.getSelectedIds().length>0)//如果有被選擇記錄
{
//根據不同的流程狀態進行不同的處理,目前只測試發佈生成靜態頁面
//如果批量審批不需要工作流,可直接使用IDBSupportService
IYkUserService flowService = (IYkUserService)ServiceLocator.getBean("IYkUserService");
String sMess = "";
try
{
sMess = flowService.doBatchWorkFlow(this.getActCode(),this.entityClassName, this.getSelectedIds(), this.getDestFlowStatus(),request,this.getNameSpaceActionName());
if(sMess!=null&&sMess.trim().length()>0&&!sMess.equals("操作成功!"))
{
this.addActionError("操作失敗!"); //在頁面顯示錯誤信息!!----增加時間2010-08-12
return "error";
}
}
catch(Exception ex)
{
//this.addActionError(ex.toString());
this.addActionError("操作失敗!");
logger.error("審批流執行異常:"+ex.toString());
return "error";
}
}
else
{
logger.info("沒有被選擇的記錄!");
}
return this.gotoPage();//不跳到首頁,而是跳到當前頁
//return this.firstPage();
}
catch(Exception ex)
{
this.addActionError(ex.toString());
return "error";
}
}
注意上面代碼中的紅色字體:
com.yktx.entity.YkUser 是帶類完整路徑的類名。
IYkUserService 是yk_user表對應的接口,格式是I開頭,類名在中間,Service結尾。
如果是其他實體則按命名規則做相應的代碼修改。
保存後,編譯代碼(運行D:\project\build\01build-core.bat)。重啓tomcat後,再打開演客空間列表頁,見下圖,增加了流程審批按鈕:
上圖中增加了4個審批按鈕,對應4個審批流。可勾選多行記錄批量審批。
四 結語
(1)以後會把簡易審批流的代碼加到代碼生成器中,開發人員不需要再手工複製修改流程相關的代碼。
(2)通過openjweb平臺的簡易流程設置,開發人員不需要花大量精力來編寫簡易審批流程序代碼。
(3)Openjweb簡易審批流可通過權限碼授權的方式進行審批流權限控制。
OpenJWeb基礎平臺全部開源,購買一次性商用授權及法培訓服務請聯繫
QQ:29803446 手機18600510596 王先生