|
|
import miment from 'miment'
|
|
|
import {getData} from '@/api/bigscreen'
|
|
|
|
|
|
export default {
|
|
|
data() {
|
|
|
return {
|
|
|
// form select-input key
|
|
|
selectInput: {
|
|
|
keyname: '',
|
|
|
keyword: ''
|
|
|
},
|
|
|
|
|
|
//日期时间快捷选项
|
|
|
datetimeRangePickerOptions: {
|
|
|
shortcuts: [{
|
|
|
text: '今天',
|
|
|
onClick(picker) {
|
|
|
const end = new Date();
|
|
|
const start = new Date(new Date(new Date().getTime()).setHours(0, 0, 0, 0));
|
|
|
picker.$emit('pick', [start, end]);
|
|
|
}
|
|
|
}, {
|
|
|
text: '昨天',
|
|
|
onClick(picker) {
|
|
|
const start = new Date(new Date(new Date().getTime() - 24 * 60 * 60 * 1000).setHours(0, 0, 0, 0));
|
|
|
const end = new Date(new Date(new Date().getTime() - 24 * 60 * 60 * 1000).setHours(23, 59, 59, 999));
|
|
|
picker.$emit('pick', [start, end]);
|
|
|
}
|
|
|
}, {
|
|
|
text: '最近一周',
|
|
|
onClick(picker) {
|
|
|
const end = new Date();
|
|
|
const start = new Date();
|
|
|
start.setTime(miment().add(-1, 'ww').stamp());
|
|
|
picker.$emit('pick', [start, end]);
|
|
|
}
|
|
|
}, {
|
|
|
text: '最近一个月',
|
|
|
onClick(picker) {
|
|
|
const end = new Date();
|
|
|
const start = new Date();
|
|
|
start.setTime(miment().add(-1, 'MM').stamp());
|
|
|
picker.$emit('pick', [start, end]);
|
|
|
}
|
|
|
}, {
|
|
|
text: '最近三个月',
|
|
|
onClick(picker) {
|
|
|
const end = new Date();
|
|
|
const start = new Date();
|
|
|
start.setTime(miment().add(-3, 'MM').stamp());
|
|
|
picker.$emit('pick', [start, end]);
|
|
|
}
|
|
|
}],
|
|
|
// disabledDate(time){
|
|
|
// return time.getTime() > Date.now()
|
|
|
// }
|
|
|
},
|
|
|
}
|
|
|
},
|
|
|
computed: {},
|
|
|
created() {
|
|
|
},
|
|
|
mounted() {
|
|
|
},
|
|
|
destroyed() {
|
|
|
},
|
|
|
methods: {
|
|
|
// 搜索重置搜索页码
|
|
|
search() {
|
|
|
this.params.currentPage = 1;
|
|
|
this.queryByPage();
|
|
|
},
|
|
|
// 把selectInput中的值赋到params查询对象中
|
|
|
parseParamsBySelectInput(keyname, keyword) {
|
|
|
if (this.params === undefined || this.params === null) {
|
|
|
console.warn('query form must bind to params object in vue data')
|
|
|
return
|
|
|
}
|
|
|
// if (!this.params.hasOwnProperty(keyname)) {
|
|
|
// console.warn('params has no field:' + keyname)
|
|
|
// return
|
|
|
// }
|
|
|
if (keyword !== undefined) {
|
|
|
this.params[keyname] = keyword.trim()
|
|
|
}
|
|
|
},
|
|
|
resetForm(data) {
|
|
|
let formKeys = Object.keys(data)
|
|
|
for (let k of formKeys) {
|
|
|
data[k] = null
|
|
|
}
|
|
|
},
|
|
|
handlerInputchange(val) {
|
|
|
this.parseParamsBySelectInput(this.selectInput.keyname, val)
|
|
|
},
|
|
|
// 查询echarts 数据
|
|
|
queryEchartsData(params) {
|
|
|
return new Promise(async (resolve) => {
|
|
|
const {code, data} = await getData(params);
|
|
|
if (code != 200) return
|
|
|
const analysisData = this.analysisChartsData(params, data);
|
|
|
resolve(analysisData)
|
|
|
})
|
|
|
},
|
|
|
// 解析不同图标的数据
|
|
|
analysisChartsData(params, data) {
|
|
|
// widget-barchart 柱线图、widget-linechart 折线图、 widget-barlinechart 柱线图
|
|
|
// widget-piechart 饼图、widget-funnel 漏斗图
|
|
|
// widget-gauge 仪表盘
|
|
|
// widget-text 文本框
|
|
|
// widge-table 表格(数据不要转)
|
|
|
// widget-stackchart 堆叠图
|
|
|
const chartType = params.chartType
|
|
|
if (
|
|
|
chartType == "widget-barchart" ||
|
|
|
chartType == "widget-linechart" ||
|
|
|
chartType == "widget-barlinechart"
|
|
|
) {
|
|
|
return this.barOrLineChartFn(params.chartProperties, data);
|
|
|
} else if (
|
|
|
chartType == "widget-piechart" ||
|
|
|
chartType == "widget-funnel"
|
|
|
) {
|
|
|
return this.piechartFn(params.chartProperties, data);
|
|
|
} else if (chartType == "widget-text") {
|
|
|
return this.widgettext(params.chartProperties, data)
|
|
|
} else if (chartType == "widget-stackchart") {
|
|
|
return this.stackChartFn(params.chartProperties, data)
|
|
|
} else {
|
|
|
return data
|
|
|
}
|
|
|
},
|
|
|
// 柱状图、折线图、折柱图
|
|
|
barOrLineChartFn(chartProperties, data) {
|
|
|
const ananysicData = {};
|
|
|
const xAxisList = [];
|
|
|
const series = [];
|
|
|
for (const key in chartProperties) {
|
|
|
const obj = {};
|
|
|
const seriesData = [];
|
|
|
const value = chartProperties[key];
|
|
|
obj["type"] = value;
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
if (value.startsWith("xAxis")) {
|
|
|
// 代表为x轴
|
|
|
xAxisList[i] = data[i][key];
|
|
|
} else {
|
|
|
// 其他的均为series展示数据
|
|
|
seriesData[i] = data[i][key];
|
|
|
}
|
|
|
}
|
|
|
obj["data"] = seriesData;
|
|
|
if (!obj["type"].startsWith("xAxis")) {
|
|
|
series.push(obj);
|
|
|
}
|
|
|
}
|
|
|
ananysicData["xAxis"] = xAxisList;
|
|
|
ananysicData["series"] = series;
|
|
|
return ananysicData;
|
|
|
},
|
|
|
//堆叠图
|
|
|
stackChartFn(chartProperties, data) {
|
|
|
const ananysicData = {};
|
|
|
const series = [];
|
|
|
//全部字段字典值
|
|
|
const types = Object.values(chartProperties)
|
|
|
//x轴字段、y轴字段名
|
|
|
const xAxisField = Object.keys(chartProperties)[types.indexOf('xAxis')]
|
|
|
const yAxisField = Object.keys(chartProperties)[types.indexOf('yAxis')]
|
|
|
//x轴数值去重,y轴去重
|
|
|
const xAxisList = this.setUnique(data.map(item => item[xAxisField]))
|
|
|
const yAxisList = this.setUnique(data.map(item => item[yAxisField]))
|
|
|
const dataGroup = this.setGroupBy(data, yAxisField)
|
|
|
|
|
|
for (const key in chartProperties) {
|
|
|
if (chartProperties[key] !== 'yAxis' && !chartProperties[key].startsWith('xAxis')) {
|
|
|
Object.keys(dataGroup).forEach(item => {
|
|
|
const data = new Array(yAxisList.length).fill(0)
|
|
|
dataGroup[item].forEach(res => {
|
|
|
data[xAxisList.indexOf(res[xAxisField])]= res[key]
|
|
|
})
|
|
|
series.push({
|
|
|
name: yAxisList[item],
|
|
|
type: chartProperties[key],
|
|
|
data,
|
|
|
})
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
ananysicData["xAxis"] = xAxisList;
|
|
|
ananysicData["series"] = series;
|
|
|
return ananysicData;
|
|
|
},
|
|
|
// 饼图、漏斗图
|
|
|
piechartFn(chartProperties, data) {
|
|
|
const ananysicData = [];
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
const obj = {};
|
|
|
for (const key in chartProperties) {
|
|
|
const value = chartProperties[key];
|
|
|
if (value === "name") {
|
|
|
obj["name"] = data[i][key];
|
|
|
} else {
|
|
|
obj["value"] = data[i][key];
|
|
|
}
|
|
|
}
|
|
|
ananysicData.push(obj);
|
|
|
}
|
|
|
return ananysicData;
|
|
|
},
|
|
|
/*gaugeFn(chartProperties, data) {
|
|
|
const ananysicData = [];
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
const obj = {};
|
|
|
for (const key in chartProperties) {
|
|
|
const value = chartProperties[key];
|
|
|
if (value === "name") {
|
|
|
obj["name"] = data[i][key];
|
|
|
} else {
|
|
|
obj["value"] = data[i][key];
|
|
|
}
|
|
|
}
|
|
|
if (!obj["unit"]) {
|
|
|
obj["unit"] = "%";
|
|
|
}
|
|
|
ananysicData.push(obj);
|
|
|
}
|
|
|
return ananysicData[0];
|
|
|
},*/
|
|
|
widgettext(chartProperties, data) {
|
|
|
const ananysicData = [];
|
|
|
for (let i = 0; i < data.length; i++) {
|
|
|
const obj = {};
|
|
|
for (const key in chartProperties) {
|
|
|
const value = chartProperties[key];
|
|
|
if (value === "name") {
|
|
|
} else {
|
|
|
obj["value"] = data[i][key];
|
|
|
}
|
|
|
}
|
|
|
ananysicData.push(obj);
|
|
|
}
|
|
|
return ananysicData;
|
|
|
},
|
|
|
setUnique(arr) {
|
|
|
let newArr = [];
|
|
|
arr.forEach(item => {
|
|
|
return newArr.includes(item) ? '' : newArr.push(item);
|
|
|
});
|
|
|
return newArr;
|
|
|
},
|
|
|
setGroupBy(array, name) {
|
|
|
const groups = {}
|
|
|
array.forEach(function (o) {
|
|
|
const group = JSON.stringify(o[name])
|
|
|
groups[group] = groups[group] || []
|
|
|
groups[group].push(o)
|
|
|
})
|
|
|
return Object.keys(groups).map(function (group) {
|
|
|
return groups[group]
|
|
|
})
|
|
|
},
|
|
|
},
|
|
|
watch: {
|
|
|
'selectInput.keyname'(newVal, oldVal) {
|
|
|
this.resetForm(this.params)
|
|
|
this.params.currentPage = 1
|
|
|
this.params.pageSize = 10
|
|
|
this.parseParamsBySelectInput(newVal, this.selectInput.keyword)
|
|
|
},
|
|
|
'selectInput.keyword'(newVal, oldVal) {
|
|
|
if (!this.selectInput.keyname) return
|
|
|
this.parseParamsBySelectInput(this.selectInput.keyname, newVal)
|
|
|
}
|
|
|
// 'selectInput.keyword'(newVal, oldVal) {
|
|
|
// this.parseParamsBySelectInput(this.selectInput.keyname, newVal)
|
|
|
// }
|
|
|
}
|
|
|
}
|