NC业务规则和业务事件

2019-08-07  本文已影响0人  把酒对牛

在NC二开中,经常要在保证系统核心业务不变的情况下,对系统的业务逻辑进行扩展,这些行为统称为“后端扩展”。
对于单据而言,“业务规则扩展”和“业务事件扩展”是两种最常见的扩展方式。这两种方式并不冲突,可以同时使用,下面我们就来一步一步探索这两种方式。
我们知道所有的单据都会走单据动作脚本N_XX,一般来说,动作脚本会调用相应Service的增删改查方法,方法里会调用诸如InsertAction之类的动作。一些单据没有自己的action,会调用使用泛型编程的公共action,我们就以其中一个为例来分析,先看代码:

public class InsertAction<T extends IBill> {
    // ...
    public T[] processAction(T[] billVOs) {
        // 业务规则处理类
        AroundProcesser<T> processor = new AroundProcesser<T>(this.point);
        // 添加业务规则
        addInnerRule(processor);
        // 派发动作前业务事件
        fireBeforeBusinessEvent(billVOs);
        // 执行动作前业务规则
        billVOs = processor.before(billVOs);
        // 由于支持FilterRule,所以返回的billVOs可能是null
        if (billVOs == null || billVOs.length == 0) {
            return null;
        }
        // 新增保存
        T[] resultVOs = this.insert(billVOs);
        // 执行动作后业务规则
        resultVOs = processor.after(resultVOs);
        return resultVOs;
    }
    /**
    * 添加业务规则
    */
    protected void addInnerRule(AroundProcesser<T> processor) {
        for (IRule<T> rule : beforeRule) {
            processor.addBeforeRule(rule);
        }
        for (IFilterRule<T> rule : beforeFilterRule) {
            processor.addBeforeRule(rule);
        }
        for (IRule<T> rule : afterRule) {
            processor.addAfterRule(rule);
        }
        for (IFilterRule<T> rule : afterFilterRule) {
            processor.addAfterRule(rule);
        }
    }
    /**
    * 动作前业务事件
    */
    protected void fireBeforeBusinessEvent(T[] billVOs) {
        try {
            EventDispatcherDelegate.fireEvent(IPMEventType.TYPE_INSERT_BEFORE, billVOs);
        } catch (BusinessException e) {
            ExceptionUtils.wrappException(e);
        }
    }

    /**
    * 动作后业务事件
    */
    protected void fireAfterBusinessEvent(T[] billVOs) {
        try {
            EventDispatcherDelegate.fireEvent(IPMEventType.TYPE_INSERT_AFTER, billVOs);
        } catch (BusinessException e) {
            ExceptionUtils.wrappException(e);
        }
    }
    // ...
}

其实说到底,所谓的“业务规则”和“业务事件”,不过是在代码里预留位置执行的一段逻辑。通过分析上面的代码,我们可以发现他们是如何被触发的:

“后端扩展”要保证系统核心业务不变,理论上来说在代码里直接为AroundProcesser等业务规则处理类的add方法添加业务规则是不规范的,因为他还是改动了源码。但是在实际的二开中,如果能获取源码的话,改源码是最方便快捷的方式,下面我们来说说标准的扩展方式:

讲了业务规则和业务事件的使用方式,最后来看他们自身的代码实现:

上一篇 下一篇

猜你喜欢

热点阅读