最近研究了下业务预警的业务开发,我们有两点需求目前平台还支持不了,1、能本月预警下个月到期的数据;2、预警结果可以显示明细、也可以显示汇总,甚至希望能显示时间段内的数据
本文档只是个人总结,还有很多不完善的地方希望和大家沟通,相互学习。
这里以应收单的业务预警为例
1. BOSIDE中新建预警对象
平台没有提供模板,不过供应链做过,我们直接复制供应链的预警对象就好
预警对象中有5个参数
1、 数据源:需要预警的数据来源,可以是单据、基础资料、报表,我这里选择的是应收单
2、 预警方案解析插件:
预警方案建立并启动后,后台服务根据预警周期条件,自动执行预警方案,在此过程中,通过预警服务插件进行灵活干预和控制;可以重写类Kingdee.BOS.Core.Warn.PlugIn. AbstractWarnServicePlugIn来实现干预;
2.1 解析消息变量之前事件
在此事件中,可以自定义需要保存到预警消息的关键数据。一般用于报表预警。以下是示例:
/// <summary>
/// 解析预警消息之前
/// 用途:主要用于报表预警,唯一确定一条报表数据所需要的关键数据是不一定,所有允许自定义
/// </summary>
/// <param name="e"></param>
void BeforeParseWarnMessage(BeforeParseWarnMessageEventArgs e)
{
//添加预警数据关键字段,如以下示例(添加字段名称为FName的关键数据,将保存到预警消息中,以便后续处理使用)
e.KeyValueFieldNames.Add("FName");
base.BeforeParseWarnMessage(e);
}
2. 2. 解析预警条件之后事件
主要用于附加一些额外的过滤条件,适合一些硬编码的条件。以下是示例:
/// <summary>
/// 触发预警条件解析之后的事件
/// 用途:主要用于添加额外的一些过滤条件
/// </summary>
/// <param name="e"></param>
void AfterWarnConditionParse(AfterWarnConditionParseArgs e)
{
//将客户=‘海格科技’的过滤掉
string filter = " FCUSTOMERNAME ='海格科技' ";
if (string.IsNullOrWhiteSpace(e.Filter))
{
e.Filter = filter;
}
else
{
e.Filter = " AND " + filter;
}
base.AfterWarnConditionParse(e);
}
2. 3. 预警执行事件
主要用于修改预警执行结果集合,不建议重写此事件,以下是示例:
/// <summary>
/// 执行预警解析
/// 用途:主要用于修改执行后的数据集合,不建议重写
/// </summary>
void ExcuteWarnParse(ExcuteWarnParseEventArgs e)
{
base.ExcuteWarnParse(e);
//将第一个数据中,客户名称改为 海格科技
//数据源是否为报表
if (this.WarnHelper.IsDataSourceReport)
{
e.WarnMessage.WarnObjectSysReportData.Rows[0]["FName"]="海格科技";
}
else
{
e.WarnMessage.WarnObjectDynamicObjects[0]["FName"] = "海格科技";
}
}
2. 4.消息解析之后事件
主要用于修改格式化后的预警消息,或者进一步使用自定义变量格式化预警消息
/// <summary>
/// 解析预警消息之后
/// 用途:主要用于修改格式化后的预警消息,或者进一步使用自定义变量格式化预警消息
/// </summary>
/// <param name="e"></param>
void AfterParseWarnMessage(AfterParseWarnMessageEventArgs e)
{
base.AfterParseWarnMessage(e);
//将自定义变量{FCUSTOMERNAME.Custom} 格式化为 海格科技
for (int i = 0; i < e.WarnMessage.MessageEntityList.Count; i++)
{
MessageEntity item = e.WarnMessage.MessageEntityList[i].MessageEntity as MessageEntity;
if (item != null)
{
item.Content = item.Content.Replace("{FCUSTOMERNAME.Custom}", "海格科技");
}
}
}
2. 5. 消息发送之前事件
对发送消息进一步精确控制,以下是示例:
/// <summary>
/// 发送预警消息之前
/// 针对消息发送的精确控制
/// </summary>
/// <param name="e"></param>
void BeforeSendWarnMessage(BeforeSendWarnMessageEventArgs e)
{
base.BeforeSendWarnMessage(e);
//当消息发送条数大于100时,取消发送
if (e.WarnMessage.MessageEntityList.Count > 100)
{
e.Cancel = true;
}
}
3、客户端插件重写指导说明
在消息中心,或者首页的预警消息功能下面,可以看到预警消息列表。此列表支持预警消息的查看和处理工作,通过预警方案的消息客户端插件重写,可以自定义处理预警消息和查看消息。
同样可以把自己的插件注册进来
重写类:Kingdee.BOS.Core.Warn.PlugIn. AbstractWarnMessagePlugIn
3.1. 查看消息
弹出指定的查看界面,如果不重写,则弹出统一的消息查看界面,以下是示例:
/// <summary>
/// 显示消息
/// </summary>
public override void ShowWarnMessage(ShowWarnMessageEventArgs e)
{
//根据传过来的关键数据,进行查看
if (e.MsgDataKeyValueList != null && e.MsgDataKeyValueList.Count() > 0)
{
// DoShow 查看逻辑
}
//标识从插件中查看,这样就不会显示公用的查看界面了
e.IsShowByPlugIn = true;
base.ShowWarnMessage(e);
}
3.2. 处理消息
插件根据传递过来的关键数据,进行处理,以下是示例:
/// <summary>
/// 处理消息
/// </summary>
public override void ProcessWarnMessage(ProcessWarnMessageEventArgs e)
{
if (e.MsgDataKeyValueList != null && e.MsgDataKeyValueList.Count() > 0)
{
string message = string.Empty;
message = DoProcess(e.MsgDataKeyValueList);//自定义处理逻辑
//插件中显示了提示消息,公共的提示消息就不显示了
e.Result.IsShowMessage = false;
//标识已被插件处理
e.IsProcessByPlugin = true;
this.ParentView.ShowMessage(message);
}
base.ProcessWarnMessage(e);
}
4、 预警条件窗体:
第一个是平台的模板,我们也可以继承这个模板自定义我们自己需要的预警条件,预警条件是一个单据;
5、 预警方案插件重写指导说明
预警方案维护界面中,对消息的配置支持变量,而变量是根据对应预警对象数据源的元数据构成的。如果开发者需要精简一些无用的变量,则可以通过重写预警方案插件来实现。
重写类:Kingdee.BOS.Core.Warn.PlugIn.AbstractWarnSolutionEditPlugIn
5.1 设置预警条件之前事件
更改预警消息变量来源,适用于精简一些无用的字段变量;
注意,需与下面的设置预警变量之前事件配套使用,否则会出错;
以下是示例:
/// <summary>
/// 预警条件界面,在设置预警条件字段之前
/// </summary>
public override void BeforeSetFilterFields(BeforeSetFilterFieldsEventArgs e)
{
//将字段名为FName的字段移除预警条件字段集合
for (int i = e.FilterFields.Count - 1; i >= 0; i--)
{
JSONObject json = e.FilterFields[i] as JSONObject;
if (json["FieldName"].ToString().ToUpperInvariant() == "FName")
{
e.FilterFields.RemoveAt(i);
}
}
base.BeforeSetFilterFields(e);
}
5.2. 设置预警变量之前事件
精简一些无用的变量,或者添加一些自定义的变量;
如果是精简的变量,需要跟前面的设置预警条件之前事件保持一致;
如果是添加的自定义变量,需要在前面提到过的(2.1.4 消息解析之后事件)事情中进行自定义格式化解析。
以下是示例:
/// <summary>
/// 消息界面,在设置消息变量之前
/// </summary>
public override void BeforeSetVeriableList(BeforeSetVeriableListEventArgs e)
{
//将变量中,字段名为FName的变量移除预警消息变量集合
for (int i = e.Veriablelist.Count - 1; i >= 0; i--)
{
WarnMessageVeriable veriable = e.Veriablelist[i];
if (veriable.FiledName.ToUpperInvariant() == "FName")
{
e.Veriablelist.RemoveAt(i);
}
}
base.BeforeSetVeriableList(e);
}
预警对象建立好后,我们需要用administrator进入我们的系统,然后设置预警方案
预警方案的新增界面,填好编号和名称,选择预警级别,然后选择自己刚刚在BOS里设置的预警对象,选择预警对象好会默认把BOS里配置的预警条件窗体携带到这里的预警条件下,同时会加载消息设置的东西
然后设置预警周期
设置好保存就可以了,
最后设置你的消息提示;
明细表体和明细正文就是我们要设置的明细消息提示、用{}框起来需要提示的字段,这里的字段都是你预警对象数据源里的字段,保存这个预警方案,预警方案就算设置好了,然后启动这个预警方案,就会自动执行,当然你也可以手动执行验证;
执行后到预警执行情况列表里查看就行,同时也会发消息到对应的接收人
推荐阅读