跳转到内容

概述

为了解决软件二开的问题,Trantor 抽象了一套模型、视图、逻辑流程,用于三者间流畅交互,同时也提升了业务实现的效率。其中逻辑部分抽象了逻辑函数(Function)扩展点(Extension)逻辑流(LogicFlow)三个概念。

  1. 逻辑函数为最小的业务单位,用于提供某个具体的业务逻辑。多个逻辑函数通过逻辑流串起来,完成一个具体的业务场景。
  2. 扩展点与逻辑函数类似,不同的是扩展点主要用于业务逻辑中可预知需要扩展的场景,可预先埋入一个扩展点,提供一个默认实现,比如电商中的运费计算,不同的快递公司计费规则有所差异。
  3. 逻辑流是可以可视化编排的自动执行的流程,被编排的内容包括一些内置节点(条件判断、循环等控制节点和访问 DataStore 等功能性节点)和上文提到的逻辑函数。

逻辑函数(Function)

  1. 逻辑函数也可称为可编排服务。逻辑函数通常为一个最小的独立业务单位,主要作用是供逻辑流进行编排来灵活实现某个场景的业务逻辑。
  2. 在简单场景下也可以不交给逻辑流编排,而是直接调用来完成业务逻辑。
  3. 逻辑函数有在线配置声明和实现两部分,与 Trantor 的许多其他资源一样,可在定制开发时替换掉制品项目中已提供的实现资源,改变现有的业务逻辑。
  4. 新增模型时系统会生成默认 CRUD 的逻辑函数(详见:内建Function),如果不满足需求,可自己单独声明。

在线配置声明

进入 制品中心->配置->业务域->逻辑函数,新增逻辑函数:

image.png

用户可以在先配置编排服务后,通过部署到Maven仓库,并依赖到自己的工程里。

Trantor会按照配置生成一个 Java Interface,如下所示,接口使用 @Function 注解标明,方法名为 execute

@Function(name = "创建线索函数")
public interface CreateClueFunc {
ClueBO execute(ClueBO clue);
}

实现

  • 逻辑函数实现是对上述已声明的 interface 的一个实现类,即 java class
  • 逻辑函数的实现 需要使用 @FunctionImpl 注解,并可以对该实现类进行描述
  • 该实现类需要实现逻辑函数声明中的 execute 方法
  • 逻辑函数实现应位于 xxx-impl 模块工程
@FunctionImpl(name = "创建线索函数")
public class CreateClueFuncImpl implements CreateClueFunc {
@Override
public ClueBO execute(@Valid ClueBO clue) {
clue.setCreatedBy(TContext.getCurrentUser());
IntResult intResult = DS.create(clue);
clue.setId(intResult.getValue().longValue());
return clue;
}
}

视图调用

创建员工时,可通过视图中 Action 标签的 logicFunction 属性指定提交表单时执行的 functionKey,functionKey 由 <moduleKey>_<interfaceName> 组成,视图如下:

<View title="线索" forModel="gaia_sfa_ClueBO" type="Form" version="2">
<Form key="clueform" model="gaia_sfa_ClueBO" dataCondition="id = ?" dataParams="[pageContext.record.id]">
<Fields>
<Field name="name"/>
<Field name="status"/>
<Field name="customer"/>
</Fields>
<Actions>
<Action type="Submit" show="#{!this.data.id}" logicFunction="gaia_sfa_CreateClueFunc" after="GoBack" layout="Footer"/>
<Action type="Submit" show="#{!!this.data.id}" logicFunction="gaia_sfa_UpdateClueFunc" after="GoBack" layout="Footer"/>
</Actions>
</Form>
</View>

其中 Form 是 Trantor 提供的一种 数据容器,容器 key 为 clueform表示页面内的数据容器唯一属性, 可根据此 key 引用数据容器对象

运行展示

