一文掌握预警插件的五种写法

在上一篇文章里,我们一起了解了预警平台的基本用法(上一篇:一看就会的预警平台基本用法),学完这些,我们已经能够快速上手去使用简单单据预警功能。但是在实际的业务场景中,由于业务逻辑的复杂性,简单的预警功能往往满足不了实际的业务需求。
为针对不同的业务场景提供定制化的预警功能,平台提供了预警插件机制,使用者可以通过编写插件对预警监控过程进行干预,从而实现使用定制化预警功能。下图为预警平台插件设置入口在新增/编辑业务预警对象页面。

平台目前提供了五种插件类型:
①自定义数据源
②自定义数据写出
③自定义消息解析
④自定义消息处理
⑤自定义消息接收人
Tips:预警平台插件为单插件机制,即如果同一类型的插件配置开启了多个插件,那么预警平台在执行预警方案的时候只有最后一个开启的插件会执行。
下面小编将结合具体的业务场景来介绍这五种插件的基本使用。
需求场景:某企业需要对商品库存进行低库存预警并有以下预警需求:
1、在扫描出低库存的商品数据时,需将这些预警数据储存在数据库中,用来跟踪处理情况。
2、若存在一段时间仍未处理的低库存商品时,触发预警。
3、预警触发后以特定消息格式通知相应的库管。
4、通知消息根据实际情况生成,同时在消息中为库管提供快速处理链接。
需求分析:
对于需求1,可以通过数据写出插件实现;
对于需求2,可以通过自定义数据源插件实现;
对于需求3,可以通过消息解析插件和自定义消息接收人插件来实现;
对于需求4,可以通过消息处理插件来实现。
下面进入”干货”阶段,小编会附上代码以供参考。
1 自定义数据写出
预警平台依据监控方案对预警数据扫描后出于性能与存储的考虑,并未将需要预警的数据写出到数据库。
此场景中,如果我们想要在扫描出低库存的商品数据后将这些预警数据存储下来用来处理后续预警事项,这个时候就可以使用自定义数据写出插件。
使用自定义数据写出插件步骤为:
1.编写数据写出插件,实现IEarlyWarnWriteOut接口,框架通过上下文将预警数据传递给接口。接着只需在接口中把相关数据写出到自己想要的数据库或文件中即可。
下面是在扫描出低库存预警数据后,将商品信息存入商品预警处理状态表(stock_status_demo单据标识)中的实现:
public class WriteOutDemo implements IEarlyWarnWriteOut {
@Override
public void writeOut(DynamicObjectCollection date, EarlyWarnContext earlyWarnContext) {
if (date.isEmpty()){
return;
}
DynamicObject[] saveDate = new DynamicObject[date.size()];
for (int i = 0; i < date.size(); i++) {
DynamicObject object = date.get(i);
DynamicObject newObject = BusinessDataServiceHelper.newDynamicObject("stock_status_demo");
newObject.set("billno", "status000"+i);
newObject.set("billstatus","A");
newObject.set("name",object.get("name"));
newObject.set("number1",""+object.get("number"));
newObject.set("status1", "0");
newObject.set("operator","IERP");
newObject.set("operatorid",(long)13466739);
saveDate[i] = newObject;
}
MainEntityType entityType = EntityMetadataCache.getDataEntityType("stock_status_demo");
BusinessDataWriter.save(entityType,saveDate);
}
}2.将插件注册到业务预警对象中。

3.新建预警监控方案,引用新建的库存预警业务预警对象。
4.在预警监控方案被触发执行成功之后,预警引擎会将相关数据写出到单据stock_status_demo中。

2 自定义数据源
上一个步骤把长时间未处理的低库存商品写出后,接下来我们需通知到相应的库管。
在这里,我们要先找出未处理(status=0)的商品,商品处理状态信息存储在stock_status_demo单据中。我们还需要通过工号关联用户信息表stock_user,根据用户id把处理通知发送给对应的库管。
在这个场景中,我们需要处理多个数据源,此时就要用到自定义数据源插件来处理多数据源协同预警的场景。自定义数据源拥有完整的功能,可以控制到整个预警数据取数过程。
使用自定义数据步骤为:
1.编辑自定义数据源插件,可以继承至系统提供的默认单据数据源DefaultEarlyWarnBillDataSource或实现自定义数据源接口IEarlyWarnDataSource。该场景下的自定义数据源实现如下:
public class DataSourceDemo implements IEarlyWarnDataSource {
@Override
public List<QFilter> buildFilter(String dataSource, FilterCondition filterCondition, EarlyWarnContext context) {
return null;
}
@Override
public DynamicObjectCollection getData(String dataSource, List<QFilter> filters, EarlyWarnContext context) {
QFilter[] statusFilters = new QFilter[]{new QFilter("status1","=","0")};
DynamicObjectCollection goods = ORM.create().query("stock_status_demo", statusFilters);
if (goods == null || goods.isEmpty()){
return new DynamicObjectCollection();
}
List<Long> idList = new ArrayList<>();
for (DynamicObject good : goods) {
idList.add(good.getLong("operatorid"));
}
if (idList.isEmpty()){
return new DynamicObjectCollection();
}
QFilter[] operatorFilters = new QFilter[]{new QFilter("number","in",idList)};
return ORM.create().query("stock_user",operatorFilters);
}
@Override
public List<Map<String, Object>> getCommonFilterColumns(String dataSource) {
return null;
}
@Override
public TreeNode getSingleMessageFieldTree(String dataSource) {
return new TreeNode();
}
@Override
public TreeNode getMergeMessageFieldTree(String dataSource) {
return new TreeNode();
}
}由于后续的预警监控方案中的默认监控条件和消息模板设置页面与数据源有关,因此接下来需要配合自定义消息解析插件使用。
3 自定义消息解析
在自定义数据源插件中获取到预警数据后,框架通过上下文将预警数据、模板传递给消息解析接口,可以从接口中获取当前的预警数据。在用户信息表中获取用户工号和姓名,同时自定义一个字段,在预警通知中展示对应内容。
使用自定义消息解析插件步骤为:
1.编写消息解析插件,实现IEarlyWarnMessageCompiler接口。具体实现如下:
public class MessageCompilerDemo implements IEarlyWarnMessageCompiler {
@Override
public String getSingleMessage(String expression, List<String> fields, DynamicObject data, EarlyWarnContext context) {
if (expression == null || data == null){
return "";
一文掌握预警插件的五种写法
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



