report-ui/src/mixins/queryform.js

451 lines
14 KiB
JavaScript
Raw Normal View History

2024-01-31 14:12:08 +08:00
import miment from 'miment'
2024-03-02 22:16:39 +08:00
import { getData } from '@/api/bigscreen'
2024-01-31 14:12:08 +08:00
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)
},
2024-03-05 17:41:14 +08:00
// 接口文档:
2024-03-02 22:16:39 +08:00
// {
2024-03-05 17:41:14 +08:00
// "code": 200,
// "message": "success",
// "result": {
// "chartType": "widget-barchart",
// "data": [
// XXX
// ]
2024-03-02 22:16:39 +08:00
// }
// }
2024-01-31 14:12:08 +08:00
queryEchartsData(params) {
return new Promise(async (resolve) => {
2024-03-02 22:16:39 +08:00
console.log('查询参数为', params)
2024-03-05 17:41:14 +08:00
const reqData = await getData(params);
2024-03-05 18:20:22 +08:00
if (reqData == null) {
return
}
if (reqData.code !== 200) {
this.$message.error("查询数据异常", reqData.message);
2024-03-02 22:16:39 +08:00
return
}
2024-03-05 17:41:14 +08:00
const data = reqData.result
console.log('查询结果为', data)
//判断data的chartType和params的chartType是否一致
if (data.chartType != params.chartType) {
2024-03-02 22:16:39 +08:00
this.$message.error("查询数据类型不匹配");
return
} else {
resolve(data.data)
}
2024-01-31 14:12:08 +08:00
})
},
2024-03-02 22:16:39 +08:00
2024-01-31 14:12:08 +08:00
/**
* 将url参数解析到图表参数中
* 1. tenantCode=aaa
* 2. [setCode].tenantCode=aaa
* 判断是否有点(.)
* a. 没有 -> 把所有的参数全部给插入contextData
* b. -> 点前缀的值去匹配相同的值再把对应的值插入contextData
*
* **/
toEchartsDataQueryParams(params) {
const queryParams = this.deepClone(params)
const query = this.$route.query
2024-03-02 22:16:39 +08:00
if (!this.isIncludePoints(query)) {
2024-01-31 14:12:08 +08:00
queryParams.contextData = { ...queryParams.contextData, ...query }
} else {
Object.keys(query).forEach(item => {
2024-03-02 22:16:39 +08:00
if (item.indexOf('.') > -1) {
2024-01-31 14:12:08 +08:00
const obj = {}
const key1 = item.split('.')[0]
const key2 = item.split('.')[1]
obj[key2] = query[item]
if (queryParams.setCode == key1) {
const newObj = { ...queryParams.contextData, ...obj }
queryParams.contextData = newObj
}
}
})
}
return queryParams
},
// 判断对象是否包含点
isIncludePoints(query) {
let isPoints = false
Object.keys(query).forEach(item => {
2024-03-02 22:16:39 +08:00
if (item.indexOf('.') > -1) {
2024-01-31 14:12:08 +08:00
isPoints = true
}
})
return isPoints
},
// 解析不同图标的数据
analysisChartsData(params, data) {
// widget-barchart 柱线图、widget-linechart 折线图、 widget-barlinechart 柱线图
// widget-piechart 饼图、widget-funnel 漏斗图
// widget-text 文本框
// widge-table 表格(数据不要转)
// widget-stackchart 堆叠图
// widget-heatmap 热力图
// widget-mapline 中国地图-路线图
// widget-radar 雷达图
// widget-select 下拉框
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" ||
chartType == "widget-scale"
) {
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 if (chartType == "widget-coord") {
return this.coordChartFn(params.chartProperties, data)
} else if (chartType == "widget-linemap") {
return this.linemapChartFn(params.chartProperties, data)
} else if (chartType == "widget-radar") {
return this.radarChartFn(params.chartProperties, data)
} else if (chartType == "widget-select") {
return this.selectChartFn(params.chartProperties, data)
} else if (chartType == "widget-mapv2chart") {
return this.mapLLChartFn(params.chartProperties, data)
} else {
return data
}
},
// 柱状图、折线图、柱线图
barOrLineChartFn(chartProperties, data) {
const analysisData = {};
const xAxisList = [];
const series = [];
for (const key in chartProperties) {
const obj = {};
const seriesData = [];
const value = chartProperties[key];
obj["type"] = value;
obj["name"] = key;
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);
}
}
analysisData["xAxis"] = xAxisList;
analysisData["series"] = series;
return analysisData;
},
//堆叠图
stackChartFn(chartProperties, data) {
const analysisData = {};
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')]
const dataField = Object.keys(chartProperties)[types.indexOf('bar')]
//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(xAxisList.length).fill(0)
dataGroup[item].forEach(res => {
data[xAxisList.indexOf(res[xAxisField])] = res[key]
})
series.push({
name: yAxisList[item],
type: chartProperties[key],
data: data,
})
})
}
}
analysisData["xAxis"] = xAxisList;
analysisData["series"] = series;
return analysisData;
},
// 饼图、漏斗图
piechartFn(chartProperties, data) {
const analysisData = [];
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];
}
}
analysisData.push(obj);
}
return analysisData;
},
widgettext(chartProperties, data) {
const analysisData = [];
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];
}
}
analysisData.push(obj);
}
return analysisData;
},
// 坐标系数据解析
coordChartFn(chartProperties, data) {
const analysisData = {};
let series = [];
//全部字段字典值
const types = Object.values(chartProperties)
//x轴字段、y轴字段、数值字段名
const xAxisField = Object.keys(chartProperties)[types.indexOf('xAxis')]
const yAxisField = Object.keys(chartProperties)[types.indexOf('yAxis')]
const dataField = Object.keys(chartProperties)[types.indexOf('series')]
//x轴数值去重y轴去重
const xAxisList = this.setUnique(data.map(item => item[xAxisField]))
const yAxisList = this.setUnique(data.map(item => item[yAxisField]))
analysisData["xAxis"] = xAxisList;
analysisData["yAxis"] = yAxisList;
for (const i in data) {
series[i] = [data[i][xAxisField], data[i][yAxisField], data[i][dataField]];
}
analysisData["series"] = series;
return analysisData;
},
// 中国地图。路线图数据解析适合source、target、value
linemapChartFn(chartProperties, data) {
const analysisData = [];
for (let i = 0; i < data.length; i++) {
const obj = {};
for (const key in chartProperties) {
const value = chartProperties[key];
if (value === "source") {
obj["source"] = data[i][key];
} else if (value === "target") {
obj["target"] = data[i][key];
} else {
obj["value"] = data[i][key];
}
}
analysisData.push(obj);
}
return analysisData;
},
// 雷达图
radarChartFn(chartProperties, data) {
const analysisData = {};
// 字段名
const radarField = [];
let nameField;
for (const key in chartProperties) {
if (chartProperties[key] == 'radar') {
radarField.push(key)
}
if (chartProperties[key] == 'name') {
nameField = key;
}
}
// 拿到数值
analysisData["name"] = nameField;
analysisData["keys"] = radarField;
analysisData["value"] = data;
return analysisData;
},
// 下拉框
selectChartFn(chartProperties, data) {
let valueField;
let labelField;
for (const key in chartProperties) {
if (chartProperties[key] == "value") {
valueField = key;
}
if (chartProperties[key] == "label") {
labelField = key;
}
}
if (valueField == null && labelField != null) {
valueField = labelField;
}
if (labelField == null && valueField != null) {
labelField = valueField
}
const analysisData = [];
for (let i = 0; i < data.length; i++) {
const obj = {};
obj["value"] = data[i][valueField];
obj["label"] = data[i][labelField];
analysisData.push(obj);
}
return analysisData;
},
// 地图带经纬度数据解析
mapLLChartFn(chartProperties, data) {
const analysisData = [];
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 if (value === "longitude") {
obj["longitude"] = Number(data[i][key]);
} else if (value === "latitude") {
obj["latitude"] = Number(data[i][key]);
} else {
obj["value"] = data[i][key];
}
}
analysisData.push(obj);
}
return analysisData;
},
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)
// }
}
}