进入交互控制台,添加模块后,配置完菜单,走发布计划发布后,在统一工作台访问,添加数据,如下图所示:

image.png

在线配置扩展点(Extension Point)

  1. 扩展点往往被用于我们认为在后续定制开发中会继续扩展的一些功能点,并在开发时留下一段精简的代码逻辑,以便于定制开发团队根据具体的业务场景进行快速的扩展和实现,替换为自己的定制场景中所需要的具体业务逻辑。
  2. 在使用习惯上,扩展点也分为在线配置声明和实现两部分,在线配置一个扩展点,并可以对该扩展点进行不同的实现,扩展点同声明的不同实现可在定制开发时进行替换。
  3. 扩展点的常用场景如:价格计算、运费计算、发货状态检查。这些场景都是一些常见的功能模块,但是由于领域不同,或者客户需求不同会有不一样的定制实现,所以适合使用扩展点。

在线配置声明

进入 制品中心->配置->业务域->扩展点,新增扩展点:

用户可以在配置扩展点后,通过部署到Maven仓库,并依赖到自己的工程里。

Trantor会按照配置生成一个 Java Interface,如下所示,接口使用 @Extension 注解标明,方法名固定为 execute

@Extension(name = "ClueBO Extension")
public interface ClueExt {
void execute(ClueBO clue);
}

实现

  • 扩展点的实现是对上述已声明的 interface 的一个实现类,即 java class
  • 扩展点的实现 需要使用 @ExtensionImpl 注解,并可以对该实现类进行描述
  • 该实现类需要实现扩展点声明中的 execute 方法
  • 扩展点的实现应位于 xxx-impl 模块工程

具体代码如下,execute 方法中打印了一行日志,代表同步第三方的动作:

@ExtensionImpl(name = "ClueBO extensionImpl")
public class ClueExtImpl implements ClueExt {
@Override
public void execute(ClueBO clue) {
log.info("execute ClueExtImpl");
}
}

逻辑流(Logic Flow)

逻辑流是一种可以可视化编排的、自动执行的流程,被编排的内容包括可编排服务与逻辑流等,逻辑流只在页面配置即可。

在线编排逻辑流

新增逻辑流

进入 制品中心->配置->业务域->逻辑流,新增逻辑流:

image.png

逻辑流编排

展开需要编排的逻辑流,点击编排,进入编排页面。

新增服务调用function节点

image.png

配置服务调用function节点

见:逻辑流(LogicFlow)

服务调用节点
逻辑处理节点&数据处理节点

视图调用

创建员工时,可通过 Action 标签的 logicFlow 属性指定提交表单时执行的 logicFlow 的 Key,logicFlow 的 Key 由 <moduleKey>_<interfaceName> 组成。视图如下:

<View title="报价单" forModel="gaia_sfa_PricingBO" type="List" menuView="true" version="2">
<Table key="table" model="gaia_sfa_PricingBO" dataCondition="">
<Search>
<Fields>
<Field name="amount"/>
<Field name="name"/>
<Field name="status"/>
</Fields>
</Search>
<RecordActions label="操作">
<Action label="详情" targetView="gaia_sfa_PricingBO__Detail__builtIn"/>
<Action label="编辑" targetView="gaia_sfa_PricingBO_pricingForm"/>
<Action label="删除" logicFunction="gaia_sfa_DeletePricingBOBuiltInFunc" after="Refresh"/>
<Action type="Submit" label="确认" after="Refresh" show="#{this.record.status!='confirmed'}" logicFlow="gaia_sfa_PricingConfirmFlow"/>
</RecordActions>
<Fields>
<Field name="amount"/>
<Field name="name"/>
<Field name="status"/>
</Fields>
</Table>
</View>

运行展示

总结

Trantor 在业务编写逻辑部分抽象了逻辑函数 Logic Function、扩展点 Extension Point 和逻辑流 Logic Flow 三部分,组成一套业务数据和业务逻辑的处理方式。