自定义右下角弹窗多场景运用实例
场景需求:
金蝶云星空系统右下角弹窗有3个场景举例:
1、指定在线用户通知类即时弹窗:在某个功能操作后,给指定用户发送即时类消息弹窗,该消息不会存储,只要用户在线则会收到,不在线用户则无效
2、用户普通通知消息弹窗:在某个功能操作后,不即时弹窗,指定用户将通知消息数据储存起来,设置消息失效时间,待用户登录后,以及心跳事件时读取数据并弹窗
3、给自己即时弹窗(多样化):在某个功能操作后,根据需求自定义组合内容,给自己弹窗
以下根据给出的插件案例依次介绍
一、指定在线用户通知类即时弹窗
描述:该类型弹窗不会储存数据,按照环境的运行状态,主动把消息发送给在线用户
样例:(c#)
protected JObject CreateMessageObject(string strTitle, string strContent) { JObject data = new JObject(); data["height"] = 150; data["width"] = 330; JArray items = new JArray(); data["items"] = items; JObject item = new JObject(); item["title"] = strTitle; item["content"] = strContent; item["stackbroad"] = true; item["stackbroadmillss"] = 2000;//单位毫秒 items.Add(item); return data; }
上面方法可直接复制使用,然后在插件中,需要发送的地方,调用平台提供方法
this.View.BroadcastToOnlineUser(this.CreateMessageObject("会议通知","你的会议时间还差15分钟,请准备及时参加"),new List<long>() { 接受消息用户ID(多个用户逗号)) });
二、用户普通通知消息弹窗
描述:该场景当前方案是借用系统自带的广播消息功能,将数据插入广播消息表(T_BAS_BROADCASTMSG)中,在系统用户登录后,以及正常心跳事件,都会根据消息的失效时间获取并且弹出
样式:(c#)
public override void ButtonClick(ButtonClickEventArgs e) { base.ButtonClick(e); if (e.Key.EqualsIgnoreCase("FSendMsgTest")) { var meta = FormMetaDataCache.GetCachedFormMetaData(this.View.Context, "BAS_BROADCASTMSG");//广播消息 var dataObj = new DynamicObject(meta.BusinessInfo.GetDynamicObjectType()); dataObj["FCREATEDATE"] = DateTime.Now; dataObj["FTITLE"] = new LocaleValue("消息标题"); dataObj["FCONTENT"] =new LocaleValue("消息内容测试"); dataObj["FCreatorId_Id"] = this.View.Context.UserId; dataObj["FSendType"] = 1; dataObj["FIsSendBroadcast"] = true; dataObj["FFailureTime"] = DateTime.Now.AddHours(0.5);//预计半小时后失效,预计该消息什么时候失效 //如果是指定用户,则需要设置指定用户数据,如全部所有用户,则不需要下面逻辑 //====== long[] senduserid = new long[] { 100063 }; DynamicObjectCollection revier = dataObj["FReceiver"] as DynamicObjectCollection; if (revier != null) { foreach (long userid in senduserid) { DynamicObject robj = new DynamicObject(revier.DynamicCollectionItemPropertyType); robj["FReceiver_Id"] = userid; revier.Add(robj); } } //====== BusinessDataServiceHelper.Save(this.View.Context, dataObj); } }
说明:上面案例中:
1、FFailureTime字段是指消息的失效时间,该值越短越好,目前系统该广播消息,是没有已读,未读设计,也没有弹出次数的记录设计,这个是通知消息,根据这个失效时间大于当前系统时间,满足条件者始终都会弹出来,也即一个消息会不停的重复弹出,直到失效过了失效时间为止
2、据上第1点的描述,如果想弹出一次,后面不弹,或者有已读未读,或者用户想看到已读的消息等等,就不能用此方案,建议可以研究借用工作流信息中心功能的普通消息功能,但是这种方式的消息不能右下角弹出
三、给自己即时弹窗(多样化)
描述:该弹窗是程序中,调用封装的弹窗接口,将信息实时弹窗出来,弹出的支持不同场景和运用
1、普通通知消息弹窗,样例(c#)
public override void ButtonClick(ButtonClickEventArgs e) { base.ButtonClick(e); if (e.Key.EqualsIgnoreCase("FShowNormlMsg")) { string msg = string.Format("客户编号{0}的订单{1}审核流程已经提交成功,请及时联系{2},催促审核!", "00001", "DD000001", "0755-12345678"); Kingdee.BOS.DataEntity.LowerRightPopMsgEntity popmsg = new DataEntity.LowerRightPopMsgEntity(); popmsg.Title = string.Format("订单{0}发送提醒", "DD000001"); popmsg.Content = msg; popmsg.LinkContent = ""; popmsg.StackBroadMillss = 2000; popmsg.ID = this.View.UserParameterKey + "_ShowNormlMsg"; ViewCommonAction.LowerRightPopMsssage(this.View, new List<DataEntity.LowerRightPopMsgEntity>() { popmsg }); } }
2、带链接交互弹窗,样例(c#)
public override void ButtonClick(ButtonClickEventArgs e) { base.ButtonClick(e); if (e.Key.EqualsIgnoreCase("FShowCallLinkMsg")) { LowerRightPopMsgEntity popmsg = new DataEntity.LowerRightPopMsgEntity(); popmsg.ID = this.View.UserParameterKey + "_ShowCallLinkMsg"; popmsg.Title = "带链接弹窗消息"; popmsg.Content = string.Format("带链接弹窗消息,您的订单{0}已经发送成功,可点击查看详情,查看更多该订单详细内容", "DD000001"); popmsg.LinkContent = "查看详情"; popmsg.FireLinkEvent = true; popmsg.StackBroadMillss = 2000; popmsg.TargetPageId = this.View.PageId; JSONObject dataobj = new JSONObject(); dataobj["billno"] = "DD000001"; popmsg.LinkTag = dataobj.ToJSONString(); ViewCommonAction.LowerRightPopMsssage(this.View, new List<DataEntity.LowerRightPopMsgEntity>() { popmsg }); } } public override void CustomEvents(CustomEventsArgs e) { base.CustomEvents(e); //点击带链接的弹窗的查看详情链接事件 if (e.Key.EqualsIgnoreCase(this.View.UserParameterKey + "_ShowCallLinkMsg") && e.EventName.EqualsIgnoreCase("ButtonClick")) { JSONObject objdta = JSONObject.Parse(e.EventArgs); this.View.ShowMessage("点击查看详情弹出的订单号是" + objdta.GetValue<string>("billno")); } }
说明:
LowerRightPopMsgEntity属性功能,可F12查看具体解释和说明
四、系统弹窗弹出规则
1、系统弹窗有即时弹窗,也即根据服务端的逻辑写法,即时弹出
2、系统弹窗堆栈式弹窗,如上给的实例都是自动堆栈弹窗,增加体验效果,例如:系统同一时间接受了4个弹窗,为了更加体验,弹完第一个,等第一个弹窗关闭,接着弹第二个。。。。依次类推,堆栈式的弹窗,后面再来多个弹窗都是堆栈排队
3、所有的弹窗默认自动关闭(打开弹窗默认20s自动关闭),属性可设置popmsg.AutoCloseInterval = 0也即永久不会自动关闭,必须需要用户点击右上角的×,进行关闭弹窗
4、根据不同的写法,两种方式弹出可同时支持
this.View.BroadcastToOnlineUser
这个方法在服务插件内调用不到,请问还有什么方法吗?
点个赞
请教一个问题,如果这个弹窗想要定时去触发的话要怎么来实现?我尝试了上面的方法确实可以通过点击一个按钮来发送广播推送给特定用户。但是如何通过定时任务去监控是否需要广播并推送?
比如一个场景:某个试验从早上8点做到晚上8点,我需要在晚上8点之后每隔10分钟就弹一次右下角广播提示工程师试验已结束。我试了发布自定义API和定时任务插件都没办法实现。
【emoji】
【emoji】
【emoji】顶一个
自定义右下角弹窗多场景运用实例
本文2024-09-16 18:41:20发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-23764.html