Files
Lydc_frontend/src/components/Analysis/analysisPage.vue
2025-12-05 10:46:19 +08:00

3445 lines
100 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div id="mapDiv">
<Map @mapView="getMap"></Map>
<div id="control">
<div class="map-control">
<div class="map-type-button" v-if="!isHot" @click="changeHotMap">
<img class="map-img" src="../../../static/img/hot.png" />
</div>
<div class="map-type-button" v-else @click="changeHotMap">
<img class="map-img" src="../../../static/img/vec.png" />
</div>
</div>
</div>
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:before-leave="beforeLeave"
v-on:leave="leave"
>
<div v-show="collapsed" id="leftPanel">
<div>
<!--展开折叠开关-->
<div @click.prevent="collapse" id="toLeft">
<i
v-if="collapsed"
class="el-icon-arrow-left"
title="收起"
style="margin-top: 13px; color: #264672"
></i>
<i
v-else
class="el-icon-arrow-right"
title="展开"
style="margin-top: 13px; color: #264672"
></i>
</div>
</div>
<div id="leftPanelScroll">
<el-tabs v-model="activeName">
<el-tab-pane label="任务进度" name="first">
<el-select
v-model="task"
size="small"
style="width: 45%; margin-bottom: 15px"
placeholder="请选择任务"
@change="changeTask()"
>
<el-option
v-for="item in taskoptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<el-select
id="sTable"
v-model="table"
size="small"
style="width: 45%; margin-bottom: 15px"
placeholder="请选择表"
@focus="getTables()"
@change="changeTable1()"
>
<el-option
v-for="item in tableoptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<el-date-picker
size="small"
style="width: 91% !important; margin-bottom: 15px"
v-model="date"
type="datetimerange"
value-format="yyyy-MM-dd HH:mm:ss"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<div style="width: 70%; margin-left: auto; margin-right: auto">
<el-radio v-model="radio" label="day" style="width: 20%"
></el-radio
>
<el-radio v-model="radio" label="month" style="width: 20%"
></el-radio
>
<el-button
size="small"
icon="el-icon-search"
@click="getEChart()"
class="dateBtn"
></el-button>
</div>
<el-radio-group
v-model="echartRadio"
size="mini"
v-show="isEchartShow"
>
<el-radio-button :label="1">任务采集总量</el-radio-button>
<el-radio-button :label="2">任务采集进度</el-radio-button>
</el-radio-group>
<div style="display: flex; justify-content: center">
<div
id="myChart1"
style="margin-top: 20px; width: 350px; height: 600px"
v-show="echartRadio == '1'"
></div>
</div>
<div style="display: flex; justify-content: center">
<div
id="myChart2"
style="width: 350px; height: 600px"
v-show="echartRadio == '2'"
></div>
</div>
</el-tab-pane>
<el-tab-pane label="任务报告" name="second">
<p>
任务
<el-select
v-model="ReportTask"
size="small"
style="width: 60%; margin-bottom: 15px"
placeholder="请选择任务"
@change="table = ''"
>
<el-option
v-for="item in reportoptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</p>
<el-button size="small" @click="getReport()" class="dateBtn"
>查看报告</el-button
>
</el-tab-pane>
<el-tab-pane label="异常监管" name="third">
<el-form
ref="warningform"
:model="warningform"
label-width="100px"
>
<el-form-item label="任务:" style="margin-bottom: 10px">
<el-select
style="width: 90%; margin-left: -30px"
v-model="warningform.task"
size="small"
placeholder="请选择任务"
@change="getWarningTables"
>
<el-option
v-for="item in wTaskOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="表:" style="margin-bottom: 10px">
<el-select
style="width: 90%; margin-left: -30px"
v-model="warningform.table"
size="small"
placeholder="请选择表"
>
<el-option
v-for="item in WTableOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item
label="异常上限比例:"
style="margin-bottom: 10px"
>
<el-tooltip
effect="light"
content="异常上限值为小数如1.5,代表对于采集平均量的比例。根据异常上限值统计采集量高于采集平均量乘以异常上限值的异常情况。"
placement="right"
>
<!-- <el-input
style="width: 90%; margin-left: -30px"
type="number"
v-model="warningform.maxratio"
placeholder="默认1.33"
clearable
></el-input> -->
<el-input-number
style="width: 90%; margin-left: -30px"
v-model="warningform.maxratio"
:precision="2"
:step="0.1"
:max="10"
:min="0"
placeholder="默认1.33"
>
</el-input-number>
</el-tooltip>
</el-form-item>
<el-form-item
label="异常下限比例:"
style="margin-bottom: 10px"
>
<el-tooltip
effect="light"
content="异常下限值为小数如0.5,代表对于采集平均量的比例。根据异常下限值统计采集量低于采集平均量乘以异常下限值的异常情况。"
placement="right"
>
<el-input-number
style="width: 90%; margin-left: -30px"
v-model="warningform.minratio"
:precision="2"
:step="0.1"
:max="10"
:min="0"
placeholder="默认0.67"
>
</el-input-number>
<!-- <el-input
style="width: 90%; margin-left: -30px"
type="number"
v-model="warningform.minratio"
placeholder="默认0.67"
clearable
></el-input> -->
</el-tooltip>
</el-form-item>
</el-form>
<el-button size="small" @click="getWarning()" class="dateBtn"
>查看详情</el-button
>
<!-- <div style="text-align: left">
异常上限值和异常下限值均输入带小数的数字1.5和0.5代表对于采集平均量的比例根据上限值统计采集量超出平均量*上限比例的异常情况根据下限值统计低于平均量*下限比例的异常情况
</div> -->
<div v-show="IsWarningShow">
<div style="text-align: left">
<p
style="
font-size: 15px !important;
font-weight: bold;
text-indent: 2em;
"
>
该任务的平均采集为{{ averageNum }}异常上限采集量为{{
highLimitNum
}}异常下限采集量为{{ lowLimitNum }}共有{{
warningWorkerNum
}}人工作完成情况异常详情如下
</p>
</div>
<el-table
:data="warningData"
border
row-key="id"
:tree-props="{ children: 'children' }"
height="650px"
style="width: 98%; margin-top: 5px"
>
<el-table-column
prop="username"
label="姓名"
min-width="100"
></el-table-column>
<el-table-column
prop="date"
label="日期"
min-width="120"
></el-table-column>
<el-table-column
prop="count"
label="采集量"
min-width="60"
></el-table-column>
</el-table>
</div>
</el-tab-pane>
<el-tab-pane label="人员统计" name="fourth">
<span>任务:</span>
<el-select
style="width: 80%; margin-bottom: 20px"
v-model="workersTask"
size="small"
placeholder="请选择任务"
>
<el-option
v-for="item in wTaskOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<el-button size="small" @click="getWorkers()" class="dateBtn"
>查看详情</el-button
>
</el-tab-pane>
</el-tabs>
</div>
</div>
</transition>
<el-card class="ReportCard" v-show="this.IsCardShow">
<div slot="header" class="clearfix">
<span>任务报告</span>
<el-button
style="float: right; padding: 3px 0"
type="text"
@click="IsCardShow = false"
>关闭</el-button
>
</div>
<el-tabs v-model="activeName1" style="height: 100%">
<el-tab-pane
label="任务信息统计报告"
name="first"
style="height: 100%; overflow: scroll"
>
<div class="reportPage" v-show="this.taskMessage == true">
<div v-for="i in tableStatNum" :key="i">
<p style="font-size: 17px !important; font-weight: bold">
{{ i }} {{ tableName[i - 1] }}
</p>
<p
style="
font-size: 16px !important;
font-weight: bold;
margin-left: 10px;
"
>
{{ i }}.1 每日采集量
</p>
<div
style="height: 300px; width: 600px; margin: 0 auto"
:id="'dailyDataEchart' + (i - 1)"
></div>
<p style="font-size: 15px !important; margin-left: 20px">
其中采集总量为{{ tableCount[i - 1] }}平均每天的采集量为{{
tableDailyAvg[i - 1]
}}{{ tableMaxDaily[i - 1] }}采集量最多{{
tableMaxDailyNum[i - 1]
}}{{ tableMinDaily[i - 1] }}采集量最少{{
tableMinDailyNum[i - 1]
}}
</p>
<p
style="
font-size: 16px !important;
font-weight: bold;
margin-left: 10px;
"
>
{{ i }}.2 每日采集进度
</p>
<div
style="height: 300px; width: 600px; margin: 0 auto"
:id="'dailyRatioEchart' + (i - 1)"
></div>
<p
style="
font-size: 16px !important;
font-weight: bold;
margin-left: 10px;
"
>
{{ i }}.3 每月采集量
</p>
<div
style="height: 300px; width: 600px; margin: 0 auto"
:id="'monthlyDataEchart' + (i - 1)"
></div>
<p style="font-size: 15px !important; margin-left: 20px">
其中平均每月的采集量为{{ tableMonthlyAvg[i - 1] }}{{
tableMaxMonthly[i - 1]
}}采集量最多{{ tableMaxMonthlyNum[i - 1] }}{{
tableMinMonthly[i - 1]
}}采集量最少{{ tableMinMonthlyNum[i - 1] }}
</p>
<p
style="
font-size: 16px !important;
font-weight: bold;
margin-left: 10px;
"
>
{{ i }}.4 每月采集进度
</p>
<div
style="height: 300px; width: 600px; margin: 0 auto"
:id="'monthlyRatioEchart' + (i - 1)"
></div>
</div>
</div>
</el-tab-pane>
<el-tab-pane
label="人员信息统计报告"
name="second"
style="height: 100%; overflow: scroll"
>
<div class="reportPage" v-show="this.workerMessage == true">
<p style="font-size: 17px !important; font-weight: bold">
工作人员列表
</p>
<el-table :data="workerInfo" style="width: 100%">
<el-table-column
prop="name"
label="工作人员"
min-width="180"
></el-table-column>
<el-table-column
prop="phone"
label="手机号"
min-width="180"
></el-table-column>
<el-table-column prop="email" label="邮箱"></el-table-column>
</el-table>
<!--对于表统计-->
<p style="font-size: 17px !important; font-weight: bold">
下面分别对子任务下工作人员完成任务的情况进行统计
</p>
<div v-for="(j, m) in tableNum" :key="m">
<p
style="
font-size: 16px !important;
font-weight: bold;
margin-left: 10px;
"
>
2.{{ j }} {{ TableList[j - 1] }}
</p>
<p style="font-size: 15px !important; margin-left: 10px">
2.{{ j }}.1 每人完成工作任务总量统计图
</p>
<div
style="height: 300px; width: 600px; margin: 0 auto"
:id="'workLoad' + (j - 1)"
></div>
<p style="font-size: 15px !important; margin-left: 10px">
2.{{ j }}.2 每人每天完成工作任务平均量统计图
</p>
<div
style="height: 300px; width: 600px; margin: 0 auto"
:id="'avgWorkLoad' + (j - 1)"
></div>
</div>
<div>
<p style="font-size: 17px !important; font-weight: bold">
下面分别对每人每天完成的工作任务量进行统计
</p>
<div v-for="(k, m) in workerNum" :key="m">
<p
style="
font-size: 16px !important;
font-weight: bold;
margin-left: 10px;
"
>
3.{{ k }} {{ WorkerList[k - 1] }}
</p>
<div v-for="(j, m) in tableNum" :key="m">
<p style="font-size: 15px !important; margin-left: 20px">
3.{{ k }}.{{ j }} {{ TableList[j - 1] }}
</p>
<div
style="height: 300px; width: 600px; margin: 0 auto"
:id="
'workLoadDaily' + (j - 1).toString() + (k - 1).toString()
"
></div>
</div>
</div>
</div>
</div>
</el-tab-pane>
</el-tabs>
</el-card>
<el-dialog title="人员统计情况" :visible.sync="IsWorkersShow">
<el-table
:data="workersData"
border
height="450px"
style="width: 98%; margin-top: 5px"
show-summary
>
<el-table-column
prop="realName"
label="用户"
min-width="60"
></el-table-column>
<el-table-column
prop="reviewerTotalWorkload"
label="分配任务量"
min-width="50"
></el-table-column>
<el-table-column
prop="collectedDataCount"
label="采集数据量"
min-width="50"
></el-table-column>
<el-table-column
prop="invalidDataCount"
label="未通过审核的数据量"
min-width="90"
></el-table-column>
<el-table-column
prop="toBeReviewedDataCount"
label="待审核的数据量"
min-width="70"
></el-table-column>
<el-table-column
prop="validDataCount"
label="通过审核的数据量"
min-width="80"
></el-table-column>
<el-table-column
prop="newDataCount"
label="新增数据量"
min-width="60"
></el-table-column>
</el-table>
</el-dialog>
<el-dialog
v-dialogDrag
class="infoDialog2"
title="数据信息"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
>
<p>
请选择查看数据
<el-select
v-model="currentFeatureId"
style="width: 55%"
placeholder="请选择数据id"
>
<el-option
v-for="item in FeaturesId"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</p>
<featureInfo :data="Info" style="margin: 0 auto" />
</el-dialog>
</div>
</template>
<script>
import Map from "../Mapview/Map";
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import GeoJSON from "ol/format/GeoJSON";
import { ajax as request } from "@/request.js";
import featureInfo from "../DataManagement/featureInfo";
import Select from "ol/interaction/Select";
import "ol/ol.css";
import Feature from "ol/Feature";
import Point from "ol/geom/Point";
import HeatmapLayer from "ol/layer/heatmap";
import { Cluster } from "ol/source";
import { Circle as CircleStyle, Fill, Stroke, Style, Text } from "ol/style";
let echarts = require("echarts/lib/echarts");
require("echarts/lib/chart/bar");
require("echarts/lib/component/title");
require("echarts/lib/component/tooltip");
require("echarts/lib/component/dataZoom");
require("echarts/lib/component/legend");
export default {
name: "ViewTask",
data() {
return {
workerMessage: false,
taskMessage: false,
isHot: false,
heatmapLayer: null,
IsWarningShow: false,
sameCount: [],
WarningTask: "",
warningData: [],
warningWorkerNum: 0,
activeName1: "first",
///人员统计
workerNum: [],
tableNum: [],
workerInfo: [],
//放表名 一个表 一个每人统计数据 统计 每人的工作总量 每人的平均工作量
TableList: [],
//工作人员
WorkerList: [],
//工作总总量 数组 数组 按照table顺序排列[按照人员排列]
workLoadList: [],
//平均工作量 上同
avgWorkLoadList: [],
//选择人 选择表 数组 数组 按照table顺序排列 按照人员排列 天及其对应的工作量
workLoadDaily: [],
myWorkLoadEchart: [],
myAvgWorkLoadEchart: [],
myWorkLoadDailyEchart: [],
myTableDailyDataEchart: [],
myTableDailyRatioEchart: [],
myTableMonthlyRatioEchart: [],
myTableMonthlyDataEchart: [],
//表数
tableStatNum: [],
//表名字、采集总量
tableName: [],
tableCount: [],
tableDailyAvg: [],
tableMonthlyAvg: [],
//对象数组数组 包含所有表的按天统计数据
dailyTableData: [],
//对象数组数组 包含所有表的按月统计数据
monthlyTableData: [],
//对象数组数组 包含所有表的按天统计比率
dailyTableRatio: [],
//对象数组数组 包含所有表的按月统计比率
monthlyTableRatio: [],
//最大采集量日
tableMaxDaily: [],
tableMaxDailyNum: [],
//最大采集量月
tableMaxMonthly: [],
tableMaxMonthlyNum: [],
//最小采集量日
tableMinDaily: [],
tableMinDailyNum: [],
//最小采集量月
tableMinMonthly: [],
tableMinMonthlyNum: [],
ReportTask: "",
reportoptions: [],
IsCardShow: false,
collapsed: true,
drawer: false,
activeName: "first",
total: "",
myChart1: null,
myChart2: null,
data: [],
ratio: [],
task: "",
table: "",
date: "",
radio: "day",
value: "",
taskoptions: [],
tableoptions: [],
myChart: null,
min: [],
max: [],
avg: [],
count: [],
sum: [],
distribute: false,
minSize: "",
maxSize: "",
clusters: null,
isClusters: false,
vectorLayer: null,
isVectorLayer: false,
cellLayer: null,
dialogVisible: false,
selectclick: null,
Info: {},
currentFeatureId: "",
FeaturesId: [],
vectorSource: null,
feature: null,
warningform: { task: "", table: "", maxratio: "1.33", minratio: "0.67" },
wTaskOptions: [],
WTableOptions: [],
averageNum: "",
lowLimitNum: "",
highLimitNum: "",
echartRadio: "1",
isEchartShow: false,
workersTask: "",
IsWorkersShow: false,
workersData: [],
};
},
components: {
Map,
featureInfo,
},
created() {
this.initList();
},
watch: {
dialogVisible: {
handler() {
if (this.dialogVisible == false) {
this.getClusters();
this.clearAll();
}
},
},
currentFeatureId: {
handler() {
if (this.vectorLayer && this.currentFeatureId !== "") {
this.setCurrentStyle();
}
},
},
activeName: {
handler() {
this.IsWarningShow = false;
this.IsWorkersShow = false;
},
},
},
methods: {
getMap(val) {
this.map = val;
let that = this;
this.map.on("moveend", function (e) {
//移除所有
if (that.clusters) {
if (that.isClusters) {
that.map.removeLayer(that.clusters);
that.isClusters = false;
}
that.clusters = null;
}
if (that.vectorLayer) {
if (that.isVectorLayer) {
that.map.removeLayer(that.vectorLayer);
that.map.removeInteraction(that.selectclick);
that.isVectorLayer = false;
}
that.vectorLayer = null;
that.selectclick = null;
}
if (that.distribute && that.cellLayer) {
that.debounce(that.getClusters(), 500);
}
});
},
debounce(fn, delay) {
let timer = null; //借助闭包
return function () {
if (timer) {
clearTimeout(timer);
timer = setTimeout(fn, delay);
} else {
timer = setTimeout(fn, delay);
}
};
},
// 初始化任务清单
initList() {
this.reportoptions = [];
this.taskoptions = [];
this.wTaskOptions = [];
let that = this;
// 从 store 获取数据
const taskData = that.$store.state.taskData.selectTaskHasCreated || [];
for (var i = 0; i < taskData.length; i++) {
that.reportoptions.push({
value: taskData[i].id,
label: taskData[i].taskName,
});
that.taskoptions.push({
value: taskData[i].id,
label: taskData[i].taskName,
});
that.wTaskOptions.push({
value: taskData[i].id,
label: taskData[i].taskName,
});
}
},
getWarningTables() {
if (this.warningform.task != "") {
this.WTableOptions = [];
var taskname = "";
for (var i = 0; i < this.wTaskOptions.length; i++) {
if (this.warningform.task == this.wTaskOptions[i].value) {
taskname = this.wTaskOptions[i].label;
break;
}
}
this.tableoptions = [];
let that = this;
request({
url: "/statistic/getTables",
method: "post",
params: {
tskName: taskname,
},
}).then(function (response) {
// 获取数据存入config
if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else if (response.status === 200) {
var json = response.data;
that.warningform.table = "mmoo";
that.WTableOptions.push({
value: "mmoo",
label: "默认",
});
for (var key in json) {
that.WTableOptions.push({
value: key,
label: json[key],
});
}
}
});
}
},
// 左侧面板收缩动画
collapse() {
this.collapsed = !this.collapsed;
},
beforeEnter: function (el) {
el.style.transform = "translate(410px,0px)";
},
enter: function (el, done) {
el.style.transform = "translate(0px,0px)";
el.style.transition = "all 0.6s ease";
done();
},
beforeLeave: function (el) {
el.style.transform = "translate(0px,0px)";
},
leave: function (el, done) {
el.style.transform = "translate(-425px,0px)";
el.style.transition = "all 0.6s ease";
// done();
},
handleClose(done) {
done();
},
changeTask() {
this.table = "";
if (this.myChart1) {
this.myChart1.clear();
this.myChart2.clear();
this.isEchartShow = false;
}
//清空
//清空
if (this.clusters) {
if (this.isClusters) {
this.map.removeLayer(this.clusters);
this.isClusters = false;
}
this.clusters = null;
}
if (this.vectorLayer) {
if (this.isVectorLayer) {
this.map.removeLayer(this.vectorLayer);
this.map.removeInteraction(this.selectclick);
this.isVectorLayer = false;
}
this.vectorLayer = null;
this.selectclick = null;
}
this.cellLayer = null;
this.distribute = false;
if (this.isHot) {
this.isHot = false;
this.removeHeatmapLayer();
this.heatmapLayer = null;
} else {
this.heatmapLayer = null;
}
},
changeTable1() {
//清空
if (this.myChart1) {
this.myChart1.clear();
this.myChart2.clear();
this.isEchartShow = false;
}
//清空
//清空
if (this.clusters) {
if (this.isClusters) {
this.map.removeLayer(this.clusters);
this.isClusters = false;
}
this.clusters = null;
}
if (this.vectorLayer) {
if (this.isVectorLayer) {
this.map.removeLayer(this.vectorLayer);
this.map.removeInteraction(this.selectclick);
this.isVectorLayer = false;
}
this.vectorLayer = null;
this.selectclick = null;
}
this.cellLayer = null;
this.distribute = true;
this.getRange(0);
this.initHeatmapLayer();
this.isHot = false;
},
getRange(addToMap) {
let that = this;
request({
url: "/allocation/info/cell/all",
method: "post",
params: {
taskId: that.task,
},
}).then(function (response) {
// 获取数据存入config
if (response.data.status === 200) {
var result = response.data.data;
if (result.features.length != 0) {
that.drawCellLayer(result);
that.map.getView().fit(that.cellLayer.getSource().getExtent());
that.getClusters();
} else {
that.$message.info("获取任务范围失败,未上传数据!");
}
} else if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
}
});
},
getClusters() {
var zoom = 0;
zoom = this.map.getView().getZoom();
//获取地图范围
var coordinates = this.map.getView().calculateExtent(this.map.getSize());
var geoHashLength = "";
switch (zoom) {
case 8:
case 9:
geoHashLength = 4;
break;
case 10:
case 11:
case 12:
geoHashLength = 5;
break;
case 13:
case 14:
case 15:
case 16:
geoHashLength = 6;
break;
case 17:
case 18:
case 19:
case 20:
geoHashLength = 7;
break;
default:
geoHashLength = 3;
}
if (this.distribute) {
if (zoom < 15) {
//请求聚类图层
let that = this;
that.minSize = 0;
that.maxSize = 0;
request({
url: "/base/getCountByGeoHash",
method: "post",
params: {
taskId: that.task,
tableName: that.table,
accuracy: geoHashLength,
longitudeMin: coordinates[0],
latitudeMin: coordinates[1],
longitudeMax: coordinates[2],
latitudeMax: coordinates[3],
},
}).then(function (response) {
if (response.data.success) {
if (response.data.data) {
var result = response.data.data;
var geojson = [];
for (var i = 0; i < result.length; i++) {
var count = result[i].count;
if (i == 0) {
that.minSize = count;
that.maxSize = count;
} else {
if (count < that.minSize) {
that.minSize = count;
}
if (count > that.maxSize) {
that.maxSize = count;
}
}
//存入count
var geojson1 = result[i].feature;
geojson1.properties = {};
geojson1.properties.count = count;
geojson.push(result[i].feature);
}
var geojsonObject = {
type: "FeatureCollection",
features: geojson,
crs: { type: "EPSG", properties: { code: "4326" } },
};
that.drawClusterLayer(geojsonObject);
} else {
that.$message.info("获取范围内数据为空!");
}
} else if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
}
});
} else {
let that = this;
request({
url: "/get/getDataByRangeIntersection",
method: "post",
params: {
taskId: that.task,
tableName: that.table,
longitudeMin: coordinates[0],
latitudeMin: coordinates[1],
longitudeMax: coordinates[2],
latitudeMax: coordinates[3],
},
}).then(function (response) {
if (response.data.success) {
if (response.data.data) {
var geojson = response.data.data;
var geojsonObject = {
type: "FeatureCollection",
features: geojson,
crs: { type: "EPSG", properties: { code: "4326" } },
};
that.drawVectorLayer(geojsonObject);
} else {
that.$message.info("获取范围内数据为空!");
}
} else if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
}
});
}
}
},
drawCellLayer(geojsonObject) {
//
if (this.cellLayer) {
this.map.removeLayer(this.cellLayer);
}
var vectorSource = new VectorSource({
features: new GeoJSON().readFeatures(geojsonObject),
});
this.cellLayer = new VectorLayer({
source: vectorSource,
});
this.cellLayer.setZIndex(5);
},
drawClusterLayer(geojsonObject) {
if (this.clusters) {
if (this.isClusters) {
this.map.removeLayer(this.clusters);
this.isClusters = false;
}
this.clusters = null;
}
if (this.vectorLayer) {
if (this.isVectorLayer) {
this.map.removeLayer(this.vectorLayer);
this.map.removeInteraction(this.selectclick);
}
this.vectorLayer = null;
this.selectclick = null;
}
var vectorSource = new VectorSource({
features: new GeoJSON().readFeatures(geojsonObject),
});
this.clusters = new VectorLayer({
source: vectorSource,
style: function (feature) {
let count = feature.get("count").toString();
let style = new Style({
stroke: new Stroke({
lineDash: [1, 2, 3, 4, 5, 6],
color: "rgba(70,130,180, 0.9)",
width: 2,
}),
fill: new Fill({
color: [255, 153, 0, 0.8],
}),
text: new Text({
text: feature.get("count").toString(),
font: "16px Microsoft YaHei",
fill: new Fill({
color: "#fff",
}),
stroke: new Stroke({
color: "rgba(0, 0, 0, 0.6)",
width: 3,
}),
}),
});
return [style];
},
});
this.clusters.setZIndex(4);
this.map.addLayer(this.clusters);
this.isClusters = true;
},
drawVectorLayer(geojsonObject) {
if (this.clusters) {
if (this.isClusters) {
this.map.removeLayer(this.clusters);
this.isClusters = false;
}
this.clusters = null;
}
if (this.vectorLayer) {
if (this.isVectorLayer) {
this.map.removeLayer(this.vectorLayer);
this.map.removeInteraction(this.selectclick);
this.isVectorLayer = false;
}
this.vectorLayer = null;
this.selectclick = null;
}
this.vectorSource = new VectorSource({
features: new GeoJSON().readFeatures(geojsonObject),
});
var styles = {
Point: new Style({
image: new CircleStyle({
radius: 7,
fill: new Fill({
color: "rgba(173,216,230)",
}),
stroke: new Stroke({
lineDash: [1, 2, 3, 4, 5, 6],
color: "rgba(70,130,180)",
width: 2,
}),
}),
stroke: new Stroke({
lineDash: [1, 2, 3, 4, 5, 6],
color: "rgba(70,130,180)",
width: 2,
}),
fill: new Fill({
color: "rgba(173,216,230)",
}),
}),
LineString: new Style({
stroke: new Stroke({
color: "green",
width: 3,
}),
}),
Polygon: new Style({
stroke: new Stroke({
color: "blue",
lineDash: [4],
width: 3,
}),
fill: new Fill({
color: "rgba(0, 0, 255, 0.1)",
}),
}),
};
var styleFunction = function (feature) {
return styles[feature.getGeometry().getType()];
};
var allfearures = this.vectorSource.getFeatures();
for (var i = 0; i < allfearures.length; i++) {
allfearures[i].setId(allfearures[i].get("id"));
}
this.vectorLayer = new VectorLayer({
id: "vectorlayer",
source: this.vectorSource,
style: styleFunction,
});
this.vectorLayer.setZIndex(4);
this.map.addLayer(this.vectorLayer);
this.isVectorLayer = true;
let this1 = this;
this.selectclick = new Select({
layers: [this.vectorLayer],
style: new Style({
image: new CircleStyle({
radius: 7,
fill: new Fill({
color: "yellow",
}),
stroke: new Stroke({
color: "#37eed0",
width: 3,
}),
}),
fill: new Fill({
color: "yellow",
}),
stroke: new Stroke({
color: "#37eed0",
width: 3,
}),
}),
});
this.selectclick.on("select", function (e) {
this1.FeaturesId = [];
var features = e.selected;
if (features.length > 0) {
this1.dialogVisible = true;
let that = this1;
var feature = features[0];
var type = feature.getGeometry().getType();
var tmp = 1;
if (type == "LineString" || type == "Point") {
that.FeaturesId.push({
value: feature.get("id"),
label: feature.get("id"),
});
that.currentFeatureId = feature.get("id");
tmp = 0;
}
this.getFeatures().clear();
var coordinate = e.mapBrowserEvent.coordinate;
var Features = that.vectorSource.getFeaturesAtCoordinate(coordinate);
for (var i = 0; i < Features.length; i++) {
that.FeaturesId.push({
value: Features[i].get("id"),
label: Features[i].get("id"),
});
if (i == 0 && tmp == 1) {
that.currentFeatureId = Features[i].get("id");
}
}
}
});
this.map.addInteraction(this.selectclick);
},
initEchart() {
if (this.myChart1) {
this.myChart1.clear();
this.myChart2.clear();
this.isEchartShow = false;
}
var selectDate = [];
var selectCount = [];
var selectRatio = [];
if (this.data) {
if (this.data.length) {
for (var i = 0; i < this.data.length; i++) {
selectDate.push(this.data[i].date);
selectCount.push(this.data[i].count);
}
} else {
this.$alert("无任务采集进度信息!", "提示", {
confirmButtonText: "确定",
});
return;
}
if (this.ratio.length) {
for (var j = 0; j < this.ratio.length; j++) {
selectRatio.push(this.ratio[j].ratio);
}
} else {
this.$alert("无任务采集进度信息!", "提示", {
confirmButtonText: "确定",
});
return;
}
} else {
this.$alert("无任务采集进度信息!", "提示", {
confirmButtonText: "确定",
});
return;
}
this.myChart1 = echarts.init(document.getElementById("myChart1"));
this.myChart2 = echarts.init(document.getElementById("myChart2"));
this.isEchartShow = true;
// 绘制图表
var myColor = [
"#eb2100",
"#eb3600",
"#d0570e",
"#d0a00e",
"#34da62",
"#00e9db",
"#00c0e9",
"#0096f3",
"#33CCFF",
"#33FFCC",
];
var gridWidth = 350; //可以根据canvas的宽度和grid的right,left,width进行计算
var fontsize = 14; //字体大小
var wordNum = parseInt(gridWidth / selectDate.length / fontsize);
var option1 = {
title: { text: "采集总量:" + this.total },
xAxis: {
data: selectDate,
axisLabel: {
interval: 0,
formatter: function (value, index) {
var strs = value.split("");
var str = "";
for (var i = 0, s; (s = strs[i++]); ) {
str += s;
if (!(i % wordNum)) str += "\n";
}
return str;
},
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
z: 10,
},
yAxis: {
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
textStyle: {
color: "#999",
},
},
},
dataZoom: [
{
type: "inside",
},
],
series: [
{
type: "bar",
showBackground: true,
itemStyle: {
normal: {
color: function (params) {
var num = myColor.length;
return myColor[params.dataIndex % num];
},
},
},
label: {
show: true,
position: "top",
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "#eb2100" },
{ offset: 0.7, color: "#d0570e" },
{ offset: 1, color: "#d0a00e" },
]),
},
},
data: selectCount,
},
],
};
this.myChart1.setOption(option1);
this.myChart1.on("datazoom", function (params) {
if (params.batch) {
var start = params.batch[0].start;
var end = params.batch[0].end;
} else {
var start = params.start;
var end = params.end;
}
var cur_col_num = ((end - start) / 100) * selectDate.length; //计算缩放后可以显示几个柱子
wordNum = parseInt(Math.ceil(gridWidth / cur_col_num) / 14); //重新计算wordNum
});
var option2 = {
xAxis: {
data: selectDate,
axisLabel: {
interval: 0,
formatter: function (value, index) {
var strs = value.split("");
var str = "";
for (var i = 0, s; (s = strs[i++]); ) {
str += s;
if (!(i % wordNum)) str += "\n";
}
return str;
},
},
axisTick: {
show: false,
},
axisLine: {
show: false,
},
z: 10,
},
yAxis: {
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
textStyle: {
color: "#999",
},
},
},
dataZoom: [
{
type: "inside",
},
],
series: [
{
type: "bar",
showBackground: true,
itemStyle: {
normal: {
color: function (params) {
var num = myColor.length;
return myColor[params.dataIndex % num];
},
},
},
label: {
show: true,
position: "top",
formatter: function (params) {
var str = Number(params.value * 100).toFixed(2);
str += "%";
return str;
},
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "#eb2100" },
{ offset: 0.7, color: "#d0570e" },
{ offset: 1, color: "#d0a00e" },
]),
},
},
data: selectRatio,
},
],
};
this.myChart2.setOption(option2);
this.myChart2.on("datazoom", function (params) {
if (params.batch) {
var start = params.batch[0].start;
var end = params.batch[0].end;
} else {
var start = params.start;
var end = params.end;
}
var cur_col_num = ((end - start) / 100) * selectDate.length; //计算缩放后可以显示几个柱子
wordNum = parseInt(Math.ceil(gridWidth / cur_col_num) / 14); //重新计算wordNum
});
// var option = {
// title: { text: "任务采集进度" },
// xAxis: [
// {
// show: false,
// },
// ],
// yAxis: {
// axisLine: {
// show: false,
// },
// axisLabel: {
// margin: 2,
// },
// nameTextStyle: {
// color: "#ffffff",
// fontSize: "10",
// },
// data: selectDate,
// },
// grid: {
// left: 35,
// },
// series: [
// {
// name: "条",
// type: "bar",
// yAxisIndex: 0,
// data: selectRatio,
// label: {
// show: true,
// position: "right",
// formatter: function (params) {
// var str = Number(params.value * 100).toFixed(2);
// str += "%";
// return str;
// },
// },
// barWidth: 15,
// itemStyle: {
// normal: {
// color: function (params) {
// var num = myColor.length;
// return myColor[params.dataIndex % num];
// },
// },
// },
// z: 2,
// },
// ],
// };
// this.myChart2.setOption(option);
},
getWorkers() {
if (this.workersTask == "") {
this.$alert("请先选择任务!", "提示", {
confirmButtonText: "确定",
});
} else {
let that = this;
request({
url: "/report/workloadByUser",
method: "get",
params: {
taskId: that.workersTask,
},
}).then(function (response) {
// 获取数据存入config
if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else if (response.data.status === 200) {
that.IsWorkersShow = true;
that.workersData = response.data.data;
}
});
}
},
getTables() {
if (this.task === "") {
this.$alert("请先选择任务!", "提示", {
confirmButtonText: "确定",
});
document.getElementById("sTable").blur();
} else {
var taskname = "";
for (var i = 0; i < this.taskoptions.length; i++) {
if (this.task == this.taskoptions[i].value) {
taskname = this.taskoptions[i].label;
break;
}
}
this.tableoptions = [];
let that = this;
request({
url: "/statistic/getTables",
method: "get",
params: {
tskName: taskname,
},
}).then(function (response) {
// 获取数据存入config
if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else if (response.status === 200) {
var json = response.data;
for (var key in json) {
that.tableoptions.push({
value: key,
label: json[key],
});
}
}
});
}
},
getEChart() {
if (this.task === "") {
this.$alert("请选择任务!", "提示", {
confirmButtonText: "确定",
});
return;
}
if (this.table === "") {
this.$alert("请选择表!", "提示", {
confirmButtonText: "确定",
});
return;
}
if (this.date.length < 2) {
this.$alert("请选择日期!", "提示", {
confirmButtonText: "确定",
});
return;
}
if (this.date[0] == this.date[1]) {
this.$message.info("查询时间重复!");
return;
}
var taskname = "";
for (var i = 0; i < this.taskoptions.length; i++) {
if (this.task == this.taskoptions[i].value) {
taskname = this.taskoptions[i].label;
break;
}
}
let that = this;
request({
url: "statistic/stat",
method: "post",
params: {
tblName: that.table,
operation: that.radio,
startTime: that.date[0],
endTime: that.date[1],
tskName: taskname,
},
}).then(function (response) {
// 获取数据存入config
if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else if (response.status === 200) {
that.data = response.data.data;
that.ratio = response.data.ratio;
that.total = response.data.total;
that.initEchart();
}
});
},
getReport() {
if (this.ReportTask === "") {
this.$alert("请先选择查看的任务!", "提示", {
confirmButtonText: "确定",
});
return;
}
//组织数据格式
let that = this;
request({
url: "/report/featuresInfo",
method: "get",
params: {
taskId: that.ReportTask,
},
}).then(function (response) {
//先清空
that.tableStatNum = [];
that.tableName = [];
that.tableCount = [];
that.tableDailyAvg = [];
that.tableMonthlyAvg = [];
that.dailyTableRatio = [];
that.dailyTableData = [];
that.monthlyTableRatio = [];
that.monthlyTableData = [];
that.tableMaxDaily = [];
that.tableMaxDailyNum = [];
that.tableMaxMonthly = [];
that.tableMaxMonthlyNum = [];
that.tableMinDaily = [];
that.tableMinDailyNum = [];
that.tableMinMonthly = [];
that.tableMinMonthlyNum = [];
if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else if (response.status === 200) {
if (response.data.length) {
var result = response.data;
var tableStatNum1 = result.length;
for (var i = 0; i < tableStatNum1; i++) {
that.tableStatNum.push(i + 1);
}
for (var j = 0; j < result.length; j++) {
var onetabledata = result[j];
that.tableName.push(onetabledata.name_ch);
that.tableCount.push(onetabledata.count);
//读取每天
var statDaily = onetabledata.statDaily;
that.tableDailyAvg.push(statDaily.avg);
var dailydata = [];
var dailyratio = [];
for (var k = 0; k < statDaily.data.length; k++) {
dailydata.push(statDaily.data[k]);
}
that.dailyTableData.push(dailydata);
for (var k = 0; k < statDaily.ratio.length; k++) {
dailyratio.push(statDaily.ratio[k]);
}
that.dailyTableRatio.push(dailyratio);
var maxdailyJson = statDaily.maxDay;
for (var key in maxdailyJson) {
that.tableMaxDaily.push(key);
that.tableMaxDailyNum.push(maxdailyJson[key]);
}
var mindailyJson = statDaily.minDay;
for (var key in mindailyJson) {
that.tableMinDaily.push(key);
that.tableMinDailyNum.push(mindailyJson[key]);
}
//读取每月
var statMonthly = onetabledata.statMonthly;
that.tableMonthlyAvg.push(statMonthly.avg);
var monthlydata = [];
var monthlyratio = [];
for (var k = 0; k < statMonthly.data.length; k++) {
monthlydata.push(statMonthly.data[k]);
}
that.monthlyTableData.push(monthlydata);
for (var k = 0; k < statMonthly.ratio.length; k++) {
monthlyratio.push(statMonthly.ratio[k]);
}
that.monthlyTableRatio.push(monthlyratio);
var maxmonthlyJson = statMonthly.maxMonth;
for (var key in maxmonthlyJson) {
that.tableMaxMonthly.push(key);
that.tableMaxMonthlyNum.push(maxmonthlyJson[key]);
}
var minmonthlyJson = statMonthly.minMonth;
for (var key in minmonthlyJson) {
that.tableMinMonthly.push(key);
that.tableMinMonthlyNum.push(minmonthlyJson[key]);
}
}
that.IsCardShow = true;
that.tableStatNum = that.tableStatNum.slice(0);
setTimeout(function () {
for (var i = 0; i < that.tableStatNum.length; i++) {
that.initTableDaliyData(i);
that.initTableDaliyRatio(i);
that.initTableMonthlyData(i);
that.initTableMonthlyRatio(i);
}
}, 50);
that.taskMessage = true;
} else {
that.$message.info("数据为空,无法生成任务信息统计报告!");
that.taskMessage = false;
}
}
});
request({
url: "/report/collectorsInfo",
method: "post",
params: {
taskId: that.ReportTask,
},
}).then(function (response) {
if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else {
//先清空
that.workerNum = [];
that.tableNum = [];
that.workerInfo = [];
that.TableList = [];
that.WorkerList = [];
that.workLoadList = [];
that.avgWorkLoadList = [];
if (response.status === 200) {
if (response.data.length) {
var result = response.data;
if (result.length > 0) {
var workerNum1 = result.length;
var tableNum1 = 0;
for (var key in result[0]) {
if (key != "name" && key != "phone" && key != "email") {
that.TableList.push(key);
tableNum1 = tableNum1 + 1;
}
}
for (var i = 0; i < workerNum1; i++) {
that.workerNum.push(i + 1);
}
for (var i = 0; i < tableNum1; i++) {
that.tableNum.push(i + 1);
}
for (var i = 0; i < result.length; i++) {
var oneworkerdata = result[i];
that.workerInfo.push({
name: oneworkerdata.name,
phone: oneworkerdata.phone,
email: oneworkerdata.email,
});
that.WorkerList.push(oneworkerdata.name);
//读取表信息
var tablesinfo = [];
for (var key in oneworkerdata) {
if (key != "name" && key != "phone" && key != "email") {
tablesinfo.push(oneworkerdata[key]);
}
}
for (var j = 0; j < that.tableNum.length; j++) {
var onetabledata = tablesinfo[j];
if (that.workLoadList[j]) {
that.workLoadList[j].push(onetabledata.workLoad);
that.avgWorkLoadList[j].push(onetabledata.avgWorkLoad);
that.workLoadDaily[j].push(onetabledata.workLoadDaily);
} else {
var workLoadList1 = [];
var avgWorkLoadList1 = [];
var workLoadDaily1 = [];
workLoadList1.push(onetabledata.workLoad);
avgWorkLoadList1.push(onetabledata.avgWorkLoad);
workLoadDaily1.push(onetabledata.workLoadDaily);
that.workLoadList[j] = workLoadList1;
that.avgWorkLoadList[j] = avgWorkLoadList1;
that.workLoadDaily[j] = workLoadDaily1;
}
}
}
that.IsCardShow = true;
that.tableNum = that.tableNum.slice(0);
that.workerNum = that.workerNum.slice(0);
setTimeout(function () {
for (var k = 0; k < that.tableNum.length; k++) {
that.initWorkLoad(k);
that.initAvgWorkLoad(k);
for (var j = 0; j < that.workerNum.length; j++) {
that.initWorkLoadDaily(k, j);
}
}
}, 50);
that.workerMessage = true;
} else {
that.$message.info("数据为空,无法生成人员信息统计报告!");
that.workerMessage = false;
}
} else {
that.$message.info("数据为空,无法生成人员信息统计报告!");
}
}
}
});
},
//i表示第几个表
initTableDaliyData(i) {
if (this.myTableDailyDataEchart[i])
this.myTableDailyDataEchart[i].clear();
var dates = [];
var counts = [];
for (let j = 0; j < this.dailyTableData[i].length; j++) {
dates.push(this.dailyTableData[i][j].date);
counts.push(this.dailyTableData[i][j].count);
}
this.myTableDailyDataEchart[i] = echarts.init(
document.getElementById("dailyDataEchart" + i)
);
//绘制
var option = {
backgroundColor: "#323a5e",
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "2%",
right: "4%",
bottom: "14%",
top: "16%",
containLabel: true,
},
legend: {
data: ["采集量"],
right: 10,
top: 12,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
},
xAxis: {
type: "category",
data: dates,
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.3)",
},
},
axisLabel: {},
},
dataZoom: [
{
show: true,
height: 12,
xAxisIndex: [0],
bottom: "8%",
start: 10,
end: 90,
handleIcon:
"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
handleSize: "110%",
handleStyle: {
color: "#d3dee5",
},
textStyle: {
color: "#fff",
},
borderColor: "#90979c",
},
{
type: "inside",
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: "采集量",
type: "bar",
barWidth: "5%",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#fccb05",
},
{
offset: 1,
color: "#f5804d",
},
]),
barBorderRadius: 12,
},
},
data: counts,
},
],
};
var app = {
currentIndex: -1,
};
let that = this;
setInterval(function () {
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
that.myTableDailyDataEchart[i].dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
that.myTableDailyDataEchart[i].dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
// 显示 tooltip
that.myTableDailyDataEchart[i].dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
}, 1000);
this.myTableDailyDataEchart[i].setOption(option);
},
//i表示第几个表
initTableDaliyRatio(i) {
if (this.myTableDailyRatioEchart[i])
this.myTableDailyRatioEchart[i].clear();
var dates = [];
var counts = [];
var j = 0;
for (j; j < this.dailyTableRatio[i].length; j++) {
dates.push(this.dailyTableRatio[i][j].date);
counts.push(this.dailyTableRatio[i][j].ratio);
}
this.myTableDailyRatioEchart[i] = echarts.init(
document.getElementById("dailyRatioEchart" + i)
);
//绘制
var option = {
backgroundColor: "#323a5e",
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "2%",
right: "4%",
bottom: "14%",
top: "16%",
containLabel: true,
},
legend: {
data: ["采集进度"],
right: 10,
top: 12,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
},
xAxis: {
type: "category",
data: dates,
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.3)",
},
},
axisLabel: {},
},
dataZoom: [
{
show: true,
height: 12,
xAxisIndex: [0],
bottom: "8%",
start: 10,
end: 90,
handleIcon:
"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
handleSize: "110%",
handleStyle: {
color: "#d3dee5",
},
textStyle: {
color: "#fff",
},
borderColor: "#90979c",
},
{
type: "inside",
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: "采集进度",
type: "bar",
barWidth: "5%",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#8bd46e",
},
{
offset: 1,
color: "#09bcb7",
},
]),
barBorderRadius: 12,
},
},
data: counts,
},
],
};
var app = {
currentIndex: -1,
};
let that = this;
setInterval(function () {
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
that.myTableDailyRatioEchart[i].dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
that.myTableDailyRatioEchart[i].dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
// 显示 tooltip
that.myTableDailyRatioEchart[i].dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
}, 1000);
this.myTableDailyRatioEchart[i].setOption(option);
},
//i表示第几个表
initTableMonthlyData(i) {
if (this.myTableMonthlyDataEchart[i])
this.myTableMonthlyDataEchart[i].clear();
var dates = [];
var counts = [];
var j = 0;
for (j; j < this.monthlyTableData[i].length; j++) {
dates.push(this.monthlyTableData[i][j].date);
counts.push(this.monthlyTableData[i][j].count);
}
this.myTableMonthlyDataEchart[i] = echarts.init(
document.getElementById("monthlyDataEchart" + i)
);
//绘制
var option = {
backgroundColor: "#323a5e",
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "2%",
right: "4%",
bottom: "14%",
top: "16%",
containLabel: true,
},
legend: {
data: ["采集量"],
right: 10,
top: 12,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
},
xAxis: {
type: "category",
data: dates,
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.3)",
},
},
axisLabel: {},
},
dataZoom: [
{
show: true,
height: 12,
xAxisIndex: [0],
bottom: "8%",
start: 10,
end: 90,
handleIcon:
"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
handleSize: "110%",
handleStyle: {
color: "#d3dee5",
},
textStyle: {
color: "#fff",
},
borderColor: "#90979c",
},
{
type: "inside",
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: "采集量",
type: "bar",
barWidth: "5%",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#fccb05",
},
{
offset: 1,
color: "#f5804d",
},
]),
barBorderRadius: 12,
},
},
data: counts,
},
],
};
var app = {
currentIndex: -1,
};
let that = this;
setInterval(function () {
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
that.myTableMonthlyDataEchart[i].dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
that.myTableMonthlyDataEchart[i].dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
// 显示 tooltip
that.myTableMonthlyDataEchart[i].dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
}, 1000);
this.myTableMonthlyDataEchart[i].setOption(option);
},
//i表示第几个表
initTableMonthlyRatio(i) {
if (this.myTableMonthlyRatioEchart[i])
this.myTableMonthlyRatioEchart[i].clear();
var dates = [];
var counts = [];
var j = 0;
for (j; j < this.monthlyTableRatio[i].length; j++) {
dates.push(this.monthlyTableRatio[i][j].date);
counts.push(this.monthlyTableRatio[i][j].ratio);
}
this.myTableMonthlyRatioEchart[i] = echarts.init(
document.getElementById("monthlyRatioEchart" + i)
);
//绘制
var option = {
backgroundColor: "#323a5e",
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "2%",
right: "4%",
bottom: "14%",
top: "16%",
containLabel: true,
},
legend: {
data: ["采集进度"],
right: 10,
top: 12,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
},
xAxis: {
type: "category",
data: dates,
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.3)",
},
},
axisLabel: {},
},
dataZoom: [
{
show: true,
height: 12,
xAxisIndex: [0],
bottom: "8%",
start: 10,
end: 90,
handleIcon:
"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
handleSize: "110%",
handleStyle: {
color: "#d3dee5",
},
textStyle: {
color: "#fff",
},
borderColor: "#90979c",
},
{
type: "inside",
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: "采集进度",
type: "bar",
barWidth: "5%",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#8bd46e",
},
{
offset: 1,
color: "#09bcb7",
},
]),
barBorderRadius: 12,
},
},
data: counts,
},
],
};
var app = {
currentIndex: -1,
};
let that = this;
setInterval(function () {
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
that.myTableMonthlyRatioEchart[i].dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
that.myTableMonthlyRatioEchart[i].dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
// 显示 tooltip
that.myTableMonthlyRatioEchart[i].dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
}, 1000);
this.myTableMonthlyRatioEchart[i].setOption(option);
},
initWorkLoad(i) {
if (this.myWorkLoadEchart[i]) this.myWorkLoadEchart[i].clear();
this.myWorkLoadEchart[i] = echarts.init(
document.getElementById("workLoad" + i)
);
//绘制
var option = {
backgroundColor: "#323a5e",
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "2%",
right: "4%",
bottom: "14%",
top: "16%",
containLabel: true,
},
legend: {
data: ["采集量"],
right: 10,
top: 12,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
},
xAxis: {
type: "category",
data: this.WorkerList,
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.3)",
},
},
axisLabel: {},
},
dataZoom: [
{
show: true,
height: 12,
xAxisIndex: [0],
bottom: "8%",
start: 10,
end: 90,
handleIcon:
"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
handleSize: "110%",
handleStyle: {
color: "#d3dee5",
},
textStyle: {
color: "#fff",
},
borderColor: "#90979c",
},
{
type: "inside",
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: "采集量",
type: "bar",
barWidth: "5%",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#fccb05",
},
{
offset: 1,
color: "#f5804d",
},
]),
barBorderRadius: 12,
},
},
data: this.workLoadList[i],
},
],
};
var app = {
currentIndex: -1,
};
let that = this;
setInterval(function () {
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
that.myWorkLoadEchart[i].dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
that.myWorkLoadEchart[i].dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
// 显示 tooltip
that.myWorkLoadEchart[i].dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
}, 1000);
this.myWorkLoadEchart[i].setOption(option);
},
initAvgWorkLoad(i) {
if (this.myAvgWorkLoadEchart[i]) this.myAvgWorkLoadEchart[i].clear();
this.myAvgWorkLoadEchart[i] = echarts.init(
document.getElementById("avgWorkLoad" + i)
);
//绘制
var option = {
backgroundColor: "#323a5e",
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "2%",
right: "4%",
bottom: "14%",
top: "16%",
containLabel: true,
},
legend: {
data: ["采集量"],
right: 10,
top: 12,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
},
xAxis: {
type: "category",
data: this.WorkerList,
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.3)",
},
},
axisLabel: {},
},
dataZoom: [
{
show: true,
height: 12,
xAxisIndex: [0],
bottom: "8%",
start: 10,
end: 90,
handleIcon:
"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
handleSize: "110%",
handleStyle: {
color: "#d3dee5",
},
textStyle: {
color: "#fff",
},
borderColor: "#90979c",
},
{
type: "inside",
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: "采集量",
type: "bar",
barWidth: "5%",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#33CCFF",
},
{
offset: 1,
color: "#0096f3",
},
]),
barBorderRadius: 12,
},
},
data: this.avgWorkLoadList[i],
},
],
};
var app = {
currentIndex: -1,
};
let that = this;
setInterval(function () {
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
that.myAvgWorkLoadEchart[i].dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
that.myAvgWorkLoadEchart[i].dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
// 显示 tooltip
that.myAvgWorkLoadEchart[i].dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
}, 1000);
this.myAvgWorkLoadEchart[i].setOption(option);
},
initWorkLoadDaily(i, j) {
if (this.myWorkLoadDailyEchart[i]) {
if (this.myWorkLoadDailyEchart[i][j])
this.myWorkLoadDailyEchart[i][j].clear();
}
var dates = [];
var counts = [];
var k = 0;
for (k; k < this.workLoadDaily[i][j].length; k++) {
dates.push(this.workLoadDaily[i][j][k].date);
counts.push(this.workLoadDaily[i][j][k].count);
}
var myWorkLoadDailyEchart1 = echarts.init(
document.getElementById("workLoadDaily" + i + j)
);
//绘制
var option = {
backgroundColor: "#323a5e",
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
},
grid: {
left: "2%",
right: "4%",
bottom: "14%",
top: "16%",
containLabel: true,
},
legend: {
data: ["采集量"],
right: 10,
top: 12,
textStyle: {
color: "#fff",
},
itemWidth: 12,
itemHeight: 10,
},
xAxis: {
type: "category",
data: dates,
axisLine: {
lineStyle: {
color: "white",
},
},
axisLabel: {
textStyle: {
fontFamily: "Microsoft YaHei",
},
},
},
yAxis: {
type: "value",
axisLine: {
show: false,
lineStyle: {
color: "white",
},
},
splitLine: {
show: true,
lineStyle: {
color: "rgba(255,255,255,0.3)",
},
},
axisLabel: {},
},
dataZoom: [
{
show: true,
height: 12,
xAxisIndex: [0],
bottom: "8%",
start: 10,
end: 90,
handleIcon:
"path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z",
handleSize: "110%",
handleStyle: {
color: "#d3dee5",
},
textStyle: {
color: "#fff",
},
borderColor: "#90979c",
},
{
type: "inside",
show: true,
height: 15,
start: 1,
end: 35,
},
],
series: [
{
name: "采集量",
type: "bar",
barWidth: "5%",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#8bd46e",
},
{
offset: 1,
color: "#09bcb7",
},
]),
barBorderRadius: 12,
},
},
data: counts,
},
],
};
var app = {
currentIndex: -1,
};
let that = this;
setInterval(function () {
var dataLen = option.series[0].data.length;
// 取消之前高亮的图形
myWorkLoadDailyEchart1.dispatchAction({
type: "downplay",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
app.currentIndex = (app.currentIndex + 1) % dataLen;
// 高亮当前图形
myWorkLoadDailyEchart1.dispatchAction({
type: "highlight",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
// 显示 tooltip
myWorkLoadDailyEchart1.dispatchAction({
type: "showTip",
seriesIndex: 0,
dataIndex: app.currentIndex,
});
}, 1000);
myWorkLoadDailyEchart1.setOption(option);
var sub1 = [];
if (this.myWorkLoadDailyEchart[i]) {
sub1 = this.myWorkLoadDailyEchart[i];
sub1.push(myWorkLoadDailyEchart1);
this.myWorkLoadDailyEchart[i] = sub1;
} else {
sub1.push(myWorkLoadDailyEchart1);
this.myWorkLoadDailyEchart.push(sub1);
}
},
getWarning() {
if (this.warningform.task == "") {
this.$alert("请先选择查看的任务!", "提示", {
confirmButtonText: "确定",
});
return;
} else if (this.warningform.table == "") {
this.$alert("请先选择查看的表!", "提示", {
confirmButtonText: "确定",
});
return;
}
// 给个默认值0.67-1.33
// else if (this.warningform.maxratio == "") {
// this.$alert("请先输入异常上限值!", "提示", {
// confirmButtonText: "确定",
// });
// return;
// } else if (this.warningform.minratio == "") {
// this.$alert("请先输入异常下限值!", "提示", {
// confirmButtonText: "确定",
// });
// return;
// }
else {
let that = this;
this.warningData = [];
let low =
this.warningform.minratio == "" ? 0.67 : this.warningform.minratio;
let high =
this.warningform.maxratio == "" ? 1.33 : this.warningform.maxratio;
request({
url: "/base/getWarningForUser",
method: "post",
params: {
taskId: that.warningform.task,
tableName: that.warningform.table,
lowLimit: low,
highLimit: high,
},
}).then(function (response) {
if (response.data.status == 200) {
if (response.data.data) {
var result = response.data.data.unusualData;
that.warningWorkerNum = result.length;
that.averageNum = response.data.data.averageNum;
that.lowLimitNum = response.data.data.lowLimitNum;
that.highLimitNum = response.data.data.highLimitNum;
var idcount = 0;
for (var i = 0; i < result.length; i++) {
var user = result[i].userName;
var dataaaa = {
id: "",
username: user,
date: "",
count: "",
children: [],
};
for (var j = 0; j < result[i].unusualDay.length; j++) {
if (j == 0) {
dataaaa.id = (idcount + 1).toString();
dataaaa.date = result[i].unusualDay[j].day;
dataaaa.count = result[i].unusualDay[j].num;
} else {
dataaaa.children.push({
id: (idcount + 1).toString(),
username: user,
date: result[i].unusualDay[j].day,
count: result[i].unusualDay[j].num,
});
}
idcount = idcount + 1;
}
that.warningData.push(dataaaa);
}
//that.getSameCount();
that.IsWarningShow = true;
} else {
that.IsWarningShow = false;
that.$alert("该任务目前无工作异常情况~");
}
} else if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else {
that.IsWarningShow = false;
that.$alert(response.data.message);
}
});
}
},
getSameCount() {
if (this.warningData.length > 0) {
this.sameCount = [];
var j = 0;
for (var i = 0; i < this.warningData.length; i++) {
this.sameCount.push(1);
}
for (var i = 1; i < this.warningData.length; i++) {
if (this.warningData[j].username == this.warningData[i].username) {
this.sameCount[j] = this.sameCount[j] + 1;
this.sameCount[i] = 0;
} else {
j = i;
}
}
}
},
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
var _row = this.sameCount[rowIndex];
var _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col,
};
}
},
tableRowClassName({ row, rowIndex }) {
if (rowIndex % 2 === 0) {
return "success-row";
}
return "";
},
getClusterData(geojsonObject) {
var Features = new GeoJSON().readFeatures(geojsonObject);
var features = new Array(Features.length);
for (var i = 0; i < Features.length; i++) {
var geometry = Features[i].getGeometry();
var coordinates = geometry.getCoordinates();
var coordinate = [];
if (coordinates[0][0]) {
if (coordinates[0][0][0]) {
coordinate = coordinates[0][0];
} else {
coordinate = coordinates[0];
}
} else {
coordinate = coordinates;
}
features[i] = new Feature(new Point(coordinate));
}
var clusterSource = new VectorSource({
features: features,
});
var cluster = new Cluster({
distance: 40,
source: clusterSource,
});
var styleCache = {};
this.clusters = new VectorLayer({
id: "clusterlayer",
source: cluster,
style: function (feature) {
if (feature.get("features")) {
var size = feature.get("features").length;
var style = styleCache[size];
if (!style) {
style = new Style({
image: new CircleStyle({
radius: 10,
stroke: new Stroke({
color: "#fff",
}),
fill: new Fill({
color: "#3399CC",
}),
}),
text: new Text({
text: size.toString(),
fill: new Fill({
color: "#fff",
}),
}),
});
styleCache[size] = style;
}
return style;
}
},
});
//聚类图层
this.clusters.setZIndex(4);
this.map.addLayer(this.clusters);
this.isClusters = true;
},
setCurrentStyle() {
if (this.currentFeatureId !== "") {
this.getFeatureData();
//改变样式
if (this.feature) {
this.feature.setStyle(undefined);
}
this.feature = this.vectorSource.getFeatureById(this.currentFeatureId);
var style = new Style({
image: new CircleStyle({
radius: 7,
fill: new Fill({
color: "yellow",
}),
stroke: new Stroke({
color: "#37eed0",
width: 3,
}),
}),
fill: new Fill({
color: "yellow",
}),
stroke: new Stroke({
color: "#37eed0",
width: 3,
}),
});
this.feature.setStyle(style);
} else {
if (this.feature) {
this.feature.setStyle(undefined);
this.feature = null;
}
}
},
clearAll() {
this.currentFeatureId = "";
this.Info = {};
this.FeaturesId = [];
},
getFeatureData() {
if (this.currentFeatureId !== "") {
let that = this;
//获取数据
request({
url: "/get/getDataById",
method: "post",
params: {
taskId: that.task,
tableName: that.table,
polygonId: that.currentFeatureId,
requestor: "browser",
},
}).then(function (response) {
if (response.data.success == true) {
var jsondata = response.data.data;
var imagedata = [];
var videodata = [];
for (var i = 0; i < jsondata.mediaFileURLs.length; i++) {
if (
jsondata.mediaFileURLs[i].substring(
jsondata.mediaFileURLs[i].length - 3
) == "jpg"
) {
imagedata.push(jsondata.mediaFileURLs[i]);
} else if (
jsondata.mediaFileURLs[i].substring(
jsondata.mediaFileURLs[i].length - 3
) == "avi"
) {
videodata.push(jsondata.mediaFileURLs[i]);
}
}
jsondata.imagedata = imagedata;
jsondata.videodata = videodata;
that.Info = jsondata;
} else if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
}
});
}
},
changeHotMap() {
if (!this.isHot) {
if (this.task && this.table) {
if (this.heatmapLayer) {
this.isHot = !this.isHot;
this.addHeatmapLayer();
} else {
this.$alert("该任务暂无热力图统计数据!");
}
} else {
this.$alert("请先在任务进度中选择生成热力图的任务和表!");
}
} else {
this.isHot = !this.isHot;
this.removeHeatmapLayer();
}
},
addHeatmapLayer() {
if (this.clusters) {
if (this.isClusters) {
this.map.removeLayer(this.clusters);
this.isClusters = false;
}
this.clusters = null;
}
if (this.vectorLayer) {
if (this.isVectorLayer) {
this.map.removeLayer(this.vectorLayer);
this.map.removeInteraction(this.selectclick);
this.isVectorLayer = false;
}
this.vectorLayer = null;
this.selectclick = null;
}
this.distribute = false;
if (this.heatmapLayer) {
this.heatmapLayer.setVisible(true);
}
},
removeHeatmapLayer() {
this.distribute = true;
this.getClusters();
if (this.heatmapLayer) {
this.heatmapLayer.setVisible(false);
}
},
initHeatmapLayer() {
let that = this;
request({
url: "base/getHeatData",
method: "post",
params: {
taskId: that.task,
tableName: that.table,
},
}).then(function (response) {
// 获取数据存入config
if (response.data.status == "401") {
that.$alert(response.data.message);
that.$router.push({ path: "/login" });
} else if (response.data.status === 200) {
if (response.data.data) {
var features = [];
var max = 1;
var datas = response.data.data;
if (datas.length == 0) return;
else {
max = Math.max.apply(
Math,
datas.map(function (o) {
return o.count;
})
);
}
for (var i = 0; i < datas.length; i++) {
var data = datas[i];
var center = [
data.feature.geometry.coordinates[0],
data.feature.geometry.coordinates[1],
];
var geometry = new Point(center);
var feature = new Feature({
geometry: geometry,
weight: parseFloat(data.count) / max.toFixed(10),
});
features.push(feature);
}
var vectorSource = new VectorSource({
features: features,
});
that.heatmapLayer = new HeatmapLayer({
source: vectorSource,
weight: "weight",
});
that.heatmapLayer.setZIndex(8);
that.heatmapLayer.setVisible(false);
that.map.addLayer(that.heatmapLayer);
}
}
});
},
},
};
</script>
<style scoped lang='scss'>
.el-input__inner {
>>> &::placeholder {
font-family: PingFangSC-Regular;
font-size: 14px;
color: #c0c4cc;
}
}
>>> .el-card__body {
height: calc(100% - 74px);
padding: 20px;
}
>>> .el-tabs__content {
height: calc(100% - 40px);
}
>>> .el-radio-button__orig-radio:checked + .el-radio-button__inner {
background-color: #264672;
border-color: #264672;
}
#map {
height: 100%;
width: 100%;
left: 0;
top: 0;
position: absolute;
}
body {
overflow: hidden;
height: 100%;
}
.map-text {
background-color: #304156;
color: white;
font-size: 14px;
}
@media screen and (min-width: 1401px) {
#control {
margin-top: 5px;
}
}
@media screen and (min-width: 840px) and (max-width: 1401px) {
#control {
margin-top: 55px;
}
}
@media screen and (min-width: 420px) and (max-width: 840px) {
#control {
margin-top: 105px;
}
}
@media screen and (max-width: 420px) {
#control {
margin-top: 155px;
}
}
.taskChoser {
margin: 5px 0px 5px 0px;
}
.el-card__body {
padding: 20px;
height: 90% !important;
}
.el-tabs__content {
overflow: auto !important;
position: relative !important;
height: 90% !important;
}
.el-table .success-row {
background: #f0f9eb;
}
#control {
z-index: 1;
position: absolute;
display: flex;
flex-flow: row;
align-items: center;
bottom: 20px;
right: 192px;
}
.map-img {
width: 80px;
height: 100px;
}
.map-type-button {
width: 50px;
display: inline-block;
text-align: center;
}
.map-control .map-type-button {
margin-right: 35px;
}
.demo-table-expand {
font-size: 0;
}
>>> .demo-table-expand label {
width: 150px;
font-weight: bold;
}
>>> .demo-table-expand .el-form-item {
margin-right: 0;
margin-bottom: 0;
width: 80%;
}
</style>