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()
//+"\" onclick=\"doBatchWorkFlow('"+flowEnt.getActionCode()+"','"+flowEnt.getResultStatus()+"','"+flowEnt.getActionName()+"')\"/>\r\n";
sTmp = " <input class=\"button\" name=\"\" type=\"button\" value=\""+flowEnt.getBtnTextCn()
+"\" onclick=\"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 王先生