客户化数据资源获取
应用场景
报表设计和数据分析时,可结合客户应用的需求获取设计可使用的数据集及数据集字段。比如数据权限需要在客户应用中进行控制,包括不同用户可使用的数据集,及不同用户对同一数据集的可使用的数据集字段都需要在客户应用中分配,在报表设计时需要调用客户系统的权限判断来实现客户化的数据资源获取。
客户化方案
产品提供资源客户化接口以满足客户系统集成调用时的个性化的数据集选择及数据集字段过滤需求。下面以数据分析资源客户化为例进行介绍,复杂报表资源的客户化保存机制类似。
数据分析数据资源获取客户化主要包括两个部分:
- 客户化数据集选择窗口
- 客户化数据集字段过滤
客户化数据集选择窗口
方案说明:
数据集选择客户化提供接口实现数据分析时对可选数据集的客户化控制,可通过以下步骤实现:
1.数据分析客户化JS中进行弹出数据集弹窗客户化设置,指定数据集选择页面。
客户化JS设置说明:
- 复杂报表:
文件位置:\mis2\custom\flexdesigner\customResourceSetting.js
- 数据分析:
文件位置:\mis2\custom\fastReport\customAnalysisResourceSetting.js
关键方法说明:
//是否开启客户化窗口,返回值true/false
function getEnableCustom();
返回值:
true:使用客户化窗口
false:不使用客户化窗口
客户可根据情况在方法中返回值
//客户自定义数据集选择窗口页面,该方法应返回jsp路径,支持参数
function genSelectDataSetUrl()
返回值:
url路径,例“/mis2/custom/fastReport/jsp/selectDataSetPage.jsp”
2.自定义数据集选择页面
产品默认的数据集选择页面,会自动获取数据管理根目录下的所有资源,如下图
产品支持数据集选择页面自定义,可实现如数据集的二次过滤,根据客户系统权限判断当前用户可用的数据集。
注意:数据集资源仍然需要以资源方式保存至平台,客户化接口只是在获取可使用数据集资源时做客户化处理。
客户化示例
一、复杂报表:
下面介绍一个具体的数据集选择客户化示例。
示例说明:
示例实现在进行数据分析时读取数据集权限json,对用户可用的数据集进行过滤。
示例实现:
数据集权限json格式说明:
{"DatasetAuth" : [
{
"Ds_id" : [
30829,
30698,
30590,
30602
],
"user_id" : "root"
},
……
]
}
其中每个节点代表一个用户有权限使用的数据集资源,user_id为用户,Ds_id为数据集资源id的数组
一.客户化JS设置:
function genSelectDataSetUrl(){
return "/mis2/custom/flexdesigner/jsp/selectDataSetPage.jsp";
}
二.自定义页面
1.自定义数据集选择页面:
示例代码:
<script>
var relativeJspUrlPrefix = "<%=relativeJspUrlPrefix %>";
var relativeUrlPrefix = "<%=relativeUrlPrefix %>";
var absoluteUrlPrefix = "<%=absoluteUrlPrefix %>";
var absoluteJspUrlPrefix = "<%=absoluteJspUrlPrefix %>";
var appPhyPath = "<%=appPhyPath %>";
var fatherId="<%=fatherId%>";
var base64 = new Base64();
var userId ="<%=userId%>";
$(function(){
$("#reourceList").height($(window).height()-$("#toolbar").height());
//生成页面工具条
var jsondata = [];
var jsonSettings = {"data":jsondata,"datatype":"json"};
$("#toolbar").rqtoolbar(jsonSettings);
//创建资源列表
createResourceList();
});
//选中资源时的处理
function selectResource(content){
//移除其他节点的bordercolor
$("#list").find("li span").each(function(index,element){
$(element).removeAttr("style");
});
$(content).css({"border-left":"#FF5F3E solid 7px", "background-color":"#F8F8F8"});
var res_id=$(content).attr("resID");
$("#resJson").val(base64.encode(res_id));
}
function submit(){
var resIDBase64=$("#resJson").val();
var resIDString=base64.decode(resIDBase64);
parent.chooseRes(resIDString);
}
function cancelLoad(windowName){
parent.cancelSelect();
}
function createResourceList(){//只是简单示例,这里处理数据的jsp可能是客户系统的一个servlet,返回数据格式也不一定
$.ajax({
url : $.contextPath+"/mis2/custom/flexdesigner/jsp/getDataSetResourceList.jsp",
type : 'POST',
dataType : 'json',
context : this,
success : function(data) {//获得json数据
for(resourceIndex in data){//
var resourceObject=data[resourceIndex];
var res_id=resourceObject['resID'];
//创建元素
var liElement=document.createElement("li");
var spanElement=document.createElement("span");
for(item in resourceObject){
spanElement.setAttribute(item,resourceObject[item]);
}
spanElement.setAttribute("class","");
spanElement.setAttribute("onclick","selectResource(this)");
spanElement.innerHTML=resourceObject["resName"];
document.getElementById("list").appendChild(liElement);
liElement.appendChild(spanElement);
}
},
error:function(XMLHttpRequest, textStatus, errorThrown){
}
});
}
</script>
示例页面位置: mis2\custom\flexdesigner\jsp\selectDataSetPage.jsp
2.数据集列表获取页面:
示例代码:
String relativeJspUrlPrefix = PathUtils.getRelativeJspUrl(request,"/");
String relativeUrlPrefix = PathUtils.getRelativeUrl(request,"");
String absoluteUrlPrefix = PathUtils.getAbsoluteUrl(request,"/");
String absoluteJspUrlPrefix =PathUtils.getAbsoluteJspUrl(request,"");
String appPhyPath = PathUtils.getAppPhyPath();
//这个页面只返回数据集信息,调用平台资源接口
String userId = null;
UserInfo ui = (UserInfo) session.getAttribute("sys_UserInfo");
if(ui != null){
userId = ui.getUserId();
}
//读取json文件(改为后台方式)
String jsonFilePath=appPhyPath+"/mis2/custom/flexdesigner/json/dataSet.json";
String resourceJSONString=GezConfigUtil.loadTextConfig(jsonFilePath);
//生成一个资源JSON
JSONArray resourceListArray=new JSONArray();
//集深平台资源缓存操作类
ResourceCacheOperator opr = new ResourceCacheOperator();
if(resourceJSONString!=null&&!"".equals(resourceJSONString)){//读取配置中的json信息
JSONObject resourceJSONObject=new JSONObject(resourceJSONString);
//遍历当前的权限信息
JSONArray dataSetAuthArray=resourceJSONObject.getJSONArray("DatasetAuth");
for(int i=0;i<dataSetAuthArray.length();i++){
JSONObject userAuthInfoObject=dataSetAuthArray.getJSONObject(i);
String authUserID=userAuthInfoObject.has("user_id")?userAuthInfoObject.getString("user_id"):"";
if(authUserID.equals(userId)){//json中配置的用户与当前登录ID相等
JSONArray resJSONArray=userAuthInfoObject.has("Ds_id")?userAuthInfoObject.getJSONArray("Ds_id"):new JSONArray();
//根据配置中的资源ID,在产品中找到对应的数据集资源供展现
for(int j=0;j<resJSONArray.length();j++){
String dataSetID=String.valueOf(resJSONArray.get(j));
//在产品的缓存中获得资源的具体信息
ResourceInfo ri = opr.getResource(dataSetID);
String resName=ri.getResName();
//创建一个资源节点供列表中使用
JSONObject resJsonObject=new JSONObject();
resJsonObject.put("resID",dataSetID);
resJsonObject.put("resName",resName);
resourceListArray.put(resJsonObject);
}
break;//不再处理
}
}
}
out.println(resourceListArray.toString());
示例页面位置:mis2\custom\flexdesigner\jsp\getDataSetResourceList.jsp
示例实现效果:
新建数据分析或重选数据集时,弹出数据集选择窗口:
root用户可选择的数据集如下:
zhangsan用户可选择的数据集如下:
二、数据分析:
下面介绍一个具体的数据集选择客户化示例。
示例说明:
示例实现在进行数据分析时读取数据集权限json,对用户可用的数据集进行过滤。
示例实现:
数据集权限json格式说明:
{"DatasetAuth" : [
{
"Ds_id" : [
30829,
30698,
30590,
30602
],
"user_id" : "root"
},
……
]
}
其中每个节点代表一个用户有权限使用的数据集资源,user_id为用户,Ds_id为数据集资源id的数组
一.客户化JS设置:
function genSelectDataSetUrl(){
return "/mis2/custom/fastReport/jsp/selectDataSetPage.jsp";
}
二.自定义页面
1.自定义数据集选择页面:
示例代码:
<script>
var relativeJspUrlPrefix = "<%=relativeJspUrlPrefix %>";
var relativeUrlPrefix = "<%=relativeUrlPrefix %>";
var absoluteUrlPrefix = "<%=absoluteUrlPrefix %>";
var absoluteJspUrlPrefix = "<%=absoluteJspUrlPrefix %>";
var appPhyPath = "<%=appPhyPath %>";
var fatherId="<%=fatherId%>";
var base64 = new Base64();
var userId ="<%=userId%>";
$(function(){
$("#reourceList").height($(window).height()-$("#toolbar").height());
//生成页面工具条
var jsondata = [];
var jsonSettings = {"data":jsondata,"datatype":"json"};
$("#toolbar").rqtoolbar(jsonSettings);
//创建资源列表
createResourceList();
});
//选中资源时的处理
function selectResource(content){
//移除其他节点的bordercolor
$("#list").find("li span").each(function(index,element){
$(element).removeAttr("style");
});
$(content).css({"border-left":"#FF5F3E solid 7px", "background-color":"#F8F8F8"});
var res_id=$(content).attr("resID");
$("#resJson").val(base64.encode(res_id));
}
function submit(){
var resIDBase64=$("#resJson").val();
var resIDString=base64.decode(resIDBase64);
parent.chooseRes(resIDString);
}
function cancelLoad(windowName){
parent.cancelSelect();
}
function createResourceList(){//只是简单示例,这里处理数据的jsp可能是客户系统的一个servlet,返回数据格式也不一定
$.ajax({
url : $.contextPath+"/mis2/custom/fastReport/jsp/getDataSetResourceList.jsp",
type : 'POST',
dataType : 'json',
context : this,
success : function(data) {//获得json数据
for(resourceIndex in data){//
var resourceObject=data[resourceIndex];
var res_id=resourceObject['resID'];
//创建元素
var liElement=document.createElement("li");
var spanElement=document.createElement("span");
for(item in resourceObject){
spanElement.setAttribute(item,resourceObject[item]);
}
spanElement.setAttribute("class","");
spanElement.setAttribute("onclick","selectResource(this)");
spanElement.innerHTML=resourceObject["resName"];
document.getElementById("list").appendChild(liElement);
liElement.appendChild(spanElement);
}
},
error:function(XMLHttpRequest, textStatus, errorThrown){
}
});
}
</script>
示例页面位置: mis2\custom\fastReport\jsp\selectDataSetPage.jsp
2.数据集列表获取页面:
示例代码:
String relativeJspUrlPrefix = PathUtils.getRelativeJspUrl(request,"/");
String relativeUrlPrefix = PathUtils.getRelativeUrl(request,"");
String absoluteUrlPrefix = PathUtils.getAbsoluteUrl(request,"/");
String absoluteJspUrlPrefix =PathUtils.getAbsoluteJspUrl(request,"");
String appPhyPath = PathUtils.getAppPhyPath();
//这个页面只返回数据集信息,调用平台资源接口
String userId = null;
UserInfo ui = (UserInfo) session.getAttribute("sys_UserInfo");
if(ui != null){
userId = ui.getUserId();
}
//读取json文件(改为后台方式)
String jsonFilePath=appPhyPath+"/mis2/custom/fastReport/json/dataSet.json";
String resourceJSONString=GezConfigUtil.loadTextConfig(jsonFilePath);
//生成一个资源JSON
JSONArray resourceListArray=new JSONArray();
//集深平台资源缓存操作类
ResourceCacheOperator opr = new ResourceCacheOperator();
if(resourceJSONString!=null&&!"".equals(resourceJSONString)){//读取配置中的json信息
JSONObject resourceJSONObject=new JSONObject(resourceJSONString);
//遍历当前的权限信息
JSONArray dataSetAuthArray=resourceJSONObject.getJSONArray("DatasetAuth");
for(int i=0;i<dataSetAuthArray.length();i++){
JSONObject userAuthInfoObject=dataSetAuthArray.getJSONObject(i);
String authUserID=userAuthInfoObject.has("user_id")?userAuthInfoObject.getString("user_id"):"";
if(authUserID.equals(userId)){//json中配置的用户与当前登录ID相等
JSONArray resJSONArray=userAuthInfoObject.has("Ds_id")?userAuthInfoObject.getJSONArray("Ds_id"):new JSONArray();
//根据配置中的资源ID,在产品中找到对应的数据集资源供展现
for(int j=0;j<resJSONArray.length();j++){
String dataSetID=String.valueOf(resJSONArray.get(j));
//在产品的缓存中获得资源的具体信息
ResourceInfo ri = opr.getResource(dataSetID);
String resName=ri.getResName();
//创建一个资源节点供列表中使用
JSONObject resJsonObject=new JSONObject();
resJsonObject.put("resID",dataSetID);
resJsonObject.put("resName",resName);
resourceListArray.put(resJsonObject);
}
break;//不再处理
}
}
}
out.println(resourceListArray.toString());
示例页面位置:mis2\custom\fastReport\jsp\getDataSetResourceList.jsp
示例实现效果:
新建数据分析或重选数据集时,弹出数据集选择窗口:
root用户可选择的数据集如下:
zhangsan用户可选择的数据集如下:
客户化数据集字段过滤
方案说明:
产品提供数据集字段过滤接口,通过实现该接口实现对报表设计可用数据集字段的过滤,控制可用字段。复杂报表暂不实现。
接口介绍:
数据集字段过滤接口:
父类:com.runqianapp.dataAnalysis.interfaces.AbstractDataSetFieldFilter
方法:
//数据分析为分组类型时,字段过滤方法
public abstract List<ColInfoBase> filterDataSetFieldForFast(HttpServletRequest request,List<ColInfoBase> sourceDataSetCol,String dataSourceName,String datasetName);
//数据分析为交叉类型时,字段过滤方法
public abstract List<ColInfoBase> filterDataSetFieldForPivot(HttpServletRequest request,List<ColInfoBase> sourceDataSetCol,String dataSourceName,String datasetName);
方法参数:
request:request对象
sourceDataSetCol:数据集列描述对象
dataSourceName:数据源名称
datasetName:数据集名称
注意:该接口实现类需要固定路径和名称,mis2\custom\fastReport\classes\CustomAnalysisDataSetField.class,如果客户定义了该类就会在数据分析显示字段时通过该类过滤数据集字段
客户化示例
代码示例:
public class CustomAnalysisDataSetField extends AbstractDataSetFieldFilter{
public List<ColInfoBase> filterDataSetFieldForFast(
HttpServletRequest request, List<ColInfoBase> sourceDataSetCol,
String dataSourceName, String datasetName) {
String userName="";
UserInfo ui = (UserInfo) request.getSession().getAttribute("sys_UserInfo");
if (ui != null) {
userName = ui.getUserId();
}
//当前用户为root显示所有字段,其他用户显示比root少显示一个字段
if("root".equals(userName)){
return sourceDataSetCol;
}else{
sourceDataSetCol.remove(sourceDataSetCol.size()-1);
return sourceDataSetCol;
}
}
public List<ColInfoBase> filterDataSetFieldForPivot(
HttpServletRequest request, List<ColInfoBase> sourceDataSetCol,
String dataSourceName, String datasetName) {
String userName="";
UserInfo ui = (UserInfo) request.getSession().getAttribute("sys_UserInfo");
if (ui != null) {
userName = ui.getUserId();
}
////当前用户为root显示所有字段,其他用户显示比root少显示一个字段
if("root".equals(userName)){
return sourceDataSetCol;
}else{
sourceDataSetCol.remove(sourceDataSetCol.size()-1);
return sourceDataSetCol;
}
}
}
示例实现效果:
root用户设计时可选字段如下:
张三用户设计时可选字段如下: