package com.ruisitech.bi.service.bireport;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rsbi.ext.engine.ExtConstants;
import com.rsbi.ext.engine.init.TemplateManager;
import com.rsbi.ext.engine.util.IdCreater;
import com.rsbi.ext.engine.view.context.Element;
import com.rsbi.ext.engine.view.context.MVContext;
import com.rsbi.ext.engine.view.context.MVContextImpl;
import com.rsbi.ext.engine.view.context.cross.*;
import com.rsbi.ext.engine.view.context.dc.grid.*;
import com.rsbi.ext.engine.view.context.form.InputField;
import com.rsbi.ispire.dc.grid.GridFilter;
import com.rsbi.ispire.dc.grid.GridProcContext;
import com.ruisitech.bi.entity.bireport.DimDto;
import com.ruisitech.bi.entity.bireport.KpiDto;
import com.ruisitech.bi.entity.bireport.ParamDto;
import com.ruisitech.bi.entity.bireport.TableQueryDto;
import com.ruisitech.bi.util.RSBIUtils;
import com.ruisitech.ext.service.DataControlInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Scope("prototype")
public class TableService extends BaseCompService {
public final static String deftMvId = "mv.tmp.table";
private Map<String, InputField> mvParams = new HashMap<String, InputField>(); //mv的参数
private StringBuffer scripts = new StringBuffer(); //用来构造js 脚本的字符串对象
/***
* 当指标有计算指标时,需要计算上期、同期等值,在显示数据时需要对偏移的数据进行过滤,
*/
private List<GridFilterContext> filters = new ArrayList<GridFilterContext>();
/**
* 数据权限接口
*/
@Autowired
private DataControlInterface dataControl;
@Autowired
private ModelCacheService cacheService;
public @PostConstruct void init() {
}
public @PreDestroy void destory() {
mvParams.clear();
filters.clear();
}
public MVContext json2MV(TableQueryDto table) throws ParseException, IOException{
//创建MV
MVContext mv = new MVContextImpl();
mv.setChildren(new ArrayList<Element>());
String formId = ExtConstants.formIdPrefix + IdCreater.create();
mv.setFormId(formId);
mv.setMvid(deftMvId);
//创建corssReport
//添加kpiOther
DimDto kpiOther = new DimDto();
kpiOther.setType("kpiOther");
table.getCols().add(kpiOther);
CrossReportContext cr = json2Table(table);
//移除kpiOther
table.getCols().remove(table.getCols().size() - 1);
//设置ID
cr.setId(table.getCompId());
cr.setOut("olapJson");
cr.setHasPms(true); //包含多维分析的参数
mv.getChildren().add(cr);
cr.setParent(mv);
Map<String, CrossReportContext> crs = new HashMap<String, CrossReportContext>();
crs.put(cr.getId(), cr);
mv.setCrossReports(crs);
//创建datacenter
String sql = this.createSql(table, 0);
GridDataCenterContext dc = this.createDataCenter(sql, table);
cr.setRefDataCetner(dc.getId());
if(mv.getGridDataCenters() == null){
mv.setGridDataCenters(new HashMap<String, GridDataCenterContext>());
}
mv.getGridDataCenters().put(dc.getId(), dc);
//判断是否需要创建数据源
String dsid = super.createDsource(cacheService.getDsource(table.getDsid()), mv);
dc.getConf().setRefDsource(dsid);
String scripts = this.scripts.toString();
if(scripts != null && scripts.length() > 0){
mv.setScripts(scripts);
}
return mv;
}
public CrossReportContext json2Table(TableQueryDto table) throws ParseException{
CrossReportContext ctx = new CrossReportContextImpl();
CrossCols cols = new CrossCols();
cols.setCols(new ArrayList<CrossField>());
ctx.setCrossCols(cols);
CrossRows rows = new CrossRows();
rows.setRows(new ArrayList<CrossField>());
ctx.setCrossRows(rows);
//没有指标,添加baseKpi
if(table.getKpiJson() == null || table.getKpiJson().size() == 0){
CrossKpi baseKpi = new BaseKpiField();
baseKpi.setAggregation("sum");
baseKpi.setAlias("kpi_value");
ctx.setBaseKpi(baseKpi);
}
ctx.setLabel(table.getCompId()); //给组件设置label
boolean uselink = false;
Map<String, Object> link = table.getLink();
if(link != null && !link.isEmpty()){
RowLinkContext rlink = new RowLinkContext();
rlink.setParamName((String)link.get("paramName"));
String url = (String)link.get("url"); //url 优先于联动组件
if(url != null && url.length() >0){
rlink.setUrl(url);
}else{
String target = (String)link.get("target");
String type = (String)link.get("type");
rlink.setTarget(target.split(","));
rlink.setType(type.split(","));
}
ctx.getCrossRows().setLink(rlink);
uselink = true;
}
//表格钻取维度
List<RowDimContext> drill = this.getDrillDim(table);
if(drill != null && drill.size() > 0){
ctx.setDims(drill);
uselink = true;
}
loopJsonField(table.getCols(), cols.getCols(), table.getKpiJson(), "col", uselink);
loopJsonField(table.getRows(), rows.getRows(), table.getKpiJson(), "row", uselink);
//如果没有维度,添加none维度
if(cols.getCols().size() == 0){
CrossField cf = new CrossField();
cf.setType("none");
cf.setDesc("合计");
cols.getCols().add(cf);
}
if(rows.getRows().size() == 0){
CrossField cf = new CrossField();
cf.setType("none");
cf.setDesc("合计");
rows.getRows().add(cf);
}
return ctx;
}
/**
* 生成表格SQL
* @param table
* @param release 判断当前是否为发布状态, 0 表示不是发布,1表示发布到多维分析,2表示发布到仪表盘
* @return
* @throws ParseException
*/
public String createSql(TableQueryDto table, int release) throws ParseException{
JSONObject dset = cacheService.getDset(table.getDsetId());
Map<String, String> tableAlias = createTableAlias(dset);
//判断是否需要计算上期、同期值
int jstype = table.getKpiComputeType();
StringBuffer sql = new StringBuffer();
sql.append("select ");
List<DimDto> dims = table.getDims();
for(int i=0; i<dims.size(); i++){
DimDto dim = dims.get(i);
String key = dim.getTableColKey();
String txt = dim.getTableColName();
String tname = dim.getTableName();
if(key != null && txt != null && key.length() >0 && txt.length() >0){
sql.append( tableAlias.get(tname) + "."+key+", " + tableAlias.get(tname) + "." + txt + ",");
}else{
if(dim.getCalc() == 0){
sql.append( tableAlias.get(dim.getTname()) + "." + dim.getColname()+" as "+dim.getAlias()+", ");
}else{
sql.append( dim.getColname()+" as "+dim.getAlias()+", ");
}
}
}
List<KpiDto> kpis = table.getKpiJson();
if(kpis.size() == 0){
sql.append(" 0 kpi_value ");
}else{
for(int i=0; i<kpis.size(); i++){
KpiDto kpi = kpis.get(i);
if(kpi.getCalc() != null && kpi.getCalc() == 1){ //表达式,直接取表达式
sql.append(kpi.getCol_name() + " ");
}else{ //获取字段别名
String name = super.convertKpiName(kpi, tableAlias);
sql.append( name + " ");
}
sql.append(kpi.getAlias());
if(i != kpis.size() - 1){
sql.append(",");
}
}
}
JSONArray joinTabs = (JSONArray)dset.get("joininfo");
String master = dset.getString("master");
sql.append(" from " + master + " a0");
for(int i=0; joinTabs!=null&&i<joinTabs.size(); i++){ //通过主表关联
JSONObject tab = joinTabs.getJSONObject(i);
String ref = tab.getString("ref");
String refKey = tab.getString("refKey");
String jtype = (String)tab.get("jtype");
if("left".equals(jtype) || "right".equals(jtype)){
sql.append(" " + jtype);
}
sql.append(" join " + ref+ " " + tableAlias.get(ref));
sql.append(" on a0."+tab.getStrin
没有合适的资源?快使用搜索试试~ 我知道了~
睿思bi开源版后台系统,基于Springboot构建,快速分析数据及可视化,0代码编写+源代码+文档说明
共548个文件
json:378个
java:135个
xml:18个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 123 浏览量
2023-11-28
16:09:12
上传
评论
收藏 11.04MB ZIP 举报
温馨提示
-# 产品特点:<br> 1.轻量级BI, 支持快速建模,快速可视化数据。 <br> 2.多维分析功能强大,支持下钻/上卷/排序/筛选/计算/聚合等多种操作方式。<br> 3.报表使用简单,功能强大,通过拖放等方式构建分析界面, 0代码编写。 <br> 4.开放源码,采用apache2.0开源协议,用户可任意使用而不需我公司授权(企业版除外)。<br> # 系统功能:<br> 1.数据建模 (支持:mysql/oracle/sqlserver/db2/postgresql/hive/kylin) <br> 2.多维分析 <br> 3.数据报表 <br> 4.权限管理 <br>## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
资源推荐
资源详情
资源评论
收起资源包目录
睿思bi开源版后台系统,基于Springboot构建,快速分析数据及可视化,0代码编写+源代码+文档说明 (548个子文件)
mvnw.cmd 6KB
.DS_Store 8KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.gitignore 453B
ojdbc6-12.1.0.2.jar 3.52MB
db2jcc-1.0.jar 3.49MB
ext3-1.5.jar 1.07MB
TableService.java 41KB
PortalPageService.java 19KB
ChartService.java 19KB
PortalChartService.java 19KB
PortalTableService.java 15KB
CubeService.java 13KB
DatasetService.java 12KB
BaseCompService.java 12KB
ReportService.java 10KB
GridService.java 9KB
RSBIUtils.java 9KB
DataSourceService.java 8KB
TableDetailService.java 7KB
RoleService.java 7KB
UserService.java 6KB
PortalViewController.java 6KB
DimDto.java 6KB
CompPreviewService.java 6KB
BoxService.java 5KB
MenuService.java 5KB
ReportDesignController.java 5KB
TreeService.java 4KB
KpiDto.java 4KB
ChartJSONDto.java 4KB
OlapService.java 4KB
ParamDto.java 3KB
PortalTableQuery.java 3KB
User.java 3KB
UserController.java 3KB
DatasetController.java 3KB
RoleController.java 3KB
PortalIndexController.java 3KB
ChartController.java 3KB
ShiroConfig.java 3KB
TableQueryDto.java 3KB
PortalChartQuery.java 3KB
ShiroDbRealm.java 3KB
CubeController.java 2KB
DetailController.java 2KB
QRCodeController.java 2KB
ChartViewController.java 2KB
GridQuery.java 2KB
PortalParamDto.java 2KB
TableViewController.java 2KB
TableController.java 2KB
GridViewController.java 2KB
BoxViewController.java 2KB
MyReportController.java 2KB
SessionAuthcFilter.java 2KB
ShareAuthcFilter.java 2KB
DataSourceController.java 2KB
Cube.java 2KB
Menu.java 2KB
Dimension.java 2KB
Portal.java 2KB
DimController.java 2KB
DataSource.java 2KB
AppLoginController.java 2KB
ShareUrl.java 2KB
CubeColMeta.java 2KB
CompParamDto.java 2KB
MenuController.java 2KB
CollectController.java 2KB
MobileController.java 2KB
BoxQuery.java 2KB
LoadXmlFromDB.java 2KB
ModelCacheService.java 2KB
AppReportController.java 2KB
HeadFilter.java 2KB
LinkAcceptDto.java 2KB
Role.java 2KB
GridColDto.java 1KB
Dataset.java 1KB
AppReportViewController.java 1KB
AppMenuController.java 1KB
Measure.java 1KB
OlapInfo.java 1KB
Area.java 1KB
MobReportType.java 1KB
MVCleanListener.java 1KB
AreaService.java 1KB
ShareController.java 1KB
DSColumn.java 1KB
Result.java 1KB
AppPushContorller.java 1KB
PortalService.java 1KB
ShareUrlService.java 1KB
ChartQueryDto.java 1KB
RsbiOsApplication.java 1KB
LoginController.java 1KB
共 548 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论
奋斗奋斗再奋斗的ajie
- 粉丝: 216
- 资源: 1969
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功