泛微E9节点操作Action之强制收回触发Action

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参数使用方式

  1. 使用自定义接口时,可以进行参数设置,和指定参数值。
  2. 设置后,需在action中实现对应的setter方法,oa会自动将设置的参数值注入
  3. 如果参数值为数据源,则注入的为DataSource对象,参数值为集成中设置的数据源名称
  4. 如参数值不为数据源,则注入的值为设置的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. 注意点1:操作OA数据库中数据,必须使用OA自带的数据库操作类(推荐Recordet、RecordSetTrans),使用其他方式操作数据库,可能会出现数据库缓存读取不到最新数据的情况

  2. 注意点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;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值