美文网首页
NC业务规则和业务事件

NC业务规则和业务事件

作者: 把酒对牛 | 来源:发表于2019-08-07 15:32 被阅读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执行,并且可以通过业务规则处理类的addBeforeRule()addAfterRule()方法直接在代码里添加前后规则。
  • 业务事件
    通过EventDispatcherDelegatefireEvent()进行事件派发。

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

  • 业务规则
    在数据表pub_pluginitem里注册,下面的SQL语句中出现的字段是必须的。
    insert into pub_pluginitem (pk_pluginitem, vmodulename, vcomponentname, vextendpointname, veventtype, vextendtype, vruleclass) values ('主键', '模块名', '组件名', '业务规则扩展点', '扩展事件类型(before、after)', '扩展类型(addAfter、addBefore、replace)', '扩展规则类');
  • 业务事件
    在NC的“业务插件注册”模块里注册,事件源ID为单据对应元数据中的主表ID,事件类型编码需要与代码中EventDispatcherDelegate.fireEvent()的首个参数对应。

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

  • 业务规则
    实现IRuleICompareRule或者IFilterRule接口。
  • 业务事件
    实现IBusinessListener接口,与业务规则能直接获取到VO不同,业务事件能直接获取到的是IBusinessEvent类型的业务事件event,通过event.getEventType()可以获取到事件类型编码。获取编码的意义在于,我们可以将一个业务事件配置到业务插件注册里的不同事件类型下,然后通过代码判断执行不同的逻辑。这样可以让不同事件类型共享同一段代码,避免代码冗余。
    至于VO如何获取,最好是通过debug分析参数IBusinessEvent的实例,因为可能获取到不同的事件类型,获取VO方式也不同,一般来说event.getUserObject()是第一步。

相关文章

  • NC业务规则和业务事件

    在NC二开中,经常要在保证系统核心业务不变的情况下,对系统的业务逻辑进行扩展,这些行为统称为“后端扩展”。对于单据...

  • 《软件需求最佳实践》读书心得 DAY03

    根据作者定义软件需求为:业务知识(包括业务事件、业务实体和业务规则)、问题列表和其他因素(如设计约束和非功能性需求...

  • Drools

    一. Drools规则引擎 Drools就是为了解决业务代码和业务规则分离的引擎。Drools 规则是在 Java...

  • 企业数据标准管理价值总结

    一个数据一般有业务属性、技术属性和管理属性组成,例如:数据项的业务定义、业务规则、质量规则为该数据的业务属性;数据...

  • Golang领域模型-实体

    前言: 实体具有业务属性、业务逻辑和业务行为,是是实实在在的业务对象。在事件风暴中,我们可以根据命令、操作与事件将...

  • 了解Magento的相关知识

    控制器是Magento所有业务逻辑的起点。 业务逻辑是指业务理论中的规则。至于 Magento业务逻辑和域逻辑(数...

  • 领域模型与持久化实现

    领域模型负责表示业务概念、有关业务状况的信息和业务规则。 反映业务状况的状态是通过这个层进行控制和利用的,但有关状...

  • 俱乐部业务规则

    总体目标: 俱乐部玩家上桌消耗钻石。 玩家初始分数仅用来积分,不结算金豆。 玩家消耗的钻石俱乐部群主、开房者和平台...

  • 产品架构深度理解

    什么是产品架构 ? 将具体的业务功能按照一定规则组装成业务模块,将不同业务模块按照一定规则进行划分和归拢,并用图形...

  • drools 入门(一)

    1. 规则引擎介绍 1.1 传统业务编程与声明式编程 (1)传统业务编程 (2) 声明式编程 1.2 业务规则面临...

网友评论

      本文标题:NC业务规则和业务事件

      本文链接:https://www.haomeiwen.com/subject/dyqodctx.html