预警平台进阶场景介绍
1 简介
1.1 功能介绍
了解了预警平台的基本用法之后,我们已经能够快速上手去使用简单单据预警功能。但是在实际的业务场景中,由于业务逻辑的复杂性,简单的预警功能往往满足不了实际的业务需求。为针对不同的业务场景提供定制化的预警功能,平台提供了预警插件机制,使用者可以通过编写插件对预警监控过程进行干预,从而实现使用定制化预警功能。
预警平台插件设置入口在新增/编辑业务预警对象页面。平台目前提供了五种插件类型:
自定义数据源
自定义数据写出
自定义消息解析
自定义消息处理
自定义消息接收人
tips:预警平台插件为单插件机制,即如果同一类型的插件配置开启了多个插件,那么预警平台在执行预警方案的时候只有最后一个开启的插件会执行。
1.2 应用场景
在系统提供的功能无法满足实际业务的需求时,平台提供了预警插件机制对预警监控过程进行功能的增强或干预,使用者可以通过按需编写的方式对预警功能进行组合使用。
1.3 系统路径
苍穹版本V5.0及以下:【系统服务云】→【配置工具】
苍穹版本V6.0:【基础服务云】→【公共设置】→【预警平台】→【业务预警对象】→新增/打开业务预警对象
插件类型包括:数据源插件、数据写出插件、消息解析插件、消息处理插件、自定义消息接收人插件
2 主要操作
下面我将结合具体的业务场景来介绍着五种插件的基本使用。
2.1 需求场景
某企业需要对商品库存进行低库存预警并有以下预警需求:
在扫描出低库存的商品数据时,需将这些预警数据储存在数据库中,用来跟踪处理情况。
若存在一段时间仍未处理的低库存商品时,触发预警。
预警触发后以特定消息格式通知相应的库管。
通知消息根据实际情况生成,同时在消息中为库管提供快速处理链接。
需求分析:对于需求点1,可以通过数据写出插件实现;对于需求点2,可以通过自定义数据源插件实现;对于需求点3,可以通过消息解析插件和自定义消息接收人插件来实现;对于需求点四可以通过消息处理插件来实现。
2.2 基本使用示例
下面进入”干货”阶段,我们会附上代码以供参考。
自定义数据写出
预警平台依据监控方案对预警数据扫描后出于性能与存储的考虑,并未将需要预警的数据写出到数据库。此场景中我们想要在扫描出低库存的商品数据后,将这些预警数据存储下来用来处理后续预警事项,这个时候就可以使用自定义数据写出插件。
使用自定义数据写出插件步骤为:
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中。
自定义数据源
上一个步骤把长时间未处理的低库存商品写出后,接下来我们需通知到相应的库管。在这里,我们要先找出未处理(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(); } }
由于后续的预警监控方案中的默认监控条件和消息模板设置页面与数据源有关,因此接下来需要配合自定义消息解析插件使用。
自定义消息解析
在自定义数据源插件中获取到预警数据后,框架通过上下文将预警数据、模板传递给消息解析接口,从可以接口中获取当前的预警数据。在用户信息表中获取用户工号和姓名,同时自定义一个字段,在预警通知中展示对应内容。
使用自定义消息解析插件步骤为:
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 ""; } 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); } @Override public String getMergeMessage(String expression, List<String> fields, EarlyWarnContext context) { return null; } }
2. 将自定义数据源插件和自定义消息解析插件,同时注册到库存通知处理业务预警对象中。
3. 新建预警监控方案,预警对象字段选择【库存通知处理】业务预警对象。
4. 在预警监控方案执行成功之后,可以在消息中心查看到预警信息。
自定义消息接收人
在获取到自定义消息之后,需要将消息发送给对应的库管进行处理。此时我们需要自定义消息接收人,通过自定义消息接收人插件,从传递过来的预警数据中获取到用户id,根据用户id给相应的库管发送处理消息。需要注意的是:实现自定义消息接收人接口返回的消息接收人ID必须在苍穹系统中存在。
使用自定义消息接收人插件步骤:
1. 编写插件,实现IEarlyWarnCustomReceiver接口。具体实现如下:
public class CustomReceiverDemo implements IEarlyWarnCustomReceiver { @Override public List<Long> getReceiverIds(EarlyWarnContext earlyWarnContext, DynamicObject[] dynamicObjects) { List<Long> receiverIds = new ArrayList<>(); for (DynamicObject object : dynamicObjects) { receiverIds.add(object.getLong("number")); } return receiverIds; } }
2. 注册插件,打开库存通知处理业务预警对象,点击自定义消息接收人插件,打开插件注册界面,注册该插件。
3.在预警监控方案中选择接收人为自定义接收人,并选择已注册的自定义消息接收人插件。
自定义消息处理
通知消息发送到对应的库管之后,需要给库管提供快速处理的链接。此时可以使用自定义消息处理插件,通过基于URL的跳转实现方式,将所需参数携带至相关处理的页面。
使用自定义消息处理插件步骤:
1. 编写消息处理插件,实现IEarlyWarnMessageHandler接口,在接口中可以通过上下文获取到相关的数据,可以构建相应的URL。具体实现如下:
public class EarlyWarnMessageHandlerDemo implements IEarlyWarnMessageHandler { @Override public EarlyWarnMessageInfo singleMessageBuilder(DynamicObject dynamicObject, EarlyWarnContext earlyWarnContext) { EarlyWarnMessageInfo info = new EarlyWarnMessageInfo(); info.setContentUrl("http://localhost:8080/ierp/?formId=pc_main_console#/dform?formId=pc_main_console"); return info; } @Override public EarlyWarnMessageInfo mergeMessageBuilder(EarlyWarnContext earlyWarnContext) { return null; } }
2. 注册消息处理插件,将插件注册到库存通知处理业务预警对象中。
3. 在库存处理通知预警监控方案中引用库存通知处理业务预警对象,保存并执行预警监控方案。
到这里,我们实现了完整【商品低库存预警】的个性化预警。相信大家通过这个按理对预警平台的有了更深的了解和体验。
限于篇幅,对于插件接口的具体使用方式,详细资料请移步金蝶云苍穹生态网站。链接奉上,请戳这里:https://demo.kdcloud.com/devdoc/?nav=corelib#/earlyWarn/04API
预警平台进阶场景介绍
本文2024-09-23 00:37:32发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-140675.html