瀏覽代碼

#10 多维分析预警bug

rsbi 2 年之前
父節點
當前提交
93496715eb

二進制
libs/ext3-1.5.jar


+ 27 - 22
src/main/java/com/ruisitech/bi/service/bireport/ReportService.java

@@ -34,9 +34,9 @@ import java.util.*;
 @Service
 @Scope("prototype")
 public class ReportService extends BaseCompService {
-	
+
 	public final static String deftMvId = "mv.export.tmp";
-	
+
 	@Autowired
 	private ModelCacheService cacheService;
 	@Autowired
@@ -47,14 +47,14 @@ public class ReportService extends BaseCompService {
 	Map<String, InputField> params = new HashMap<>();
 
 	public @PostConstruct void init() {
-		
-	}  
-	
+
+	}
+
 	public @PreDestroy void destory() {
-		
+
 	}
-	
-	
+
+
 	public MVContext json2MV(JSONObject json, int release) throws Exception{
 		//创建MV
 		MVContext mv = new MVContextImpl();
@@ -185,12 +185,12 @@ public class ReportService extends BaseCompService {
 		for(String dsid : dsids){
 			super.createDsource(cacheService.getDsource(dsid), mv);
 		}
-		
+
 		return mv;
 	}
-	
+
 	/**
-	 * 
+	 *
 	 * @param mv
 	 * @param release  判断当前是否为发布状态, 0 表示不是发布,1表示发布到多维分析,2表示发布到仪表盘
 	 * @return
@@ -202,7 +202,7 @@ public class ReportService extends BaseCompService {
 		if(dsid == null || dsid.length() == 0){
 			return;
 		}
-		
+
 		//添加kpiOther
 		DimDto kpiOther = new DimDto();
 		kpiOther.setType("kpiOther");
@@ -213,7 +213,7 @@ public class ReportService extends BaseCompService {
 		cr.setId("comp");
 		cr.setOut("html");
 		cr.setShowData(true);
-		
+
 		String sql = tableService.createSql(table, release);
 		//创建datacenter
 		GridDataCenterContext dc = tableService.createDataCenter(sql, table);
@@ -223,22 +223,27 @@ public class ReportService extends BaseCompService {
 			mv.setGridDataCenters(new HashMap<String, GridDataCenterContext>());
 		}
 		mv.getGridDataCenters().put(dc.getId(), dc);
-		
+
 		mv.getChildren().add(cr);
 		cr.setParent(mv);
-		
+
 		Map<String, CrossReportContext> crs = new HashMap<String, CrossReportContext>();
 		crs.put(cr.getId(), cr);
 		mv.setCrossReports(crs);
+
+		String scripts = tableService.getScripts().toString();
+		if( scripts.length() > 0){
+			mv.setScripts(scripts);
+		}
 	}
-	
+
 	public void createChart(MVContext mv, ChartQueryDto chart, int release) throws IOException, ParseException{
 		String dsid = chart.getDsid();
 		if(dsid == null || dsid.length() == 0){
 			return;
 		}
-		
-		
+
+
 		//创建钻取维度
 		StringBuffer sb = new StringBuffer("");
 		int cnt = 0;
@@ -266,15 +271,15 @@ public class ReportService extends BaseCompService {
 			mv.setGridDataCenters(new HashMap<String, GridDataCenterContext>());
 		}
 		mv.getGridDataCenters().put(dc.getId(), dc);
-		
+
 		mv.getChildren().add(cr);
 		cr.setParent(mv);
-		
+
 		Map<String, ChartContext> crs = new HashMap<String, ChartContext>();
 		crs.put(cr.getId(), cr);
 		mv.setCharts(crs);
 	}
-	
+
 	public String createDimSql(ParamDto dim){
 		String tname = dim.getTableName();
 		if(tname == null || tname.length() == 0){  //维度未关联码表,直接从数据中查询。
@@ -287,7 +292,7 @@ public class ReportService extends BaseCompService {
 			return sql;
 		}
 	}
-	
+
 	public String createMonthSql(){
 		String sql = "select mid \"value\", mname \"text\" from code_month order by mid desc";
 		return sql;

+ 86 - 86
src/main/java/com/ruisitech/bi/service/bireport/TableService.java

@@ -38,18 +38,18 @@ 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>();
-	
+
 	/**
 	 * 数据权限接口
 	 */
@@ -58,16 +58,16 @@ public class TableService extends BaseCompService {
 
 	@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();
@@ -75,7 +75,7 @@ public class TableService extends BaseCompService {
 		String formId = ExtConstants.formIdPrefix + IdCreater.create();
 		mv.setFormId(formId);
 		mv.setMvid(deftMvId);
-		
+
 		//创建corssReport
 		//添加kpiOther
 		DimDto kpiOther = new DimDto();
@@ -91,11 +91,11 @@ public class TableService extends BaseCompService {
 
 		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);
@@ -104,25 +104,25 @@ public class TableService extends BaseCompService {
 			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);
@@ -134,7 +134,7 @@ public class TableService extends BaseCompService {
 			baseKpi.setAlias("kpi_value");
 			ctx.setBaseKpi(baseKpi);
 		}
-		
+
 		ctx.setLabel(table.getCompId());  //给组件设置label
 		boolean uselink = false;
 		Map<String, Object> link = table.getLink();
@@ -153,17 +153,17 @@ public class TableService extends BaseCompService {
 			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();
@@ -177,10 +177,10 @@ public class TableService extends BaseCompService {
 			cf.setDesc("合计");
 			rows.getRows().add(cf);
 		}
-		
+
 		return ctx;
 	}
-	
+
 	/**
 	 * 生成表格SQL
 	 * @param table
@@ -211,7 +211,7 @@ public class TableService extends BaseCompService {
 				}
 			}
 		}
-		
+
 		List<KpiDto> kpis = table.getKpiJson();
 		if(kpis.size() == 0){
 			sql.append(" 0 kpi_value ");
@@ -233,7 +233,7 @@ public class TableService extends BaseCompService {
 		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");
@@ -247,15 +247,15 @@ public class TableService extends BaseCompService {
 			sql.append(" ");
 		}
 		sql.append(" where 1=1 ");
-		
+
 		//处理数据权限
 		if(dataControl != null){
 			sql.append(dataControl.process(RSBIUtils.getLoginUserInfo(), dset.getString("master")));
 		}
-		
+
 		for(int i=0; i<dims.size(); i++){
 			DimDto dim = dims.get(i);
-			
+
 			//处理日期限制
 			if(dim.getType().equals("day")){
 				if(dim.getDay() != null){
@@ -345,7 +345,7 @@ public class TableService extends BaseCompService {
 				}
 			}
 		}
-		
+
 		//限制参数的查询条件
 		for(int i=0; table.getParams() != null && i<table.getParams().size(); i++){
 			ParamDto param = table.getParams().get(i);
@@ -420,7 +420,7 @@ public class TableService extends BaseCompService {
 				}
 			}
 		}
-		
+
 		//处理事件接受的参数限制条件
 		Map<String, Object> linkAccept = table.getLinkAccept();
 		if(linkAccept != null && linkAccept.size() > 0){
@@ -432,7 +432,7 @@ public class TableService extends BaseCompService {
 			}
 			sql.append(" and  " + col + " = " + ncol);
 		}
-		
+
 		if(dims.size() > 0){
 			sql.append(" group by ");
 			for(int i=0; i<dims.size(); i++){
@@ -500,7 +500,7 @@ public class TableService extends BaseCompService {
 					order.append(",");
 				}
 			}
-			
+
 			//再按row排序
 			for(int i=0; i<table.getRows().size(); i++){
 				DimDto dim = table.getRows().get(i);
@@ -511,8 +511,8 @@ public class TableService extends BaseCompService {
 					order.append(",");
 				}
 			}
-			
-			
+
+
 			if(order.length() <= 11 ){  //判断是否拼接了 order by 字段
 				return sql.toString().replaceAll("@", "'");
 			}else{
@@ -523,7 +523,7 @@ public class TableService extends BaseCompService {
 			return sql.toString().replaceAll("@", "'");
 		}
 	}
-	
+
 	/**
 	 * 创建表格datacenter
 	 * @param sql
@@ -538,7 +538,7 @@ public class TableService extends BaseCompService {
 		ctx.setId("DC-" + IdCreater.create());
 		String name = TemplateManager.getInstance().createTemplate(sql);
 		ctx.getConf().setTemplateName(name);
-		
+
 		//判断指标计算
 		for(KpiDto kpi : dto.getKpiJson()){
 			if(kpi.getCompute() != null && kpi.getCompute().length() > 0){
@@ -560,15 +560,15 @@ public class TableService extends BaseCompService {
 				}
 			}
 		}
-		
+
 		//判断是否有时间偏移的计算
 		for(GridFilterContext filter : this.filters){
 			ctx.getProcess().add(filter);
 		}
-		
+
 		return ctx;
 	}
-	
+
 	/**
 	 * 创建指标排名process
 	 * @param sqlVO
@@ -579,7 +579,7 @@ public class TableService extends BaseCompService {
 		GridSortContext proc = new GridSortContext();
 		proc.setAppendOrder(true);
 		proc.setChangeOldOrder(false);
-		
+
 		//创建排序的分组维
 		StringBuffer sb = new StringBuffer("");
 		StringBuffer orderSb = new StringBuffer("");
@@ -597,7 +597,7 @@ public class TableService extends BaseCompService {
 		proc.setType(orderSb.toString().split(","));
 		return proc;
 	}
-	
+
 	/**
 	 * 创建时间偏移process,时间偏移用来计算同比、环比、上期、同期等值
 	 * @param sqlVO
@@ -641,7 +641,7 @@ public class TableService extends BaseCompService {
 		}
 		return proc;
 	}
-	
+
 	private GridProcContext createMoveAvg(TableQueryDto sqlVO, KpiDto kpi){
 		ComputeMoveAvgContext ctx = new ComputeMoveAvgContext();
 		ctx.setAlias(kpi.getAlias()+"_ydpj");
@@ -649,7 +649,7 @@ public class TableService extends BaseCompService {
 		ctx.setStep(3);
 		return ctx;
 	}
-	
+
 	/**
 	 * 创建占比计算process
 	 */
@@ -662,7 +662,7 @@ public class TableService extends BaseCompService {
 			DimDto dim = sqlVO.getCols().get(i);
 			sb.append(dim.getColname());
 			sb.append(",");
-			
+
 		}
 		if(sb.length() > 0){
 			String str = sb.substring(0, sb.length() - 1);
@@ -670,16 +670,16 @@ public class TableService extends BaseCompService {
 		}
 		return proc;
 	}
-	
+
 	private void loopJsonField(List<DimDto> arrays, List<CrossField> ls, List<KpiDto> kpis, String pos, boolean uselink) throws ParseException{
 		List<CrossField> tmp = ls;
 		for(int i=0; i<arrays.size(); i++){
 			DimDto obj = arrays.get(i);
 			String type = obj.getType();
 			String issum = obj.getIssum();
-			
+
 			if(type.equals("kpiOther")){
-				
+
 				List<CrossField> newCf = new ArrayList<CrossField>();
 				if(tmp.size() == 0){
 					for(KpiDto kpi : kpis){
@@ -701,7 +701,7 @@ public class TableService extends BaseCompService {
 						}else{
 							cf.setDesc(kpi.getKpi_name());  //指标名称
 						}
-						
+
 						//当回调函数和指标预警同时起作用时, 指标预警起作用
 						//处理回调函数
 						cf.setJsFunc(kpi.getFuncname());
@@ -710,7 +710,7 @@ public class TableService extends BaseCompService {
 							code = RSBIUtils.unescape(code);
 							this.scripts.append("function "+cf.getJsFunc()+"(value,col,row,data){"+code+"}");
 						}
-						
+
 						//处理指标预警
 						Map<String, Object> warn = kpi.getWarning();
 						if(warn != null && !warn.isEmpty()){
@@ -719,7 +719,7 @@ public class TableService extends BaseCompService {
 						}
 						tmp.add(cf);
 						newCf.add(cf);
-						
+
 						//判断指标是否需要进行计算
 						if(kpi.getCompute() != null && kpi.getCompute().length() > 0){
 							String[] jss = kpi.getCompute().split(",");  //可能有多个计算,用逗号分隔
@@ -767,7 +767,7 @@ public class TableService extends BaseCompService {
 							}
 							tp.getSubs().add(cf);
 							newCf.add(cf);
-							
+
 							//判断指标是否需要进行计算
 							if(kpi.getCompute() != null && kpi.getCompute().length() > 0){
 								String[] jss = kpi.getCompute().split(",");  //可能有多个计算,用逗号分隔
@@ -781,11 +781,11 @@ public class TableService extends BaseCompService {
 					}
 				}
 				tmp = newCf;
-				
-				
+
+
 			}else if("day".equals(type)){
 				List<CrossField> newCf = new ArrayList<CrossField>();
-				
+
 				if(tmp.size() == 0){
 					CrossField cf = new CrossField();
 					/**
@@ -800,7 +800,7 @@ public class TableService extends BaseCompService {
 					}
 					**/
 					cf.setCasParent(true);
-					
+
 					Integer top = obj.getTop();
 					cf.setTop(top);
 					String topType = obj.getTopType();
@@ -821,7 +821,7 @@ public class TableService extends BaseCompService {
 					cf.setSubs(new ArrayList<CrossField>());
 					tmp.add(cf);
 					newCf.add(cf);
-					
+
 					//添加合计项
 					if("y".equals(issum)){
 						CrossField sumcf = new CrossField();
@@ -835,7 +835,7 @@ public class TableService extends BaseCompService {
 						tmp.add(sumcf);
 						newCf.add(sumcf);
 					}
-					
+
 				}else{
 					for(CrossField tp : tmp){
 						//如果上级是合计,下级不包含维度了
@@ -870,10 +870,10 @@ public class TableService extends BaseCompService {
 						cf.setAliasDesc(alias);
 						cf.setSubs(new ArrayList<CrossField>());
 						cf.setParent(tp);
-						
+
 						tp.getSubs().add(cf);
 						newCf.add(cf);
-						
+
 						//添加合计项
 						if("y".equals(issum)){
 							CrossField sumcf = new CrossField();
@@ -890,7 +890,7 @@ public class TableService extends BaseCompService {
 					}
 				}
 				tmp = newCf;
-				
+
 			}else if("month".equals(type)){
 				List<CrossField> newCf = new ArrayList<CrossField>();
 				if(tmp.size() == 0){
@@ -923,7 +923,7 @@ public class TableService extends BaseCompService {
 					cf.setSubs(new ArrayList<CrossField>());
 					tmp.add(cf);
 					newCf.add(cf);
-					
+
 					//添加合计项
 					if("y".equals(issum)){
 						CrossField sumcf = new CrossField();
@@ -937,7 +937,7 @@ public class TableService extends BaseCompService {
 						tmp.add(sumcf);
 						newCf.add(sumcf);
 					}
-					
+
 				}else{
 					for(CrossField tp : tmp){
 						//如果上级是合计,下级不包含维度了
@@ -972,10 +972,10 @@ public class TableService extends BaseCompService {
 						cf.setAliasDesc(alias);
 						cf.setSubs(new ArrayList<CrossField>());
 						cf.setParent(tp);
-						
+
 						tp.getSubs().add(cf);
 						newCf.add(cf);
-						
+
 						//添加合计项
 						if("y".equals(issum)){
 							CrossField sumcf = new CrossField();
@@ -1018,7 +1018,7 @@ public class TableService extends BaseCompService {
 					cf.setSubs(new ArrayList<CrossField>());
 					tmp.add(cf);
 					newCf.add(cf);
-					
+
 					//添加合计项
 					if("y".equals(issum)){
 						CrossField sumcf = new CrossField();
@@ -1031,7 +1031,7 @@ public class TableService extends BaseCompService {
 						sumcf.setSubs(new ArrayList<CrossField>());
 						tmp.add(sumcf);
 						newCf.add(sumcf);
-						
+
 						//如果是col,需要给合计添加指标
 						/**
 						if(pos.equals("col")){
@@ -1055,12 +1055,12 @@ public class TableService extends BaseCompService {
 						}
 						**/
 					}
-					
+
 				}else{
 					for(CrossField tp : tmp){
 						//如果上级是合计,下级不包含维度了, 但需要包含指标
 						if(tp.getType().equals("none")){
-							
+
 							//如果是col,需要给合计添加指标
 							if(pos.equals("col")){
 								for(KpiDto kpi : kpis){
@@ -1079,7 +1079,7 @@ public class TableService extends BaseCompService {
 									kpicf.setParent(tp);
 								}
 							}
-							
+
 							continue;
 						}
 						CrossField cf = new CrossField();
@@ -1097,7 +1097,7 @@ public class TableService extends BaseCompService {
 							cf.setAliasDesc(tableColName);
 						}
 						cf.setCasParent(true);
-						
+
 						cf.setTop(obj.getTop());
 						cf.setTopType(obj.getTopType());
 						cf.setUselink(uselink);
@@ -1107,7 +1107,7 @@ public class TableService extends BaseCompService {
 						cf.setParent(tp);
 						tp.getSubs().add(cf);
 						newCf.add(cf);
-						
+
 						//添加合计项
 						if("y".equals(issum)){
 							CrossField sumcf = new CrossField();
@@ -1125,10 +1125,10 @@ public class TableService extends BaseCompService {
 				}
 				tmp = newCf;
 			}
-			
+
 		}
-	}	
-	
+	}
+
 	public List<RowDimContext> getDrillDim(TableQueryDto table){
 		List<Map<String, Object>> drillDim = table.getDrillDim();
 		if(drillDim == null || drillDim.isEmpty() || table.getCols().size() != 1){  //只有一个row维度才能启用钻取
@@ -1146,28 +1146,28 @@ public class TableService extends BaseCompService {
 		}
 		return ret;
 	}
-	
+
 	public String createWarning(Map<String, Object> warn, String kpiFmt, StringBuffer scripts ){
 		String funcName = "warn"+ IdCreater.create();
 		scripts.append("function " +funcName+"(val, a, b, c, d){");
 		//先输出值
-		//scripts.append("if(d == 'json'){out.print('<span class=\"kpiValue\">');}");
-		scripts.append("if(val == null){out.print('-')}else{out.print(val, '"+kpiFmt+"');}");
+		scripts.append("var ret = '';");
+		scripts.append("if(val == null){ret += ('-')}else{ret += utils.numberFmt(val, '"+kpiFmt+"');}");
 		scripts.append("if(d != 'json'){"); //只在html模式下起作用
-		scripts.append(" return;");
+		scripts.append(" return ret;");
 		scripts.append("}");
 		scripts.append("if(val "+warn.get("logic1")+" "+warn.get("val1")+"){");
-		scripts.append("out.print(\"<span class='"+warn.get("pic1")+"'></span>\")");
+		scripts.append("ret += (\"<span class='"+warn.get("pic1")+"'></span>\")");
 		scripts.append("}else if(val "+(warn.get("logic1").equals(">=")?"<":"<=")+" "+warn.get("val1")+" && val "+warn.get("logic2")+" "+warn.get("val2")+"){");
-		scripts.append("out.print(\"<span class='"+warn.get("pic2")+"'></span>\")");
+		scripts.append("ret += (\"<span class='"+warn.get("pic2")+"'></span>\")");
 		scripts.append("}else{");
-		scripts.append("out.print(\"<span class='"+warn.get("pic3")+"'></span>\")");
+		scripts.append("ret += (\"<span class='"+warn.get("pic3")+"'></span>\")");
 		scripts.append("}");
-		//scripts.append("if(d == 'html'){out.print('</span>');}");
+		scripts.append("return ret;");
 		scripts.append("}");
-		return funcName; 
+		return funcName;
 	}
-	
+
 	private CrossField kpiCompute(String compute, KpiDto kpi){
 		CrossField cf = new CrossField();
 		if("zb".equals(compute)){
@@ -1240,5 +1240,5 @@ public class TableService extends BaseCompService {
 	public StringBuffer getScripts() {
 		return scripts;
 	}
-	
+
 }