DSDSWeb/src/views/dataSearch.vue

1008 lines
30 KiB
Vue
Raw Normal View History

2024-07-11 18:02:47 +08:00
<template>
<div class="shuju">
<div class="shuju_con">
2024-07-13 18:00:03 +08:00
<div v-show="show == false" class="left">
2024-10-09 11:25:00 +08:00
<div class="tags">
2026-04-03 11:46:47 +08:00
<span class="tag" v-if="menu1">航次编号{{ menu1 }} <i class="el-icon-close" @click="menu1 = ''"></i></span>
2024-10-09 11:25:00 +08:00
<span class="tag" v-if="menu2">平台类型{{ menu2 }} <i class="el-icon-close" @click="menu2 = ''"></i></span>
<span class="tag" v-if="menu3">设备类型{{ menu3 }} <i class="el-icon-close" @click="menu3 = ''"></i></span>
<span class="tag" v-if="menu4">数据样品类型{{ menu4 }} <i class="el-icon-close" @click="menu4 = ''"></i></span>
</div>
2024-07-11 18:02:47 +08:00
<div class="left1">
<div class="xiala">
2024-07-13 18:00:03 +08:00
<el-select v-model="searchTypeValue" placeholder="">
<el-option v-for="(item, index) in searchType" :key="index" :label="item.label" :value="item.label"
:disabled="item.disabled" />
2024-07-11 18:02:47 +08:00
</el-select>
</div>
2024-07-13 18:00:03 +08:00
<el-input v-model="searchValue" placeholder="" />
<el-button class="sousuo" type="primary" icon="el-icon-search" @click="getSearch" />
2024-10-09 11:25:00 +08:00
<el-button v-if="menuShow" class="caidan" type="default" icon="el-icon-s-operation" @click="handleMenu" />
2024-07-11 18:02:47 +08:00
</div>
<div class="left3">
2024-07-13 18:00:03 +08:00
<el-radio-group v-model="radio">
<el-radio label="数据样品集">数据样品集</el-radio>
<el-radio label="航次">航次</el-radio>
</el-radio-group>
2024-07-11 18:02:47 +08:00
</div>
2026-04-03 02:05:29 +08:00
<div class="left4-sample-wrap" v-if="radio == '数据样品集'">
2026-04-03 11:46:47 +08:00
<p class="rule-text">编号规则航次编号_平台类型_设备类型_数据样品类型</p>
2026-04-03 02:05:29 +08:00
<div class="left4">
2026-04-06 11:50:54 +08:00
<div v-for="(item, index) in dataList" :key="index" :id="item.tsy_id" class="left4_1">
2026-04-03 02:05:29 +08:00
<div class="left4_top">
2026-04-06 11:50:54 +08:00
<p @click="openList(item, 'list')"
style="font-weight: 400;font-size: 14px;cursor: pointer;color: #409eff">{{ item.dataset_name }} <span
class="mileage">{{ item.file_total }}</span></p>
2026-04-03 02:05:29 +08:00
<span class="org">{{ item.create_time }}</span>
2024-07-13 18:00:03 +08:00
</div>
2026-04-03 02:05:29 +08:00
<ul v-show="currenId == item.tsy_id && fold">
<li :class="sample.tsy_id == currenSample ? 'bg-color' : ''" class="sample" :id="sample.tsy_id"
2026-04-06 11:50:54 +08:00
v-for="(sample, i) in item.sampleArray" :key="i" @click.stop="onSample(sample, item.job_type)">{{
sample.sample_name }}
2026-04-03 02:05:29 +08:00
</li>
</ul>
<div class="left4_list">
<div class="list1">
<p>航次</p>
2026-04-06 11:50:54 +08:00
<span class="hover-color" style="color: #409eff" @click="turnDeatilPage(item)">{{ item.voyage_name
}}</span>
2026-04-03 02:05:29 +08:00
</div>
<div class="list1">
<p>平台类型</p>
<span>{{ item.platform_type }}</span>
</div>
2024-07-13 18:00:03 +08:00
2026-04-03 02:05:29 +08:00
<div class="list1">
<p>平台名称</p>
<span>{{ item.platform_name }}</span>
</div>
2024-07-13 18:00:03 +08:00
2026-04-03 02:05:29 +08:00
<div class="list1">
<p>潜次序号</p>
<span>{{ item.diving_sn }}</span>
</div>
2024-07-11 18:02:47 +08:00
2026-04-03 02:05:29 +08:00
<div class="list1">
<p>设备类型</p>
<span>{{ item.equipment_type }}</span>
</div>
2024-07-11 18:02:47 +08:00
2026-04-03 02:05:29 +08:00
<div class="list1">
<p>数据样品类型</p>
<span style="font-weight: bold">{{ item.data_type }}</span>
</div>
<div class="list1">
<p>作业类型</p>
<span>{{ item.job_type }}</span>
</div>
2024-07-11 18:02:47 +08:00
2024-07-13 18:00:03 +08:00
</div>
</div>
</div>
</div>
<div class="left4" v-if="radio == '航次'">
2025-10-31 16:15:28 +08:00
<div v-for="(item, index) in dataList" :key="index" class="left4_1" style="cursor: pointer" :id="item.tsy_id">
2024-07-13 18:00:03 +08:00
<div class="left4_top">
2025-10-31 16:15:28 +08:00
<p :style="currentVoyage === item.tsy_id ? 'color: #409eff' : ''">
<span style="color: #409eff" @click="turnDeatilPage(item)">{{ item.voyage_name }}</span>
<span class="mileage">{{ item.voyage_mileage }}海里</span>
</p>
2024-07-13 18:00:03 +08:00
<span class="org">{{ item.funding_org }}</span>
</div>
<div class="left4_list">
<div class="list1">
<p>科考船舶</p>
<span>{{ item.ship_name }}</span>
</div>
2024-07-11 18:02:47 +08:00
<div class="list1">
<p>航次首席</p>
2024-07-13 18:00:03 +08:00
<span>{{ item.voyage_officer }}</span>
</div>
<div class="list1">
<p>离港日期</p>
<span>{{ item.voyage_start_date.slice(0, 10) }}</span>
2024-07-13 18:00:03 +08:00
</div>
<div class="list1">
<p>返港日期</p>
<span>{{ item.voyage_end_date.slice(0, 10) }}</span>
2024-07-13 18:00:03 +08:00
</div>
<div class="list1">
<p>项目编号</p>
<span>{{ item.funding_code }}</span>
</div>
<div class="list1">
<p>是否涉密</p>
<span>{{ item.serect_status == 'Active' ? '是' : '否' }}</span>
2024-07-11 18:02:47 +08:00
</div>
<div class="btns">
<el-button v-if="!item.highlight" icon="el-icon-s-opportunity" circle
@click="addHighlightLayer(item.voyage_name, index)" />
<el-button v-if="item.highlight" type="primary" icon="el-icon-s-opportunity" circle
@click="clearHighlight(item.voyage_name, index)" />
<el-button v-if="!item.show" icon="el-icon-view" circle
@click="addSingleLineImg(item.voyage_name, index)" />
<el-button v-if="item.show" type="primary" icon="el-icon-view" circle
@click="removeSingleLineImg(item.voyage_name, index)" />
<!-- <el-button icon="el-icon-location-information" circle /> -->
</div>
2024-07-11 18:02:47 +08:00
</div>
</div>
</div>
<div class="arrow">
<img src="../../static/images/arrow_nav.png" alt="" @click="shousuo">
</div>
</div>
2024-07-13 18:00:03 +08:00
<div v-show="show" class="arrow_r" @click="toshow">
2024-07-11 18:02:47 +08:00
<img src="../../static/images/arrow_nav1.png" alt="">
</div>
<div class="right">
2026-04-02 18:05:51 +08:00
<div id="dataSearchMap" style="height: 100vh;width:100%;" />
<a @click="goHome"> <img class="logo" src="../../static/images/logo_map.png" alt="">
<p class="goHome">返回首页</p>
</a>
2024-07-11 18:02:47 +08:00
</div>
</div>
2026-04-03 11:46:47 +08:00
<!-- 航次编号弹窗-->
<el-dialog title="请选择航次编号" :visible.sync="dialog1" width="1000px">
<el-table ref="tableData1" border highlight-current-row @current-change="handleCurrentChange1" max-height="480"
:data="tableData1" :header-cell-style="{ background: '#dddfe6', color: '#555960', textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }">
<el-table-column type="index" label="#" width="50" />
2026-04-03 11:46:47 +08:00
<el-table-column prop="name" label="航次编号" />
</el-table>
</el-dialog>
<!-- 平台类型弹窗-->
<el-dialog title="请选择平台类型" :visible.sync="dialog2" width="1000px">
<el-table ref="tableData2" border @current-change="handleCurrentChange2" :data="tableData2" max-height="480"
:header-cell-style="{ background: '#dddfe6', color: '#555960', textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }">
<el-table-column type="index" label="#" width="50" />
<el-table-column prop="name" label="平台类型名称" />
<el-table-column prop="value" label="英文类型名称" />
</el-table>
</el-dialog>
<!-- 设备类型弹窗-->
<el-dialog title="请选择设备类型" :visible.sync="dialog3" width="1000px">
<el-table ref="tableData3" border @current-change="handleCurrentChange3" :data="tableData3" max-height="480"
:header-cell-style="{ background: '#dddfe6', color: '#555960', textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }">
<el-table-column type="index" label="#" width="50" />
<el-table-column prop="name" label="设备类型名称" />
<el-table-column prop="value" label="英文名称" />
</el-table>
</el-dialog>
<!-- 数据样品类型弹窗-->
<el-dialog title="请选择数据样品类型" :visible.sync="dialog4" width="1000px">
<el-table ref="tableData4" border @current-change="handleCurrentChange4" :data="tableData4" max-height="480"
:header-cell-style="{ background: '#dddfe6', color: '#555960', textAlign: 'center' }"
:cell-style="{ textAlign: 'center' }">
<el-table-column type="index" label="#" width="50" />
<el-table-column prop="name" label="数据样品类型类型名称" />
<el-table-column prop="value" label="英文名称" />
</el-table>
</el-dialog>
<!-- 航次信息弹窗-->
<el-dialog title="航次信息" :visible.sync="dialog5" width="800px">
<div class="detail_b">
<h3 style="padding-bottom: 10px;">{{ voyageInfo.voyage_name }}</h3>
<p>{{ voyageInfo.voyage_remark }}</p>
<h4 style="padding: 20px 0 10px;">航次信息</h4>
<div>
<el-row :gutter="20">
<el-col :span="12">
<label>科考船舶</label><span>{{ voyageInfo.ship_name }}</span>
</el-col>
<el-col :span="12">
<label>资助机构</label><span>{{ voyageInfo.funding_org }}</span>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<label>离港日期</label><span>{{ voyageInfo.voyage_start_date }}</span>
</el-col>
<el-col :span="12">
<label>返港日期</label><span>{{ voyageInfo.voyage_end_date }}</span>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<label>航次首席</label><span>{{ voyageInfo.voyage_officer }}</span>
</el-col>
</el-row>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleVoyageDetail">查看航次详情</el-button>
</span>
</el-dialog>
2024-07-11 18:02:47 +08:00
</div>
</template>
<script>
2024-10-09 11:25:00 +08:00
import {
getMenu,
getDataList,
dataPoints,
sampleLineList,
sampleStationList
} from '../api/dataSearch'
2024-07-20 11:25:13 +08:00
import { getParamsList, getVoyageLine } from '../api/home'
import { regInfo } from '@/api/dataSearch'
2024-10-08 14:49:06 +08:00
import Cookies from 'js-cookie'
import Vue from 'vue'
2026-04-06 11:50:54 +08:00
import { setMapLayoutProperty, loadVectorLayer } from '@/utils/vector-layer-utils'
import { ColorGenerator } from '@/utils/color-generator';
2026-04-05 16:54:44 +08:00
import { initMapbox, triggerLayerClick } from "@/utils/mapbox-utils";
2024-07-11 18:02:47 +08:00
export default {
name: 'Shuju',
data() {
return {
2024-07-13 18:00:03 +08:00
show: false,
viewer: null,
2025-12-25 16:47:57 +08:00
filter: null,
2024-10-09 11:25:00 +08:00
searchType: [
{
2026-04-03 11:46:47 +08:00
label: '航次编号',
2024-10-09 11:25:00 +08:00
disabled: false
},
{
label: '平台类型',
disabled: false
},
{
label: '平台名称'
},
{
label: '设备类型',
disabled: false
},
{
2025-04-23 13:48:08 +08:00
label: '航次首席'
2024-10-09 11:25:00 +08:00
},
{
label: '数据集名称'
},
{
2025-04-23 13:48:08 +08:00
label: '数据样品类型',
disabled: false
},
2024-10-09 11:25:00 +08:00
],
2026-04-03 11:46:47 +08:00
searchTypeValue: '航次编号',
2024-07-13 18:00:03 +08:00
radio: '航次',
dialog1: false,
tableData1: [],
total1: 0,
dialog2: false,
tableData2: [],
total2: 0,
dialog3: false,
tableData3: [],
total3: 0,
dialog4: false,
tableData4: [],
total4: 0,
2024-10-09 11:25:00 +08:00
menu1: '',
menu2: '',
menu3: '',
menu4: '',
dialog5: false,
voyageInfo: {},
2024-07-13 18:00:03 +08:00
dataList: [],
searchValue: '',
2024-07-14 20:41:51 +08:00
menuShow: true,
currenId: null,
2024-09-02 13:51:14 +08:00
fold: false,
2024-07-14 20:41:51 +08:00
currenSample: null,
previousEntityId: null,
job: '',
chooseStation: null,
chooseLine: null,
2024-10-16 09:16:41 +08:00
currentVoyage: null, // 当前选中的航次
2024-10-25 15:41:33 +08:00
currentSample: null, // 当前选中的数据样品集合
// 保存自定义底图
2025-09-08 09:38:12 +08:00
imageryViewModels: [],
// 保存轨迹图层
trackLineLayers: [],
// 记录已渲染的轨迹
rendered: [],
trackLayerMap: {}, // 存储每个航次对应的轨迹图层实例
highlightLayer: null, // 存储当前高亮图层实例
2024-07-13 18:00:03 +08:00
}
},
watch: {
2024-07-14 20:41:51 +08:00
radio(val) {
2024-10-09 11:25:00 +08:00
this.dataList = []
2024-07-14 20:41:51 +08:00
},
searchTypeValue(val) {
2026-04-03 11:46:47 +08:00
if (val == '航次编号' || val == '平台类型' || val == '设备类型' || val == '数据样品类型') {
2024-07-14 20:41:51 +08:00
this.menuShow = true
} else {
this.menuShow = false
}
2024-10-09 11:25:00 +08:00
},
menu1(val) {
if (val) {
this.searchType[0].disabled = true
} else {
this.searchType[0].disabled = false
}
},
menu2(val) {
if (val) {
this.searchType[1].disabled = true
} else {
this.searchType[1].disabled = false
}
},
menu3(val) {
if (val) {
this.searchType[3].disabled = true
} else {
this.searchType[3].disabled = false
}
},
menu4(val) {
if (val) {
this.searchType[4].disabled = true
} else {
this.searchType[4].disabled = false
}
},
2024-07-11 18:02:47 +08:00
},
2025-10-31 16:15:28 +08:00
mounted() {
2026-04-02 18:05:51 +08:00
initMapbox("dataSearchMap", {
tileKey: "world_horizon_1",
2026-04-03 11:10:58 +08:00
zoom: 3,
2026-04-02 18:05:51 +08:00
center: [122, 15],
minZoom: 2,
maxZoom: 29,
2026-04-06 11:50:54 +08:00
coastlineOn: false,
contourOn: false
2026-04-02 18:05:51 +08:00
});
2025-10-31 16:15:28 +08:00
},
2024-07-11 18:02:47 +08:00
methods: {
2024-10-09 11:25:00 +08:00
// 获取菜单
handleMenu() {
this.dataList = []
getMenu({
start: 0,
limit: 10000,
search_type: this.searchTypeValue,
return_type: this.radio,
voyage_name: this.menu1,
platform_type: this.menu2,
equipment_type: this.menu3,
data_type: this.menu4
}).then(res => {
2026-04-03 11:46:47 +08:00
if (this.searchTypeValue === '航次编号') {
this.dialog1 = true
this.tableData1 = res.page.records
2024-10-09 11:25:00 +08:00
} else if (this.searchTypeValue === '平台类型') {
this.dialog2 = true
this.tableData2 = res.page.records
2024-10-09 11:25:00 +08:00
} else if (this.searchTypeValue === '设备类型') {
this.dialog3 = true
this.tableData3 = res.page.records
2024-10-09 11:25:00 +08:00
} else if (this.searchTypeValue === '数据样品类型') {
this.dialog4 = true
this.tableData4 = res.page.records
2024-10-09 11:25:00 +08:00
}
})
},
handleCurrentChange1(item) {
2024-10-09 11:25:00 +08:00
this.menu1 = item.name
this.tableData1 = []
2024-10-09 11:25:00 +08:00
this.searchType[0].disabled = true
const str = this.searchType.find(item => {
return item.disabled !== true
})
this.searchTypeValue = str.label
this.dialog1 = false
2024-10-09 11:25:00 +08:00
},
handleCurrentChange2(item) {
2024-10-09 11:25:00 +08:00
this.menu2 = item.name
this.tableData2 = []
2024-10-09 11:25:00 +08:00
this.searchType[1].disabled = true
const str = this.searchType.find(item => {
return item.disabled !== true
})
this.searchTypeValue = str.label
this.dialog2 = false
2024-10-09 11:25:00 +08:00
},
handleCurrentChange3(item) {
2024-10-09 11:25:00 +08:00
this.menu3 = item.name
this.tableData3 = []
2024-10-09 11:25:00 +08:00
this.searchType[3].disabled = true
const str = this.searchType.find(item => {
return item.disabled !== true
})
this.searchTypeValue = str.label
this.dialog3 = false
2024-10-09 11:25:00 +08:00
},
handleCurrentChange4(item) {
2024-10-09 11:25:00 +08:00
this.menu4 = item.name
this.tableData4 = []
2024-10-09 11:25:00 +08:00
this.searchType[4].disabled = true
const str = this.searchType.find(item => {
return item.disabled !== true
})
this.searchTypeValue = str.label
this.dialog4 = false
2024-10-09 11:25:00 +08:00
},
2024-07-13 18:00:03 +08:00
// 获取左侧航次列表
getList() {
this.dataList = []
const params = {
2024-10-09 11:25:00 +08:00
start: 0,
limit: 10000,
2024-07-13 18:00:03 +08:00
search_type: this.searchTypeValue,
return_type: this.radio,
2024-10-09 11:25:00 +08:00
voyage_name: this.menu1,
platform_type: this.menu2,
equipment_type: this.menu3,
data_type: this.menu4,
2024-07-13 18:00:03 +08:00
search_value: this.searchValue,
2024-10-08 14:49:06 +08:00
FrameSessionId: Cookies.get('JSESSIONID')
2024-07-13 18:00:03 +08:00
}
2024-10-09 11:25:00 +08:00
getDataList(params).then(res => {
2026-04-06 11:50:54 +08:00
// 先隐藏所有图层,再根据筛选结果显示对应图层
setMapLayoutProperty('dataSearchMap', 'none')
2024-07-14 20:41:51 +08:00
const arr = res.page.records
2025-09-08 09:38:12 +08:00
if (this.radio === '航次') {
if (arr.length) {
let i = 0;
const colors = ColorGenerator.generateDivergingColors(arr.length);
2025-09-08 09:38:12 +08:00
arr.forEach(item => {
item.highlight = false
item.show = true
// 加载轨迹图层
2026-04-02 18:05:51 +08:00
loadVectorLayer(item.voyage_name, ["line", "symbol"], [colors[i], colors[i]], "visible", "dataSearchMap", "dsds");
i++;
2025-09-08 09:38:12 +08:00
})
}
this.dataList = arr
2024-07-14 20:41:51 +08:00
}
2025-09-08 09:38:12 +08:00
if (this.radio === '数据样品集') {
try {
this.getDataPoints(arr)
}
catch (err) {
console.log(err);
}
2024-07-14 20:41:51 +08:00
}
})
},
// 添加高亮图层
addHighlightLayer(voyageName, i) {
2026-04-02 18:05:51 +08:00
Vue.config.maps["dataSearchMap"].setPaintProperty(`vector-${voyageName}-line`, "line-width", 4);
2025-11-25 21:11:26 +08:00
this.dataList[i].highlight = true;
},
// 清除高亮
clearHighlight(voyageName, i) {
2025-11-25 21:11:26 +08:00
let lineWidthExpression = [
"case",
["boolean", ["feature-state", "hover"], false],
4,
["boolean", ["feature-state", "click"], false],
2,
1.8
];
2026-04-02 18:05:51 +08:00
Vue.config.maps["dataSearchMap"].setPaintProperty(`vector-${voyageName}-line`, "line-width", lineWidthExpression);
2025-11-25 21:11:26 +08:00
this.dataList[i].highlight = false;
},
// 显示
addSingleLineImg(voyageName, i) {
if (i !== null) {
this.dataList[i].show = true;
}
// 显示图层
2026-04-02 18:05:51 +08:00
Vue.config.maps["dataSearchMap"].setLayoutProperty(`vector-${voyageName}-symbol`, "visibility", "visible");
Vue.config.maps["dataSearchMap"].setLayoutProperty(`vector-${voyageName}-line`, "visibility", "visible");
},
// 隐藏
removeSingleLineImg(voyageName, i) {
if (i !== null) {
this.dataList[i].show = false;
}
// 隐藏图层
2026-04-02 18:05:51 +08:00
// let visibility = Vue.config.maps["dataSearchMap"].getLayoutProperty(`vector-${voyageName}-symbol`, "visibility");
// visibility = visibility == "visible" ? "none" : "visible";
2026-04-02 18:05:51 +08:00
Vue.config.maps["dataSearchMap"].setLayoutProperty(`vector-${voyageName}-symbol`, "visibility", "none");
Vue.config.maps["dataSearchMap"].setLayoutProperty(`vector-${voyageName}-line`, "visibility", "none");
2025-09-08 09:38:12 +08:00
},
// 清除所有轨迹图层
clearAll() {
// this.clearHighlight()
if (this.trackLayerMap.length) {
this.trackLayerMap.forEach(layer => {
this.viewer.imageryLayers.remove(layer);
this.trackLayerMap = []
2025-09-08 09:38:12 +08:00
})
}
},
2024-07-14 20:41:51 +08:00
// 搜素
getSearch() {
2025-09-08 09:38:12 +08:00
this.clearAll()
2024-10-09 11:25:00 +08:00
this.getList()
2024-07-14 20:41:51 +08:00
},
// 获取数据样品集坐标点位
getDataPoints(arr) {
2025-04-23 13:48:08 +08:00
if (!arr.length) return false
let i = 0;
const colors = ColorGenerator.generateDivergingColors(arr.length);
2025-09-08 09:38:12 +08:00
arr.forEach(item => {
2025-12-25 16:47:57 +08:00
// 添加测线/站位图层
if (item.job_type == "测线作业") {
2026-04-02 18:05:51 +08:00
loadVectorLayer(`sample_line_${item.dataset_name}`, ["line"], ["#FFFFFF", "#FFFFFF"], "visible", "dataSearchMap", "dsds", "sample_name");
2025-12-25 16:47:57 +08:00
} else {
2026-04-02 18:05:51 +08:00
loadVectorLayer(`sample_station_${item.dataset_name}`, ["symbol"], ["#FFFFFF", "#FFFFFF"], "visible", "dataSearchMap", "dsds", "sample_name");
2025-12-25 16:47:57 +08:00
}
i++;
2025-09-08 09:38:12 +08:00
})
2024-07-14 20:41:51 +08:00
const voyageList = arr
2025-09-08 09:38:12 +08:00
voyageList.map(item => {
if (item.job_type === '测线作业') {
2024-07-14 20:41:51 +08:00
// 获取样品列表
sampleLineList({
dataset_id: item.tsy_id
}).then(res => {
item.sampleArray = res.array
})
}
2025-09-08 09:38:12 +08:00
if (item.job_type === '站位作业') {
2024-07-14 20:41:51 +08:00
// 获取样品列表
sampleStationList({
dataset_id: item.tsy_id
}).then(res => {
item.sampleArray = res.array
})
}
})
this.dataList = voyageList
},
2024-08-02 16:56:07 +08:00
turnDeatilPage(item) {
this.dialog5 = true
regInfo({ voyage_name: item.voyage_name }).then(res => {
this.voyageInfo = res.map.voyage
})
},
handleVoyageDetail() {
2025-10-31 16:15:28 +08:00
const routeData = this.$router.resolve({
2024-08-02 16:56:07 +08:00
name: 'dataDetail',
query: {
voyage_name: this.voyageInfo.voyage_name
2024-08-02 16:56:07 +08:00
}
})
2025-10-31 16:15:28 +08:00
window.open(routeData.href, '_blank')
2024-07-11 18:02:47 +08:00
},
shousuo() {
2024-07-13 18:00:03 +08:00
this.show = true
// 等待布局变化完成后触发地图 resize
setTimeout(() => {
2026-04-02 18:05:51 +08:00
Vue.config.maps["dataSearchMap"].resize();
}, 10);
2024-07-11 18:02:47 +08:00
},
toshow() {
2024-07-13 18:00:03 +08:00
this.show = false
// 等待布局变化完成后触发地图 resize
setTimeout(() => {
2026-04-02 18:05:51 +08:00
Vue.config.maps["dataSearchMap"].resize();
}, 10);
2024-07-13 18:00:03 +08:00
},
2024-07-14 20:41:51 +08:00
// 展开数据样品列表
2024-10-25 15:41:33 +08:00
openList(item, type) {
if (type === 'list') {
if (this.currenId == item.tsy_id) {
this.fold = !this.fold
} else {
this.fold = true
if (item.file_total) {
this.currenId = item.tsy_id
this.job = item.job_type
}
}
2024-09-02 13:51:14 +08:00
} else {
this.fold = true
2024-10-25 15:41:33 +08:00
this.currenId = item.tsy_id
this.job = item.job_type
// this.scrollTo(item.tsy_id)
setTimeout(() => {
this.scrollTo(this.currenSample)
}, 500)
2024-07-14 20:41:51 +08:00
}
},
// 选中样品列表数据
2025-12-25 16:47:57 +08:00
onSample(sample, job_type) {
2024-07-14 20:41:51 +08:00
this.currenSample = sample.tsy_id
2025-12-25 16:47:57 +08:00
if (job_type == "测线作业" && (!sample.start_lon || !sample.start_lat || !sample.end_lon || !sample.end_lat) || job_type == "站位作业" && (!sample.sampling_lon || !sample.sampling_lat)) {
alert('该样品无坐标信息,无法定位!');
return;
}
let lon = 0;
let lat = 0;
if (job_type == "测线作业") {
// lon = Number(sample.start_lon);
// lat = Number(sample.start_lat);
2026-04-01 20:48:30 +08:00
lon = (Number(sample.start_lon) + Number(sample.end_lon)) / 2;
lat = (Number(sample.start_lat) + Number(sample.end_lat)) / 2;
2025-12-25 16:47:57 +08:00
}
if (job_type == "站位作业") {
lon = Number(sample.sampling_lon);
lat = Number(sample.sampling_lat);
}
2026-04-02 18:05:51 +08:00
Vue.config.maps["dataSearchMap"].setZoom(10);
Vue.config.maps["dataSearchMap"].flyTo({
2025-12-25 16:47:57 +08:00
center: [lon, lat],
speed: 10
});
let layerId = `vector-${job_type == "测线作业" ? "sample_line" : "sample_station"}_${sample.dataset_name}-${job_type == "测线作业" ? "line" : "symbol"}`;
let sourceLayerId = `${job_type == "测线作业" ? "sample_line" : "sample_station"}_${sample.dataset_name}`;
// vector-sample_station_TS-46-1_FDZ377_Slurp_SWYP-symbol、vector-sample_line_TS2-29-1_SY612_GQXJ_PJZP-line
2026-04-02 18:05:51 +08:00
// highlightFeaturesByProperty("dataSearchMap", `${job_type == "测线作业" ? "sample_line" : "sample_station"}_${sample.dataset_name}`, layerId, "sample_name", sample.sample_name);
triggerLayerClick("dataSearchMap", sourceLayerId, layerId, [lon, lat], { "sample_name": sample.sample_name });
2024-09-13 13:59:25 +08:00
},
goHome() {
this.$router.push({ name: 'home' })
2024-10-25 15:41:33 +08:00
},
scrollTo(sectionId) {
const element = document.getElementById(sectionId);
if (element) {
element.scrollIntoView({ behavior: 'smooth' });
}
2024-07-14 20:41:51 +08:00
}
2024-07-11 18:02:47 +08:00
}
}
</script>
<style scoped lang="scss">
2026-04-02 18:05:51 +08:00
// #dataSearchMap {
// // position: absolute;
// left: 0px;
// top: 0px;
// bottom: 0px;
// right: 0px;
// padding: 0px;
// margin: 0px;
// width: 100%;
// height: 100vh;
// }
2024-07-11 18:02:47 +08:00
.shuju {
width: 100%;
height: 100%;
2024-07-11 18:02:47 +08:00
.shuju_con {
width: 100%;
2024-09-13 13:59:25 +08:00
height: 100%;
2024-07-11 18:02:47 +08:00
display: flex;
align-items: center;
justify-content: center;
2024-07-11 18:02:47 +08:00
.left {
position: relative;
2024-07-13 18:00:03 +08:00
width: 570px;
2024-09-13 13:59:25 +08:00
height: 100vh;
2024-07-11 18:02:47 +08:00
background: #fff;
box-sizing: border-box;
2024-07-13 18:00:03 +08:00
padding: 50px 30px;
2024-07-11 18:02:47 +08:00
display: flex;
flex-direction: column;
2024-07-11 18:02:47 +08:00
.left1 {
width: 100%;
height: 40px;
2026-04-03 02:05:29 +08:00
flex-shrink: 0;
2024-07-11 18:02:47 +08:00
display: flex;
align-items: center;
2024-07-11 18:02:47 +08:00
.xiala {
2024-07-13 18:00:03 +08:00
width: 80%;
2024-07-11 18:02:47 +08:00
height: 40px;
2024-07-13 18:00:03 +08:00
margin-right: 15px;
2024-07-11 18:02:47 +08:00
}
2024-07-11 18:02:47 +08:00
.el-button {
width: 12%;
font-size: 20px;
height: 40px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
2024-07-11 18:02:47 +08:00
.sousuo {
margin-right: 1%;
}
2024-07-11 18:02:47 +08:00
.caidan {
color: #999;
}
}
2024-07-11 18:02:47 +08:00
.left2 {
margin-top: 20px;
2024-07-11 18:02:47 +08:00
.el-tag {
margin-right: 10px;
}
}
2024-07-11 18:02:47 +08:00
.left3 {
2024-07-13 18:00:03 +08:00
padding: 10px 0;
2024-07-11 18:02:47 +08:00
width: 100%;
margin-top: 10px;
2026-04-03 02:05:29 +08:00
flex-shrink: 0;
2024-07-11 18:02:47 +08:00
display: flex;
align-items: center;
2024-07-13 18:00:03 +08:00
justify-content: center;
2024-07-11 18:02:47 +08:00
border-bottom: 1px solid #e5e5e5;
}
2026-04-03 02:05:29 +08:00
/**
* 数据样品集编号说明固定在滚动区外仅列表在 .left4 内滚动
*/
.left4-sample-wrap {
width: 100%;
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
2026-04-06 11:50:54 +08:00
>.rule-text {
2026-04-03 02:05:29 +08:00
flex-shrink: 0;
2026-04-03 11:46:47 +08:00
margin-top: 12px;
2026-04-03 02:05:29 +08:00
margin-bottom: 10px;
2026-04-03 11:46:47 +08:00
font-size: 14px;
color: #999;
white-space: nowrap;
overflow-x: auto;
2026-04-03 02:05:29 +08:00
}
2026-04-06 11:50:54 +08:00
>.left4 {
2026-04-03 02:05:29 +08:00
flex: 1;
min-height: 0;
}
}
/** 筛选结果列表:占满左侧剩余高度并独立滚动 */
.left4 {
2024-07-11 18:02:47 +08:00
width: 100%;
2026-04-03 02:05:29 +08:00
flex: 1;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: thin;
scrollbar-color: #c0c4cc #f0f0f0;
2024-07-13 18:00:03 +08:00
&::-webkit-scrollbar {
2026-04-03 02:05:29 +08:00
width: 6px;
}
&::-webkit-scrollbar-track {
background: #f0f0f0;
border-radius: 3px;
2024-07-13 18:00:03 +08:00
}
&::-webkit-scrollbar-thumb {
2026-04-03 02:05:29 +08:00
background-color: #c0c4cc;
border-radius: 3px;
&:hover {
background-color: #909399;
}
2024-07-13 18:00:03 +08:00
}
.left4_1 {
padding: 20px 0;
2024-07-11 18:02:47 +08:00
width: 100%;
height: auto;
border-bottom: 1px solid #e5e5e5;
2025-04-23 13:48:08 +08:00
cursor: default;
//&:hover {
// .left4_top {
// p {
// color: #409eff;
// }
// }
//}
.left4_top {
2024-07-11 18:02:47 +08:00
display: flex;
flex-direction: column;
width: 100%;
margin-bottom: 10px;
p {
2024-07-11 18:02:47 +08:00
font-size: 16px;
color: #212121;
font-weight: bold;
2025-10-31 16:15:28 +08:00
//display: flex;
//justify-content: space-between;
2024-07-13 18:00:03 +08:00
.mileage {
font-size: 12px;
color: #909fa7;
2025-10-31 16:15:28 +08:00
float: right;
2024-07-13 18:00:03 +08:00
}
2024-07-11 18:02:47 +08:00
}
2024-07-13 18:00:03 +08:00
.org {
font-size: 12px;
color: #999999;
2024-07-11 18:02:47 +08:00
}
}
2024-07-14 20:41:51 +08:00
.sample {
padding: 6px 12px;
box-sizing: border-box;
box-sizing: border-box;
font-size: 14px;
color: #555555;
position: relative;
2025-04-23 13:48:08 +08:00
cursor: pointer;
2024-07-14 20:41:51 +08:00
&::before {
content: "";
display: block;
width: 8px;
height: 8px;
background-color: #B82C22;
position: absolute;
left: 0;
top: 12px;
border-radius: 50%;
}
2024-07-14 20:41:51 +08:00
//&:hover {
// background-color: rgb(248,249,250);
//}
}
2024-07-14 20:41:51 +08:00
.bg-color {
background-color: rgb(93, 156, 236);
2024-07-14 20:41:51 +08:00
}
.left4_list {
2024-07-11 18:02:47 +08:00
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.list1 {
2024-07-11 18:02:47 +08:00
width: 50%;
display: flex;
align-items: center;
margin-bottom: 10px;
p {
2024-07-13 18:00:03 +08:00
font-size: 14px;
2024-07-11 18:02:47 +08:00
color: #999;
}
span {
2024-07-13 18:00:03 +08:00
font-size: 14px;
2024-07-11 18:02:47 +08:00
color: #212121;
}
}
}
}
2024-10-09 11:25:00 +08:00
.list {
margin-top: 20px;
border: 1px solid #e5e5e5;
div {
padding: 5px 10px;
border-bottom: 1px solid #e5e5e5;
}
.list-value {
cursor: pointer;
}
:last-child {
border-bottom: none;
}
}
}
.tags {
2024-10-09 13:38:02 +08:00
color: #333333;
2024-10-09 11:25:00 +08:00
display: flex;
flex-wrap: wrap;
2026-04-03 02:05:29 +08:00
flex-shrink: 0;
2024-10-09 11:25:00 +08:00
.tag {
2024-10-09 13:38:02 +08:00
color: #333333;
2024-10-09 11:25:00 +08:00
padding: 5px;
background-color: rgb(249, 249, 249);
2024-10-09 11:25:00 +08:00
margin: 0 15px 15px 0;
}
2024-07-11 18:02:47 +08:00
}
.arrow {
2024-07-11 18:02:47 +08:00
position: absolute;
right: 0;
top: 40%;
z-index: 888;
cursor: pointer;
}
}
.arrow_r {
2024-07-11 18:02:47 +08:00
position: absolute;
top: 40%;
left: 0;
z-index: 888;
cursor: pointer;
}
2024-07-11 18:02:47 +08:00
.right {
width: 100%;
height: 100%;
2024-09-13 13:59:25 +08:00
position: relative;
.logo {
width: 60px;
height: 60px;
cursor: pointer;
position: absolute;
2025-09-08 09:38:12 +08:00
bottom: 25px;
right: 20px;
}
.goHome {
cursor: pointer;
position: absolute;
2025-09-08 09:38:12 +08:00
bottom: 0;
right: 20px;
color: rgba(255, 255, 255, 0.8);
2024-09-13 13:59:25 +08:00
}
2024-07-11 18:02:47 +08:00
}
}
}
2025-04-23 13:48:08 +08:00
.hover-color:hover {
2025-04-23 13:48:08 +08:00
color: #409eff !important;
cursor: pointer;
}
2024-07-11 18:02:47 +08:00
</style>
<style>
.left3_1 .el-radio {
margin-right: 15px;
}
2024-07-11 18:02:47 +08:00
.left3_1 .el-radio__label {
font-size: 15px;
}
2024-07-11 18:02:47 +08:00
.el-input__inner::-webkit-input-placeholder {
color: #333;
}
2024-07-11 18:02:47 +08:00
.left3_2 .el-input__inner {
padding-left: 0;
border: none;
font-size: 15px;
}
.BMapLabel {
2024-07-11 18:02:47 +08:00
border: none !important;
color: #fff;
background: none !important;
}
</style>