现场因为数据量大或者数据库性能或网络配置等原因,经查出现查询数据报错或者查询数据超时等情况,每次出现报错都需要找到BI团队排查,导致BI维护团队的工作量和维护压力很大。
所以,客户期望在数据查询报错或者查询超时等情况,可以通过前端的错误提示信息来引导用户找相关的维护团队解决问题。例如:查询超时可以找数据库维护团队、网络超时可以找网络团队等。
目前是有统一的js入口可以定制开发处理,X模块需要提供对应的接口。
之前在后端实现了一套扩展接口,但客户使用了中间件,中间件的报错没有经过smartbi后端,无法扩展,需要提供前端二开接口支持。
功能:获取错误码
输入:无
输出:错误码,如SQL_ERROR,NO_PERMISSION,ENGINE_VERSION_ERROR等
功能:获取错误信息
输入:无
输出:错误信息,前端错误弹窗的内容
功能:设置错误信息
输入:错误信息
输出:无
功能:设为弱提示,前端显示错误时将使用弱提示
输入:boolean
输出:无
功能:判断是否是弱提示
输入:无
输出:boolean
功能:设置错误栈,扩展时可设置为null,前端显示错误时则不显示栈信息按钮
输入:string
输出:无
功能:获取错误栈
输入:无
输出:string
// 扩展包module类, 用于注册IExceptionResultHandler package smartbi.smartbixexception; import smartbi.framework.IModule; import smartbi.framework.IShutdownHook; import smartbix.exception.ExceptionResultProcessorHolder; import smartbix.exception.IExceptionResultHandler; public class MyExceptionModule implements IModule, IShutdownHook { private static MyExceptionModule instance = new MyExceptionModule(); private IExceptionResultHandler handler = new MyExceptionHandler(); public static MyExceptionModule getInstance () { return instance; } @Override public void activate() { ExceptionResultProcessorHolder.getInstance().addHandler(handler); } @Override public void shutdown() { ExceptionResultProcessorHolder.getInstance().removeHandler(handler); } } // 扩展包实现的IExceptionResultHandler package smartbi.smartbixexception; import smartbix.ExceptionResult; import smartbix.exception.IExceptionResultHandler; public class MyExceptionHandler implements IExceptionResultHandler { @Override public ExceptionResult handle(ExceptionResult result) { // 忽略弱提示错误 if (result.isWeak()) { return result; } // sql查询错误不显示栈信息 if ("SQL_ERROR".equals(result.getCode())) { result.setStackTrace(null); return result; } // 权限错误使用弱提示 if ("NO_PERMISSION".equals(result.getCode())) { result.setWeak(true); return result; } // 新引擎未开启修改提示信息, 且不显示栈信息 if ("ENGINE_VERSION_ERROR".equals(result.getCode())) { result.setMessage("新引擎未开启"); result.setStackTrace(null); return result; } return result; } } |
作用:在报表初始化时设置报错弹窗处理函数
名称 | 类型 | 说明 | |
输入参数 | option | JSON | 报错传参option信息 |
返回值 | option | JSON | 经过处理之后的报option信息 |
不同的报表类型,二开接口的调用时机不一样
仪表盘,时机:PAGE_ON_INIT,调用对象iPage.setHttpErrorDialOPHander【针对V10.5.15及以上版本有效】
新透视,时机:AD_HOC_ANALYSIS_ON_INIT,调用对象iAdHocAnalysis.setHttpErrorDialOPHander 【针对V11及以上版本有效】
新即席,时机:DETAILED_QUERY_ON_INIT,调用对象iDetailQuery.setHttpErrorDialOPHander 【针对V11及以上版本有效】
//仪表盘调用示范 this.on(PAGE_ON_INIT, (iPage) => { iPage.setHttpErrorDialOPHander(function (option) { if (option.message.indexOf('504') >= 0 || option.message.indexOf('502') >= 0) { option.message = '服务器请求网络超时' } return option; }) }) //透视分析调用示范 this.on(AD_HOC_ANALYSIS_ON_INIT, (iAdHocAnalysis) => { iAdHocAnalysis.setHttpErrorDialOPHander(function (option) { debugger if (option.message.indexOf('504') >= 0 || option.message.indexOf('502') >= 0) { option.message = '服务器请求网络超时-透视' } return option; }) }) //即席查询调用示范 this.on(DETAILED_QUERY_ON_INIT, (iDetailQuery) => { iDetailQuery.setHttpErrorDialOPHander(function (option) { debugger if (option.message.indexOf('504') >= 0 || option.message.indexOf('502') >= 0) { option.message = '服务器请求网络超时-即席查询' } return option; }) }) |