业务预警业务开发总结
金蝶云社区-天冥异
天冥异
15人赞赏了该文章 1558次浏览 未经作者许可,禁止转载编辑于2018年06月14日 10:26:51


最近研究了下业务预警的业务开发,我们有两点需求目前平台还支持不了,1、能本月预警下个月到期的数据;2、预警结果可以显示明细、也可以显示汇总,甚至希望能显示时间段内的数据

本文档只是个人总结,还有很多不完善的地方希望和大家沟通,相互学习。

这里以应收单的业务预警为例

1.       BOSIDE中新建预警对象


平台没有提供模板,不过供应链做过,我们直接复制供应链的预警对象就好

预警对象中有5个参数

1、  数据源:需要预警的数据来源,可以是单据、基础资料、报表,我这里选择的是应收单

image.png

2、  预警方案解析插件:
预警方案建立并启动后,后台服务根据预警周期条件,自动执行预警方案,在此过程中,通过预警服务插件进行灵活干预和控制;可以重写类Kingdee.BOS.Core.Warn.PlugIn. AbstractWarnServicePlugIn来实现干预;

image.png

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、客户端插件重写指导说明
在消息中心,或者首页的预警消息功能下面,可以看到预警消息列表。此列表支持预警消息的查看和处理工作,通过预警方案的消息客户端插件重写,可以自定义处理预警消息和查看消息。

同样可以把自己的插件注册进来

image.png 重写类: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、  预警条件窗体:

image.png

第一个是平台的模板,我们也可以继承这个模板自定义我们自己需要的预警条件,预警条件是一个单据;


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进入我们的系统,然后设置预警方案

image.png

image.png

预警方案的新增界面,填好编号和名称,选择预警级别,然后选择自己刚刚在BOS里设置的预警对象,选择预警对象好会默认把BOS里配置的预警条件窗体携带到这里的预警条件下,同时会加载消息设置的东西

image.png

image.png

 

然后设置预警周期

image.png

设置好保存就可以了,

最后设置你的消息提示;

image.png

明细表体和明细正文就是我们要设置的明细消息提示、用{}框起来需要提示的字段,这里的字段都是你预警对象数据源里的字段,保存这个预警方案,预警方案就算设置好了,然后启动这个预警方案,就会自动执行,当然你也可以手动执行验证;

执行后到预警执行情况列表里查看就行,同时也会发消息到对应的接收人

image.png

 


赞 15