1、节点附加操作执行顺序
保存表单数据–>节点后附加操作–>生成编号–>出口附加规则–>节点前附加操作–>插入操作者和签字意见
注:流程存为文档(workflowToDoc)接口特殊处理,作为流程提交的最后一个action执行
2、如何编写一个action
编写一个JAVA类,实现weaver/interfaces/workflow/action/Action.java接口
package weaver.interfaces.workflow.action;
import weaver.soa.workflow.request.RequestInfo;
public interface Action {
public static final String SUCCESS="1";
/**
* 失败信息,返回此信息,如果是节点前附加操作,将会阻止流程提交
*/
public static final String FAILURE_AND_CONTINUE = "0";
public String execute(RequestInfo request);
}
import weaver.general.BaseBean;
import weaver.interfaces.workflow.action.Action;
import weaver.soa.workflow.request.RequestInfo;
// 实现改 Action 接口,BaseBean可以选择不继承,但是继承之后可以适用于相关的方法
public class BaseActionDemo extends BaseBean implements Action {
@Override
public String execute(RequestInfo request) {
/**********执行action的业务逻辑************/
new BaseBean().writeLog("我是action,我正在执行");
return SUCCESS;//成功标识,继续流程提交或执行下一个附加操作
//return FAILURE_AND_CONTINUE;//失败标识,阻断流程提交
}
}
3、action参数使用方式
- 使用自定义接口时,可以进行参数设置,和指定参数值。
- 设置后,需在action中实现对应的setter方法,oa会自动将设置的参数值注入
- 如果参数值为数据源,则注入的为DataSource对象,参数值为集成中设置的数据源名称
- 如参数值不为数据源,则注入的值为设置的String对象
public class TestMsgAction implements Action {
//当参数值不为数据源,则注入的值为设置的String对象
private String name= "";
//当设置参数值为数据源,则注入的为DataSource对象
private DataSource hRDataSource= null;
//实现对应的stter方法
public void setName(String name) {
this.name= name;
}
//实现对应的stter方法
public void setHRDataSource(DataSource hRDataSource) {
this.HRDataSource= hRDataSource;
}
@Override
public String execute(RequestInfo request) {
return SUCCESS;
}
}
4、Action的作用
1、获取流程相关信息(requestid、workflowid、formid、isbill、表单信息等);
2、执行sql语句,查询或更新OA系统中的数据;
3、返回失败标识和提示信息,阻断前台流程提交,并显示提示信息;
4、强制收回触发action回滚
5、调用第三方系统的接口
6、实现自定义操作者
public String execute(RequestInfo info) {
//获取工作流id
String workflowId = info.getWorkflowid();
//获取流程id
String requestid = info.getRequestid();
//获取RequestManager对象
RequestManager RequestManager = info.getRequestManager();
//获取当前节点id
int currentnodeid = RequestManager.getNodeid();
//下一个节点id
int nextnodeid = RequestManager.getNextNodeid();
//获取流程表单id
int formid = RequestManager.getFormid();
//是否为单据
int isbill = RequestManager.getIsbill();
//获取数据库主表名
String tableName = isbill == 1 ? "workflow_form" : RequestManager.getBillTableName();
/*************1.不带事务执行SQL开始***************/
RecordSet rs = new RecordSet();
//执行查询语句,查询数据
rs.executeQuery("select name from formtable_main_45 where requestid = ?", requestid);
if(rs.next()){
String nameValue = rs.getString("name");
new BaseBean().writeLog("name 的值是 :" + nameValue );
}
//执行update语句,更新数据
rs.executeUpdate("update formtable_main_45 set name = ? where requestid = ?", "nameValue", requestid);
/*************1.不带事务执行SQL结束***************/
/*************2.带事务执行SQL开始***************/
RecordSetTrans rst = new RecordSetTrans();
rst.setAutoCommit(false);
try {
rst.executeUpdate("update formtable_main_45 set name= ? where requestid = ?", "nameValue", requestid);
rst.executeUpdate("update formtable_main_45 set name = ? where requestid = ?", "nameValue_test", requestid);
//手动提交事务
rst.commit();
} catch (Exception e) {
//执行失败,回滚数据
rst.rollback();
e.printStackTrace();
}
/*************2.带事务执行SQL结束***************/
/*************3.查询或操作流程流转相关表开始***************/
/*************此处需注意不要将RecordSetTrans对象的事务提交掉***************/
RecordSetTrans requestRst = info.getRequestManager().getRsTrans();
try {
requestRst.executeQuery("select status from workflow_requestbase where requestid = ?", requestid);
if (requestRst.next()) {
String statusValue = rs.getString("status");
new BaseBean().writeLog("statusValue 的值是 :" + statusValue);
}
} catch (Exception e) {
e.printStackTrace();
}
return Action.SUCCESS;
}
-
注意点1:操作OA数据库中数据,必须使用OA自带的数据库操作类(推荐Recordet、RecordSetTrans),使用其他方式操作数据库,可能会出现数据库缓存读取不到最新数据的情况
-
注意点2:使用requestInfo.getRequestManager().getRsTrans()获取到的RecordSetTrans对象,不要手动提交或者回滚数据,会导致流程提交错误。
5、强制收回到指定节点触发业务逻辑回滚
在系统中,可能经常遇到流程创建节点提交后需要锁定状态,流程退回创建节点时需要是否锁定状态,这种清空下我可以按照如下方式操作:
public String execute(RequestInfo requestInfo) {
writeLog("LeaveRejectOrDrawBackAction正在执行对应操作requestid:"+requestInfo.getRequestid());
//获取⼯作流id
String workflowId = requestInfo.getWorkflowid();
//获取流程id
String requestid = requestInfo.getRequestid();
//获取RequestManager对象
RequestManager RequestManager = requestInfo.getRequestManager();
//获取当前节点id
int currentnodeid = RequestManager.getNodeid();
//下⼀个节点id
int nextnodeid = RequestManager.getNextNodeid();
//判断提交类型 第一次提交 “” 不为第一次: “1” 该字段值可以做一些只需第一次提交的业务逻辑更新的需求
String isFirstSubmit = RequestManager.getIsFirstSubmit();
//当前操作类型 submit:提交 / reject:退回 /drawBack:强制收回
String src = requestInfo.getRequestManager().getSrc();
//方式一,指定退回创建节点时执行业务逻辑操作
writeLog("workflowId:"+workflowId+",currentnodeid:"+currentnodeid+",nextnodeid:"+nextnodeid+",isFirstSubmit:"+isFirstSubmit+",src:"+src);
try {
//判断是否为退回或者强制收回
if (nextnodeid != 0 && StringUtils.isNotEmpty(src) && ("reject".equals(src) || "drawBack".equals(src))) {
//判断是否为退回或者强制收回 创建节点
String sql = "select * from workflow_nodebase where isstart =1 and id=?";
RecordSet rs = new RecordSet();
rs.executeQuery(sql, nextnodeid);
if (rs.next()) {
//执行对应的业务逻辑
...
}
}
//方式二,退回指定节点时执行业务逻辑操作
//判断节点强制收回到指定节点,则回滚数据,
if (request.getRequestManager().getNodeid() == 123) {
//执行对应的业务逻辑
...
}
return Action.SUCCESS;
}catch (Exception e) {
writeLog("error:"+e.getMessage());
requestInfo.getRequestManager().setMessageid("90001");
requestInfo.getRequestManager().setMessagecontent("系统异常,请刷新后重试!如果无法解决,请联系系统管理员!"+e.getMessage());
return Action.FAILURE_AND_CONTINUE;
}
}