Files
4.0/src/renderer/views/dashboard/index.vue

1463 lines
44 KiB
Vue
Raw Normal View History

2025-07-03 17:39:09 +08:00
<template>
<div class="dashboard-container" v-loading.fullscreen="fullScreenLoading"
element-loading-background="rgba(0, 0, 0, 0.8)">
<div class="absolute " style="z-index: 99999;">
<!-- <el-button @click="create">点一下</el-button> -->
<!-- <span style="color: red">{{ $t("login.loginTitle") }}</span>-->
<!-- <el-select @change="langChange" v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>-->
<!-- <span class="svg-container" @click="handleLogin">
<svg-icon icon-class="point" :class-name="['point','pp']"></svg-icon>
<svg-icon icon-class="personalModel" :class-name="['point','pp']"></svg-icon>
<svg-icon icon-class="measure" :class-name="['point','pp']"></svg-icon>
<svg-icon icon-class="height_measure" :class-name="['point','pp']"></svg-icon>
</span>-->
</div>
<Tree v-if="noSituation" class="absolute zIndex9 tree" ref="tree"></Tree>
<!-- <WangEditor class="absolute zIndex99"></WangEditor>-->
<myHeaderAll ref="myHeaderAll" v-if="noSituation"></myHeaderAll>
<bottomMenu v-if="noSituation"></bottomMenu>
<!-- 态势演播 -->
<!-- <div class="movie absolute zIndex999">
<gant class="movie absolute zIndex999"/>
</div> -->
<!-- <button class="videoStop absolute zIndex999" @click="videoStop">结束录制</button> -->
<!--左侧一级菜单-->
<firstMenu v-if="noSituation" class="absolute zIndex9" ref="firstMenu"></firstMenu>
<!--左侧二级菜单-->
<secondMenu class="absolute" ref="secondMenu"></secondMenu>
<editor class="absolute zIndex99" ref="editor"></editor>
2025-07-31 09:31:31 +08:00
<selectImg class="selectImgBox absolute" ref="selectImg"></selectImg>
2025-07-03 17:39:09 +08:00
<!--剖面分析-->
<profileAnalysis class="profileAnalysisBox absolute zIndex99"></profileAnalysis>
<!--土方分析-->
<cutFill class="cutFillBox absolute zIndex99"></cutFill>
<!--淹没分析-->
<inundationAnalysis class="inundationAnalysisBox absolute zIndex99"></inundationAnalysis>
<!-- <div class="richTextDialogBox">-->
<el-dialog :title="richTextDialog.title" :modal="false" :visible.sync="richTextDialog.visible" width="1090px"
@close="cancel" :center="true" :close-on-click-modal="false">
<div id="richTextEditor" style="background: #fff"></div>
<!-- :content="richTextDialog.content"-->
<!-- <richTextEditor></richTextEditor>-->
<!-- <div style="display: flex;justify-content: flex-end;padding: 6px 0;">
<el-button size="mini" type="primary" @click="save">确定</el-button>
<el-button size="mini" type="danger" @click="cancel">取消</el-button>
</div>-->
</el-dialog>
<!--坐标定位-->
<flyToLocation ref="flyToLocation" class="flyToLocationBox absolute zIndex99"></flyToLocation>
<junbiao ref="junbiao" class="junbiaoBox absolute zIndex999"></junbiao>
<junbiao3d ref="junbiao3d" class="junbiao3dBox absolute zIndex999"></junbiao3d>
<vrModel class="vrModelBox absolute zIndex999"></vrModel>
<textModel class="textModelBox absolute zIndex999"></textModel>
<adddirectory class="adddirectoryBox absolute zIndex999"></adddirectory>
<model ref="model" class="modelBox absolute zIndex999"></model>
2025-09-02 10:01:05 +08:00
<modelg ref="modelg" class="modelBoxg absolute zIndex999"></modelg>
2025-07-03 17:39:09 +08:00
<modelSelect ref="modelSelect" class="modelSelectBox absolute zIndex999"></modelSelect>
<bimInfo ref="bimInfo" class="bimInfoBox absolute zIndex99"></bimInfo>
<echartsTotal ref="echartsTotal" class="echartsTotalBox absolute zIndex99"></echartsTotal>
<rolePermission></rolePermission>
<div class="absolute zIndex99 tongbu" style="top: 5vw">
<el-button size="mini" @click="tongbu">数据同步</el-button>
</div>
<div v-if="showBigData || noSituation" style="display: flex">
<div id="earth" :class="['fullSize']"></div>
<div id="map2d" :class="['fullSize', 'absolute', 'halfEarth', 'zIndex1']" style="left: 50%; height: 100vh"></div>
</div>
<div v-if="!noSituation && !showBigData" id="earthContainers" :class="['fullSize']"></div>
<div v-if="noSituation" class="absolute zIndex9 logo" style="bottom: 15px" @click="changeState">
<!-- <img src="@/assets/images/81.gif" /> -->
<!-- <img src="@/assets/images/rotation.gif" /> -->
<!-- <img src="@/assets/images/地球.gif" />-->
2025-09-10 19:14:15 +08:00
<img :src="require('@/assets/images/shijingjun/' + skinInfo + '/logo.png')" alt="" />
2025-07-03 17:39:09 +08:00
<!-- <img src="@/assets/images/3c60ff3cd2d9e0547ada43a58fa60c3.png">-->
<!-- <img src="@/assets/images/aaaaaa.webp">-->
<!-- <button v-for="item in optionss" @click="addMarker(item)">{{ item.source_name }}</button>-->
</div>
<scene class="absolute zIndex999 scene"></scene>
<div id="modal" style=""></div>
<el-drawer class="transformDrawerBox" :modal-append-to-body="false" :wrapperClosable="false" title="转换"
:visible.sync="transformDrawer" direction="ltr">
<div class="transformDrawerContent">
<el-collapse @change="changeActive" v-model="transformTypeActiveName" accordion>
<template v-for="item in transformTypes">
<el-collapse-item :title="item.title" :name="item.name">
<div class="transformDrawerItem">
<span>源文件路径</span>
<el-input size="medium" v-model="input" :placeholder="item.placeholder ? item.placeholder : '请输入文件路径'
2025-11-14 09:42:30 +08:00
">
2025-07-03 17:39:09 +08:00
<template slot="append">
<el-button @click="openDialog(item)">
<i class="el-icon-more"></i>
</el-button>
</template>
</el-input>
</div>
<div class="transformDrawerItem">
<span>存放路径</span>
<el-input size="medium" v-model="output" :placeholder="item.outplaceholder ? item.outplaceholder : '请输入文件路径'
2025-11-14 09:42:30 +08:00
">
2025-07-03 17:39:09 +08:00
<template slot="append">
<el-button @click="openSaveDialog(item)">
<i class="el-icon-more"></i>
</el-button>
</template>
</el-input>
</div>
</el-collapse-item>
</template>
</el-collapse>
<div class="btn">
<el-button :disabled="transformTypeActiveName == ''" type="primary" size="medium" @click="transform">转换
</el-button>
</div>
</div>
</el-drawer>
<!-- 导入作战数据生成的点的样式-->
<fightingDataStyle ref="fightingDataStyle" class="fightingDataStyleBox absolute zIndex99"></fightingDataStyle>
<DTH ref="dth" :host="host" :token="token" class="zIndex99"></DTH>
<!-- 标准版本 无人机 -->
<!-- <flyer v-if="flyerDiv" class="flyer"></flyer> -->
2025-07-03 17:39:09 +08:00
<!-- <flyer2 v-if="flyerDiv2" class="flyer"></flyer2> -->
<!--态势部分-->
<div v-show="!showBigData && !noSituation" class="titles">
实景三维态势推演系统
</div>
<svg v-show="!showBigData && !noSituation" class="icon icon-top" aria-hidden="true">
<use xlink:href="#icon-top"></use>
</svg>
<svg class="icon icon-tuichudenglu" @click="closeSituation" aria-hidden="true" v-if="showList">
<use xlink:href="#icon-tuichudenglu"></use>
</svg>
<!--右侧元素指挥舱-->
<!--新增态势0827-->
<div v-if="editSituation" :class="[
2025-11-14 09:42:30 +08:00
'cabinBox',
'animate__animated',
typeof showCabin == 'boolean'
? showCabin
? 'animate__zoomOutRight'
: 'animate__zoomInRight'
: '',
]">
2025-07-03 17:39:09 +08:00
<cabin @changeShow="changeShow('showCabin', 'showCabinBtn')" ref="cabin"></cabin>
</div>
<div v-if="editSituation && typeof showCabinBtn == 'boolean'" :class="[
2025-11-14 09:42:30 +08:00
'cabinShowBtn',
'cabinShowBtn',
'animate__animated',
typeof showCabinBtn == 'boolean'
? showCabinBtn
? 'animate__lightSpeedInRight'
: 'animate__lightSpeedOutRight'
: '',
]">
2025-07-03 17:39:09 +08:00
<div class="switch-node-outer">
<div class="switch-node-inner" @click="changeShow('showCabinBtn', 'showCabin')">
展开指挥舱
</div>
</div>
</div>
<!--态势事件新建框-->
<div class="newEventBox" v-if="eventBox">
<newEvent></newEvent>
</div>
<!--态势时间面板-->
<eventEditor class="eventEditor"></eventEditor>
<!--元素列表框-->
<div :class="[
2025-11-14 09:42:30 +08:00
'elementBox',
'animate__animated',
typeof showElement == 'boolean'
? showElement
? 'animate__zoomOutLeft'
: 'animate__zoomInLeft'
: '',
]" v-if="editSituation">
2025-07-03 17:39:09 +08:00
<elements @changeShow="changeShow('showElement', 'showElementBtn')" v-if="!showList"></elements>
</div>
<!--新增态势0822 -->
<div v-if="editSituation && typeof showElementBtn == 'boolean'" style="left: 0%;" :class="[
2025-11-14 09:42:30 +08:00
'elementShowBtn',
'animate__animated',
typeof showElementBtn == 'boolean'
? showElementBtn
? 'animate__lightSpeedInLeft'
: 'animate__lightSpeedOutLeft'
: '',
]">
2025-07-03 17:39:09 +08:00
<div class="switch-node-outer">
<div class="switch-node-inner" @click="changeShow('showElementBtn', 'showElement')">
展开军标标绘
</div>
</div>
</div>
<svg class="icon icon-tuichu" @click="closeSituationEdit" aria-hidden="true" v-if="editSituation">
<use xlink:href="#icon-tuichu"></use>
</svg>
<!-- 方案列表 -->
<div class="content" v-if="showList">
<situationList ref="situation" @openSituationEdit="openSituationEdit"></situationList>
</div>
<div v-if="eventsList" class="timeline-container">
<deduction ref="Deduction" :TSTYOBJ="TSTYOBJ" :action="action"></deduction>
</div>
<!-- gis资源列表 -->
<div class="gisTable">
<el-dialog title="gis资源列表" :modal="false" :visible.sync="dialogTableVisible" @open="fetchData">
<el-table class="gisTable" :row-key="getRowKey" :reserve-selection="true" :data="gisData" ref="multipleTable"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55"> </el-table-column>
<!--<el-table-column width="150" property="date" label="日期"></el-table-column>-->
<el-table-column property="source_name" label="名称"></el-table-column>
<el-table-column width="300" property="source_type" label="类型"></el-table-column>
</el-table>
<div class="btnsbox">
<el-button class="btns" @click="addResource">添加</el-button>
</div>
</el-dialog>
</div>
<input type="file" id="fileInputlink" style="display: none;" multiple
accept=".jpg, .png, .webp, .svg, .bmp, .gif,.mp4,.mp3,.pdf" @change="uploadFile" />
<input type="file" id="fileInputPanorama" style="display: none;" multiple accept=".jpeg,.png,.jpg"
@change="uploadFile2" />
<!-- 海东1021 -->
<div class="goodSearch" v-if="goodSearchDialog">
<div class="contentBox " v-draggable>
<div class="titleBox nav">
<span class="title">{{ $t("leftMenu.secondMenu.goodsSearch") }}</span>
<span class="closeBox">
<span @click="goodSearchDialog = false"></span>
</span>
<div class="hr"></div>
</div>
<!-- <template v-if="goodSearchEmpty">
<div class="empty-img">
</div>
</template>
<template v-else> -->
<div id="goodSearchEchart"></div>
2025-11-17 17:09:02 +08:00
<div style="height: 60px;position: relative;">
2025-11-14 09:42:30 +08:00
<el-button class="export-btn" style="
background: rgba(var(--color-sdk-base-rgb), 0.2);
border: 1px solid rgba(var(--color-sdk-base-rgb), 0.5);
color: #ffffff;
position: absolute;
right: 20px;
bottom: 20px;
">导出Excel</el-button>
2025-11-17 17:09:02 +08:00
</div>
2025-07-03 17:39:09 +08:00
<!-- </template> -->
</div>
</div>
<!-- 海东表格设置 -->
<excelSet ref="excelSet" class="excelSetBox absolute zIndex99"></excelSet>
<!-- tufu_select -->
<tufuSelect style="top: 115px;right: 50px;" class="tufuSelect absolute zIndex99"></tufuSelect>
<!-- 战术计算 -->
<tactical class="tacticalBox absolute"></tactical>
2025-09-02 10:01:05 +08:00
<!-- modelSet -->
<ModelSet class="ModelSetBox absolute"></ModelSet>
2025-07-03 17:39:09 +08:00
</div>
</template>
<script>
// 新增态势0910
import {ipcRenderer, remote} from "electron";
2025-07-03 17:39:09 +08:00
import { mapGetters } from "vuex";
import Tree from "@/components/Tree/index";
import bottomMenu from "@/components/bottomMenus/bottomMenu.vue";
import myHeaderAll from "@/components/myHeaderAll/index.vue";
import firstMenu from "@/components/LeftMenu/firstMenu.vue";
import secondMenu from "@/components/LeftMenu/secondMenu.vue";
import editor from "@/components/editor/index.vue";
import selectImg from "@/components/selectImg.vue";
import profileAnalysis from "@/components/analysis/profileAnalysis.vue";
import cutFill from "@/components/analysis/cutFill.vue";
import inundationAnalysis from "@/components/analysis/inundationAnalysis.vue";
import flyToLocation from "@/components/dialog/flyToLocation.vue";
import junbiao from "@/components/dialog/junbiao.vue";
import junbiao3d from "@/components/dialog/junbiao3d.vue";
import model from "@/components/dialog/model.vue";
2025-09-02 10:01:05 +08:00
import modelg from "@/components/dialog/modelg.vue";
2025-07-03 17:39:09 +08:00
import vrModel from "@/components/dialog/vrModel.vue";
import textModel from "@/components/dialog/textModel.vue";
2025-09-02 10:01:05 +08:00
import ModelSet from "@/components/dialog/ModelSet.vue";
2025-07-03 17:39:09 +08:00
import modelSelect from "@/components/dialog/modelSelect.vue";
import echartsTotal from "@/components/dialog/echartsTotal.vue";
import bimInfo from "@/components/dialog/bimInfo.vue";
import fightingDataStyle from "@/components/dialog/fightingDataStyle.vue";
import scene from "@/components/three/index.vue";
import rolePermission from "@/components/myHeaderAll/systemPopup/components/permission/permission.vue";
import gant from "../../components/gantt-next/gant.vue";
import modelTransform from "./modelTransform";
import DTH from "@/components/DTH/index";
// import flyer from "@/components/UAV2/index";
2025-07-03 17:39:09 +08:00
// import flyer2 from "@/components/UAV3/index";
import situationList from "@/components/situationList/index.vue";
import deduction from "@/components/TS/deduction.vue";
import cabin from "@/components/situationEdit/cabin.vue";
import elements from "@/components/situationEdit/element.vue";
import nodeType from "@/components/treeNode";
import newEvent from "@/components/Events/newEvent.vue";
import adddirectory from "../../components/dialog/adddirectory.vue";
import excelSet from "@/components/dialog/excelSet.vue";
import eventEditor from "@/components/TS/eventEditor/index.vue";
import tufuSelect from "@/components/dialog/tufu_select.vue";
import tactical from "@/components/dialog/tactical.vue";
2025-07-03 17:39:09 +08:00
import {
getSelectedNode,
getNodeData,
cusAddNodes,
cusRenderNode,
} from "@/components/Tree/treeNode";
import { addSource, delSource, checkAuth, linkFile } from "@/api/gisAPI";
import { eventList, tilesetAdd, tilesetList } from "@/api/aboutCabin";
import { obj } from "@/api/dataFromApi";
import { getIP } from "../../utils";
import { getToken } from "@/utils/auth";
import { cusNodeIcon } from "../../components/Tree/treeNode";
2025-11-14 09:42:30 +08:00
2025-07-03 17:39:09 +08:00
// import richTextEditor from "@/components/editor/richTextEditor.vue";
let handleLogin = (that) => {
// 需要登录就去掉“/dashboard”
that.$store
.dispatch("Login", {
host: "http://localhost:8890",
username: "admin",
password: "c30807e6587ade285ba7ade9f881b3d7",
})
.then(() => {
console.log("logined$$$$$$$$$$$$$$");
// that.createEarth();
// this.$router.push({path: '/'})
})
.catch(() => { });
};
export default {
name: "dashboard",
mixins: [modelTransform],
components: {
newEvent,
elements,
cabin,
deduction,
situationList,
eventEditor,
// flyer,
2025-07-03 17:39:09 +08:00
// flyer2,
DTH,
gant,
scene,
Tree,
rolePermission,
bottomMenu,
myHeaderAll,
firstMenu,
secondMenu,
editor,
selectImg,
profileAnalysis,
cutFill,
inundationAnalysis,
model,
modelSelect,
bimInfo,
fightingDataStyle,
echartsTotal,
junbiao,
junbiao3d,
flyToLocation,
vrModel,
textModel,
adddirectory,
// richTextEditor
// New,
// WangEditor
excelSet,
2025-09-02 10:01:05 +08:00
tufuSelect,
tactical,
2025-09-02 10:01:05 +08:00
ModelSet,
modelg
2025-07-03 17:39:09 +08:00
},
data() {
return {
eventLists: [],
TSTYOBJ: {},
action: null,
// flyerDiv
flyerDiv: false,
flyerDiv2: false,
excelSetDialog: false,
//海东1021
goodSearchDialog: false,
goodSearchEmpty: false,
// 新增态势0827
showCabin: "",
showCabinBtn: "",
// 新增态势0821
showElement: "",
showElementBtn: "",
//新增态势
noSituation: true,
showBigData: false,
showList: false,
editSituation: false,
eventBox: false,
eventsList: false,
dialogTableVisible: false,
gisData: [],
multipleSelection: [],
// tasks: Store.tasks, //渲染的真实任务数据、
// scales: Store.scales,
host: localStorage.getItem("service"),
token: getToken(),
skinInfo: JSON.parse(localStorage.getItem("systemSetting")).skinInfo,
appVersion: "81", //localStorage.getItem("appVersion"),
fullScreenLoading: false,
transformDrawer: false,
State: true, //功能菜单的显示状态
imgsrc: "",
halfEarth: false,
richTextDialog: {
title: "true",
content: "<span style='color:red'>true</span>",
visible: false,
},
treeObj: null,
/* BillboardObject,
*PolygonObject,
PolylineObject,
Model,
Path,
Circle,
AttackArrow,
PincerArrow,*/
/*测试用*/
optionss: [
{
source_name: "点标注",
key: "DrawPoint",
source_type: "point",
className: "public",
},
/* {name: "线", source_name: "线", key: "DrawPolyline", source_type: "line",},
{name: "面", source_name: "面标注", key: "DrawPolygon", source_type: "panel",},
{name: "圆", source_name: "圆标注", key: "DrawCircle", source_type: "circle",},
{name: "箭头", source_name: "箭头", key: "DrawAttackArrow", source_type: "attackArrow",},
{name: "钳形箭头", source_name: "钳形箭头", key: "DrawPincerArrow", source_type: "pincerArrow",},
*/
],
/*测试用*/
options: [
{
value: "zh",
label: "中文简体",
},
{
value: "en",
label: "英文",
},
{
value: "tw",
label: "中文繁体",
},
],
value: "zh",
};
},
beforeMount() {
// this.appVersion="earth"
},
computed: {
...mapGetters(["name", "roles", "lang"]),
},
beforeCreate() {
// if (!(this.$store.getters.token))
// handleLogin(this)
//新增态势
// window.Store = new TSTY.store();
// window.Clock = new TSTY.clock();
},
mounted() {
ipcRenderer.on("udpServerError",(e,msg)=>{
this.$message.error(msg);
})
ipcRenderer.on("udpServerSuccess",(e,msg)=>{
this.$message.success(msg);
})
2025-07-03 17:39:09 +08:00
// new Notification("这是标题", {
// body: "这是正文",
// icon:
// "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png",
// requireInteraction: true,
// image:
// "https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png",
// });
window.$dth = this.$refs.dth;
// this.appVersion=localStorage.getItem("appVersion")
const that = this;
// this.imgsrc=require('@/assets/images/'+'81'+'/'+this.skinInfo+'/logo.png')
window.addEventListener("setItemEvent", (e) => {
if (e.key == "systemSetting") {
let obj = JSON.parse(e.newValue);
that.skinInfo = obj.skinInfo;
}
});
window.$root_home_index = this;
// // this.$nextTick(() => {
// this.createEarth()
this.value = this.$i18n.locale;
//
/*YJMap.on().then(() => {
window.map2d = new YJMap.Map("map2d")
})*/
this.$recvChanel("checkSituation", () => {
this.removeEarth1();
});
//测试用
this.$recvChanel("getTreeObj", (treeObj) => {
console.log(treeObj);
this.treeObj = treeObj;
this.$removeChanel("getTreeObj");
});
// checkAuth(res => {
// // console.log(res)
// // this.authInfo = res
// })
//测试用
// this.changeState()
window.addEventListener("openEventBox", () => {
console.log("++++++++++++++++++++++++++++");
this.eventBox = true;
this.$nextTick(() => {
window.dispatchEvent(window.EventsNameMap.get("initEvent"));
});
});
// this.create();
//
this.$recvChanel("linkFile", () => {
this.importPath();
});
this.$recvChanel('panoramaFile', () => {
this.importPath2()
})
this.systemSetting = JSON.parse(localStorage.getItem("systemSetting"));
// this.systemSetting.skinInfo = this.system.skin
if (this.systemSetting.sheetIndexStatusSwitch) {
this.$changeComponentShow(".tufuSelect", true);
} else {
this.$changeComponentShow(".tufuSelect", false);
}
},
methods: {
// 上传链接link
uploadFile(event) {
let files = event.target.files;
console.log("files", files);
if (files.length > 0) {
const formData = new FormData();
for (let i = 0; i < files.length; i++) {
const element = files[i];
formData.append("files", element);
}
// 创建loading实例
const loading = this.$loading({
lock: true,
text: '上传中 0%',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
// 配置axios请求
this.$axios({
method: 'post',
url: getIP() + '/yjearth4.0/api/v1/linkFile/import',
data: formData,
headers: {
'token': getToken()
},
onUploadProgress: (progressEvent) => {
if (progressEvent.lengthComputable) {
const percentComplete = Math.round((progressEvent.loaded / progressEvent.total) * 100);
loading.text = `上传中 ${percentComplete}%`;
}
}
}).then(response => {
loading.close();
const res = response.data;
if (res.code == 0) {
this.$message.success("上传成功");
this.$sendChanel("linkFileData", res.data.list);
} else {
this.$message.error(res.message || "上传失败");
}
}).catch(error => {
loading.close();
this.$message.error("上传失败: " + error.message);
});
}
},
// 上传全景
uploadFile2(event) {
let files = event.target.files;
if (files.length > 0) {
const formData = new FormData();
for (let i = 0; i < files.length; i++) {
const element = files[i];
formData.append("files", element);
}
// 创建loading实例
const loading = this.$loading({
lock: true,
text: '上传中 0%',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
// 配置axios请求
this.$axios({
method: 'post',
url: getIP() + '/yjearth4.0/api/v1/linkFile/import',
data: formData,
headers: {
'token': getToken()
},
onUploadProgress: (progressEvent) => {
if (progressEvent.lengthComputable) {
const percentComplete = Math.round((progressEvent.loaded / progressEvent.total) * 100);
loading.text = `上传中 ${percentComplete}%`;
}
}
}).then(response => {
loading.close();
const res = response.data;
if (res.code == 0) {
this.$message.success("上传成功");
this.$sendChanel("panoramaFileData", res.data.list);
} else {
this.$message.error(res.message || "上传失败");
}
}).catch(error => {
loading.close();
this.$message.error("上传失败: " + error.message);
});
}
},
// 导入链接link
importPath() {
document.getElementById("fileInputlink").click();
// this.$removeChanel("fileInputlink");
},
// 导入链接link
importPath2() {
document.getElementById("fileInputPanorama").click();
// this.$removeChanel("fileInputPanorama");
},
//新增态势0822
changeShow(key1, key2) {
this[key1] = !this[key1];
// this[key2]=!this[key2]
setTimeout(() => {
this[key2] = !this[key2];
}, 500);
},
// 创建地球
create() {
this.noSituation = !this.noSituation;
this.showBigData = true;
this.$nextTick(() => {
window.$createEarth();
});
},
//新增态势
closeSituation() {
//退出态势
this.noSituation = !this.noSituation;
this.showList = !this.showList;
this.$nextTick(() => {
window.$createEarth();
});
// 新增态势0910
remote.getCurrentWindow().setFullScreen(false);
// this.openEarth();
},
closeSituationEdit() {
// 新增态势0906
if (window.Earth1) {
window.draw && window.draw.end();
Array.from(ts_Map.values()).forEach((entity) => entity.remove());
ts_Map.clear();
2025-07-03 17:39:09 +08:00
window.Earth1.destroy();
window.Earth1 = null;
}
this.$refs.Deduction.stop();
2025-07-03 17:39:09 +08:00
this.editSituation = !this.editSituation;
this.eventsList = false;
this.showList = !this.showList;
// //新增态势0824
2025-07-03 17:39:09 +08:00
this.showElementBtn = "";
this.showCabinBtn = "";
this.showCabin = "";
2025-07-03 17:39:09 +08:00
this.showElement = "";
//
// this.eventBox = false;
2025-07-03 17:39:09 +08:00
this.$nextTick(() => {
this.$refs.situation.getList();
});
},
getRowKey(row) {
// 需要为每一行设置一个唯一标识这里假设每行的id是唯一的
return row.ID;
},
addResource() {
let ztreeObj = $.fn.zTree.getZTreeObj("treeDemos");
let nodes = ztreeObj.getSelectedNodes();
let p_id = 0;
if (nodes.length) {
p_id = nodeType[nodes[0].type].allowChildren
? nodes[0].id
: nodes[0].p_id;
}
let tilesetArr = [];
let allNodes = ztreeObj.transformToArray(ztreeObj.getNodes());
allNodes.forEach(
(item) => item.source_id && tilesetArr.push(item.source_id)
);
this.multipleSelection.forEach((item) => {
if (item.source_id && tilesetArr.includes(item.source_id)) {
console.log("已经添加过该资源");
} else {
let param = {};
param.p_id = p_id;
param.name = item.source_name;
param.tree_index = item.tree_index;
param.type = item.source_type;
param.source_id = item.source_id;
param.detail = {
layer_index: item.layer_index,
params: item.detail,
};
tilesetAdd(param, (res) => {
console.log("render数据资源");
this.dialogTableVisible = false;
let idKey = ztreeObj.setting.data.simpleData.idKey;
let parentNode = ztreeObj.getNodeByParam(idKey, param.p_id, null);
res.icon = cusNodeIcon(res);
res.children = null;
let newNodes = ztreeObj.addNodes(parentNode, [res]);
nodeType[res.type].render(res);
ztreeObj.updateNode(newNodes[0]);
});
}
});
},
fetchData() {
tilesetList({}, (res) => {
// console.log(res);
this.gisData = res.list.length ? res.list : [];
let ztreeObj = $.fn.zTree.getZTreeObj("treeDemos");
let nodes = ztreeObj.transformToArray(ztreeObj.getNodes());
let tilesetArr = [];
nodes.forEach(
(item) => item.source_id && tilesetArr.push(item.source_id)
);
console.log("tilesetArr", tilesetArr);
console.log(this.gisData);
setTimeout(() => {
for (let i = 0; i < this.gisData.length; i++) {
let item = this.gisData[i];
console.log(this.$refs.multipleTable.toggleRowSelection);
console.log(item);
console.log(tilesetArr.includes(item.source_id));
if (item.source_id && tilesetArr.includes(item.source_id)) {
this.$refs.multipleTable.toggleRowSelection(item, true);
}
}
}, 10);
});
},
handleSelectionChange(val) {
console.log(val);
this.multipleSelection = val;
},
openSituationEdit(plan) {
window.currentPlan = plan;
eventList({ plan_id: plan.ID || plan.plan_id }, (res) => {
console.log("eventList", res);
this.eventLists = res.list
this.eventsList = true;
window.TSTYOBJ = window.TSTY.init({
startTimestamp: plan.plan_create_time,
tasks: this.eventLists,
scales: { preMainIndex: 2 }
});
this.action = window.TSTYOBJ.initAction()
this.TSTYOBJ = window.TSTYOBJ
this.$nextTick(() => {
TSTYOBJ.store.init()
TSTYOBJ.renderLine(this.$nextTick)
TSTYOBJ.renderLabel({ left: 0 })
TSTYOBJ.store.updateTimeLineRightRest()
})
this.showList = !this.showList;
this.editSituation = !this.editSituation;
this.createEarth("earthContainers");
/*
2025-07-03 17:39:09 +08:00
console.log("eventList", res);
// obj.tasks = res.list;
let arr = [];
res.list.forEach((item) => {
arr.push(window.Store.databaseToTimeline(item));
});
obj.tasks = arr;
obj.startTimestamp = plan.plan_create_time;
window.Store.initData(obj);
// window.Clock = new TSTY.clock();
this.scales = Store.scales;
this.tasks = Store.tasks;
2025-07-03 17:39:09 +08:00
this.showList = !this.showList;
this.editSituation = !this.editSituation;
this.createEarth("earthContainers");
this.eventsList = true;
this.$nextTick(() => {
window.Store.setFullWidth();
});*/
});
},
removeEarth1() {
/* Array.from(_entityMap.values()).forEach(
(entity) => entity && entity.remove()
);*/
_entityMap.clear();
if (window.Earth1) {
window.Earth1.destroy();
window.Earth1 = null;
}
this.noSituation = !this.noSituation;
this.showList = !this.showList;
this.$nextTick(() => {
this.$refs.situation.getList();
});
},
changeState() {
this.State = !this.State;
let bottomMenuMove = [
"animate__fadeInLeftBig",
"animate__fadeOutLeftBig",
];
let leftMenuMove = ["animate__fadeInUpBig", "animate__fadeOutDownBig"];
let add = 1,
remove = 0;
let left_second = document.querySelector(".left_second");
if (!this.State) {
left_second.style.display = "none";
}
if (this.State) {
add = 0;
remove = 1;
}
$(".bottomMenu").removeClass(bottomMenuMove[remove]);
$(".bottomMenu").addClass(bottomMenuMove[add]);
$(".left").removeClass(leftMenuMove[remove]);
$(".left").addClass(leftMenuMove[add]);
},
tongbu() {
this.$refs.firstMenu.tongbu2D();
},
// videoStop(){
// this.$changeComponentShow('.videoStop', false)
// this.$sendElectronChanel('endRecoder')
// },
flyToView() {
console.log("2222222222flyToView");
console.log(111111, localStorage.getItem("defaultView"));
if (localStorage.getItem("defaultView"))
YJ.Global.flyTo(JSON.parse(localStorage.getItem("defaultView")));
},
closeEditor() {
this.$sendChanel("closeEditor");
this.$changeComponentShow("#modal", false);
this.richTextDialog.visible = false;
},
/* save() {
this.$sendChanel("saveRichText")
this.$sendChanel("closeEditor")
this.richTextDialog.visible = false
},*/
cancel() {
this.$changeComponentShow("#modal", false);
this.$sendChanel("closeEditor");
this.richTextDialog.visible = false;
},
//测试用
addMarker(option) {
let selectedNode = getSelectedNode(this.treeObj);
if (selectedNode) {
let DbOption = JSON.parse(JSON.stringify(option));
let source_id = this.$md5(new Date().getTime() + option.source_name);
DbOption.source_id = source_id;
DbOption.p_id = selectedNode.source_id;
let draw = new YJ.Draw[option.key]();
draw.start((err, params) => {
console.log(params);
let detailOption = {};
if (
Object.prototype.toString.call(params) === "[object Object]" &&
!params.hasOwnProperty("lng")
) {
detailOption = params;
} else {
detailOption = { position: params, name: option.source_name };
}
if (err) throw err;
//node上树node存数据库
let node = getNodeData(DbOption, detailOption);
console.log(DbOption);
addSource(node).then((res) => {
if ([0, 200].includes(res.code)) {
cusRenderNode(DbOption);
cusAddNodes(this.treeObj, selectedNode, [node]);
}
});
});
} else {
this.$message.warning("请选中一节点后操作");
}
},
/*langChange() {
this.$store.dispatch("changeLang", this.value)
this.$store.dispatch("changeIconSingleColor", "red")
console.log("lang", this.lang)
},*/
createEarth(domId) {
this.$nextTick(() => {
console.log("$nextTick");
if (YJ) {
window.Earth1 = new YJ.YJEarth(domId);
window.earth = window.Earth1;
YJ.Global.CesiumContainer(Earth1, { compass: false, legend: false });
YJ.Global.setGroundCover(true);
this.$refs.cabin.getSourceList();
window.Earth1.tabHide = ["属性信息"];
}
});
2025-11-14 09:42:30 +08:00
}
2025-07-03 17:39:09 +08:00
},
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.dashboard {
&-container {
width: 100vw;
height: 100vh;
position: fixed;
//海东1021
.goodSearch {
z-index: 999;
.contentBox {
border: 1.5px solid;
backdrop-filter: blur(2px);
background: linear-gradient(0deg, #00ffff33 0%, #00ffff00 100%),
rgba(0, 0, 0, 0.6);
width: 650px;
height: 400px;
position: absolute;
color: #fff;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border-image: linear-gradient(to bottom,
rgb(0, 255, 255) 6.25%,
rgb(0, 200, 255) 100%) 1;
display: flex;
flex-direction: column;
justify-content: space-between;
.titleBox {
height: 50px;
.title {
line-height: 50px;
padding-left: 15px;
font-size: 20px;
text-shadow: 0px 0px 9px rgba(20, 118, 255, 1);
}
.closeBox {
right: 0;
position: absolute;
display: inline-block;
width: 35px;
height: 33px;
border-radius: 0 0 0 90%;
background: #00ffff;
&>span {
font-size: 22px;
position: absolute;
right: 5px;
cursor: pointer;
}
}
}
#goodSearchEchart {
flex: auto;
}
.hr {
width: 89%;
margin: 0 auto;
border-bottom: 1px solid rgba(204, 204, 204, 0.2);
}
&:after {
display: block;
position: absolute;
content: "";
left: -1.5px;
top: -6px;
width: 70.5px;
height: 6px;
opacity: 1;
background: rgba(0, 255, 255, 1);
clip-path: polygon(0 0, calc(100% - 3px) 0, 100% 6px, 0 6px);
}
}
}
//height: calc(100vh - 50px);
//margin: 30px;
#earth {
display: flex;
width: 100vw;
height: 100vh;
}
#earths {
width: 100vw;
height: 100vh;
display: none;
}
.halfEarth {
display: block !important;
width: 50vw !important;
}
.zIndex1 {
z-index: -1;
}
.selectedEarthCss {
//border: 1px solid red;
padding: 2px;
}
.svg-container {
display: inline-block;
//border: 1px solid red;
}
.bottomMenuBox,
.leftBox {
overflow: hidden;
}
.selectImgBox,
.profileAnalysisBox,
.cutFillBox,
.inundationAnalysisBox,
.flyToLocationBox,
.tongbu,
.modelSelectBox,
.bimInfoBox,
.echartsTotalBox,
.modelBox,
.vrModelBox,
.scene,
.editor,
.junbiaoBox,
.textModelBox,
.junbiao3dBox,
.videoStop,
.adddirectoryBox,
.excelSetBox,
2025-09-02 10:01:05 +08:00
.tufuSelect,
.tacticalBox,
2025-09-02 10:01:05 +08:00
.ModelSetBox,
2025-11-14 09:42:30 +08:00
.modelBoxg {
2025-07-03 17:39:09 +08:00
display: none;
}
2025-11-14 09:42:30 +08:00
.selectImgBox {
2025-07-31 09:31:31 +08:00
z-index: 9999999;
2025-11-14 09:42:30 +08:00
}
2025-09-02 10:01:05 +08:00
.ModelSetBox{
z-index: 10000;
}
2025-11-14 09:42:30 +08:00
2025-07-03 17:39:09 +08:00
.scene {
//width: 5vw;
//height: 5vw;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
//border: 1px solid red;
background: #808080;
}
.logo {
width: 5vw;
height: 5vw;
bottom: 10px;
left: 20px;
img {
width: 100%;
height: 100%;
}
}
.richTextDialogBox {
position: absolute;
//border: 1px solid red;
width: 1090px;
height: 600px;
z-index: 2003;
}
#modal {
position: fixed;
z-index: 99;
background-color: rgba(0, 0, 0, 0.5);
width: 100vw;
height: 100vh;
display: none;
}
::v-deep .el-dialog {
height: 600px;
.el-dialog__body {
padding: 0 !important;
}
}
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
<style lang="scss">
.dashboard-container {
//新增态势0830
.cabinShowBtn {
z-index: 9999;
//display: none;
position: absolute;
top: calc(50% - 225px);
.switch-node-outer {
position: relative;
background: #0ff;
clip-path: polygon(0% calc(var(--width) + var(--innerBorder)),
100% 0%,
100% 100%,
0% calc(100% - var(--width) - var(--innerBorder)));
padding: calc(var(--innerBorder) * 1.42) var(--innerBorder);
.switch-node-inner {
clip-path: polygon(0% var(--width),
100% var(--innerBorder),
100% calc(100% - var(--innerBorder)),
0% calc(100% - var(--width)));
//clip-path: polygon(0% var(--innerBorder), 100% var(--width), 100% calc(100% - 30px), 0% calc(100% - 3px));
cursor: pointer;
writing-mode: vertical-lr;
padding: calc(var(--width) * 1.1) 0;
width: var(--width);
line-height: var(--width);
background: var(--bg-color);
color: #0ff;
letter-spacing: 2.5px;
/* border: 1.5px solid rgba(0, 255, 255, 1); */
position: relative;
box-sizing: border-box;
}
}
}
.timeline-container {
position: absolute;
width: 100vw;
//height: 230px;
box-sizing: border-box;
z-index: 9;
bottom: 0;
.area {
position: relative;
}
}
//新增态势0822
.elementShowBtn {
z-index: 9999;
//display: none;
position: absolute;
//新增态势0827
//left: 0%;
top: calc(50% - 225px);
/*transform: translateY(-50%);*/
.switch-node-outer {
position: relative;
//width: var(--width);
clip-path: polygon(0% 0%,
100% calc(var(--width) + var(--innerBorder)),
100% calc(100% - var(--width) - var(--innerBorder)),
0% 100%);
//clip-path: polygon(0% 0%, 100% 33px, 100% calc(100% - 33px), 0% 100%);
padding: calc(var(--innerBorder) * 1.42) var(--innerBorder);
//padding: 4.6px 3px;
background: #0ff;
.switch-node-inner {
clip-path: polygon(0% var(--innerBorder),
100% var(--width),
100% calc(100% - var(--width)),
0% calc(100% - var(--innerBorder)));
//clip-path: polygon(0% var(--innerBorder), 100% var(--width), 100% calc(100% - 30px), 0% calc(100% - 3px));
cursor: pointer;
writing-mode: vertical-lr;
padding: calc(var(--width) * 1.1) 0;
width: var(--width);
line-height: var(--width);
background: var(--bg-color);
color: #0ff;
letter-spacing: 2.5px;
/* border: 1.5px solid rgba(0, 255, 255, 1); */
position: relative;
box-sizing: border-box;
}
}
}
.cabinShowBtn {
right: 0%;
}
//新增态势
&>.content {
background: url("../../assets/img/bkgif@3x.gif") no-repeat;
background-size: 100% 100%;
width: 100vw;
height: 100vh !important;
position: absolute;
z-index: 9;
}
.icon-top {
//width: 100%;
//height: 100%;
top: 0;
left: 0;
z-index: 99;
position: absolute;
width: vw(1920) !important;
//height: 8.888vh;
height: vh(96) !important;
//background: linear-gradient(180deg, rgba(0, 33, 36, 1) 0%, rgba(0, 38, 41, 1) 25.47%, rgba(0, 0, 0, 0) 100%);
}
.timeline-content {
position: absolute;
width: 100vw;
height: vh(295);
box-sizing: border-box;
z-index: 9;
bottom: 0;
background: url("../../assets/img/timeLinePanelBg.png") no-repeat 50% 100%;
background-size: cover;
.area {
position: relative;
}
}
.icon-tuichu {
position: absolute;
top: vh(5);
right: vw(5);
z-index: 999;
width: vw(24) !important;
height: vh(24) !important;
cursor: pointer;
}
.icon-tuichudenglu {
position: absolute;
z-index: 999;
width: vw(26);
height: vh(26);
right: vw(8);
top: vh(8);
}
.titles {
left: 50%;
transform: translateX(-50%);
font-size: px2font(40);
top: vh(19);
line-height: px2font(50);
font-family: "alimamashuheiti";
z-index: 999;
position: absolute;
color: #fff;
}
.elementBox,
.cabinBox {
width: vw(343);
height: vh(662);
position: absolute;
z-index: 9999;
top: vh(145);
border: vw(1.5) solid rgba(0, 255, 255, 1);
background: linear-gradient(180deg,
rgba(0, 255, 255, 0.2) 0%,
rgba(0, 255, 255, 0) 100%),
rgba(0, 0, 0, 0.5);
color: #fff;
}
.eventEditor {
border: 1px solid;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
z-index: 999;
color: #fff;
background: rgba(0, 63, 63, 1);
overflow-y: auto;
font-size: px2font(16);
}
.elementBox {
left: vw(30);
}
.cabinBox {
right: vw(30);
}
//新增态势结束
.el-dialog {
height: 600px;
display: flex;
flex-direction: column;
.el-dialog__body {
padding-top: 0 !important;
padding-bottom: 0 !important;
flex: auto;
display: flex;
flex-direction: column;
#richTextEditor {
flex: auto;
display: flex;
flex-direction: column;
.w-e-text-container {
flex: auto;
}
}
}
}
.transformDrawerContent {
padding-left: 15px;
.btn {
margin-top: 5px;
}
.transformDrawerItem {
padding-left: 10px;
font-size: 12px;
display: flex;
align-items: center;
margin-top: 5px;
>span {
display: block;
width: 115px;
/* align-content: center; */
}
}
}
.fightingDataStyleBox {
display: none;
}
.movie {
top: 0.1vh;
left: 0;
width: 98vw;
// display: none;
//height: 240px !important;
}
}
</style>