rsbi 4 роки тому
батько
коміт
1e54f1dce7

+ 37 - 13
src/view/bireport/ParamFilter.vue

@@ -22,6 +22,7 @@
 				<el-date-picker
 				v-model="st"
 				type="month"
+				value-format="yyyy-MM"
 				placeholder="选择月份">
 				</el-date-picker>
 			</div>
@@ -30,6 +31,7 @@
 				<el-date-picker
 				v-model="end"
 				type="month"
+				value-format="yyyy-MM"
 				placeholder="选择月份">
 				</el-date-picker>
 			</div>
@@ -42,6 +44,7 @@
 				<el-date-picker
 				v-model="st"
 				type="date"
+				value-format="yyyy-MM-dd"
 				placeholder="选择日期">
 				</el-date-picker>
 			</div>
@@ -50,6 +53,7 @@
 				<el-date-picker
 				v-model="end"
 				type="date"
+				value-format="yyyy-MM-dd"
 				placeholder="选择日期">
 				</el-date-picker>
 			</div>
@@ -66,7 +70,7 @@
 	import {ajax} from '@/common/biConfig'
 	import $ from 'jquery'
 	import { Loading } from "element-ui"
-	import {findParamById} from '@/view/bireport/bireportUtils'
+	import {findParamById,msginfo} from '@/view/bireport/bireportUtils'
 
 	export default {
 		props:{
@@ -82,9 +86,9 @@
 				param:{},
 				checkList:[],
 				dimValus:[],
-				st:"",  //日期/月份的开始日期
-				end:"",	//日期/月份的结束日期,
-				search:""
+				st:null,  //日期/月份的开始日期
+				end:null,	//日期/月份的结束日期,
+				search:null
 			}
 		},
 		mounted(){
@@ -99,8 +103,8 @@
 				this.param = p;
 				this.dimValus = [];
 				this.checkList = p.vals || [];
-				this.st = [];
-				this.end = [];
+				this.st = p.st?p.st: null;
+				this.end = p.end?p.end:null;
 				let load = Loading.service({ fullscreen: true });
 				ajax({
 					url:"bireport/paramFilter.action",
@@ -111,16 +115,36 @@
 				}, this, load);
 			},
 			save(){
-				this.param.vals = this.checkList;
-				var strs = [];
-				this.checkList.forEach(e=>{
-					let t = this.dimValus.filter(m=>m.id===e)[0];
-					strs.push(t.name);
-				});
-				this.param.valStrs = strs;
+				let p = this.param;
+				if(p.type === 'month'){
+					p.st =  this.st;
+					p.end =  this.end;
+					//判断是否st < ed
+					if(Number(p.st) > Number(p.end)){
+						msginfo("您选择的开始月份不能大于结束月份。", "error");
+						return;
+					}
+				}else if(p.type === 'day'){
+					p.st =  this.st;
+					p.end =  this.end;
+					//判断是否st < ed
+					if(Number(p.st.replace(/-/g, "")) > Number(p.end.replace(/-/g, ""))){
+						msginfo("您选择的开始日期不能大于结束日期。", "error");
+						return;
+					}
+				}else{
+					this.param.vals = this.checkList;
+					var strs = [];
+					this.checkList.forEach(e=>{
+						let t = this.dimValus.filter(m=>m.id===e)[0];
+						strs.push(t.name);
+					});
+					this.param.valStrs = strs;
+				}
 				this.show = false;
 				//刷新组件
 				this.$parent.$refs['paramForm'].$forceUpdate();
+				this.$parent.$refs['tableForm'].tableView();
 			},
 			searchme(){
 				let load = Loading.service({ fullscreen: true });

+ 23 - 1
src/view/bireport/ReportParam.vue

@@ -4,7 +4,7 @@
 			<div class="ptabhelpr">拖拽维度到此处作为筛选条件</div>
 			<template v-for="(p) in pageInfo.params">
 				<span :key="p.id" class="pppp">
-					<span title="筛选" @click="paramFilter(p.id, p.type, p.name)" class="text">{{p.name}}({{p.valStrs&&p.valStrs.length>0?p.valStrs.join(","):"无"}})</span>
+					<span title="筛选" @click="paramFilter(p.id, p.type, p.name)" class="text">{{p.name}}({{ paramsDisp(p) }})</span>
 					<button class="btn btn-default btn-xs" title="删除" @click.stop="deleteParam(p.id)"><i class="fa fa-remove"></i></button>
 				</span>
 			</template>
@@ -31,8 +31,30 @@
 			this.paramDrop();
 		},
 		computed: {
+			//ccc: {
+			//	get:function(){
+					//return "abc";
+			//	}
+				//var s = p.valStrs&&p.valStrs.length>0?p.valStrs.join(","):"无";
+				//return 'abc';
+			// }
 		},
 		methods: {	
+			paramsDisp(p){
+				if(p.type === 'day' || p.type === 'month'){
+					if(p.st && p.end){
+						return p.st + "至" + p.end
+					}else{
+						return "无";
+					}
+				}else{
+					if(p.valStrs&&p.valStrs.length>0){
+						return p.valStrs.join(",");
+					}else{
+						return "无";
+					}
+				}
+			},
 			/**
 			 * 参数接受拖拽事件
 			 */

Різницю між файлами не показано, бо вона завелика
+ 194 - 42
src/view/bireport/ReportTable.vue


+ 5 - 5
src/view/bireport/bireportUtils.js

@@ -33,11 +33,11 @@ export const findCompById = (id, pageInfo)=>{
 	return ret;
 }
 export const msginfo = (msg, type)=>{
-    if(!type){
-        Message.error({message:msg, type:"info",showClose: true });
-    }else{
-        Message.success({message:msg, type:"success",showClose: true});
-    }
+	if(!type || type === 'error'){
+		Message.error({message:msg, type:"error",showClose: true});
+	}else{
+		Message.success({message:msg, type:"success",showClose: true});
+	}
 }
 
 export const kpiExist = (kpiId, kpis)=>{

+ 245 - 0
src/view/bireport/tableUtils.js

@@ -0,0 +1,245 @@
+/**
+ * 表格的工具类
+ */
+import $ from 'jquery'
+import * as tools from '@/view/bireport/bireportUtils'
+
+export const dimsort = (tp, dim, pos, comp, cb)=>{
+	dim.dimord = tp;
+	//进行维度排序时,清除度量的排序信息
+	for(let i=0; i<comp.kpiJson.length; i++){
+		comp.kpiJson[i].sort = '';
+	}
+	if(cb){
+		cb();
+	}
+}
+export function changecolrow(comp, cb){
+	var tmp = comp.rows;
+	comp.rows = comp.cols;
+	comp.cols = tmp;
+	if(cb){
+		cb();
+	}
+}
+
+export function dimmove(tp, dim, pos, comp, cb){
+	var dims = null;
+	if(pos == 'col'){
+		dims = comp.cols;
+	}else{
+		dims = comp.rows;
+	}
+	if(dims.length <= 1){
+		tools.msginfo('无效移动。', "error");
+		return;
+	}
+	for(var i=0; i<dims.length; i++){
+		if(dims[i].id == dim.id){
+			if(tp == 'left'){
+				if(i <= 0){
+					tools.msginfo('无效移动。', "error");
+					return;
+				}else{
+					var tp = dims[i - 1];
+					dims[i - 1] = dims[i];
+					dims[i] = tp;
+					if(cb){
+						cb();
+					}
+					return;
+				}
+			}else
+			if(tp == 'right'){
+				if( i >= dims.length - 1){
+					tools.msginfo('无效移动。', "error");
+					return;
+				}else{
+					var tp = dims[i + 1];
+					dims[i + 1] = dims[i];
+					dims[i] = tp;
+					if(cb){
+						cb();
+					}
+					return;
+				}
+			}
+			break;
+		}
+	}
+}
+//维度交换行列
+export function dimexchange(dim, pos, comp, cb){	
+	if(pos == 'col'){
+		//先移除维度
+		var idx = 0;
+		var tmp = null;
+		var dims = comp.cols;
+		for(var i=0; i<dims.length; i++){
+			if(dims[i].id == dim.id){
+				idx = i;
+				tmp = dims[i];
+				break;
+			}
+		}
+		//如果维度有分组,分组必须相同
+		var group = tmp.grouptype;
+		if(group != null && tools.findGroup(comp.cols, group, tmp)){
+			tools.msginfo("移动失败,同一分组的维度必须在同一行/列标签。", "error");
+			return;
+		}
+		comp.cols.splice(idx, 1);
+		//再添加维度
+		comp.rows.push(tmp);
+	}else
+	if(pos == 'row'){
+		//先移除维度
+		var idx = 0;
+		var tmp = null;
+		var dims = comp.rows;
+		for(var i=0; i<dims.length; i++){
+			if(dims[i].id == dim.id){
+				idx = i;
+				tmp = dims[i];
+				break;
+			}
+		}
+		//如果维度有分组,分组必须相同
+		var group = tmp.grouptype;
+		if(group != null && tools.findGroup(comp.rows, group, tmp)){
+			tools.msginfo("移动失败,同一分组的维度必须在同一行/列标签。", "error");
+			return;
+		}
+		comp.rows.splice(idx, 1);
+		//再添加维度
+		comp.cols.push(tmp);
+	}
+	if(cb){
+		cb();
+	}
+}
+//从表格JSON中删除KPI
+export function delJsonKpiOrDim(tp, id, pos, comp, pageInfo, cb){
+	if(tp == 'kpi'){
+		var kpis = comp.kpiJson;
+		var idx = -1;
+		for(var i=0; i<kpis.length; i++){
+			if(kpis[i].kpi_id == id){
+				idx = i;
+				break;
+			}
+		}
+		kpis.splice(idx, 1);
+	}
+	if(tp == 'dim'){
+		var dims = null;
+		if(pos == 'col'){
+			dims = comp.cols;
+		}else{
+			dims = comp.rows;
+		}
+		var idx = -1;
+		for(var i=0; i<dims.length; i++){
+			if(dims[i].id == id){
+				idx = i
+				break;
+			}
+		}
+		dims.splice(idx, 1);
+		//如果删除维度后无时间维度,并且度量中含有计算度量,需要清除计算度量内容
+		if(!isExistDateDim(comp, 'table')){
+			for(var j=0; comp.kpiJson&&j<comp.kpiJson.length; j++){
+				delete comp.kpiJson[j].compute;
+			}
+		}
+		//如果有参数,并且参数是时间维度,如果参数时间类型表格中没有,移除计算度量
+		if(!paramsamedimdate(comp, pageInfo)){
+			for(var j=0; comp.kpiJson&&j<comp.kpiJson.length; j++){
+				delete comp.kpiJson[j].compute;
+			}
+		}
+	}
+	if(cb){
+		cb();
+	}
+}
+/**
+判断是否存在date类型的维度,比如day/month/quarter/year
+**/
+function isExistDateDim(comp, tp){
+	var ret = false;
+	if(tp == 'table'){
+		if(!comp.cols){
+			return ret;
+		}
+		for(var i=0; i<comp.cols.length; i++){
+			var tp = comp.cols[i].type;
+			if(tp == 'year' || tp == 'quarter' || tp == 'month' || tp == 'day'){
+				ret = true;
+				break;
+			}
+		}
+		if(!comp.rows){
+			return ret;
+		}
+		for(var i=0; i<comp.rows.length; i++){
+			var tp = comp.rows[i].type;
+			if(tp == 'year' || tp == 'quarter' || tp == 'month' || tp == 'day'){
+				ret = true;
+				break;
+			}
+		}
+	}
+	if(tp == 'chart'){
+		if(!comp.chartJson || !comp.chartJson.params){
+			return ret;
+		}
+		for(var i=0; i<comp.chartJson.params.length; i++){
+			var tp = comp.chartJson.params[i].type;
+			if(tp == 'year' || tp == 'quarter' || tp == 'month' || tp == 'day'){
+				ret = true;
+				break;
+			}
+		}
+		if(!comp.chartJson || !comp.chartJson.xcol){
+			return ret;
+		}
+		var xtype = comp.chartJson.xcol.type;
+		if(xtype == 'year' || xtype == 'quarter' || xtype == 'month' || xtype == 'day'){
+			ret = true;
+		}
+	}
+	return ret;
+}
+/**
+判断是否有时间参数,如果有,必须表格组件中也具有相同的参数
+**/
+function paramsamedimdate(comp, pageInfo){
+	var same = true;
+	var exist = function(input){
+		var ret = false;
+		for(var i=0; comp.cols&&i<comp.cols.length; i++){
+			if(comp.cols[i].type == input){
+				ret = true;
+				break;
+			}
+		}
+		for(var i=0; comp.rows&&i<comp.rows.length; i++){
+			if(comp.rows[i].type == input){
+				ret = true;
+				break;
+			}
+		}
+		return ret;
+	}
+	var params = pageInfo.params;
+	for(let i=0; params&&i<params.length; i++){
+		if(params[i].type == "year" || params[i].type == "quarter" || params[i].type == "month" || params[i].type == "day"){
+			if(!exist(params[i].type)){
+				same = false;
+				break;
+			}
+		}
+	}
+	return same;
+}