558 lines
15 KiB
Vue
558 lines
15 KiB
Vue
<template>
|
||
<div
|
||
class="searchBarBox divHeight"
|
||
ref="searchBarRef">
|
||
<el-form
|
||
:inline="true"
|
||
class="demo-form-inline">
|
||
<span class="blue-block"></span>
|
||
<el-form-item
|
||
label="能源类型"
|
||
required>
|
||
<el-select
|
||
v-model="queryParams.energyTypeId"
|
||
placeholder="请选择"
|
||
style="width: 150px"
|
||
@change="chooseType"
|
||
filterable
|
||
size="small">
|
||
<el-option
|
||
v-for="item in energyTypeList"
|
||
:key="item.id"
|
||
:label="item.labelName"
|
||
:value="item.id"></el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item
|
||
label="时间维度"
|
||
required>
|
||
<el-select
|
||
v-model="queryParams.timeDim"
|
||
placeholder="请选择"
|
||
style="width: 80px"
|
||
size="small">
|
||
<el-option
|
||
v-for="item in getDictDatas(this.DICT_TYPE.TIME_DIM)"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value"></el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item
|
||
label="时间范围"
|
||
required>
|
||
<div v-show="queryParams.timeDim === '1'">
|
||
<el-date-picker
|
||
v-model="timeValue"
|
||
type="datetimerange"
|
||
range-separator="至"
|
||
start-placeholder="开始日期"
|
||
end-placeholder="结束日期"
|
||
format="yyyy-MM-dd HH:mm"
|
||
value-format="timestamp"
|
||
:picker-options="pickerOptions"
|
||
popper-class="noneMinute"
|
||
@change="timeSelect"
|
||
size="small"
|
||
style="width: 350px"
|
||
:clearable="false"></el-date-picker>
|
||
</div>
|
||
<div v-show="queryParams.timeDim === '2'">
|
||
<el-date-picker
|
||
v-model="dateValue"
|
||
type="daterange"
|
||
range-separator="至"
|
||
start-placeholder="开始日期"
|
||
end-placeholder="结束日期"
|
||
value-format="timestamp"
|
||
:picker-options="pickerOptions"
|
||
:clearable="false"
|
||
size="small"
|
||
style="width: 350px"
|
||
@change="timeSelect"></el-date-picker>
|
||
</div>
|
||
<div v-show="queryParams.timeDim === '3'">
|
||
<el-date-picker
|
||
v-model="weekValue1"
|
||
type="week"
|
||
format="yyyy 第 WW 周"
|
||
style="width: 170px"
|
||
:picker-options="pickerOptionsWeek"
|
||
@change="startWeek"
|
||
:clearable="false"
|
||
size="small"
|
||
placeholder="选择周"></el-date-picker>
|
||
-
|
||
<el-date-picker
|
||
v-model="weekValue2"
|
||
type="week"
|
||
format="yyyy 第 WW 周"
|
||
:picker-options="pickerOptionsWeek"
|
||
style="width: 170px"
|
||
@change="endWeek"
|
||
:clearable="false"
|
||
size="small"
|
||
placeholder="选择周"></el-date-picker>
|
||
</div>
|
||
<div v-show="queryParams.timeDim === '4'">
|
||
<el-date-picker
|
||
v-model="monthValue"
|
||
type="monthrange"
|
||
range-separator="至"
|
||
start-placeholder="开始日期"
|
||
end-placeholder="结束日期"
|
||
value-format="timestamp"
|
||
:clearable="false"
|
||
:picker-options="pickerOptions"
|
||
size="small"
|
||
style="width: 350px"
|
||
@change="timeSelect"></el-date-picker>
|
||
</div>
|
||
<div v-show="queryParams.timeDim === '5'">
|
||
<el-date-picker
|
||
style="width: 170px"
|
||
v-model="yearValue1"
|
||
type="year"
|
||
:picker-options="pickerOptions"
|
||
value-format="timestamp"
|
||
placeholder="选择年"
|
||
@change="startYear"
|
||
size="small"
|
||
:clearable="false"></el-date-picker>
|
||
-
|
||
<el-date-picker
|
||
style="width: 170px"
|
||
v-model="yearValue2"
|
||
type="year"
|
||
:picker-options="pickerOptions"
|
||
value-format="timestamp"
|
||
placeholder="选择年"
|
||
@change="endYear"
|
||
size="small"
|
||
:clearable="false"></el-date-picker>
|
||
</div>
|
||
</el-form-item>
|
||
<el-form-item
|
||
v-if="energyType !== 0"
|
||
label="对象维度"
|
||
required>
|
||
<el-select
|
||
v-model="queryParams.objType"
|
||
placeholder="请选择"
|
||
style="width: 80px"
|
||
@change="selectObjs"
|
||
:disabled="energyType === 2"
|
||
size="small">
|
||
<el-option
|
||
v-for="item in getDictDatas(this.DICT_TYPE.OBJECT_TYPE)"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value"></el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item
|
||
label="对象选择"
|
||
required>
|
||
<el-select
|
||
v-model="queryParams.objIds"
|
||
placeholder="请选择"
|
||
multiple
|
||
:multiple-limit="5"
|
||
collapse-tags
|
||
filterable
|
||
style="width: 200px"
|
||
size="small">
|
||
<el-option
|
||
v-for="item in objectList"
|
||
:key="item.id"
|
||
:label="item.name"
|
||
:value="item.id">
|
||
<span style="float: left">{{ item.name }}</span>
|
||
<span style="float: right; color: #8492a6; font-size: 13px">
|
||
{{ item.code }}
|
||
</span>
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
<el-form-item>
|
||
<el-button
|
||
type="primary"
|
||
size="small"
|
||
@click="search">
|
||
查询
|
||
</el-button>
|
||
<el-button
|
||
size="small"
|
||
@click="resetBtn">
|
||
重置
|
||
</el-button>
|
||
<span
|
||
class="separateStyle"
|
||
v-hasPermi="['analysis:contrast-analysis:export']"></span>
|
||
<el-button
|
||
v-hasPermi="['analysis:contrast-analysis:export']"
|
||
type="primary"
|
||
size="small"
|
||
plain
|
||
@click="exportBtn">
|
||
导出
|
||
</el-button>
|
||
</el-form-item>
|
||
</el-form>
|
||
</div>
|
||
</template>
|
||
<script>
|
||
import { getEnergyTypeListAll } from '@/api/base/energyType';
|
||
import { getLineAll } from '@/api/base/productionLine';
|
||
import { getWorkShopAll } from '@/api/base/workshopSection';
|
||
import { getFactoryList } from '@/api/core/base/factory';
|
||
import moment from 'moment';
|
||
export default {
|
||
name: 'searchArea',
|
||
data() {
|
||
return {
|
||
// 查询参数
|
||
queryParams: {
|
||
energyTypeId: null,
|
||
objIds: [],
|
||
objType: '',
|
||
timeDim: null,
|
||
startTime: null,
|
||
endTime: null,
|
||
},
|
||
energyType: 0, //1电2非电
|
||
timeValue: [], // 最大7天只能整点
|
||
dateValue: [], // 最大30天
|
||
weekValue1: null, //最多24周
|
||
weekValue2: null,
|
||
monthValue: [], //最多24月
|
||
yearValue1: null, //最多10年
|
||
yearValue2: null,
|
||
energyTypeList: [],
|
||
objectList: [],
|
||
pickerOptions: {
|
||
disabledDate(date) {
|
||
return date.getTime() > Date.now();
|
||
},
|
||
},
|
||
pickerOptionsWeek: {
|
||
disabledDate(time) {
|
||
let day = Date.now();
|
||
let limitTime = moment(day).day(-1);
|
||
return time.getTime() > new Date(limitTime).getTime();
|
||
},
|
||
},
|
||
};
|
||
},
|
||
mounted() {
|
||
this.getTypeList();
|
||
this.queryParams.timeDim = this.getDictDatas(
|
||
this.DICT_TYPE.TIME_DIM
|
||
)[0].value; // 默认时
|
||
},
|
||
methods: {
|
||
getTypeList() {
|
||
getEnergyTypeListAll().then((res) => {
|
||
this.energyTypeList = res.data || [];
|
||
});
|
||
},
|
||
// 切换能源类型
|
||
chooseType(id) {
|
||
let val;
|
||
this.energyTypeList.map((item) => {
|
||
if (item.id === id) {
|
||
val = item.name;
|
||
}
|
||
});
|
||
if (val == 1 || val == 2) {
|
||
this.energyType = 1;
|
||
this.queryParams.objType = null;
|
||
} else {
|
||
this.energyType = 2;
|
||
this.queryParams.objType = this.getDictDatas(
|
||
this.DICT_TYPE.OBJECT_TYPE
|
||
)[0].value;
|
||
}
|
||
this.selectObjs(this.queryParams.objType);
|
||
},
|
||
// 范围选择器
|
||
timeSelect() {
|
||
switch (this.queryParams.timeDim) {
|
||
case '1':
|
||
if (!this.timeValue) {
|
||
this.$modal.msgError('时间范围不能为空');
|
||
return false;
|
||
}
|
||
if (this.timeValue[1] - this.timeValue[0] > 7 * 24 * 3600000) {
|
||
this.$modal.msgError('最大时间范围为7天,请重新选择');
|
||
this.timeValue = [];
|
||
}
|
||
break;
|
||
case '2':
|
||
if (!this.dateValue) {
|
||
this.$modal.msgError('时间范围不能为空');
|
||
return false;
|
||
}
|
||
if (this.dateValue[1] - this.dateValue[0] > 29 * 24 * 3600000) {
|
||
this.$modal.msgError('最大时间范围为30天,请重新选择'); // 自动选择默认是0:00:00要求是23:59:59
|
||
this.dateValue = [];
|
||
}
|
||
break;
|
||
case '4':
|
||
if (!this.monthValue) {
|
||
this.$modal.msgError('时间范围不能为空');
|
||
return false;
|
||
}
|
||
if (this.monthValue[1] - this.monthValue[0] > 729 * 24 * 3600000) {
|
||
this.$modal.msgError('最大时间范围为24个月,请重新选择'); // 同理上面
|
||
this.monthValue = [];
|
||
}
|
||
break;
|
||
default:
|
||
}
|
||
},
|
||
// 年选择器
|
||
startYear() {
|
||
if (this.yearValue2 && this.yearValue2 < this.yearValue1) {
|
||
this.$modal.msgError('开始时间不能晚于结束时间,请重新选择');
|
||
this.yearValue1 = null;
|
||
return false;
|
||
}
|
||
if (this.yearValue1 && this.yearValue2) {
|
||
if (this.yearValue2 - this.yearValue1 > 10 * 365 * 24 * 3600000) {
|
||
this.$modal.msgError('最大时间范围为10年,请重新选择');
|
||
this.yearValue1 = null;
|
||
return false;
|
||
}
|
||
}
|
||
},
|
||
endYear() {
|
||
if (this.yearValue2 && this.yearValue2 < this.yearValue1) {
|
||
this.$modal.msgError('结束时间不能早于开始时间,请重新选择');
|
||
this.yearValue2 = null;
|
||
return false;
|
||
}
|
||
if (this.yearValue1 && this.yearValue2) {
|
||
if (this.yearValue2 - this.yearValue1 > 10 * 365 * 24 * 3600000) {
|
||
this.$modal.msgError('最大时间范围为10年,请重新选择');
|
||
this.yearValue2 = null;
|
||
return false;
|
||
}
|
||
}
|
||
},
|
||
// 周选择器
|
||
startWeek() {
|
||
if (this.weekValue1 && this.weekValue2) {
|
||
let a = new Date(this.weekValue1).getTime();
|
||
let b = new Date(this.weekValue2).getTime();
|
||
if (a > b) {
|
||
this.$modal.msgError('开始时间不能晚于结束时间,请重新选择');
|
||
this.weekValue1 = null;
|
||
return false;
|
||
}
|
||
if (b - a > 167 * 24 * 3600000) {
|
||
this.$modal.msgError('最大时间范围为24周,请重新选择');
|
||
this.weekValue1 = null;
|
||
return false;
|
||
}
|
||
}
|
||
},
|
||
endWeek() {
|
||
if (this.weekValue1 && this.weekValue2) {
|
||
let a = new Date(this.weekValue1).getTime();
|
||
let b = new Date(this.weekValue2).getTime();
|
||
if (a > b) {
|
||
this.$modal.msgError('结束时间不能早于开始时间,请重新选择');
|
||
this.weekValue2 = null;
|
||
return false;
|
||
}
|
||
if (b - a > 167 * 24 * 3600000) {
|
||
this.$modal.msgError('最大时间范围为24周,请重新选择');
|
||
this.weekValue2 = null;
|
||
return false;
|
||
}
|
||
}
|
||
},
|
||
// 对象维度
|
||
selectObjs(val) {
|
||
console.log(val);
|
||
switch (val) {
|
||
case '1':
|
||
getFactoryList().then((res) => {
|
||
this.objectList = res.data || [];
|
||
this.queryParams.objIds = [];
|
||
});
|
||
break;
|
||
case '2':
|
||
getLineAll().then((res) => {
|
||
this.objectList = res.data || [];
|
||
this.queryParams.objIds = [];
|
||
});
|
||
break;
|
||
default:
|
||
getWorkShopAll().then((res) => {
|
||
this.objectList = res.data || [];
|
||
this.queryParams.objIds = [];
|
||
});
|
||
}
|
||
},
|
||
// 查询
|
||
search() {
|
||
if (!this.queryParams.energyTypeId) {
|
||
this.$modal.msgError('请选择能源类型');
|
||
return false;
|
||
}
|
||
if (!this.queryParams.timeDim) {
|
||
this.$modal.msgError('请选择时间维度');
|
||
return false;
|
||
}
|
||
switch (this.queryParams.timeDim) {
|
||
case '1':
|
||
if (this.timeValue && this.timeValue.length > 0) {
|
||
this.queryParams.startTime = this.timeValue[0];
|
||
this.queryParams.endTime = this.timeValue[1]; // 不用转
|
||
} else {
|
||
this.$modal.msgError('时间范围不能为空');
|
||
return false;
|
||
}
|
||
break;
|
||
case '2':
|
||
if (this.dateValue.length > 0) {
|
||
this.queryParams.startTime = this.dateValue[0];
|
||
this.queryParams.endTime = this.dateValue[1] + 86399000; // 转为23:59:59
|
||
} else {
|
||
this.$modal.msgError('日范围不能为空');
|
||
return false;
|
||
}
|
||
break;
|
||
case '3':
|
||
if (this.weekValue1 && this.weekValue2) {
|
||
let a =
|
||
moment(this.weekValue1).day(0).format('YYYY-MM-DD') + ' 00:00:00';
|
||
let b =
|
||
moment(this.weekValue2).day(6).format('YYYY-MM-DD') + ' 23:59:59';
|
||
this.queryParams.startTime = new Date(a).getTime();
|
||
this.queryParams.endTime = new Date(b).getTime();
|
||
} else {
|
||
this.$modal.msgError('周范围不能为空');
|
||
return false;
|
||
}
|
||
break;
|
||
case '4': // 转为本月最后一天的最后一秒
|
||
if (this.monthValue.length > 0) {
|
||
this.queryParams.startTime = this.monthValue[0];
|
||
this.queryParams.endTime = this.transformTime(this.monthValue[1]);
|
||
} else {
|
||
this.$modal.msgError('月范围不能为空');
|
||
return false;
|
||
}
|
||
break;
|
||
default: //本年最后一天
|
||
if (this.yearValue1 && this.yearValue2) {
|
||
if (this.yearValue2 < this.yearValue1) {
|
||
this.$modal.msgError('结束时间不能早于开始时间');
|
||
return false;
|
||
} else {
|
||
this.queryParams.startTime = this.yearValue1;
|
||
this.queryParams.endTime = this.transformYear(this.yearValue2);
|
||
}
|
||
} else {
|
||
this.$modal.msgError('年范围不能为空');
|
||
return false;
|
||
}
|
||
}
|
||
if (!this.queryParams.objType) {
|
||
this.$modal.msgError('请选择对象维度');
|
||
return false;
|
||
}
|
||
if (this.queryParams.objIds.length === 0) {
|
||
this.$modal.msgError('请选择对象');
|
||
return false;
|
||
}
|
||
this.queryParams.startTime = this.queryParams.startTime + '';
|
||
this.queryParams.endTime = this.queryParams.endTime + '';
|
||
console.log(this.queryParams);
|
||
this.$emit('submit', this.queryParams);
|
||
},
|
||
resetBtn() {
|
||
this.queryParams.energyTypeId = null;
|
||
this.queryParams.timeDim = this.getDictDatas(
|
||
this.DICT_TYPE.TIME_DIM
|
||
)[0].value; // 默认时
|
||
this.queryParams.objIds = [];
|
||
this.queryParams.objType = '';
|
||
this.timeValue = [];
|
||
this.dateValue = [];
|
||
this.weekValue1 = null;
|
||
this.weekValue2 = null;
|
||
this.monthValue = [];
|
||
this.yearValue1 = null;
|
||
this.yearValue2 = null;
|
||
},
|
||
// 导出
|
||
exportBtn() {
|
||
this.$emit('export');
|
||
},
|
||
transformTime(timeStamp) {
|
||
// 本月最后一天
|
||
let year = moment(timeStamp).format('YYYY');
|
||
let month = moment(timeStamp).format('MM');
|
||
let newData =
|
||
moment(new Date(year, month, 0)).format('YYYY-MM-DD') + ' 23:59:59';
|
||
let value = new Date(newData).getTime();
|
||
return value;
|
||
},
|
||
transformYear(timeStamp) {
|
||
// 本年最后一天
|
||
let year = moment(timeStamp).format('YYYY');
|
||
let newData = year + '-12-31 23:59:59';
|
||
let value = new Date(newData).getTime();
|
||
return value;
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
<style lang='scss'>
|
||
/* 时间整点 */
|
||
.noneMinute .el-time-spinner__wrapper {
|
||
width: 100%;
|
||
}
|
||
.noneMinute .el-scrollbar:nth-of-type(2) {
|
||
display: none;
|
||
}
|
||
.demo-form-inline {
|
||
.el-date-editor .el-range__icon {
|
||
font-size: 16px;
|
||
color: #0b58ff;
|
||
}
|
||
.el-input__prefix .el-icon-date {
|
||
font-size: 16px;
|
||
color: #0b58ff;
|
||
}
|
||
}
|
||
</style>
|
||
<style lang="scss" scoped>
|
||
.demo-form-inline {
|
||
.blue-block {
|
||
display: inline-block;
|
||
width: 4px;
|
||
height: 16px;
|
||
background-color: #0b58ff;
|
||
border-radius: 1px;
|
||
margin-right: 8px;
|
||
margin-top: 12px;
|
||
}
|
||
.el-form-item {
|
||
margin-right: 10px;
|
||
margin-bottom: 4px;
|
||
}
|
||
}
|
||
.separateStyle {
|
||
display: inline-block;
|
||
width: 1px;
|
||
height: 24px;
|
||
background: #e8e8e8;
|
||
vertical-align: middle;
|
||
margin: 0 10px;
|
||
}
|
||
</style> |