如何给FineReport设置自定义消息提醒工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给FineReport设置自定义消息提醒工具相关的知识,希望对你有一定的参考价值。
参考技术AFineReport设计器有自动的消息推送功能,可设置报表定时推送和常规的日报周报推送。官方有自己的消息推送的接口,不过有些用户旺旺希望自己开发,符合自己需求的推送界面。
;(function($)
/*定义一个工具对象,所有的工具以后都放进去*/
HG = ;
/*定义我们第一个基础类OBJ*/
HG.OBJ = function(options)
//保证子类能够继承父类的默认成员变量
this.options = $.extend(this._defaultOptions(), options);
//初始化对象
this._init();
;
$.extend(HG.OBJ.prototype,
_defaultOptions: function ()
return classType:"OBJ";
,
_init:function()
);
/*定义用于生成子类的方法*/
HG.extend=function(parent,options)
var son = $.extend(parent,);
son.prototype = $.extend(parent.prototype,options);
return son;
;
/*第一个就是要构建我们的通讯对象*/
/****定义一些通讯用的私有成员和方法*****/
//发送通道的状态,为了减轻服务器压力,采取单通道发送
var status = true;
var sendMsgList = [];
var receiveMsgList = [];
var server = null;
var sendType = null;
var dataType = null;
//最终发送消息的方法
var send=function(msg,onReceive,onComplete,onFailed)
if(!msg.inList)
msg.inList = true;
sendMsgList.push(msg);
if(status)
status = false;
var tempSendMsgList = sendMsgList;
sendMsgList = [];
FR.ajax(
url: server,
type: sendType,
dataType:dataType,
data:msgList:tempSendMsgList,
success : function(receiveMsgList)
status = true;
onReceive(receiveMsgList);
,
complete: function(XMLHttpRequest,textStatus)
status = true;
onComplete(XMLHttpRequest,textStatus);
,
error: function(XMLHttpRequest, textStatus, errorThrown)
status = true;
onFailed(XMLHttpRequest, textStatus, errorThrown);
);
else
setTimeout(function()
send(msg,onReceive,onComplete,onFailed);
,1000);
;
var formatDate = function(date)
var d = new Date(date);
return d.getFullYear()+"-"+d.getMonth()+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
;
//通讯类,可以自己重写onReceive的方法来实现自己的消息工具,消息的内容为JSON格式,自己定义就好了
HG.CommunicationClient = HG.extend(HG.OBJ,
_defaultOptions: function ()
return
classType:"CommunicationClient",
//默认只跟当前的服务器进行联络
server:FR.servletURL+"?op=msgserver",
sendType:"POST",
dataType:"JSON",
//轮询的频率,默认3秒1次,越快服务器和客户端压力越大
pollingRate:3000
;
,
_init:function()
server = this.options.server;
sendType = this.options.sendType;
dataType = this.options.dataType;
this.polling4Receive();
,
send:function(msg)
var self = this;
send(msg,self.onReceive, self.onComplete, self.onFailed);
,
//给某个用户发文本消息
sendText:function(toUserId,text)
this.send(action:"send",userId:toUserId,time:new Date().getTime(),content:text:text)
,
onReceive:function(msg)
if(msg.length>0)
for( var i=0; i<msg.length; i++ )
console.info(formatDate(msg[i].time)+" "+msg[i].name+" "+decodeURI("%E8%AF%B4%EF%BC%9A")+" "+msg[i].content.text);
,
onFailed:function(XMLHttpRequest, textStatus, errorThrown)
,
onComplete:function(XMLHttpRequest, textStatus)
,
/*向服务器轮询,检查是否有自己的消息*/
polling4Receive:function()
var self = this;
self.send(action:"findMessage",inList:false);
setTimeout(function()
self.polling4Receive();
,self.options.pollingRate);
);
//先生成一个对话工具
HG.Talk = new HG.CommunicationClient();
)(jQuery);
有一篇文章正好是关于题主所说的教程的,你也可以去看看,相信您看了之后会更加明白的。
如何开发FineReport的自定义控件?
FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论。
第一步:实例化一个注册控件的接口
给四个信息 我们的控件类,界面类,图标路径,控件类型名字
package com.hg.free.plugin.customcombo.param; import com.fr.design.designer.creator.XComboBox; import com.fr.design.fun.impl.AbstractParameterWidgetOptionProvider; import com.fr.form.ui.Widget; public class WidgetRegister extends AbstractParameterWidgetOptionProvider { @Override public Class<? extends Widget> classForWidget() { return CustomComboBox.class; } @Override public Class<?> appearanceForWidget() { return XComboBox.class; } @Override public String iconPathForWidget() { return "/com/fr/web/images/combobox.png"; } @Override public String nameForWidget() { return "自定义下拉框"; } }
第二步,重写控件类
package com.hg.free.plugin.customcombo.param; import com.fr.form.ui.ComboBox; import com.fr.ui.DataFilter; public class CustomComboBox extends ComboBox { private static final long serialVersionUID = 7169771062153345236L; @Override public String getXType() { return "customcombo"; } @Override protected DataFilter createDataFilter() { return new CustomComboBoxDataFilter(); } }
因为要改变过滤方式,就要重写一个过滤器
package com.hg.free.plugin.customcombo.param; import com.fr.form.ui.ComboBoxDataFilter; public class CustomComboBoxDataFilter extends ComboBoxDataFilter { @Override public boolean isMatch(String txt, String filter) { if(null==txt && null!=filter)return false; if(null==txt && null==filter)return true; return txt.indexOf(filter)!=-1; } }
第三步,继承前端控件JS
; (function($){ FR.CustomComboBoxEditor = FR.extend(FR.ComboBoxEditor, { _init: function () { FR.CustomComboBoxEditor.superclass._init.apply(this, arguments); } }); $.shortcut("customcombo", FR.CustomComboBoxEditor); })(jQuery);
好了~以上就是全部的代码开发~然后写个xml用ant打包成插件就可以了。
代码解释:
首先来看这段代码是什么意思呢?
就是我定义了一个控件类型为CustomComboBoxEditor的控件,他继承了ComboBoxEditor的全部方法和属性,并且我把新定义的控件类型的标记声明为customcombo,这个标记有啥用勒,其他用途就不说了,单单说在这里的用途,就是JAVA 本身是不能让前端取生成什么控件的~而是通过告诉前端一个配置,前端的JS引擎(姑且这么称呼他吧)~根据这个配置去执行对应的脚本生成对应的dom样式之类的~shortcut你就这么理解~后台返回一个配置是要生成customcombo这个控件~那么它就像一个map一样找到了对应的键值FR.CustomComboBoxEditor~然后把该控件的配置丢到这个方法里面去执行。就生成我们的控件了。
因为这个例子中并没有对前端有任何修改的要求~所以就没做任何改动~下面看后台。
我们这个例子是要修改模糊匹配的方式。
那么原来控件匹配的机制是怎么搞的,是这样的:假设我是一个老板(妈蛋也只能假设一下了),现在我想了解一份纸质合同的细节,但是公司有一大坨纸质合同我怎么找呢~当然是请个秘书了(美女最好),我告诉她我要的合同大概是有些什么信息~然后她去找出来把最后找到的合同给我就可以了。
我们这里控件ComboBox就是老板,ComboBoxDataFilter就是秘书,就是这么个意思,这里每个秘书肯定都有自己找合同的一套方法,以前那个秘书是只要有点相关的就都找出来了,新来的这个秘书是只找老板提示的信息匹配到的合同~查找匹配的方法就是isMatch,这个代码就是这样的,代码的开发其实只要仔细分析就能够映射到现实生活中的很多事务处理上面~因为代码也是人设计的,逻辑总逃脱不了人处理事务的思维。
本文出自 “雄霸天下的博客” 博客,请务必保留此出处http://10549520.blog.51cto.com/10539520/1883057
以上是关于如何给FineReport设置自定义消息提醒工具的主要内容,如果未能解决你的问题,请参考以下文章