明树Git Lab
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
J
jt_front
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
jt_front
Commits
5c1447f5
Commit
5c1447f5
authored
Jan 27, 2026
by
zhanghan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
可视化大屏开发完成
parent
6fdf04db
Pipeline
#106638
passed with stage
in 17 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1999 additions
and
1742 deletions
+1999
-1742
routes.js
src/router/routes.js
+6
-6
bigScreen.vue
src/views/everydayPage/bigScreen.vue
+47
-56
index.vue
src/views/homePage/index.vue
+110
-1680
oldIndex.vue
src/views/homePage/oldIndex.vue
+1836
-0
No files found.
src/router/routes.js
View file @
5c1447f5
...
@@ -211,12 +211,12 @@ const routes = [
...
@@ -211,12 +211,12 @@ const routes = [
title
:
"投资目标责任书"
,
title
:
"投资目标责任书"
,
component
:
()
=>
import
(
"@/views/everydayPage/shareAdd.vue"
),
component
:
()
=>
import
(
"@/views/everydayPage/shareAdd.vue"
),
},
},
{
//
{
path
:
"/bigScreen"
,
//
path: "/bigScreen",
name
:
"bigScreen"
,
//
name: "bigScreen",
title
:
"可视化大屏"
,
//
title: "可视化大屏",
component
:
()
=>
import
(
"@/views/everydayPage/bigScreen.vue"
),
//
component: () => import("@/views/everydayPage/bigScreen.vue"),
},
//
},
],
],
},
},
{
{
...
...
src/views/everydayPage/bigScreen.vue
View file @
5c1447f5
...
@@ -50,6 +50,12 @@
...
@@ -50,6 +50,12 @@
</el-icon>
</el-icon>
{{
isFullscreen
?
"退出全屏"
:
"全屏"
}}
{{
isFullscreen
?
"退出全屏"
:
"全屏"
}}
</span>
</span>
<span
@
click=
"handleInput(!modelValue)"
class=
"fullscreen-text"
>
<el-icon
:size=
"18"
>
<Switch
/>
</el-icon>
{{
modelValue
?
"决策分析可视化大屏"
:
"交通投资可视化大屏"
}}
</span>
</div>
</div>
</div>
</div>
<div
class=
"map-container"
>
<div
class=
"map-container"
>
...
@@ -424,10 +430,26 @@ import { reactive, ref, nextTick, watch, onMounted, onUnmounted } from "vue";
...
@@ -424,10 +430,26 @@ import { reactive, ref, nextTick, watch, onMounted, onUnmounted } from "vue";
import
*
as
echarts
from
"echarts"
;
import
*
as
echarts
from
"echarts"
;
const
selectedContentBtn
=
ref
(
"jianshe"
);
const
selectedContentBtn
=
ref
(
"jianshe"
);
const
isFullscreen
=
ref
(
false
);
const
showBackBtn
=
ref
(
false
);
const
showBackBtn
=
ref
(
false
);
const
selectedNavBtn
=
ref
(
"equity"
);
// 默认选中股权投资
const
selectedNavBtn
=
ref
(
"equity"
);
// 默认选中股权投资
const
props
=
defineProps
({
modelValue
:
{
type
:
Boolean
,
default
:
""
,
// 默认值,避免空值报错
},
isFullscreen
:
{
// 父组件传递的全屏状态
type
:
Boolean
,
default
:
false
,
},
});
const
emit
=
defineEmits
([
"update:modelValue"
,
"toggle-fullscreen"
]);
const
handleInput
=
(
e
)
=>
{
// e.target.value 是输入框的最新值
emit
(
"update:modelValue"
,
e
);
};
// 导航按钮点击事件
// 导航按钮点击事件
const
handleNavBtnClick
=
(
key
)
=>
{
const
handleNavBtnClick
=
(
key
)
=>
{
selectedNavBtn
.
value
=
key
;
selectedNavBtn
.
value
=
key
;
...
@@ -1474,67 +1496,37 @@ const resizeEcharts = () => {
...
@@ -1474,67 +1496,37 @@ const resizeEcharts = () => {
// 全屏切换功能
// 全屏切换功能
const
toggleFullscreen
=
()
=>
{
const
toggleFullscreen
=
()
=>
{
const
homeContainer
=
document
.
querySelector
(
".home-container"
);
emit
(
"toggle-fullscreen"
);
// 触发父组件的全屏切换方法
if
(
isFullscreen
.
value
)
{
// 退出全屏
if
(
document
.
exitFullscreen
)
{
document
.
exitFullscreen
();
}
else
if
(
document
.
webkitExitFullscreen
)
{
document
.
webkitExitFullscreen
();
}
else
if
(
document
.
msExitFullscreen
)
{
document
.
msExitFullscreen
();
}
homeContainer
.
style
.
height
=
"100%"
;
// 移除全屏类
homeContainer
.
classList
.
remove
(
"fullscreen"
);
}
else
{
// 进入全屏
if
(
homeContainer
.
requestFullscreen
)
{
homeContainer
.
requestFullscreen
();
}
else
if
(
homeContainer
.
webkitRequestFullscreen
)
{
homeContainer
.
webkitRequestFullscreen
();
}
else
if
(
homeContainer
.
msRequestFullscreen
)
{
homeContainer
.
msRequestFullscreen
();
}
homeContainer
.
style
.
height
=
"100vh"
;
// 添加全屏类
homeContainer
.
classList
.
add
(
"fullscreen"
);
}
isFullscreen
.
value
=
!
isFullscreen
.
value
;
};
};
onMounted
(()
=>
{
onMounted
(()
=>
{
initProgressPie
();
initProgressPie
();
window
.
addEventListener
(
"
resize"
,
resizeEcharts
);
window
.
addEventListener
(
"
echarts-resize"
,
resizeEcharts
);
// 监听父组件的resize事件
});
});
onUnmounted
(()
=>
{
onUnmounted
(()
=>
{
window
.
removeEventListener
(
"resize"
,
resizeEcharts
);
window
.
removeEventListener
(
"
echarts-
resize"
,
resizeEcharts
);
});
});
// 监听全屏变化事件
//
//
监听全屏变化事件
window
.
addEventListener
(
"fullscreenchange"
,
()
=>
{
//
window.addEventListener("fullscreenchange", () => {
const
homeContainer
=
document
.
querySelector
(
".home-container"
);
//
const homeContainer = document.querySelector(".home-container");
if
(
!
document
.
fullscreenElement
)
{
//
if (!document.fullscreenElement) {
isFullscreen
.
value
=
false
;
//
isFullscreen.value = false;
if
(
homeContainer
)
{
//
if (homeContainer) {
homeContainer
.
style
.
height
=
"100%"
;
//
homeContainer.style.height = "100%";
// 移除全屏类
//
// 移除全屏类
homeContainer
.
classList
.
remove
(
"fullscreen"
);
//
homeContainer.classList.remove("fullscreen");
}
//
}
}
else
{
//
} else {
isFullscreen
.
value
=
true
;
//
isFullscreen.value = true;
if
(
homeContainer
)
{
//
if (homeContainer) {
homeContainer
.
style
.
height
=
"100vh"
;
//
homeContainer.style.height = "100vh";
// 添加全屏类
//
// 添加全屏类
homeContainer
.
classList
.
add
(
"fullscreen"
);
//
homeContainer.classList.add("fullscreen");
}
//
}
}
//
}
});
//
});
// 表格弹框
// 表格弹框
let
tableData
=
ref
([]);
let
tableData
=
ref
([]);
...
@@ -1666,6 +1658,7 @@ const handleClose = () => {
...
@@ -1666,6 +1658,7 @@ const handleClose = () => {
}
}
.header-fullscreen {
.header-fullscreen {
display: flex;
position: absolute;
position: absolute;
right: 4%;
right: 4%;
top: 110%;
top: 110%;
...
@@ -1674,6 +1667,7 @@ const handleClose = () => {
...
@@ -1674,6 +1667,7 @@ const handleClose = () => {
z-index: 9999;
z-index: 9999;
.fullscreen-text {
.fullscreen-text {
margin-right: 16px;
color: white;
color: white;
font-weight: 700;
font-weight: 700;
font-size: 14px;
font-size: 14px;
...
@@ -1975,9 +1969,6 @@ const handleClose = () => {
...
@@ -1975,9 +1969,6 @@ const handleClose = () => {
}
}
}
}
}
}
</
style
>
<
style
lang=
"less"
>
.home-container {
.home-container {
.el-dialog {
.el-dialog {
height: 75%;
height: 75%;
...
...
src/views/homePage/index.vue
View file @
5c1447f5
<
template
>
<
template
>
<div
class=
"home-container"
>
<!-- 新增父容器,作为全屏的目标元素(替代子组件的.home-container) -->
<div
class=
"header"
>
<div
class=
"parent-fullscreen-container"
ref=
"parentContainer"
>
<!--
<div
class=
"header-left"
>
<oldIndex
<div
v-model=
"taggle"
class=
"nav-btn"
v-for=
"item in navLeftBtns"
:key=
"item.key"
v-if=
"taggle"
:class=
"
{ active: selectedBtn === item.key }"
:is-fullscreen=
"isFullscreen"
@click="changeBtn(item.key)"
@
toggle-fullscreen=
"handleToggleFullscreen"
>
/>
<span>
{{
item
.
name
}}
</span>
<bigScreen
</div>
v-model=
"taggle"
</div>
-->
v-if=
"!taggle"
<div
class=
"header-middile"
>
:is-fullscreen=
"isFullscreen"
<span>
葛洲坝集团交通投资有限公司投资决策分析系统
</span>
@
toggle-fullscreen=
"handleToggleFullscreen"
</div>
/>
<!--
<div
class=
"header-right"
>
<div
class=
"nav-btn"
v-for=
"item in navRightBtns"
:key=
"item.key"
:class=
"
{ active: selectedBtn === item.key }"
@click="changeBtn(item.key)"
>
<span>
{{
item
.
name
}}
</span>
</div>
</div>
-->
<div
class=
"header-fullscreen"
>
<span
@
click=
"toggleFullscreen"
class=
"fullscreen-text"
>
<el-icon
:size=
"18"
>
<full-screen
/>
</el-icon>
{{
isFullscreen
?
"退出全屏"
:
"全屏"
}}
</span>
</div>
</div>
<div
class=
"nav-list"
>
<span
v-for=
"item in navList"
:key=
"item.index"
:class=
"
{ active: selectedContentBtn === item.key }"
@click="selectContentBtn(item)"
>
{{
item
.
name
}}
</span>
</div>
<div
class=
"map-container"
>
<div
class=
"map-content"
>
<div
class=
"info-top-wrap"
v-if=
"['lixiang', 'tuichu'].includes(selectedContentBtn)"
>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn]"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
</div>
<div
class=
"info-right-wrap"
v-else-if=
"selectedContentBtn === 'jianshe'"
>
<div
class=
"info-title"
>
项目概况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].gaikuang"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzwcqk"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资完成情况
</div>
<div
class=
"info-progress"
>
<div
class=
"progress-pie"
ref=
"progressPie"
></div>
<div
class=
"progress-bar"
>
<div
class=
"progress-text"
>
109.04/122.52亿元
</div>
<div
class=
"progress-image"
>
<div
class=
"progress-show-value"
></div>
<!-- rel100%宽在css上占父元素的85%,进度样式上要做换算 -->
<div
class=
"progress-show-value-rel"
:style=
"
{ width: `${89 * 85 / 100}%` }"
>
</div>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资回收完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzhswcqk"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
</div>
<div
class=
"info-right-wrap"
v-else-if=
"['shiyunying', 'yunying'].includes(selectedContentBtn)"
>
<div
class=
"info-title"
>
项目概况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].gaikuang"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
<template
v-if=
"infoObj[selectedContentBtn].tzwcqk"
>
<div
class=
"info-title"
>
投资完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzwcqk"
:key=
"idx"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
</
template
>
<div
class=
"info-title"
>
经营计划完成情况
</div>
<div
class=
"data-info-large"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].jyjhwcqk"
:key=
"idx"
>
<div
class=
"item-title"
>
{{ item.title }}
</div>
<div
class=
"item-content"
>
<div
class=
"target-item"
v-for=
"(target, index) in item.data"
:key=
"index"
:class=
"{'target-small': target.size === 'small'}"
>
<div
class=
"target-name"
>
{{ target.name }}
</div>
<div
class=
"target-value"
:class=
"{
'target-green': !isNaN(target.value) && target.value < 0,
'target-red': !isNaN(target.value) && target.value > 0,
}"
>
{{ target.value }}
<el-icon
v-if=
"target.size === 'small' && !isNaN(target.value)"
>
<Top
v-if=
"target.value > 0"
/>
<Bottom
v-else
/>
</el-icon>
</div>
</div>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资回收完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzhswcqk"
:key=
"idx"
>
<div
class=
"item-title"
>
{{ item.title }}
</div>
<div
class=
"item-value"
>
{{ item.value }}
<span
class=
"item-unit"
>
{{ item.unit }}
</span>
</div>
</div>
</div>
<div
class=
"info-title"
>
2025经营计划完成进度
</div>
<div
class=
"data-info-large"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].jyjhwcjd"
:key=
"idx"
>
<div
class=
"item-content"
>
<div
class=
"target-item"
v-for=
"(target, index) in item.data"
:key=
"index"
>
<div
class=
"target-name"
>
{{ target.name }}
</div>
<div
class=
"target-value"
>
{{ target.value }}
</div>
</div>
</div>
</div>
</div>
</div>
<Map
ref=
"mapRef"
:tabKey=
"selectedContentBtn"
/>
<div
class=
"back-to-country-btn"
@
click=
"backToCountry"
v-show=
"showBackBtn"
>
返回全国
</div>
</div>
</div>
<div
class=
"bottom"
></div>
<!-- 详情信息 -->
<el-dialog
:title=
"dialogTitle + '详情'"
v-model=
"dialogVisible"
width=
"80%"
:before-close=
"handleClose"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
>
<div
class=
"dialog-content"
>
<div
class=
"table-wrap"
>
<el-table
:data=
"tableData"
style=
"width: 100%"
empty-text=
"暂无数据"
>
<el-table-column
type=
"index"
width=
"60"
label=
"序号"
:align=
"'center'"
/>
<el-table-column
prop=
"name"
label=
"项目名称"
:align=
"'center'"
width=
"120"
/>
<el-table-column
prop=
"qy"
label=
"项目区域"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"jsgm"
label=
"建设规模"
:align=
"'center'"
>
<el-table-column
prop=
"zlc"
label=
"总里程(KM)"
:align=
"'center'"
/>
<el-table-column
prop=
"cds"
label=
"车道数"
:align=
"'center'"
/>
<el-table-column
prop=
"qsb"
label=
"桥隧比"
:align=
"'center'"
/>
</el-table-column>
<el-table-column
prop=
"jsq"
label=
"建设期(年)"
:align=
"'center'"
/>
<el-table-column
prop=
"yyqnx"
label=
"运营期年限(年)"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"jcztz"
label=
"决策总投资"
:align=
"'center'"
width=
"110"
/>
<el-table-column
prop=
"jczt"
label=
"决策主体"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"jcsj"
label=
"决策时间"
width=
"110"
:align=
"'center'"
/>
<el-table-column
prop=
"sfPPP"
label=
"是否是PPP项目"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"xmmyms"
label=
"项目名义模式"
:align=
"'center'"
width=
"110"
/>
<el-table-column
prop=
"sjms"
label=
"实际模式"
:align=
"'center'"
width=
"150"
/>
<el-table-column
prop=
"gqjg"
label=
"股权结构"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"xmzt"
label=
"项目状态"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"tcsj"
label=
"通车时间"
width=
"110"
:align=
"'center'"
/>
<el-table-column
prop=
"hbfs"
label=
"回报方式"
:align=
"'center'"
width=
"150"
/>
<el-table-column
prop=
"irr"
label=
"IRR"
:align=
"'center'"
width=
"100"
/>
</el-table>
</div>
<!-- <div class="page-wrap">
<el-pagination background layout="prev, pager, next" :total="1000" />
</div> -->
</div>
<
template
#
footer
>
<span
class=
"dialog-footer"
>
<el-button
@
click=
"handleClose"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"handleClose"
>
确 定
</el-button
>
</span>
</
template
>
</el-dialog>
</div>
</div>
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
Map
from
"@/components/CommonMap.
vue"
;
import
{
ref
,
onMounted
,
onUnmounted
,
watch
,
nextTick
}
from
"
vue"
;
import
{
reactive
,
ref
,
nextTick
,
watch
,
onMounted
,
onUnmounted
}
from
"
vue"
;
import
oldIndex
from
"@/views/homePage/oldIndex.
vue"
;
import
*
as
echarts
from
"echarts
"
;
import
bigScreen
from
"@/views/everydayPage/bigScreen.vue
"
;
const
navLeftBtns
=
reactive
([
// 1. 组件切换状态(原有逻辑)
{
const
taggle
=
ref
(
true
);
key
:
"equity"
,
name
:
"股权投资"
// 2. 全屏状态(提升到父组件统一管理)
},
{
key
:
"risk"
,
name
:
"固定资产投资"
}
]);
const
navRightBtns
=
reactive
([
{
key
:
"realestate"
,
name
:
"房地产投资"
},
{
key
:
"finance"
,
name
:
"融资建设投资"
}
]);
const
selectedBtn
=
ref
(
"equity"
);
const
selectedContentBtn
=
ref
(
"lixiang"
);
const
selectedContentName
=
ref
(
"立项"
);
const
isFullscreen
=
ref
(
false
);
const
isFullscreen
=
ref
(
false
);
const
showBackBtn
=
ref
(
false
);
const
navList
=
reactive
([
// 3. 父容器ref(作为全屏的目标元素)
{
const
parentContainer
=
ref
(
null
);
index
:
1
,
name
:
"立项"
,
key
:
"lixiang"
},
{
index
:
2
,
name
:
"建设"
,
key
:
"jianshe"
},
{
index
:
3
,
name
:
"试运营"
,
key
:
"shiyunying"
},
{
index
:
4
,
name
:
"运营"
,
key
:
"yunying"
},
// {
// index: 5,
// name: "转让",
// },
{
index
:
6
,
name
:
"退出"
,
key
:
"tuichu"
},
]);
const
infoObj
=
reactive
({
lixiang
:
[
{
title
:
"总个数"
,
value
:
"36"
,
unit
:
"个"
,
data
:
[
{
name
:
"/"
,
qy
:
"/"
,
zlc
:
"/"
,
cds
:
"/"
,
qsb
:
"/"
,
jsq
:
"/"
,
yyqnx
:
"/"
,
jcztz
:
"/"
,
jczt
:
"/"
,
jcsj
:
"/"
,
sfPPP
:
"/"
,
xmmyms
:
"/"
,
sjms
:
"/"
,
gqjg
:
"/"
,
xmzt
:
"/"
,
tcsj
:
"/"
,
hbfs
:
"/"
,
}
]
},
{
title
:
"总投资"
,
value
:
"3107.22"
,
unit
:
"亿元"
},
{
title
:
"总规模"
,
value
:
"0"
,
unit
:
"公里"
}
],
jianshe
:
{
gaikuang
:
[
{
title
:
"总个数"
,
value
:
"10"
,
unit
:
"个"
,
data
:
[
{
name
:
"和襄高速"
,
qy
:
"安徽"
,
zlc
:
"170.6"
,
cds
:
"4/6"
,
qsb
:
"29.50%"
,
jsq
:
"3"
,
yyqnx
:
"29.5"
,
jcztz
:
"247.54"
,
jczt
:
"中国能建"
,
jcsj
:
"2023/1/11"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+建设期投资补助"
,
sjms
:
"BOT+车购税资金50.63亿元"
,
gqjg
:
"控股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/31"
,
hbfs
:
"使用者付费"
},
{
name
:
"肇明高速"
,
qy
:
"广东"
,
zlc
:
"98.43"
,
cds
:
"6"
,
qsb
:
"55.12%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"214.94"
,
jczt
:
"中国能建"
,
jcsj
:
"2019/12/12"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT+施工总承包+政府补助"
,
sjms
:
"BOT+政府股权投资"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2029/6/30"
,
hbfs
:
"使用者付费"
},
{
name
:
"延安东高速"
,
qy
:
"陕西"
,
zlc
:
"57.16"
,
cds
:
"4"
,
qsb
:
"49.7%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"85.94"
,
jczt
:
"中国能建"
,
jcsj
:
"2020/6/29"
,
sfPPP
:
"是"
,
xmmyms
:
"PPP"
,
sjms
:
"BOT+90%工可车流量延期条件兜底"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/15"
,
hbfs
:
"使用者付费(有合作期末延长收费期条款)"
},
{
name
:
"关环高速"
,
qy
:
"陕西"
,
zlc
:
"73.74"
,
cds
:
"4"
,
qsb
:
"29.38%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"71.84"
,
jczt
:
"中国能建"
,
jcsj
:
"2020/8/4"
,
sfPPP
:
"是"
,
xmmyms
:
"PPP"
,
sjms
:
"BOT+定补"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2028/9/30"
,
hbfs
:
"使用者付费+政府固定补助"
},
{
name
:
"横钦高速"
,
qy
:
"广西"
,
zlc
:
"166.024"
,
cds
:
"4"
,
qsb
:
"15.85%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"208.32"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/12/30"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+施工总承包+可行性缺口补助"
,
sjms
:
"BOT+运营期定补6.1亿/年+缺口延期条件兜底"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2026/9/30"
,
hbfs
:
"使用者付费+可行性缺口补助(实际为固定补助+合作期末延长收费期条款)"
},
{
name
:
"全灌高速"
,
qy
:
"广西"
,
zlc
:
"75.14"
,
cds
:
"4"
,
qsb
:
"26.1%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"92.73"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/12/30"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+施工总承包+可行性缺口补助"
,
sjms
:
"BOT+运营期定补3.204亿/年+缺口延期条件兜底"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2026/6/30(泉南拼接2027年3月)"
,
hbfs
:
"使用者付费+可行性缺口补助(实际为固定补助+合作期末延长收费期条款)"
},
{
name
:
"济商高速(济宁)"
,
qy
:
"山东"
,
zlc
:
"45.076"
,
cds
:
"6"
,
qsb
:
"15.78%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"69.48"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/9/2"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/31"
,
hbfs
:
"使用者付费"
},
{
name
:
"济商高速(菏泽)"
,
qy
:
"山东"
,
zlc
:
"65.47"
,
cds
:
"6"
,
qsb
:
"12.43%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"104.07"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/9/28"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/31"
,
hbfs
:
"使用者付费"
},
{
name
:
"承克高速"
,
qy
:
"河北"
,
zlc
:
"105.58"
,
cds
:
"4"
,
qsb
:
"26.48%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"130.25"
,
jczt
:
"中国能建"
,
jcsj
:
"2023/3/8"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+可行性缺口补助"
,
sjms
:
"BOT+车购税+运营期定补9500万元"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2027/9/10"
,
hbfs
:
"使用者付费+政府固定补助"
},
{
name
:
"S10高速"
,
qy
:
"甘肃"
,
zlc
:
"194.34"
,
cds
:
"4"
,
qsb
:
"6.8%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"108.94"
,
jczt
:
"中国能建"
,
jcsj
:
"2025/1/6"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"控股"
,
xmzt
:
"筹建"
,
tcsj
:
"预计2028/12/31"
,
hbfs
:
"使用者付费"
}
]
},
{
title
:
"总投资"
,
value
:
"1334.05"
,
unit
:
"亿元"
},
{
title
:
"总规模"
,
value
:
"1051.56"
,
unit
:
"公里"
}
],
tzwcqk
:
[
// { title: "10月完成投资", value: "*" },
{
title
:
"2025年完成投资"
,
value
:
"109.04"
,
unit
:
"亿元"
},
{
title
:
"累计完成投资"
,
value
:
"531.39"
,
unit
:
"亿元"
}
],
tzhswcqk
:
[
// { title: "10月完成回收", value: "*" },
{
title
:
"2025年完成回收"
,
value
:
"28.84"
,
unit
:
"亿元"
},
{
title
:
"完成率"
,
value
:
"53.16"
,
unit
:
"%"
}
]
},
shiyunying
:
{
gaikuang
:
[
{
title
:
"总个数"
,
value
:
9
,
unit
:
"个"
,
data
:
[
{
name
:
"巴万高速"
,
qy
:
"四川"
,
zlc
:
"120.07"
,
cds
:
"4"
,
qsb
:
"64.57%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"188.2"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+政府股权合作"
,
sjms
:
"BOT+可行性缺口补助(费用兜底)"
,
gqjg
:
"控股"
,
xmzt
:
"已运营"
,
tcsj
:
"2021/1/1"
,
hbfs
:
"使用者付费+可行性缺口费用补助"
,
},
{
name
:
"巨单高速"
,
qy
:
"山东"
,
zlc
:
"116.2"
,
cds
:
"4"
,
qsb
:
"5.36%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"80.16"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2020/1/1"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"济泰高速"
,
qy
:
"山东"
,
zlc
:
"60.33"
,
cds
:
"6"
,
qsb
:
"49.43%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"101.82"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2020/10/27"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"枣菏高速"
,
qy
:
"山东"
,
zlc
:
"187.32"
,
cds
:
"4"
,
qsb
:
"16.69%"
,
jsq
:
"3.5"
,
yyqnx
:
"25"
,
jcztz
:
"144.79"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2020/10/8"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"延黄高速"
,
qy
:
"陕西"
,
zlc
:
"149.47"
,
cds
:
"4"
,
qsb
:
"54.92%"
,
jsq
:
"3.25"
,
yyqnx
:
"28"
,
jcztz
:
"145.88"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/7/25"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT+车购税资金50.23亿元"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2021/6/30"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"宁石高速"
,
qy
:
"陕西"
,
zlc
:
"51.78"
,
cds
:
"4"
,
qsb
:
"54.92%"
,
jsq
:
"3.72"
,
yyqnx
:
"28"
,
jcztz
:
"60.54"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/7/25"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2022/12/9"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"田西高速"
,
qy
:
"广西"
,
zlc
:
"191.26"
,
cds
:
"4"
,
qsb
:
"53.62%"
,
jsq
:
"3.75"
,
yyqnx
:
"30"
,
jcztz
:
"273.75"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/12/13"
,
sfPPP
:
"是"
,
xmmyms
:
"“DBFOT(设计-建设-融资-运营-移交)”的PPP模式"
,
sjms
:
"BOT+建设期补助29.54亿元(含政府资本金)+运营固定补助3.1045亿元/年+可行性缺口补助(费用兜底)"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2022/12/29"
,
hbfs
:
"使用者付费+固定补助+可行性缺口补助"
,
},
{
name
:
"武阳高速"
,
qy
:
"湖北"
,
zlc
:
"91.308"
,
cds
:
"4/6"
,
qsb
:
"40.41%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"113.51"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/11/13"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2023/10/20"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"麟法高速"
,
qy
:
"陕西"
,
zlc
:
"46.33"
,
cds
:
"4"
,
qsb
:
"29.38%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"52.79"
,
jczt
:
"中国能建"
,
jcsj
:
"2020/8/4"
,
sfPPP
:
"是"
,
xmmyms
:
"PPP"
,
sjms
:
"BOT+定补"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2025/7/21"
,
hbfs
:
"使用者付费+固定补助"
,
},
]
},
{
title
:
"总投资"
,
value
:
1151.36
,
unit
:
"亿元"
},
{
title
:
"总规模"
,
value
:
945.67
,
unit
:
"公里"
}
],
tzwcqk
:
[
// { title: "11月完成投资", value: "*" },
{
title
:
"2025年完成投资"
,
value
:
"*"
},
{
title
:
"累计完成投资"
,
value
:
"*"
}
],
jyjhwcqk
:
[
{
title
:
"营业收入"
,
data
:
[
// {
// name: "11月完成",
// value: 3.58,
// unit: "亿元"
// },
{
name
:
"第三季度完成"
,
value
:
31.71
,
unit
:
"亿元"
},
{
name
:
"2025累计完成"
,
value
:
38.86
,
unit
:
"亿元"
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
3.78
,
unit
:
"%"
}
]
},
{
title
:
"运营成本"
,
data
:
[
// {
// name: "11月发生",
// value: 1.96,
// unit: "亿元"
// },
{
name
:
"第三季度发生"
,
value
:
16.99
,
unit
:
"亿元"
},
{
name
:
"2025累计完成"
,
value
:
20.91
,
unit
:
"亿元"
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
-
14.73
,
unit
:
"%"
}
]
},
{
title
:
"利润总额"
,
data
:
[
// {
// name: "11月完成",
// value: -1.015,
// unit: "亿元"
// },
{
name
:
"第三季度完成"
,
value
:
-
5.91
,
unit
:
"亿元"
},
{
name
:
"2025累计完成"
,
value
:
-
7.94
,
unit
:
"亿元"
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
-
28.83
,
unit
:
"%"
}
]
}
],
tzhswcqk
:
[
// { title: "11月完成回收", value: 2.8682,
// unit: "亿元"
// },
{
title
:
"2025年完成回收"
,
value
:
31.55
,
unit
:
"亿元"
},
{
title
:
"完成率"
,
value
:
85
,
unit
:
"%"
}
],
jyjhwcjd
:
[
{
data
:
[
{
name
:
"营业收入完成进度"
,
value
:
85.81
,
unit
:
"%"
},
{
name
:
"实际完成金额"
,
value
:
38.86
,
unit
:
"亿元"
},
{
name
:
"计划完成金额"
,
value
:
45.27
,
unit
:
"亿元"
}
]
},
{
data
:
[
{
name
:
"运营成本完成进度"
,
value
:
79.60
,
unit
:
"%"
},
{
name
:
"实际完成金额"
,
value
:
20.91
,
unit
:
"亿元"
},
{
name
:
"计划完成金额"
,
value
:
26.27
,
unit
:
"亿元"
}
]
},
{
data
:
[
{
name
:
"利润总额完成进度"
,
value
:
77.59
,
unit
:
"%"
},
{
name
:
"实际完成金额"
,
value
:
-
7.94
,
unit
:
"亿元"
},
{
name
:
"计划完成金额"
,
value
:
-
10.23
,
unit
:
"亿元"
}
]
}
]
},
yunying
:
{
gaikuang
:
[
{
title
:
"总个数"
,
value
:
"2"
,
unit
:
"个"
,
data
:
[
{
name
:
"襄荆高速"
,
qy
:
"湖北"
,
zlc
:
"185.42"
,
cds
:
"4"
,
qsb
:
"1.8%"
,
jsq
:
"5"
,
yyqnx
:
"30"
,
jcztz
:
"44.15"
,
jczt
:
"葛洲坝集团"
,
jcsj
:
"2000年"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"控股"
,
xmzt
:
"已运营"
,
tcsj
:
"2004/6/26"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"杨宣高速"
,
qy
:
"云南"
,
zlc
:
"47.8"
,
cds
:
"4"
,
qsb
:
"50%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"70.08"
,
jczt
:
"授权葛洲坝集团"
,
jcsj
:
"2018/2/9"
,
sfPPP
:
"否"
,
xmmyms
:
"EPC+BOT+股权合作"
,
sjms
:
"BOT+政府股权投资+建设期补助资金"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2021/10/8"
,
hbfs
:
"使用者付费"
,
}
]
},
{
title
:
"总投资"
,
value
:
"114.23"
,
unit
:
"亿元"
},
{
title
:
"总规模"
,
value
:
"233.22"
,
unit
:
"公里"
}
],
tzhswcqk
:
[
// { title: "11月完成回收", value: 0.0318,
// unit: "亿元"
// },
{
title
:
"2025年完成回收"
,
value
:
0.35
,
unit
:
"亿元"
},
{
title
:
"完成率"
,
value
:
6
,
unit
:
"亿元"
}
],
jyjhwcqk
:
[
{
title
:
"营业收入"
,
data
:
[
// {
// name: "11月完成",
// value: "*"
// },
{
name
:
"第三季度完成"
,
value
:
"*"
},
{
name
:
"2025累计完成"
,
value
:
"*"
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
"*"
}
]
},
{
title
:
"运营成本"
,
data
:
[
// {
// name: "11月完成",
// value: "*"
// },
{
name
:
"第三季度完成"
,
value
:
"*"
},
{
name
:
"2025累计完成"
,
value
:
"*"
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
"*"
}
]
},
{
title
:
"利润总额"
,
data
:
[
// {
// name: "11月完成",
// value: "*"
// },
{
name
:
"第三季度完成"
,
value
:
"*"
},
{
name
:
"2025累计完成"
,
value
:
"*"
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
"*"
}
]
}
],
jyjhwcjd
:
[
{
data
:
[
{
name
:
"营业收入完成进度"
,
value
:
"*"
},
{
name
:
"实际完成金额"
,
value
:
"*"
},
{
name
:
"计划完成金额"
,
value
:
"*"
}
]
},
{
data
:
[
{
name
:
"运营成本完成进度"
,
value
:
"*"
},
{
name
:
"实际完成金额"
,
value
:
"*"
},
{
name
:
"计划完成金额"
,
value
:
"*"
}
]
},
{
data
:
[
{
name
:
"利润总额完成进度"
,
value
:
"*"
},
{
name
:
"实际完成金额"
,
value
:
"*"
},
{
name
:
"计划完成金额"
,
value
:
"*"
}
]
}
]
},
tuichu
:
[
{
title
:
"总个数"
,
value
:
"3"
,
unit
:
"个"
,
data
:
[
{
name
:
"内鹤高速"
,
qy
:
"河南"
,
zlc
:
"31.43"
,
cds
:
"4"
,
qsb
:
"20.01%"
,
jsq
:
"3"
,
yyqnx
:
"40"
,
jcztz
:
"40.48"
,
jczt
:
"中国能建"
,
jcsj
:
""
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
""
,
xmzt
:
"拟退出"
,
tcsj
:
""
,
hbfs
:
""
,
},
{
name
:
"内林东段高速"
,
qy
:
"河南"
,
zlc
:
"33.65"
,
cds
:
"4"
,
qsb
:
"18.40%"
,
jsq
:
"3"
,
yyqnx
:
"40"
,
jcztz
:
"43.67"
,
jczt
:
"中国能建"
,
jcsj
:
""
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
""
,
xmzt
:
"拟退出"
,
tcsj
:
""
,
hbfs
:
""
,
},
{
name
:
"内林西段高速"
,
qy
:
"河南"
,
zlc
:
"43.27"
,
cds
:
"4"
,
qsb
:
"30.31%"
,
jsq
:
"3"
,
yyqnx
:
"40"
,
jcztz
:
"57.14"
,
jczt
:
"中国能建"
,
jcsj
:
""
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
""
,
xmzt
:
"拟退出"
,
tcsj
:
""
,
hbfs
:
""
,
}
]
},
{
title
:
"总投资"
,
value
:
"141.29"
,
unit
:
"亿元"
},
{
title
:
"总规模"
,
value
:
"108.35"
,
unit
:
"公里"
},
{
title
:
"累计完成投资"
,
value
:
"0"
,
unit
:
"亿元"
}
]
})
const
changeBtn
=
(
btn
)
=>
{
// 4. 全屏切换核心方法(修改:目标元素改为父容器)
selectedBtn
.
value
=
btn
;
const
handleToggleFullscreen
=
()
=>
{
};
if
(
!
parentContainer
.
value
)
return
;
// 添加防抖功能,避免频繁切换造成的性能问题
let
debounceTimer
=
null
;
const
selectContentBtn
=
(
item
)
=>
{
if
(
debounceTimer
)
{
clearTimeout
(
debounceTimer
);
}
debounceTimer
=
setTimeout
(()
=>
{
selectedContentBtn
.
value
=
item
.
key
;
if
(
item
.
key
===
"jianshe"
)
{
nextTick
(()
=>
{
initProgressPie
();
})
}
else
{
progressPieChart
.
dispose
()
}
},
100
);
};
// 绘制投资完成情况环形图
const
progressPie
=
ref
(
null
);
let
progressPieChart
=
null
;
const
initProgressPie
=
()
=>
{
progressPieChart
?.
dispose
();
progressPieChart
=
echarts
.
init
(
progressPie
.
value
);
const
option
=
{
// 中心百分比文字
title
:
{
text
:
[
"{a|89}"
,
"{b|%}"
].
join
(
" "
),
left
:
"center"
,
top
:
"center"
,
textStyle
:
{
color
:
"#2FD2FB"
,
// 蓝色文字(匹配截图)
lineHeight
:
1.2
,
fontFamily
:
"DINBold"
,
fontWeight
:
"bold"
,
rich
:
{
a
:
{
fontSize
:
22
},
b
:
{
fontSize
:
12
}
}
}
},
series
:
[
// 1. 外层圆环边框(浅色蓝环)
{
type
:
"pie"
,
animationDuration
:
2000
,
radius
:
[
"85%"
,
"70%"
],
// 外层边框的粗细
startAngle
:
0
,
itemStyle
:
{
borderColor
:
"#8692fc"
,
borderWidth
:
1
,
},
label
:
{
show
:
false
},
labelLine
:
{
show
:
false
},
data
:
[
{
value
:
89
,
name
:
"绿色扇区"
,
itemStyle
:
{
color
:
"#00FF00"
,
fontSize
:
12
},
},
// 绿色扇区
{
value
:
11
,
name
:
"背景扇区"
,
itemStyle
:
{
color
:
"transparent"
},
},
],
},
],
};
progressPieChart
.
setOption
(
option
);
};
const
resizeEcharts
=
()
=>
{
progressPieChart
?.
resize
()
}
// 全屏切换功能
const
toggleFullscreen
=
()
=>
{
const
homeContainer
=
document
.
querySelector
(
".home-container"
);
if
(
isFullscreen
.
value
)
{
if
(
isFullscreen
.
value
)
{
// 退出全屏
// 退出全屏
if
(
document
.
exitFullscreen
)
{
if
(
document
.
exitFullscreen
)
document
.
exitFullscreen
();
document
.
exitFullscreen
();
else
if
(
document
.
webkitExitFullscreen
)
document
.
webkitExitFullscreen
();
}
else
if
(
document
.
webkitExitFullscreen
)
{
else
if
(
document
.
msExitFullscreen
)
document
.
msExitFullscreen
();
document
.
webkitExitFullscreen
();
}
else
if
(
document
.
msExitFullscreen
)
{
document
.
msExitFullscreen
();
}
homeContainer
.
style
.
height
=
"100%"
;
parentContainer
.
value
.
style
.
height
=
"100%"
;
// 移除全屏类
parentContainer
.
value
.
classList
.
remove
(
"fullscreen"
);
homeContainer
.
classList
.
remove
(
"fullscreen"
);
}
else
{
}
else
{
// 进入全屏
// 进入全屏
if
(
homeContainer
.
requestFullscreen
)
{
if
(
parentContainer
.
value
.
requestFullscreen
)
homeContainer
.
requestFullscreen
();
parentContainer
.
value
.
requestFullscreen
();
}
else
if
(
homeContainer
.
webkitRequestFullscreen
)
{
else
if
(
parentContainer
.
value
.
webkitRequestFullscreen
)
homeContainer
.
webkitRequestFullscreen
();
parentContainer
.
value
.
webkitRequestFullscreen
();
}
else
if
(
homeContainer
.
msRequestFullscreen
)
{
else
if
(
parentContainer
.
value
.
msRequestFullscreen
)
homeContainer
.
msRequestFullscreen
();
parentContainer
.
value
.
msRequestFullscreen
();
}
parentContainer
.
value
.
style
.
height
=
"100vh"
;
homeContainer
.
style
.
height
=
"100vh"
;
parentContainer
.
value
.
classList
.
add
(
"fullscreen"
);
// 添加全屏类
homeContainer
.
classList
.
add
(
"fullscreen"
);
}
}
isFullscreen
.
value
=
!
isFullscreen
.
value
;
isFullscreen
.
value
=
!
isFullscreen
.
value
;
};
};
onMounted
(()
=>
{
// 5. 监听浏览器全屏状态变化(统一在父组件处理,移除子组件的重复监听)
window
.
addEventListener
(
"resize"
,
resizeEcharts
);
const
handleFullscreenChange
=
()
=>
{
});
if
(
!
parentContainer
.
value
)
return
;
onUnmounted
(()
=>
{
window
.
removeEventListener
(
"resize"
,
resizeEcharts
);
});
// 监听全屏变化事件
const
isDocFullscreen
=
!!
document
.
fullscreenElement
;
window
.
addEventListener
(
"fullscreenchange"
,
()
=>
{
isFullscreen
.
value
=
isDocFullscreen
;
const
homeContainer
=
document
.
querySelector
(
".home-container"
);
if
(
!
document
.
fullscreenElement
)
{
// 同步父容器样式
isFullscreen
.
value
=
false
;
if
(
isDocFullscreen
)
{
if
(
homeContainer
)
{
parentContainer
.
value
.
style
.
height
=
"100vh"
;
homeContainer
.
style
.
height
=
"100%"
;
parentContainer
.
value
.
classList
.
add
(
"fullscreen"
);
// 移除全屏类
homeContainer
.
classList
.
remove
(
"fullscreen"
);
}
}
else
{
}
else
{
isFullscreen
.
value
=
true
;
parentContainer
.
value
.
style
.
height
=
"100%"
;
if
(
homeContainer
)
{
parentContainer
.
value
.
classList
.
remove
(
"fullscreen"
);
homeContainer
.
style
.
height
=
"100vh"
;
}
// 添加全屏类
homeContainer
.
classList
.
add
(
"fullscreen"
);
// 关键:组件切换后,同步子组件的.home-container样式
const
childHomeContainer
=
document
.
querySelector
(
".home-container"
);
if
(
childHomeContainer
)
{
childHomeContainer
.
style
.
height
=
isDocFullscreen
?
"100vh"
:
"100%"
;
if
(
isDocFullscreen
)
{
childHomeContainer
.
classList
.
add
(
"fullscreen"
);
}
else
{
childHomeContainer
.
classList
.
remove
(
"fullscreen"
);
}
}
}
}
};
// 6. 监听taggle变化(组件切换),主动同步全屏状态到新组件
watch
(
taggle
,
()
=>
{
// 组件切换后,等待DOM渲染完成
nextTick
(()
=>
{
const
childHomeContainer
=
document
.
querySelector
(
".home-container"
);
if
(
childHomeContainer
&&
isFullscreen
.
value
)
{
// 保持全屏样式
childHomeContainer
.
style
.
height
=
"100vh"
;
childHomeContainer
.
classList
.
add
(
"fullscreen"
);
}
});
});
});
// 表格弹框
// 7. 监听窗口大小变化(可选,优化全屏体验)
let
tableData
=
ref
([]);
const
handleResize
=
()
=>
{
const
handleDetail
=
(
item
)
=>
{
window
.
dispatchEvent
(
new
CustomEvent
(
"echarts-resize"
));
if
(
item
.
data
?.
length
)
{
// 全屏时强制同步样式
tableData
.
value
=
item
.
data
;
if
(
isFullscreen
.
value
&&
parentContainer
.
value
)
{
dialogVisible
.
value
=
true
;
parentContainer
.
value
.
style
.
height
=
"100vh"
;
const
childHomeContainer
=
document
.
querySelector
(
".home-container"
);
if
(
childHomeContainer
)
childHomeContainer
.
style
.
height
=
"100vh"
;
}
}
};
};
const
dialogTitle
=
ref
(
""
);
const
dialogVisible
=
ref
(
false
);
// 生命周期:绑定/解绑事件
const
handleClose
=
()
=>
{
onMounted
(()
=>
{
dialogVisible
.
value
=
false
;
window
.
addEventListener
(
"fullscreenchange"
,
handleFullscreenChange
);
}
window
.
addEventListener
(
"resize"
,
handleResize
);
});
onUnmounted
(()
=>
{
window
.
removeEventListener
(
"fullscreenchange"
,
handleFullscreenChange
);
window
.
removeEventListener
(
"resize"
,
handleResize
);
});
</
script
>
</
script
>
<
style
scoped
lang=
"less"
>
<
style
scoped
lang=
"less"
>
.home-container {
/* 父容器样式:默认占满屏幕 */
background-image: url("@/assets/images/bg.png");
.parent-fullscreen-container {
background-size: 100% 100%;
width: 100%;
width: 100%;
height: 100%;
height: 100%;
color: #fff;
position: relative;
display: flex;
}
flex-direction: column;
justify-content: space-between;
.header {
width: 100%;
.vh(height, 80);
display: flex;
justify-content: center;
align-items: flex-end;
position: relative; // 为绝对定位提供参考
.header-fullscreen {
position: absolute;
right: 20px;
bottom: 0; // 与导航按钮底部对齐
cursor: pointer;
span {
color: white;
font-weight: 700;
.font(14);
display: flex;
align-items: center;
gap: 6px;
}
}
.header-middile {
background-image: url("@/assets/images/header.png");
background-size: 100% 100%;
.vw(width,750);
font-weight: 400;
font-family: "YouSheBiaoTiHei";
.vh(height,75);
display: flex;
justify-content: center;
align-items: center;
span{
background: linear-gradient(to bottom, #fff, #B4CFF2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
@media screen and (max-width: 2560px) {
// flex: 1;
.font(28);
}
@media screen and (max-width: 1920px) {
// flex: 0.7;
.font(28);
}
@media screen and (max-width: 1440px) {
// .font(24);
flex: 0.8;
}
}
.header-left,.header-right {
display: flex;
align-items: center;
justify-content: center;
.nav-btn {
.font(20);
cursor: pointer;
// color: #fff;
font-family: YouSheBiaoTiYuan;
display: flex;
align-items: center;
justify-content: center;
.vh(height,54);
.vw(width,194);
background-repeat: no-repeat;
background-position: center;
background-size: 100% 100%;
&.active{
.font(22);
span{
background: linear-gradient(to bottom, #fff, #fff, #0047FF);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
span{
background: linear-gradient(to bottom, #fff, #3D73FF);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
.header-left{
.nav-btn{
margin-right: -20px;
background-image: url("@/assets/images/left-btn.png");
&.active{
background-image: url("@/assets/images/left-hlightBtn.png");
}
}
}
.header-right {
margin-left: -20px;
.nav-btn {
background-image: url("@/assets/images/right-btn.png");
&.active {
background-image: url("@/assets/images/right-hight-btn.png");
}
}
}
}
.nav-list{
display: flex;
justify-content: center;
align-items: center;
.vw(margin-top, 10);
span{
.font(14);
width: 110px;
height: 35px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
flex-shrink: 0;
color: rgba(255, 255, 255, 0.5);
background-image: url("@/assets/images/default-btn.png");
background-repeat: no-repeat;
background-size: 80% 80%;
background-position: center;
margin-left: -32px;
&.active{
color: #fff;
background-image: url("@/assets/images/nav-hight-btn.png");
}
&:nth-child(1) {
margin-left: 0;
&.active {
background-image: url("@/assets/images/立项.png");
}
&:not(.active) {
background-image: url("@/assets/images/initiation-default.png");
}
}
&:nth-child(6) {
margin-left: -31px;
background-image: url("@/assets/images/退出.png");
&.active {
background-image: url("@/assets/images/退出-active.png");
}
}
}
/* 全屏样式(作用于父容器) */
}
:deep(.fullscreen) {
.map-container{
position: fixed !important;
flex: 1;
top: 0;
height: 0;
left: 0;
display: flex;
width: 100vw !important;
.vh(margin-bottom, -20);
height: 100vh !important;
.map-content{
z-index: 9999 !important;
position: relative;
overflow: hidden;
flex: 1;
width: 0;
height: 100%;
.info-top-wrap{
position: absolute;
width: 100%;
top: 0;
z-index: 777;
.vh(margin-top, 10);
}
.info-right-wrap{
position: absolute;
top: 0;
bottom: 0;
.vw(right, 44);
.vw(width, 580);
display: flex;
flex-direction: column;
justify-content: center;
z-index: 777;
.info-title{
.vw(width, 180);
.vh(height, 28);
.vh(line-height, 28);
.font(16);
.vw(padding-left,20);
.vh(margin-bottom,10);
text-align: left;
color: #fff;
white-space: nowrap;
font-family: YouSheBiaoTiYuan;
background-image: url("@/assets/images/tag.png");
background-size: 100% 100%;
}
.data-info{
justify-content: flex-start;
}
}
.data-info{
display: flex;
align-items: center;
justify-content: center;
.vh(margin-bottom,15);
.info-item {
.vw(width, 180);
// .vh(height, 90);
.vw(border-radius, 5);
.vw(padding, 10);
.vw(margin-right,20);
background-image: url("@/assets/images/total2.png");
background-repeat: no-repeat;
background-size: 100% 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
cursor: pointer;
.item-title {
.font(12);
// white-space: nowrap;
}
.item-value {
.font(20);
color: @Color;
font-family: "DIN";
.item-unit {
.font(10);
}
}
}
:last-child {
margin-right: 0;
margin-bottom: 0;
}
}
.info-progress{
display: flex;
align-items: center;
.progress-pie{
.vw(width, 120);
.vw(height, 120);
}
.progress-bar{
flex: 1;
width: 0;
position: relative;
.progress-text{
position: absolute;
top: -5px;
right: 0;
.font(20);
font-family: DIN;
}
.progress-image{
width: 100%;
.vh(height, 98);
background-image: url("@/assets/images/progressBar.png");
background-size: 100% 100%;
.progress-show-value {
position: absolute;
top: 35%;
left: 15%;
width: 85%;
height: 30%;
background-image: url("@/assets/images/baseRate.png");
background-size: 100% 100%;
}
.progress-show-value-rel {
position: absolute;
top: 36%;
left: 15%;
height: 30%;
background-image: url(/src/assets/images/progress.png);
background-size: auto 100%;
-webkit-transform: skew(-30deg);
transform: skew(-30deg);
}
}
}
}
.data-info-large{
display: flex;
align-items: center;
justify-content: space-between;
.vh(margin-bottom,15);
.info-item{
.vw(width, 180);
.vw(border-radius, 5);
.vw(margin-right,10);
.vw(padding-left, 10);
.vw(padding-right, 10);
.vw(padding-top, 5);
.vw(padding-bottom, 5);
background-image: url("@/assets/images/complete.png");
background-size: 100% 100%;
display: flex;
flex-direction: column;
.item-title{
.vh(height, 22);
display: flex;
justify-content: center;
align-items: center;
background-image: url("@/assets/images/completeTitle.png");
background-size: 100% 100%;
.font(12);
display: flex;
justify-content: center;
align-items: center;
}
.item-content{
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
.vh(padding-top, 10);
.target-item{
min-width: 49%;
.target-name{
.font(10);
color: #fff;
}
.target-value{
.font(20);
color: #96F6FF;
font-family: DINBold;
}
&.target-small{
width: 40%;
min-width: 40%;
.target-name{
.font(8);
color: rgba(255, 255, 255, 0.7);
}
.target-value{
.font(14);
display: flex;
align-items: center;
&.target-green{
color: #32D25A;
}
&.target-red{
color: #D2216E;
}
}
}
}
}
}
}
}
}
.bottom {
background-image: url("@/assets/images/bottom.png");
background-repeat: no-repeat;
background-size: 100% 100%;
background-position: center;
width: 100%;
.vh(height, 110);
}
.dialog-content{
display: flex;
flex-direction: column;
.table-wrap{
.el-table{
height: 100%;
thead {
color: #000;
th{
background: #f5f7fa;
.cell{
text-align: center;
}
}
}
}
}
.page-wrap{
margin-top: 10px;
display: flex;
justify-content: flex-end;
}
}
}
}
</
style
>
<
style
lang=
"less"
>
/* 子组件的.home-container继承父容器的全屏样式 */
.home-container {
:deep(.home-container) {
.el-dialog{
width: 100%;
height: 75%;
height: 100%;
display: flex;
flex-direction: column;
.el-dialog__body{
flex: 1;
height: 0;
}
}
.dialog-content{
height: 100%;
.table-wrap{
max-height: 100%;
.el-table{
height: 100%;
thead {
color: #000;
th{
background: #f5f7fa;
.cell{
text-align: center;
}
}
}
}
}
}
}
}
</
style
>
</
style
>
src/views/homePage/oldIndex.vue
0 → 100644
View file @
5c1447f5
<
template
>
<div
class=
"home-container"
>
<div
class=
"header"
>
<!--
<div
class=
"header-left"
>
<div
class=
"nav-btn"
v-for=
"item in navLeftBtns"
:key=
"item.key"
:class=
"
{ active: selectedBtn === item.key }"
@click="changeBtn(item.key)"
>
<span>
{{
item
.
name
}}
</span>
</div>
</div>
-->
<div
class=
"header-middile"
>
<span>
葛洲坝集团交通投资有限公司投资决策分析系统
</span>
</div>
<!--
<div
class=
"header-right"
>
<div
class=
"nav-btn"
v-for=
"item in navRightBtns"
:key=
"item.key"
:class=
"
{ active: selectedBtn === item.key }"
@click="changeBtn(item.key)"
>
<span>
{{
item
.
name
}}
</span>
</div>
</div>
-->
<div
class=
"header-fullscreen"
>
<span
@
click=
"toggleFullscreen"
class=
"fullscreen-text"
>
<el-icon
:size=
"18"
>
<full-screen
/>
</el-icon>
{{
isFullscreen
?
"退出全屏"
:
"全屏"
}}
</span>
<span
@
click=
"handleInput(!modelValue)"
class=
"fullscreen-text"
>
<el-icon
:size=
"18"
>
<Switch
/>
</el-icon>
{{
modelValue
?
"决策分析可视化大屏"
:
"交通投资可视化大屏"
}}
</span>
</div>
</div>
<div
class=
"nav-list"
>
<span
v-for=
"item in navList"
:key=
"item.index"
:class=
"
{ active: selectedContentBtn === item.key }"
@click="selectContentBtn(item)"
>
{{
item
.
name
}}
</span>
</div>
<div
class=
"map-container"
>
<div
class=
"map-content"
>
<div
class=
"info-top-wrap"
v-if=
"['lixiang', 'tuichu'].includes(selectedContentBtn)"
>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn]"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
</div>
<div
class=
"info-right-wrap"
v-else-if=
"selectedContentBtn === 'jianshe'"
>
<div
class=
"info-title"
>
项目概况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].gaikuang"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzwcqk"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资完成情况
</div>
<div
class=
"info-progress"
>
<div
class=
"progress-pie"
ref=
"progressPie"
></div>
<div
class=
"progress-bar"
>
<div
class=
"progress-text"
>
109.04/122.52亿元
</div>
<div
class=
"progress-image"
>
<div
class=
"progress-show-value"
></div>
<!-- rel100%宽在css上占父元素的85%,进度样式上要做换算 -->
<div
class=
"progress-show-value-rel"
:style=
"
{ width: `${(89 * 85) / 100}%` }"
>
</div>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资回收完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzhswcqk"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
</div>
<div
class=
"info-right-wrap"
v-else-if=
"['shiyunying', 'yunying'].includes(selectedContentBtn)"
>
<div
class=
"info-title"
>
项目概况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].gaikuang"
:key=
"idx"
@
click=
"handleDetail(item)"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
<template
v-if=
"infoObj[selectedContentBtn].tzwcqk"
>
<div
class=
"info-title"
>
投资完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzwcqk"
:key=
"idx"
>
<div
class=
"item-title"
>
{{
item
.
title
}}
</div>
<div
class=
"item-value"
>
{{
item
.
value
}}
<span
class=
"item-unit"
>
{{
item
.
unit
}}
</span>
</div>
</div>
</div>
</
template
>
<div
class=
"info-title"
>
经营计划完成情况
</div>
<div
class=
"data-info-large"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].jyjhwcqk"
:key=
"idx"
>
<div
class=
"item-title"
>
{{ item.title }}
</div>
<div
class=
"item-content"
>
<div
class=
"target-item"
v-for=
"(target, index) in item.data"
:key=
"index"
:class=
"{ 'target-small': target.size === 'small' }"
>
<div
class=
"target-name"
>
{{ target.name }}
</div>
<div
class=
"target-value"
:class=
"{
'target-green': !isNaN(target.value) && target.value < 0,
'target-red': !isNaN(target.value) && target.value > 0,
}"
>
{{ target.value }}
<el-icon
v-if=
"target.size === 'small' && !isNaN(target.value)"
>
<Top
v-if=
"target.value > 0"
/>
<Bottom
v-else
/>
</el-icon>
</div>
</div>
</div>
</div>
</div>
<div
class=
"info-title"
>
投资回收完成情况
</div>
<div
class=
"data-info"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].tzhswcqk"
:key=
"idx"
>
<div
class=
"item-title"
>
{{ item.title }}
</div>
<div
class=
"item-value"
>
{{ item.value }}
<span
class=
"item-unit"
>
{{ item.unit }}
</span>
</div>
</div>
</div>
<div
class=
"info-title"
>
2025经营计划完成进度
</div>
<div
class=
"data-info-large"
>
<div
class=
"info-item"
v-for=
"(item, idx) in infoObj[selectedContentBtn].jyjhwcjd"
:key=
"idx"
>
<div
class=
"item-content"
>
<div
class=
"target-item"
v-for=
"(target, index) in item.data"
:key=
"index"
>
<div
class=
"target-name"
>
{{ target.name }}
</div>
<div
class=
"target-value"
>
{{ target.value }}
</div>
</div>
</div>
</div>
</div>
</div>
<Map
ref=
"mapRef"
:tabKey=
"selectedContentBtn"
/>
<div
class=
"back-to-country-btn"
@
click=
"backToCountry"
v-show=
"showBackBtn"
>
返回全国
</div>
</div>
</div>
<div
class=
"bottom"
></div>
<!-- 详情信息 -->
<el-dialog
:title=
"dialogTitle + '详情'"
v-model=
"dialogVisible"
width=
"80%"
:before-close=
"handleClose"
:close-on-click-modal=
"false"
:close-on-press-escape=
"false"
>
<div
class=
"dialog-content"
>
<div
class=
"table-wrap"
>
<el-table
:data=
"tableData"
style=
"width: 100%"
empty-text=
"暂无数据"
>
<el-table-column
type=
"index"
width=
"60"
label=
"序号"
:align=
"'center'"
/>
<el-table-column
prop=
"name"
label=
"项目名称"
:align=
"'center'"
width=
"120"
/>
<el-table-column
prop=
"qy"
label=
"项目区域"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"jsgm"
label=
"建设规模"
:align=
"'center'"
>
<el-table-column
prop=
"zlc"
label=
"总里程(KM)"
:align=
"'center'"
/>
<el-table-column
prop=
"cds"
label=
"车道数"
:align=
"'center'"
/>
<el-table-column
prop=
"qsb"
label=
"桥隧比"
:align=
"'center'"
/>
</el-table-column>
<el-table-column
prop=
"jsq"
label=
"建设期(年)"
:align=
"'center'"
/>
<el-table-column
prop=
"yyqnx"
label=
"运营期年限(年)"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"jcztz"
label=
"决策总投资"
:align=
"'center'"
width=
"110"
/>
<el-table-column
prop=
"jczt"
label=
"决策主体"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"jcsj"
label=
"决策时间"
width=
"110"
:align=
"'center'"
/>
<el-table-column
prop=
"sfPPP"
label=
"是否是PPP项目"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"xmmyms"
label=
"项目名义模式"
:align=
"'center'"
width=
"110"
/>
<el-table-column
prop=
"sjms"
label=
"实际模式"
:align=
"'center'"
width=
"150"
/>
<el-table-column
prop=
"gqjg"
label=
"股权结构"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"xmzt"
label=
"项目状态"
:align=
"'center'"
width=
"100"
/>
<el-table-column
prop=
"tcsj"
label=
"通车时间"
width=
"110"
:align=
"'center'"
/>
<el-table-column
prop=
"hbfs"
label=
"回报方式"
:align=
"'center'"
width=
"150"
/>
<el-table-column
prop=
"irr"
label=
"IRR"
:align=
"'center'"
width=
"100"
/>
</el-table>
</div>
<!-- <div class="page-wrap">
<el-pagination background layout="prev, pager, next" :total="1000" />
</div> -->
</div>
<
template
#
footer
>
<span
class=
"dialog-footer"
>
<el-button
@
click=
"handleClose"
>
取 消
</el-button>
<el-button
type=
"primary"
@
click=
"handleClose"
>
确 定
</el-button>
</span>
</
template
>
</el-dialog>
</div>
<div></div>
</template>
<
script
setup
>
import
Map
from
"@/components/CommonMap.vue"
;
import
bigScreen
from
"@/views/everydayPage/bigScreen.vue"
;
import
{
reactive
,
ref
,
nextTick
,
watch
,
onMounted
,
onUnmounted
}
from
"vue"
;
import
*
as
echarts
from
"echarts"
;
const
navLeftBtns
=
reactive
([
{
key
:
"equity"
,
name
:
"股权投资"
,
},
{
key
:
"risk"
,
name
:
"固定资产投资"
,
},
]);
const
navRightBtns
=
reactive
([
{
key
:
"realestate"
,
name
:
"房地产投资"
,
},
{
key
:
"finance"
,
name
:
"融资建设投资"
,
},
]);
const
selectedBtn
=
ref
(
"equity"
);
const
selectedContentBtn
=
ref
(
"lixiang"
);
const
selectedContentName
=
ref
(
"立项"
);
const
showBackBtn
=
ref
(
false
);
const
navList
=
reactive
([
{
index
:
1
,
name
:
"立项"
,
key
:
"lixiang"
,
},
{
index
:
2
,
name
:
"建设"
,
key
:
"jianshe"
,
},
{
index
:
3
,
name
:
"试运营"
,
key
:
"shiyunying"
,
},
{
index
:
4
,
name
:
"运营"
,
key
:
"yunying"
,
},
// {
// index: 5,
// name: "转让",
// },
{
index
:
6
,
name
:
"退出"
,
key
:
"tuichu"
,
},
]);
const
infoObj
=
reactive
({
lixiang
:
[
{
title
:
"总个数"
,
value
:
"36"
,
unit
:
"个"
,
data
:
[
{
name
:
"/"
,
qy
:
"/"
,
zlc
:
"/"
,
cds
:
"/"
,
qsb
:
"/"
,
jsq
:
"/"
,
yyqnx
:
"/"
,
jcztz
:
"/"
,
jczt
:
"/"
,
jcsj
:
"/"
,
sfPPP
:
"/"
,
xmmyms
:
"/"
,
sjms
:
"/"
,
gqjg
:
"/"
,
xmzt
:
"/"
,
tcsj
:
"/"
,
hbfs
:
"/"
,
},
],
},
{
title
:
"总投资"
,
value
:
"3107.22"
,
unit
:
"亿元"
},
{
title
:
"总规模"
,
value
:
"0"
,
unit
:
"公里"
},
],
jianshe
:
{
gaikuang
:
[
{
title
:
"总个数"
,
value
:
"10"
,
unit
:
"个"
,
data
:
[
{
name
:
"和襄高速"
,
qy
:
"安徽"
,
zlc
:
"170.6"
,
cds
:
"4/6"
,
qsb
:
"29.50%"
,
jsq
:
"3"
,
yyqnx
:
"29.5"
,
jcztz
:
"247.54"
,
jczt
:
"中国能建"
,
jcsj
:
"2023/1/11"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+建设期投资补助"
,
sjms
:
"BOT+车购税资金50.63亿元"
,
gqjg
:
"控股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/31"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"肇明高速"
,
qy
:
"广东"
,
zlc
:
"98.43"
,
cds
:
"6"
,
qsb
:
"55.12%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"214.94"
,
jczt
:
"中国能建"
,
jcsj
:
"2019/12/12"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT+施工总承包+政府补助"
,
sjms
:
"BOT+政府股权投资"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2029/6/30"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"延安东高速"
,
qy
:
"陕西"
,
zlc
:
"57.16"
,
cds
:
"4"
,
qsb
:
"49.7%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"85.94"
,
jczt
:
"中国能建"
,
jcsj
:
"2020/6/29"
,
sfPPP
:
"是"
,
xmmyms
:
"PPP"
,
sjms
:
"BOT+90%工可车流量延期条件兜底"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/15"
,
hbfs
:
"使用者付费(有合作期末延长收费期条款)"
,
},
{
name
:
"关环高速"
,
qy
:
"陕西"
,
zlc
:
"73.74"
,
cds
:
"4"
,
qsb
:
"29.38%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"71.84"
,
jczt
:
"中国能建"
,
jcsj
:
"2020/8/4"
,
sfPPP
:
"是"
,
xmmyms
:
"PPP"
,
sjms
:
"BOT+定补"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2028/9/30"
,
hbfs
:
"使用者付费+政府固定补助"
,
},
{
name
:
"横钦高速"
,
qy
:
"广西"
,
zlc
:
"166.024"
,
cds
:
"4"
,
qsb
:
"15.85%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"208.32"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/12/30"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+施工总承包+可行性缺口补助"
,
sjms
:
"BOT+运营期定补6.1亿/年+缺口延期条件兜底"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2026/9/30"
,
hbfs
:
"使用者付费+可行性缺口补助(实际为固定补助+合作期末延长收费期条款)"
,
},
{
name
:
"全灌高速"
,
qy
:
"广西"
,
zlc
:
"75.14"
,
cds
:
"4"
,
qsb
:
"26.1%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"92.73"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/12/30"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+施工总承包+可行性缺口补助"
,
sjms
:
"BOT+运营期定补3.204亿/年+缺口延期条件兜底"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2026/6/30(泉南拼接2027年3月)"
,
hbfs
:
"使用者付费+可行性缺口补助(实际为固定补助+合作期末延长收费期条款)"
,
},
{
name
:
"济商高速(济宁)"
,
qy
:
"山东"
,
zlc
:
"45.076"
,
cds
:
"6"
,
qsb
:
"15.78%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"69.48"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/9/2"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/31"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"济商高速(菏泽)"
,
qy
:
"山东"
,
zlc
:
"65.47"
,
cds
:
"6"
,
qsb
:
"12.43%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"104.07"
,
jczt
:
"中国能建"
,
jcsj
:
"2021/9/28"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2025/12/31"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"承克高速"
,
qy
:
"河北"
,
zlc
:
"105.58"
,
cds
:
"4"
,
qsb
:
"26.48%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"130.25"
,
jczt
:
"中国能建"
,
jcsj
:
"2023/3/8"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+可行性缺口补助"
,
sjms
:
"BOT+车购税+运营期定补9500万元"
,
gqjg
:
"参股"
,
xmzt
:
"在建"
,
tcsj
:
"预计2027/9/10"
,
hbfs
:
"使用者付费+政府固定补助"
,
},
{
name
:
"S10高速"
,
qy
:
"甘肃"
,
zlc
:
"194.34"
,
cds
:
"4"
,
qsb
:
"6.8%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"108.94"
,
jczt
:
"中国能建"
,
jcsj
:
"2025/1/6"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"控股"
,
xmzt
:
"筹建"
,
tcsj
:
"预计2028/12/31"
,
hbfs
:
"使用者付费"
,
},
],
},
{
title
:
"总投资"
,
value
:
"1334.05"
,
unit
:
"亿元"
,
},
{
title
:
"总规模"
,
value
:
"1051.56"
,
unit
:
"公里"
,
},
],
tzwcqk
:
[
// { title: "10月完成投资", value: "*" },
{
title
:
"2025年完成投资"
,
value
:
"109.04"
,
unit
:
"亿元"
},
{
title
:
"累计完成投资"
,
value
:
"531.39"
,
unit
:
"亿元"
},
],
tzhswcqk
:
[
// { title: "10月完成回收", value: "*" },
{
title
:
"2025年完成回收"
,
value
:
"28.84"
,
unit
:
"亿元"
},
{
title
:
"完成率"
,
value
:
"53.16"
,
unit
:
"%"
},
],
},
shiyunying
:
{
gaikuang
:
[
{
title
:
"总个数"
,
value
:
9
,
unit
:
"个"
,
data
:
[
{
name
:
"巴万高速"
,
qy
:
"四川"
,
zlc
:
"120.07"
,
cds
:
"4"
,
qsb
:
"64.57%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"188.2"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT+政府股权合作"
,
sjms
:
"BOT+可行性缺口补助(费用兜底)"
,
gqjg
:
"控股"
,
xmzt
:
"已运营"
,
tcsj
:
"2021/1/1"
,
hbfs
:
"使用者付费+可行性缺口费用补助"
,
},
{
name
:
"巨单高速"
,
qy
:
"山东"
,
zlc
:
"116.2"
,
cds
:
"4"
,
qsb
:
"5.36%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"80.16"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2020/1/1"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"济泰高速"
,
qy
:
"山东"
,
zlc
:
"60.33"
,
cds
:
"6"
,
qsb
:
"49.43%"
,
jsq
:
"3"
,
yyqnx
:
"25"
,
jcztz
:
"101.82"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2020/10/27"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"枣菏高速"
,
qy
:
"山东"
,
zlc
:
"187.32"
,
cds
:
"4"
,
qsb
:
"16.69%"
,
jsq
:
"3.5"
,
yyqnx
:
"25"
,
jcztz
:
"144.79"
,
jczt
:
"中国能建"
,
jcsj
:
"2016/12/26"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2020/10/8"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"延黄高速"
,
qy
:
"陕西"
,
zlc
:
"149.47"
,
cds
:
"4"
,
qsb
:
"54.92%"
,
jsq
:
"3.25"
,
yyqnx
:
"28"
,
jcztz
:
"145.88"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/7/25"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT+车购税资金50.23亿元"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2021/6/30"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"宁石高速"
,
qy
:
"陕西"
,
zlc
:
"51.78"
,
cds
:
"4"
,
qsb
:
"54.92%"
,
jsq
:
"3.72"
,
yyqnx
:
"28"
,
jcztz
:
"60.54"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/7/25"
,
sfPPP
:
"是"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2022/12/9"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"田西高速"
,
qy
:
"广西"
,
zlc
:
"191.26"
,
cds
:
"4"
,
qsb
:
"53.62%"
,
jsq
:
"3.75"
,
yyqnx
:
"30"
,
jcztz
:
"273.75"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/12/13"
,
sfPPP
:
"是"
,
xmmyms
:
"“DBFOT(设计-建设-融资-运营-移交)”的PPP模式"
,
sjms
:
"BOT+建设期补助29.54亿元(含政府资本金)+运营固定补助3.1045亿元/年+可行性缺口补助(费用兜底)"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2022/12/29"
,
hbfs
:
"使用者付费+固定补助+可行性缺口补助"
,
},
{
name
:
"武阳高速"
,
qy
:
"湖北"
,
zlc
:
"91.308"
,
cds
:
"4/6"
,
qsb
:
"40.41%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"113.51"
,
jczt
:
"中国能建"
,
jcsj
:
"2018/11/13"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2023/10/20"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"麟法高速"
,
qy
:
"陕西"
,
zlc
:
"46.33"
,
cds
:
"4"
,
qsb
:
"29.38%"
,
jsq
:
"4"
,
yyqnx
:
"30"
,
jcztz
:
"52.79"
,
jczt
:
"中国能建"
,
jcsj
:
"2020/8/4"
,
sfPPP
:
"是"
,
xmmyms
:
"PPP"
,
sjms
:
"BOT+定补"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2025/7/21"
,
hbfs
:
"使用者付费+固定补助"
,
},
],
},
{
title
:
"总投资"
,
value
:
1151.36
,
unit
:
"亿元"
,
},
{
title
:
"总规模"
,
value
:
945.67
,
unit
:
"公里"
,
},
],
tzwcqk
:
[
// { title: "11月完成投资", value: "*" },
{
title
:
"2025年完成投资"
,
value
:
"*"
},
{
title
:
"累计完成投资"
,
value
:
"*"
},
],
jyjhwcqk
:
[
{
title
:
"营业收入"
,
data
:
[
// {
// name: "11月完成",
// value: 3.58,
// unit: "亿元"
// },
{
name
:
"第三季度完成"
,
value
:
31.71
,
unit
:
"亿元"
,
},
{
name
:
"2025累计完成"
,
value
:
38.86
,
unit
:
"亿元"
,
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
3.78
,
unit
:
"%"
,
},
],
},
{
title
:
"运营成本"
,
data
:
[
// {
// name: "11月发生",
// value: 1.96,
// unit: "亿元"
// },
{
name
:
"第三季度发生"
,
value
:
16.99
,
unit
:
"亿元"
,
},
{
name
:
"2025累计完成"
,
value
:
20.91
,
unit
:
"亿元"
,
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
-
14.73
,
unit
:
"%"
,
},
],
},
{
title
:
"利润总额"
,
data
:
[
// {
// name: "11月完成",
// value: -1.015,
// unit: "亿元"
// },
{
name
:
"第三季度完成"
,
value
:
-
5.91
,
unit
:
"亿元"
,
},
{
name
:
"2025累计完成"
,
value
:
-
7.94
,
unit
:
"亿元"
,
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
-
28.83
,
unit
:
"%"
,
},
],
},
],
tzhswcqk
:
[
// { title: "11月完成回收", value: 2.8682,
// unit: "亿元"
// },
{
title
:
"2025年完成回收"
,
value
:
31.55
,
unit
:
"亿元"
},
{
title
:
"完成率"
,
value
:
85
,
unit
:
"%"
},
],
jyjhwcjd
:
[
{
data
:
[
{
name
:
"营业收入完成进度"
,
value
:
85.81
,
unit
:
"%"
,
},
{
name
:
"实际完成金额"
,
value
:
38.86
,
unit
:
"亿元"
,
},
{
name
:
"计划完成金额"
,
value
:
45.27
,
unit
:
"亿元"
,
},
],
},
{
data
:
[
{
name
:
"运营成本完成进度"
,
value
:
79.6
,
unit
:
"%"
,
},
{
name
:
"实际完成金额"
,
value
:
20.91
,
unit
:
"亿元"
,
},
{
name
:
"计划完成金额"
,
value
:
26.27
,
unit
:
"亿元"
,
},
],
},
{
data
:
[
{
name
:
"利润总额完成进度"
,
value
:
77.59
,
unit
:
"%"
,
},
{
name
:
"实际完成金额"
,
value
:
-
7.94
,
unit
:
"亿元"
,
},
{
name
:
"计划完成金额"
,
value
:
-
10.23
,
unit
:
"亿元"
,
},
],
},
],
},
yunying
:
{
gaikuang
:
[
{
title
:
"总个数"
,
value
:
"2"
,
unit
:
"个"
,
data
:
[
{
name
:
"襄荆高速"
,
qy
:
"湖北"
,
zlc
:
"185.42"
,
cds
:
"4"
,
qsb
:
"1.8%"
,
jsq
:
"5"
,
yyqnx
:
"30"
,
jcztz
:
"44.15"
,
jczt
:
"葛洲坝集团"
,
jcsj
:
"2000年"
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
"控股"
,
xmzt
:
"已运营"
,
tcsj
:
"2004/6/26"
,
hbfs
:
"使用者付费"
,
},
{
name
:
"杨宣高速"
,
qy
:
"云南"
,
zlc
:
"47.8"
,
cds
:
"4"
,
qsb
:
"50%"
,
jsq
:
"3"
,
yyqnx
:
"30"
,
jcztz
:
"70.08"
,
jczt
:
"授权葛洲坝集团"
,
jcsj
:
"2018/2/9"
,
sfPPP
:
"否"
,
xmmyms
:
"EPC+BOT+股权合作"
,
sjms
:
"BOT+政府股权投资+建设期补助资金"
,
gqjg
:
"参股"
,
xmzt
:
"已运营"
,
tcsj
:
"2021/10/8"
,
hbfs
:
"使用者付费"
,
},
],
},
{
title
:
"总投资"
,
value
:
"114.23"
,
unit
:
"亿元"
,
},
{
title
:
"总规模"
,
value
:
"233.22"
,
unit
:
"公里"
,
},
],
tzhswcqk
:
[
// { title: "11月完成回收", value: 0.0318,
// unit: "亿元"
// },
{
title
:
"2025年完成回收"
,
value
:
0.35
,
unit
:
"亿元"
},
{
title
:
"完成率"
,
value
:
6
,
unit
:
"亿元"
},
],
jyjhwcqk
:
[
{
title
:
"营业收入"
,
data
:
[
// {
// name: "11月完成",
// value: "*"
// },
{
name
:
"第三季度完成"
,
value
:
"*"
,
},
{
name
:
"2025累计完成"
,
value
:
"*"
,
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
"*"
,
},
],
},
{
title
:
"运营成本"
,
data
:
[
// {
// name: "11月完成",
// value: "*"
// },
{
name
:
"第三季度完成"
,
value
:
"*"
,
},
{
name
:
"2025累计完成"
,
value
:
"*"
,
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
"*"
,
},
],
},
{
title
:
"利润总额"
,
data
:
[
// {
// name: "11月完成",
// value: "*"
// },
{
name
:
"第三季度完成"
,
value
:
"*"
,
},
{
name
:
"2025累计完成"
,
value
:
"*"
,
},
{
name
:
"累计同期环比"
,
size
:
"small"
,
value
:
"*"
,
},
],
},
],
jyjhwcjd
:
[
{
data
:
[
{
name
:
"营业收入完成进度"
,
value
:
"*"
,
},
{
name
:
"实际完成金额"
,
value
:
"*"
,
},
{
name
:
"计划完成金额"
,
value
:
"*"
,
},
],
},
{
data
:
[
{
name
:
"运营成本完成进度"
,
value
:
"*"
,
},
{
name
:
"实际完成金额"
,
value
:
"*"
,
},
{
name
:
"计划完成金额"
,
value
:
"*"
,
},
],
},
{
data
:
[
{
name
:
"利润总额完成进度"
,
value
:
"*"
,
},
{
name
:
"实际完成金额"
,
value
:
"*"
,
},
{
name
:
"计划完成金额"
,
value
:
"*"
,
},
],
},
],
},
tuichu
:
[
{
title
:
"总个数"
,
value
:
"3"
,
unit
:
"个"
,
data
:
[
{
name
:
"内鹤高速"
,
qy
:
"河南"
,
zlc
:
"31.43"
,
cds
:
"4"
,
qsb
:
"20.01%"
,
jsq
:
"3"
,
yyqnx
:
"40"
,
jcztz
:
"40.48"
,
jczt
:
"中国能建"
,
jcsj
:
""
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
""
,
xmzt
:
"拟退出"
,
tcsj
:
""
,
hbfs
:
""
,
},
{
name
:
"内林东段高速"
,
qy
:
"河南"
,
zlc
:
"33.65"
,
cds
:
"4"
,
qsb
:
"18.40%"
,
jsq
:
"3"
,
yyqnx
:
"40"
,
jcztz
:
"43.67"
,
jczt
:
"中国能建"
,
jcsj
:
""
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
""
,
xmzt
:
"拟退出"
,
tcsj
:
""
,
hbfs
:
""
,
},
{
name
:
"内林西段高速"
,
qy
:
"河南"
,
zlc
:
"43.27"
,
cds
:
"4"
,
qsb
:
"30.31%"
,
jsq
:
"3"
,
yyqnx
:
"40"
,
jcztz
:
"57.14"
,
jczt
:
"中国能建"
,
jcsj
:
""
,
sfPPP
:
"否"
,
xmmyms
:
"BOT"
,
sjms
:
"BOT"
,
gqjg
:
""
,
xmzt
:
"拟退出"
,
tcsj
:
""
,
hbfs
:
""
,
},
],
},
{
title
:
"总投资"
,
value
:
"141.29"
,
unit
:
"亿元"
},
{
title
:
"总规模"
,
value
:
"108.35"
,
unit
:
"公里"
},
{
title
:
"累计完成投资"
,
value
:
"0"
,
unit
:
"亿元"
},
],
});
const
changeBtn
=
(
btn
)
=>
{
selectedBtn
.
value
=
btn
;
};
const
props
=
defineProps
({
modelValue
:
{
type
:
Boolean
,
},
isFullscreen
:
{
type
:
Boolean
,
},
});
const
emit
=
defineEmits
([
"update:modelValue"
,
"toggle-fullscreen"
]);
const
handleInput
=
(
e
)
=>
{
// e.target.value 是输入框的最新值
emit
(
"update:modelValue"
,
e
);
};
// 添加防抖功能,避免频繁切换造成的性能问题
let
debounceTimer
=
null
;
const
selectContentBtn
=
(
item
)
=>
{
if
(
debounceTimer
)
{
clearTimeout
(
debounceTimer
);
}
debounceTimer
=
setTimeout
(()
=>
{
selectedContentBtn
.
value
=
item
.
key
;
if
(
item
.
key
===
"jianshe"
)
{
nextTick
(()
=>
{
initProgressPie
();
});
}
else
{
progressPieChart
.
dispose
();
}
},
100
);
};
// 绘制投资完成情况环形图
const
progressPie
=
ref
(
null
);
let
progressPieChart
=
null
;
const
initProgressPie
=
()
=>
{
progressPieChart
?.
dispose
();
progressPieChart
=
echarts
.
init
(
progressPie
.
value
);
const
option
=
{
// 中心百分比文字
title
:
{
text
:
[
"{a|89}"
,
"{b|%}"
].
join
(
" "
),
left
:
"center"
,
top
:
"center"
,
textStyle
:
{
color
:
"#2FD2FB"
,
// 蓝色文字(匹配截图)
lineHeight
:
1.2
,
fontFamily
:
"DINBold"
,
fontWeight
:
"bold"
,
rich
:
{
a
:
{
fontSize
:
22
,
},
b
:
{
fontSize
:
12
,
},
},
},
},
series
:
[
// 1. 外层圆环边框(浅色蓝环)
{
type
:
"pie"
,
animationDuration
:
2000
,
radius
:
[
"85%"
,
"70%"
],
// 外层边框的粗细
startAngle
:
0
,
itemStyle
:
{
borderColor
:
"#8692fc"
,
borderWidth
:
1
,
},
label
:
{
show
:
false
},
labelLine
:
{
show
:
false
},
data
:
[
{
value
:
89
,
name
:
"绿色扇区"
,
itemStyle
:
{
color
:
"#00FF00"
,
fontSize
:
12
},
},
// 绿色扇区
{
value
:
11
,
name
:
"背景扇区"
,
itemStyle
:
{
color
:
"transparent"
},
},
],
},
],
};
progressPieChart
.
setOption
(
option
);
};
const
resizeEcharts
=
()
=>
{
progressPieChart
?.
resize
();
};
// 全屏切换功能
const
toggleFullscreen
=
()
=>
{
emit
(
"toggle-fullscreen"
);
// 触发父组件的全屏切换方法
};
onMounted
(()
=>
{
window
.
addEventListener
(
"resize"
,
resizeEcharts
);
});
onUnmounted
(()
=>
{
window
.
removeEventListener
(
"resize"
,
resizeEcharts
);
});
// 表格弹框
let
tableData
=
ref
([]);
const
handleDetail
=
(
item
)
=>
{
if
(
item
.
data
?.
length
)
{
tableData
.
value
=
item
.
data
;
dialogVisible
.
value
=
true
;
}
};
const
dialogTitle
=
ref
(
""
);
const
dialogVisible
=
ref
(
false
);
const
handleClose
=
()
=>
{
dialogVisible
.
value
=
false
;
};
</
script
>
<
style
scoped
lang=
"less"
>
.home-container {
background-image: url("@/assets/images/bg.png");
background-size: 100% 100%;
width: 100%;
height: 100%;
color: #fff;
display: flex;
flex-direction: column;
justify-content: space-between;
.header {
width: 100%;
.vh(height, 80);
display: flex;
justify-content: center;
align-items: flex-end;
position: relative; // 为绝对定位提供参考
.header-fullscreen {
display: flex;
position: absolute;
right: 20px;
bottom: 0; // 与导航按钮底部对齐
cursor: pointer;
span {
color: white;
margin-right: 16px;
font-weight: 700;
.font(14);
display: flex;
align-items: center;
gap: 6px;
}
}
.header-middile {
background-image: url("@/assets/images/header.png");
background-size: 100% 100%;
.vw(width,750);
font-weight: 400;
font-family: "YouSheBiaoTiHei";
.vh(height,75);
display: flex;
justify-content: center;
align-items: center;
span {
background: linear-gradient(to bottom, #fff, #b4cff2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
@media screen and (max-width: 2560px) {
// flex: 1;
.font(28);
}
@media screen and (max-width: 1920px) {
// flex: 0.7;
.font(28);
}
@media screen and (max-width: 1440px) {
// .font(24);
flex: 0.8;
}
}
.header-left,
.header-right {
display: flex;
align-items: center;
justify-content: center;
.nav-btn {
.font(20);
cursor: pointer;
// color: #fff;
font-family: YouSheBiaoTiYuan;
display: flex;
align-items: center;
justify-content: center;
.vh(height,54);
.vw(width,194);
background-repeat: no-repeat;
background-position: center;
background-size: 100% 100%;
&.active {
.font(22);
span {
background: linear-gradient(to bottom, #fff, #fff, #0047ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
span {
background: linear-gradient(to bottom, #fff, #3d73ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
.header-left {
.nav-btn {
margin-right: -20px;
background-image: url("@/assets/images/left-btn.png");
&.active {
background-image: url("@/assets/images/left-hlightBtn.png");
}
}
}
.header-right {
margin-left: -20px;
.nav-btn {
background-image: url("@/assets/images/right-btn.png");
&.active {
background-image: url("@/assets/images/right-hight-btn.png");
}
}
}
}
.nav-list {
display: flex;
justify-content: center;
align-items: center;
.vw(margin-top, 10);
span {
.font(14);
width: 110px;
height: 35px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
flex-shrink: 0;
color: rgba(255, 255, 255, 0.5);
background-image: url("@/assets/images/default-btn.png");
background-repeat: no-repeat;
background-size: 80% 80%;
background-position: center;
margin-left: -32px;
&.active {
color: #fff;
background-image: url("@/assets/images/nav-hight-btn.png");
}
&:nth-child(1) {
margin-left: 0;
&.active {
background-image: url("@/assets/images/立项.png");
}
&:not(.active) {
background-image: url("@/assets/images/initiation-default.png");
}
}
&:nth-child(6) {
margin-left: -31px;
background-image: url("@/assets/images/退出.png");
&.active {
background-image: url("@/assets/images/退出-active.png");
}
}
}
}
.map-container {
flex: 1;
height: 0;
display: flex;
.vh(margin-bottom, -20);
.map-content {
position: relative;
flex: 1;
width: 0;
height: 100%;
.info-top-wrap {
position: absolute;
width: 100%;
top: 0;
z-index: 777;
.vh(margin-top, 10);
}
.info-right-wrap {
position: absolute;
top: 0;
bottom: 0;
.vw(right, 44);
.vw(width, 580);
display: flex;
flex-direction: column;
justify-content: center;
z-index: 777;
.info-title {
.vw(width, 180);
.vh(height, 28);
.vh(line-height, 28);
.font(16);
.vw(padding-left,20);
.vh(margin-bottom,10);
text-align: left;
color: #fff;
white-space: nowrap;
font-family: YouSheBiaoTiYuan;
background-image: url("@/assets/images/tag.png");
background-size: 100% 100%;
}
.data-info {
justify-content: flex-start;
}
}
.data-info {
display: flex;
align-items: center;
justify-content: center;
.vh(margin-bottom,15);
.info-item {
.vw(width, 180);
// .vh(height, 90);
.vw(border-radius, 5);
.vw(padding, 10);
.vw(margin-right,20);
background-image: url("@/assets/images/total2.png");
background-repeat: no-repeat;
background-size: 100% 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
cursor: pointer;
.item-title {
.font(12);
// white-space: nowrap;
}
.item-value {
.font(20);
color: @Color;
font-family: "DIN";
.item-unit {
.font(10);
}
}
}
:last-child {
margin-right: 0;
margin-bottom: 0;
}
}
.info-progress {
display: flex;
align-items: center;
.progress-pie {
.vw(width, 120);
.vw(height, 120);
}
.progress-bar {
flex: 1;
width: 0;
position: relative;
.progress-text {
position: absolute;
top: -5px;
right: 0;
.font(20);
font-family: DIN;
}
.progress-image {
width: 100%;
.vh(height, 98);
background-image: url("@/assets/images/progressBar.png");
background-size: 100% 100%;
.progress-show-value {
position: absolute;
top: 35%;
left: 15%;
width: 85%;
height: 30%;
background-image: url("@/assets/images/baseRate.png");
background-size: 100% 100%;
}
.progress-show-value-rel {
position: absolute;
top: 36%;
left: 15%;
height: 30%;
background-image: url(/src/assets/images/progress.png);
background-size: auto 100%;
-webkit-transform: skew(-30deg);
transform: skew(-30deg);
}
}
}
}
.data-info-large {
display: flex;
align-items: center;
justify-content: space-between;
.vh(margin-bottom,15);
.info-item {
.vw(width, 180);
.vw(border-radius, 5);
.vw(margin-right,10);
.vw(padding-left, 10);
.vw(padding-right, 10);
.vw(padding-top, 5);
.vw(padding-bottom, 5);
background-image: url("@/assets/images/complete.png");
background-size: 100% 100%;
display: flex;
flex-direction: column;
.item-title {
.vh(height, 22);
display: flex;
justify-content: center;
align-items: center;
background-image: url("@/assets/images/completeTitle.png");
background-size: 100% 100%;
.font(12);
display: flex;
justify-content: center;
align-items: center;
}
.item-content {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
.vh(padding-top, 10);
.target-item {
min-width: 49%;
.target-name {
.font(10);
color: #fff;
}
.target-value {
.font(20);
color: #96f6ff;
font-family: DINBold;
}
&.target-small {
width: 40%;
min-width: 40%;
.target-name {
.font(8);
color: rgba(255, 255, 255, 0.7);
}
.target-value {
.font(14);
display: flex;
align-items: center;
&.target-green {
color: #32d25a;
}
&.target-red {
color: #d2216e;
}
}
}
}
}
}
}
}
}
.bottom {
background-image: url("@/assets/images/bottom.png");
background-repeat: no-repeat;
background-size: 100% 100%;
background-position: center;
width: 100%;
.vh(height, 110);
}
.dialog-content {
display: flex;
flex-direction: column;
.table-wrap {
.el-table {
height: 100%;
thead {
color: #000;
th {
background: #f5f7fa;
.cell {
text-align: center;
}
}
}
}
}
.page-wrap {
margin-top: 10px;
display: flex;
justify-content: flex-end;
}
}
}
</
style
>
<
style
lang=
"less"
>
.home-container {
.el-dialog {
height: 75%;
display: flex;
flex-direction: column;
.el-dialog__body {
flex: 1;
height: 0;
}
}
.dialog-content {
height: 100%;
.table-wrap {
max-height: 100%;
.el-table {
height: 100%;
thead {
color: #000;
th {
background: #f5f7fa;
.cell {
text-align: center;
}
}
}
}
}
}
}
</
style
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment