You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xy-frontend/src/views/statisticalReport/index.vue

476 lines
15 KiB
Vue

<template>
<div class="statisticalReport">
<div class="searchMain">
<div class="searchBox" ref="searchref">
<el-form :inline="true" :model="formdata" class="demo-form-inline">
<el-form-item label="电压等级" class="dyClass">
<el-select v-model="formdata.dyid" @change="getSearchxl">
<el-option
v-for="item in dyOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
{{ item.name }}
</el-option>
</el-select>
</el-form-item>
<el-form-item label="线路名称">
<el-select v-model="formdata.lineid" filterable>
<el-option
v-for="item in xlOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label="活动"
class="activitybox"
v-if="
roleName === 'superadmin' ||
roleName === 'Matthew' ||
roleName === 'SCB'
"
>
<el-select
@keyup.enter.native="onSubmit()"
v-model="formdata.activityId"
filterable
@change="changeActive"
>
<el-option
v-for="item in activityOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="开始日期">
<el-date-picker
v-model="formdata.starttime"
type="datetime"
placeholder="开始日期"
value-format="timestamp"
:picker-options="pickerOptions"
default-time="00:00:00"
>
</el-date-picker>
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker
v-model="formdata.endtime"
type="datetime"
default-time="23:59:59"
placeholder="结束日期"
value-format="timestamp"
:picker-options="pickerOptions"
class="ml10"
>
</el-date-picker>
</el-form-item>
<el-form-item>
<el-input
v-model="formdata.search"
placeholder="请输入装置编号"
clearable
></el-input>
</el-form-item>
<el-form-item label="采样周期" class="intervalClass">
<el-input
v-model="formdata.interval"
placeholder="请输入采样周期"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" :disabled="searchFlag"
>查询</el-button
>
</el-form-item>
</el-form>
</div>
<div class="pictureBox">
<div class="deviceTable">
<el-table
ref="multipleTable"
border
:data="lastDataArray"
tooltip-effect="dark"
stripe
style="width: 100%"
height="calc(120%)"
v-loading="loading"
highlight-current-row
>
<template slot="empty">
<el-empty :image-size="160" description="暂无数据"></el-empty>
</template>
<el-table-column prop="cmdid" label="装置"></el-table-column>
<el-table-column label="图片数据" prop="photoTimePoint">
<template slot-scope="scope">
<span class="pre-format">{{ scope.row.photoTimePoint }}</span>
</template>
</el-table-column>
<el-table-column label="覆冰数据" prop="pullPoint">
<template slot-scope="scope">
<span class="pre-format">{{ scope.row.pullPoint }}</span>
</template>
</el-table-column>
<el-table-column label="天气数据" prop="weatherPoint">
<template slot-scope="scope">
<span class="pre-format">{{ scope.row.weatherPoint }}</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</div>
</template>
<script>
import { getSearchInfo, getReportApi } from "@/utils/api/index";
import { getActivityApi } from "@/utils/api/reportApi";
export default {
name: "statisticalReport",
data() {
return {
searchFlag: true,
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now(); // 禁用大于今天的日期
},
},
dyOptions: [{ id: -1, name: "全部" }], //电压数据
xlOptions: [{ id: -1, name: "全部" }], //线路数据
activityOptions: [{ id: -1, name: "全部" }], //活动
formdata: {
dyid: -1,
lineid: -1,
towerid: -1,
channelid: -1,
interval: 10,
search: "",
activityId: -1,
},
dataArray: [],
lastDataArray: [],
page: 1, // 当前页数
pageSize: 20, // 每页数量
tdTermid: "",
loading: false,
};
},
created() {
var that = this;
this.roleName = localStorage.getItem("userName");
document.onkeydown = function (e) {
var key = window.event.keyCode;
if (key === 13) {
that.onSubmit(); // 触发事件
}
};
},
mounted() {
this.getactiveList();
this.$set(this.formdata, "endtime", new Date().getTime());
this.$set(
this.formdata,
"starttime",
new Date(new Date().toLocaleDateString()).getTime()
);
},
methods: {
//获取电压信息
getSearchdy() {
getSearchInfo({ type: 1 })
.then((res) => {
this.dyOptions = this.dyOptions.concat(res.data.list);
console.log(this.dyOptions);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.dyid = this.dyOptions[0].id;
} else {
this.formdata.dyid = Number(this.$route.query.dyId);
}
this.getSearchxl();
})
.catch((err) => {});
},
//获取线路数据
getSearchxl() {
getSearchInfo({ type: 2, id: this.formdata.dyid })
.then((res) => {
this.xlOptions = [{ id: -1, name: "全部" }];
this.xlOptions = this.xlOptions.concat(res.data.list);
if (JSON.stringify(this.$route.query) === "{}") {
this.formdata.lineid = this.xlOptions[0].id;
} else {
this.formdata.lineid = Number(this.$route.query.lineId);
}
})
.catch((err) => {});
},
//获取活动列表
getactiveList() {
getActivityApi()
.then((res) => {
// this.activityOptions = this.activityOptions.concat(res.data.list);
let activeArr = res.data.map((item) => ({
id: item.id,
name: item.title,
}));
this.activityOptions = this.activityOptions.concat(activeArr);
console.log(this.activityOptions);
this.formdata.activityId = this.activityOptions[1].id;
this.searchFlag = false;
})
.catch((err) => {});
},
changeActive(val) {
this.formdata.activityId = val;
},
getSearchtdAlone() {
getSearchInfo({ type: 5, id: this.tdTermid })
.then((res) => {
this.tdOptions = [{ id: -1, name: "全部", alias: null }];
this.tdOptions = this.tdOptions.concat(res.data.list);
})
.catch((err) => {});
},
//获取图片列表
getPicData() {
this.loading = true;
console.log(this.formdata);
this.$set(this.formdata, "pageindex", this.page);
this.$set(this.formdata, "pagesize", this.pageSize);
getReportApi(this.formdata)
.then((res) => {
console.log(res.data);
this.dataArray = res.data;
this.loading = false;
this.lastDataArray = this.processSnapshotData(this.dataArray);
})
.catch((err) => {
this.loading = false;
console.log(err);
});
},
processSnapshotData(data) {
return data.map((item) => {
const channelStatus = [];
console.log(item);
//图片数据
item.channels.forEach((channel) => {
const channelStatusParts = []; // 通道级别的状态片段
channel.presets.forEach((preset) => {
const missingTimes = [];
const moreTimes = [];
preset.scheduleList.forEach((schedule) => {
if (schedule.wrong && schedule.timeList.length === 0) {
const time = `${schedule.hour
.toString()
.padStart(2, "0")}:${schedule.minute
.toString()
.padStart(2, "0")}`;
missingTimes.push(time);
}
if (schedule.wrong && schedule.timeList.length > 1) {
const time = `${schedule.hour
.toString()
.padStart(2, "0")}:${schedule.minute
.toString()
.padStart(2, "0")}`;
moreTimes.push(time);
}
});
// 生成当前预置位的状态片段
const presetStatusParts = [];
if (missingTimes.length > 0) {
presetStatusParts.push(
`少图(${[...new Set(missingTimes)].join("、")}`
);
}
if (moreTimes.length > 0) {
presetStatusParts.push(
`多图(${[...new Set(moreTimes)].join("、")}`
);
}
// 若当前预置位有问题,则添加到通道状态
if (presetStatusParts.length > 0) {
channelStatusParts.push(
`预置位${preset.presetId}${presetStatusParts.join("")}`
);
}
});
// 构建通道的最终状态描述
const status =
channelStatusParts.length > 0
? `通道${channel.channelId}${channelStatusParts.join("")}`
: `通道${channel.channelId}图片正常`;
channelStatus.push(status);
});
//覆冰数据
const pullStatusParts = [];
const pullmissingTimes = [];
const pullmoreTimes = [];
item.pullScheduleList.forEach((pull) => {
if (pull.wrong && pull.timeList.length === 0) {
const time = `${pull.hour.toString().padStart(2, "0")}:${pull.minute
.toString()
.padStart(2, "0")}`;
pullmissingTimes.push(time);
}
if (pull.wrong && pull.timeList.length > 1) {
const time = `${pull.hour.toString().padStart(2, "0")}:${pull.minute
.toString()
.padStart(2, "0")}`;
pullmoreTimes.push(time);
}
});
console.log(pullmissingTimes);
console.log(pullmoreTimes);
// 生成当前预置位的状态片段
const pullParts = [];
if (pullmissingTimes.length > 0) {
pullParts.push(
`${pullmissingTimes.length}条数据(${[
...new Set(pullmissingTimes),
].join("、")}`
);
}
if (pullmoreTimes.length > 0) {
pullParts.push(
`${pullmoreTimes.length}条数据(${[
...new Set(pullmoreTimes),
].join("、")}`
);
}
// 构建通道的最终状态描述
const pullstatus =
pullParts.length > 0 ? `${pullParts.join("")}` : `数据正常`;
pullStatusParts.push(pullstatus);
//覆冰拉力结束
//天气数据遍历开始
//覆冰数据
const weatherStatusParts = [];
const weathermissingTimes = [];
const weathermoreTimes = [];
item.weatherScheduleList.forEach((weather) => {
if (weather.wrong && weather.timeList.length === 0) {
const time = `${weather.hour
.toString()
.padStart(2, "0")}:${weather.minute.toString().padStart(2, "0")}`;
weathermissingTimes.push(time);
}
if (weather.wrong && weather.timeList.length > 1) {
const time = `${weather.hour
.toString()
.padStart(2, "0")}:${weather.minute.toString().padStart(2, "0")}`;
weathermoreTimes.push(time);
}
});
console.log(weathermissingTimes);
console.log(weathermoreTimes);
// 生成当前预置位的状态片段
const weatherParts = [];
if (weathermissingTimes.length > 0) {
weatherParts.push(
`${weathermissingTimes.length}条数据(${[
...new Set(weathermissingTimes),
].join("、")}`
);
}
if (weathermoreTimes.length > 0) {
weatherParts.push(
`${weathermoreTimes.length}条数据(${[
...new Set(weathermoreTimes),
].join("、")}`
);
}
// 构建通道的最终状态描述
const weatherstatus =
weatherParts.length > 0 ? `${weatherParts.join("")}` : `数据正常`;
weatherStatusParts.push(weatherstatus);
//天气数据遍历结束
//最终返回数据
return {
cmdid: item.cmdid,
photoTimePoint: channelStatus.join("\n"),
pullPoint: pullStatusParts.join("\n"),
weatherPoint: weatherStatusParts.join("\n"),
};
});
},
//查询
onSubmit() {
if (this.formdata.starttime > this.formdata.endtime) {
return this.$message({
duration: 1500,
showClose: true,
message: "开始日期不能大于结束日期",
type: "warning",
});
}
this.getPicData();
},
},
};
</script>
<style lang="less">
.statisticalReport {
width: calc(100% - 24px);
height: calc(100% - 24px);
padding: 12px 12px;
background: #fff;
.deviceTable {
height: calc(100% - 94px);
//background: #fcc;
}
.searchMain {
border: 1px solid #dddddd;
height: calc(100% - 22px);
padding: 12px;
border-radius: 4px;
.ml10 {
margin-left: 10px;
}
.dyClass {
.el-select {
width: 150px;
}
}
.intervalClass {
.el-input {
width: 80px;
}
}
}
.pictureBox {
height: calc(100% - 135px);
border: 1px solid #eee;
.pre-format {
white-space: pre-line; /* 保留换行符 */
line-height: 1.8; /* 增加行间距 */
}
}
}
</style>