
为针对不同的业务场景提供定制化的预警功能,平台提供了预警插件机制,使用者可以通过编写插件对预警监控过程进行干预,从而实现使用定制化预警功能。下图为预警平台插件设置入口在新增/编辑业务预警对象页面。

预警平台提供了单据、基础资料的默认消息解析插件DefaultBillMessageCompiler,但是该插件中的模板数据只能来源于指定的单据和基础资料,如若想在消息中添加一些来源于其他单据的数据,可以通过自定义消息解析插件来达到预期的效果。
## 业务场景
某企业需要对商品库存进行低库存的预警,在预警触发后以特定消息格式发送。
## 实现方案
编写消息解析插件,实现IEarlyWarnMessageCompiler接口。框架通过上下文将预警数据、模板传递给接口,用户在接口中获取当前预警的数据,从库存批次表中获取出对应批次的信息,用户构建所需要的预警信息即可。
## 代码示例
```
/**
*在用户信息表中获取用户工号和姓名,同时自定义一个字段,在预警通知中展示对应内容。
*/
public class MessageCompilerDemo implements IEarlyWarnMessageCompiler {
/**
* 构建单个消息
* @param expression 表达式
* @param fields 参数列表
* @param data 数据
* @param context 预警引擎执行上下文
* @return
*/
@Override
public String getSingleMessage(String expression, List<String> fields, DynamicObject data, EarlyWarnContext context) {
if (expression == null || data == null){
return "";
}
Map<String, String> map = new HashMap<>();
for (String field : fields) {
String value = "";
if ("customField".equals(field)){
value = "自定义字段:负责人请抓紧时间处理";
}else {
String[] arr = StringUtil.split(field, ".");
Object objValue = getValue(data, arr);
value = objValue == null?"" : objValue.toString();
}
map.put(field,value);
}
StringTemplateParser parser = new StringTemplateParser();
return parser.parse(expression,name->map.get(name));
}
private String getValue(DynamicObject data, String[] arr) {
if(null == arr || arr.length == 0){
return "";
}
Object obj = data.get(arr[0]);
if(obj instanceof DynamicObject){
return getValue((DynamicObject)obj, Arrays.copyOfRange(arr, 1, arr.length));
}
return StringUtil.toSafeString(obj);
}
/**
* 构建合并消息(同构建单个消息的原理一样)
* @param expression 表达式
* @param fields 参数列表
* @param context 预警引擎执行上下文
* @return
*/
@Override
public String getMergeMessage(String expression, List<String> fields, EarlyWarnContext context) {
return null;
}
/**
* 例子:如果预警数据中包含附件内容,也可以用邮件的方式发送附件
* 构建单条消息邮件发送方式的附件内容
* @param data 数据
* @param context 预警引擎执行上下文
* @return
*/
public MessageAttachment getSingleEmailMessageAttachment(DynamicObject data, EarlyWarnConte