10.13问题修复

dev_xd
lj7788@126.com 2025-10-13 15:31:00 +08:00
parent 71baa4f1ae
commit 8a3097c456
23 changed files with 2608 additions and 489 deletions

View File

@ -14,6 +14,7 @@ import labor from "./labor";
import bim from "./bim"
import machMater from './machmater'
import checked from './checked'
import pitmonit from './pitmonit'
export default {
http: axios,
@ -32,5 +33,6 @@ export default {
labor,
bim,
machMater,
checked
checked,
pitmonit
};

View File

@ -0,0 +1,45 @@
import request from "@/utils/request";
const totalCount=(prjId)=>{
return request({
url: `/manage/bgscreen/pitmonit/totalCount?prjId=${prjId}`,
method: 'get'
})
}
const alarmList=(prjId)=>{
return request({
url: `/manage/bgscreen/pitmonit/alarm?prjId=${prjId}`,
method: 'get'
})
}
const getLastDataForElement=(prjId)=>{
return request({
url: `/manage/bgscreen/pitmonit/getLastDataForElement?prjId=${prjId}`,
method: 'get'
})
}
const selectByDate=data=>{
return request({
url: `/manage/bgscreen/pitmonit/selectByDate`,
method: 'post',
data:data
})
}
const monitDays=(prjId)=>{
return request({
url: `/manage/bgscreen/pitmonit/monitDays?prjId=${prjId}`,
method: 'get'
})
}
export default{
totalCount,
alarmList,
getLastDataForElement,
selectByDate,
monitDays
}

View File

@ -0,0 +1,256 @@
import Vue from 'vue'
Vue.component("classify-bar", {
template: `
<div :style="{'height': height+'px'}" ref="chart">
</div>
`,
props: {
data:{
type:Array
},
height:{
type:Number
},
legend:{
type:Array
},
},
data() {
return {
classData:[],
}
},
mounted(){
this.init()
},
methods: {
init(){
this.getChartData()
},
getChartData(){
//品类金额占比 饼图
var chChartPie = echarts.init(this.$refs.chart);
this.echartPie(chChartPie,this.data)
},
echartPie(chChart,data){
let newPromise = new Promise((resolve) => {
resolve()
})
//然后异步执行echarts的初始化函数
newPromise.then(() => {
if(data.length==0){
return;
}
var max = data[0].total
var nameData = [];
var totalData = []
var background = []
var yesMonitor = []
var notMonitor = []
var yesProp = []
var notProp = []
var unitData = []
for (let i = data.length-1; i >=0 ; i--) {
nameData.push(data[i].name);
totalData.push(data[i].total)
unitData.push(data[i].unit)
background.push(100);
yesMonitor.push(data[i].yesMonitor);
notMonitor.push(data[i].notMonitor);
yesProp.push((data[i].yesMonitor/max)*100)
notProp.push((data[i].notMonitor/max)*100)
}
var legend = ["已监控", "未监控"]
if(this.legend){
legend = this.legend
}
this.option = {
grid: {
//图表的位置
top: "8%",
left: "3%",
right: "5%",
bottom: "-12%",
containLabel: true,
},
legend: {
right: "0",
top: "0",
//icon: "circle",
itemWidth: 15,
itemHeight:10,
itemGap: 8,
textStyle: {
fontSize: 12,
color:'#c6d9fa'
},
data: legend,
},
xAxis: [{
show: false,
},
//由于下边X轴已经是百分比刻度了,所以需要在顶部加一个X轴,刻度是金额,也隐藏掉
{
show: false,
}
],
yAxis: [
{
type: 'category',
axisLabel: {
show: false, //让Y轴数据不显示
},
itemStyle: {
},
axisTick: {
show: false, //隐藏Y轴刻度
},
axisLine: {
show: false, //隐藏Y轴线段
},
data: [],
},{
show: false,
data: [],
axisLine: {
show: false
}
}],
series: [
//数据条--------------------我是分割线君------------------------------//
{
show: true,
type: 'bar',
xAxisIndex: 1, //代表使用第二个X轴刻度!!!!!!!!!!!!!!!!!!!!!!!!
barGap: '-100%',
barWidth: '6', //统计条宽度
itemStyle: {
normal: {
color: 'rgba(22,203,115,0.05)'
},
},
label: {
normal: {
show: true,
//label 的position位置可以是top bottom left,right,也可以是固定值
//在这里需要上下统一对齐,所以用固定值
position: [0, '-25'],
rich: { //富文本
prop: { //自定义颜色
color: '#c6d9fa',
fontSize:'14',
},
unit:{
color: '#6c829a',
fontSize:'12',
},
yes:{
color: '#55adf7',
fontSize:'14',
},
not:{
color: '#4677fa',
fontSize:'14',
},
index:{
color: '#fcbc02',
fontStyle: 'italic',
padding:[0,0,0,5],
fontSize:'14',
},
name: {
width: 200,
color: '#c6d9fa',
padding:[0,0,0,10],
fontSize:'14',
},
color:{
color: '#8ca2be',
fontSize:'14',
},
arrow:{
width:12,
height:8,
backgroundColor: {
image: "/cdn/images/WEB_2B7C06210CD44D55BFEE6205A35DE4A7.png",
},
},
},
formatter: function(data) {
//富文本固定格式{colorName|这里填你想要写的内容}
//return '{arrow|}'
return '{arrow|}{index|No.'+(nameData.length-data.dataIndex)+'}{name|' + nameData[data.dataIndex] + '}{prop|' + totalData[data.dataIndex] + '}{unit| '+unitData[data.dataIndex]+'}{prop|} {yes|'+yesMonitor[data.dataIndex]+'}{unit| '+unitData[data.dataIndex]+'/}{not|'+notMonitor[data.dataIndex]+'}{unit| '+unitData[data.dataIndex]+'}{prop|} ';
},
}
},
data: background
},
{
type: 'bar',
silent: true,
yAxisIndex: 1,
barWidth: 6,
itemStyle: {
normal: {
color: 'rgba(0,82,198,0.3)'
},
emphasis: {
color: 'rgba(0,82,198,0.3)'
}
},
data: background
},
{
type: 'bar',
name:legend[0],
stack: '1',
legendHoverLink: false,
barWidth: 6,
itemStyle: {
normal: {
color: '#52adf4'
},
emphasis: {
color: '#52adf4'
}
},
data: yesProp
}, {
type: 'bar',
name:legend[1],
stack: '1',
legendHoverLink: false,
barWidth: 6,
itemStyle: {
normal: {
color: '#4677ff'
},
emphasis: {
color: '#4677ff'
}
},
data: notProp
}]
};
chChart.setOption(this.option);
window.onresize = chChart.resize;
})
},
},
watch:{
data: function (n,o) {
this.getChartData()
}
}
})

View File

@ -7,80 +7,113 @@
<div :class="nav == 2 ? 'head-nav active' : 'head-nav'" @click="doNav(2)" v-if="1 == 2"></div>
<div :class="nav == 7 ? 'head-nav active' : 'head-nav'" @click="doNav(7)" v-if="1 == 2"></div>
<div v-if="showMenusNavIds.includes('1')" :class="(nav >= 100 && nav < 200) || nav == 1 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('1')"
:class="(nav >= 100 && nav < 200) || nav == 1 ? 'head-nav active' : 'head-nav'" style="position: relative"
class="has-submenu">
<div>项目概况</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left" :class="getMenuClass(100)">
<button v-if="showMenusNavIds.includes('101')" type="button" :class="nav == 101 ? 'active' : ''" class="sub-btn" @click="doNav(101)"></button>
<button v-if="showMenusNavIds.includes('102')" type="button" :class="nav == 102 ? 'active' : ''" class="sub-btn" @click="doNav(102)"></button>
<button v-if="showMenusNavIds.includes('101')" type="button" :class="nav == 101 ? 'active' : ''"
class="sub-btn" @click="doNav(101)">项目详情</button>
<button v-if="showMenusNavIds.includes('102')" type="button" :class="nav == 102 ? 'active' : ''"
class="sub-btn" @click="doNav(102)">劳务管理</button>
</div>
</div>
</div>
</div>
<div v-if="showMenusNavIds.includes('3')" :class="(nav >= 300 && nav < 400) || nav == 3 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('3')"
:class="(nav >= 300 && nav < 400) || nav == 3 ? 'head-nav active' : 'head-nav'" style="position: relative"
class="has-submenu">
<div>安全管理</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left" :class="getMenuClass(300)">
<button v-if="showMenusNavIds.includes('301')" type="button" :class="nav == 301 ? 'active' : ''" class="sub-btn" @click="doNav(301)"></button>
<button v-if="showMenusNavIds.includes('302')" type="button" :class="nav == 302 ? 'active' : ''" class="sub-btn" @click="doNav(302)"></button>
<button v-if="showMenusNavIds.includes('303')" type="button" :class="nav == 303 ? 'active' : ''" class="sub-btn" @click="doNav(303)"></button>
<button v-if="showMenusNavIds.includes('304')" type="button" :class="nav == 304 ? 'active' : ''" class="sub-btn" @click="doNav(304)"></button>
<button v-if="showMenusNavIds.includes('301')" type="button" :class="nav == 301 ? 'active' : ''"
class="sub-btn" @click="doNav(301)">安全隐患排查</button>
<button v-if="showMenusNavIds.includes('302')" type="button" :class="nav == 302 ? 'active' : ''"
class="sub-btn" @click="doNav(302)">教育培训</button>
<button v-if="showMenusNavIds.includes('303')" type="button" :class="nav == 303 ? 'active' : ''"
class="sub-btn" @click="doNav(303)">基坑监测</button>
<button v-if="showMenusNavIds.includes('304')" type="button" :class="nav == 304 ? 'active' : ''"
class="sub-btn" @click="doNav(304)">塔机监测</button>
<button v-if="showMenusNavIds.includes('305')" type="button" :class="nav == 305 ? 'active' : ''" class="sub-btn" @click="doNav(305)"></button>
<button v-if="showMenusNavIds.includes('306')" type="button" :class="nav == 306 ? 'active' : ''" class="sub-btn" @click="doNav(306)"></button>
<button v-if="showMenusNavIds.includes('307')" type="button" :class="nav == 307 ? 'active' : ''" class="sub-btn" @click="doNav(307)"></button>
<button v-if="showMenusNavIds.includes('308')" type="button" :class="nav == 308 ? 'active' : ''" class="sub-btn" @click="doNav(308)"></button>
<button v-if="showMenusNavIds.includes('305')" type="button" :class="nav == 305 ? 'active' : ''"
class="sub-btn" @click="doNav(305)">高支模监测</button>
<button v-if="showMenusNavIds.includes('306')" type="button" :class="nav == 306 ? 'active' : ''"
class="sub-btn" @click="doNav(306)">配电箱监测</button>
<button v-if="showMenusNavIds.includes('307')" type="button" :class="nav == 307 ? 'active' : ''"
class="sub-btn" @click="doNav(307)">爬架监测</button>
<button v-if="showMenusNavIds.includes('308')" type="button" :class="nav == 308 ? 'active' : ''"
class="sub-btn" @click="doNav(308)">升降机监测</button>
<button v-if="showMenusNavIds.includes('309')" type="button" :class="nav == 309 ? 'active' : ''" class="sub-btn" @click="doNav(309)"></button>
<button v-if="showMenusNavIds.includes('310')" type="button" :class="nav == 310 ? 'active' : ''" class="sub-btn" @click="doNav(310)">AI</button>
<button v-if="showMenusNavIds.includes('311')" type="button" :class="nav == 311 ? 'active' : ''" class="sub-btn" @click="doNav(311)"></button>
<button v-if="showMenusNavIds.includes('309')" type="button" :class="nav == 309 ? 'active' : ''"
class="sub-btn" @click="doNav(309)">视频监控</button>
<button v-if="showMenusNavIds.includes('310')" type="button" :class="nav == 310 ? 'active' : ''"
class="sub-btn" @click="doNav(310)">AI预警</button>
<button v-if="showMenusNavIds.includes('311')" type="button" :class="nav == 311 ? 'active' : ''"
class="sub-btn" @click="doNav(311)">标准化管理</button>
</div>
</div>
</div>
</div>
<div v-if="showMenusNavIds.includes('4')" :class="(nav >= 400 && nav < 500) || nav == 4 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('4')"
:class="(nav >= 400 && nav < 500) || nav == 4 ? 'head-nav active' : 'head-nav'" style="position: relative"
class="has-submenu">
<div>质量管理</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left" :class="getMenuClass(400)">
<button v-if="showMenusNavIds.includes('401')" type="button" :class="nav == 401 ? 'active' : ''" class="sub-btn" @click="doNav(401)"></button>
<button v-if="showMenusNavIds.includes('402')" type="button" :class="nav == 402 ? 'active' : ''" class="sub-btn" @click="doNav(402)"></button>
<button v-if="showMenusNavIds.includes('403')" type="button" :class="nav == 403 ? 'active' : ''" class="sub-btn" @click="doNav(403)"></button>
<button v-if="showMenusNavIds.includes('404')" type="button" :class="nav == 404 ? 'active' : ''" class="sub-btn" @click="doNav(404)"></button>
<button v-if="showMenusNavIds.includes('401')" type="button" :class="nav == 401 ? 'active' : ''"
class="sub-btn" @click="doNav(401)">质量隐患排查</button>
<button v-if="showMenusNavIds.includes('402')" type="button" :class="nav == 402 ? 'active' : ''"
class="sub-btn" @click="doNav(402)">材料取样复试</button>
<button v-if="showMenusNavIds.includes('403')" type="button" :class="nav == 403 ? 'active' : ''"
class="sub-btn" @click="doNav(403)">举牌验收</button>
<button v-if="showMenusNavIds.includes('404')" type="button" :class="nav == 404 ? 'active' : ''"
class="sub-btn" @click="doNav(404)">标养室监测</button>
<button v-if="showMenusNavIds.includes('405')" type="button" :class="nav == 405 ? 'active' : ''" class="sub-btn" @click="doNav(405)"></button>
<button v-if="showMenusNavIds.includes('406')" type="button" :class="nav == 406 ? 'active' : ''" class="sub-btn" @click="doNav(406)"></button>
<button v-if="showMenusNavIds.includes('405')" type="button" :class="nav == 405 ? 'active' : ''"
class="sub-btn" @click="doNav(405)">标准化管理</button>
<button v-if="showMenusNavIds.includes('406')" type="button" :class="nav == 406 ? 'active' : ''"
class="sub-btn" @click="doNav(406)">混泥土监测</button>
</div>
</div>
</div>
</div>
<div v-if="showMenusNavIds.includes('5')" :class="(nav >= 500 && nav < 600) || nav == 5 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('5')"
:class="(nav >= 500 && nav < 600) || nav == 5 ? 'head-nav active' : 'head-nav'" style="position: relative"
class="has-submenu">
<div>进度管理</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left" :class="getMenuClass(500)">
<button v-if="showMenusNavIds.includes('502')" type="button" :class="nav == 502 ? 'active' : ''" class="sub-btn" @click="doNav(502)"></button>
<button v-if="showMenusNavIds.includes('501')" type="button" :class="nav == 501 ? 'active' : ''" class="sub-btn" @click="doNav(501)"></button>
<button v-if="showMenusNavIds.includes('502')" type="button" :class="nav == 502 ? 'active' : ''"
class="sub-btn" @click="doNav(502)">进度管理</button>
<button v-if="showMenusNavIds.includes('501')" type="button" :class="nav == 501 ? 'active' : ''"
class="sub-btn" @click="doNav(501)">延时摄影</button>
</div>
</div>
</div>
</div>
<div v-if="showMenusNavIds.includes('8')" :class="(nav >= 800 && nav < 900) || nav == 8 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('8')"
:class="(nav >= 800 && nav < 900) || nav == 8 ? 'head-nav active' : 'head-nav'" style="position: relative"
class="has-submenu">
<div>物机管理</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left" :class="getMenuClass(800)">
<button v-if="showMenusNavIds.includes('801')" type="button" :class="nav == 801 ? 'active' : ''" class="sub-btn" @click="doNav(801)"></button>
<button v-if="showMenusNavIds.includes('802')" type="button" :class="nav == 802 ? 'active' : ''" class="sub-btn" @click="doNav(802)"></button>
<button v-if="showMenusNavIds.includes('801')" type="button" :class="nav == 801 ? 'active' : ''"
class="sub-btn" @click="doNav(801)">机械管理</button>
<button v-if="showMenusNavIds.includes('802')" type="button" :class="nav == 802 ? 'active' : ''"
class="sub-btn" @click="doNav(802)">材料管理</button>
</div>
</div>
</div>
@ -88,25 +121,34 @@
</div>
</el-col>
<el-col :span="8" class="header-center">
<img class="prj-logo" :src="selProject.setting.orgLogo" v-if="selProject && selProject.setting && selProject.setting.orgLogo" />
<img class="prj-logo" :src="selProject.setting.orgLogo"
v-if="selProject && selProject.setting && selProject.setting.orgLogo" />
<span class="sp-title">{{ selProject?.setting?.orgName || selProject?.projectName || "数字建安施工管理平台" }}</span>
</el-col>
<el-col :span="8">
<div class="head-title-tab" style="display: inline-flex">
<div v-if="showMenusNavIds.includes('6')" :class="nav == 6 ? 'head-nav active' : 'head-nav'" @click="doNav(6)">绿</div>
<div v-if="showMenusNavIds.includes('7')" :class="(nav >= 700 && nav < 800) || nav == 7 ? 'head-nav active' : 'head-nav'" style="position: relative" class="has-submenu">
<div v-if="showMenusNavIds.includes('6')" :class="nav == 6 ? 'head-nav active' : 'head-nav'"
@click="doNav(6)">绿碳中心</div>
<div v-if="showMenusNavIds.includes('7')"
:class="(nav >= 700 && nav < 800) || nav == 7 ? 'head-nav active' : 'head-nav'" style="position: relative"
class="has-submenu">
<div>数字孪生</div>
<div class="header-btn-list">
<div class="header-btn-list-arrow"></div>
<div class="header-btn-list-item" style>
<div class="header-btn-list-padding menu-row1" style="text-align: left" :class="getMenuClass(700)">
<button v-if="showMenusNavIds.includes('701')" type="button" :class="nav == 701 ? 'active' : ''" class="sub-btn" @click="doNav(701)"></button>
<button v-if="showMenusNavIds.includes('701')" type="button" :class="nav == 701 ? 'active' : ''"
class="sub-btn" @click="doNav(701)">项目沙盘</button>
<button v-if="showMenusNavIds.includes('702')" type="button" :class="nav == 702 ? 'active' : ''" class="sub-btn" @click="doNav(702)"></button>
<button v-if="showMenusNavIds.includes('703')" type="button" :class="nav == 703 ? 'active' : ''" class="sub-btn" @click="doNav(703)">BIM</button>
<button v-if="showMenusNavIds.includes('702')" type="button" :class="nav == 702 ? 'active' : ''"
class="sub-btn" @click="doNav(702)">项目漫游</button>
<button v-if="showMenusNavIds.includes('703')" type="button" :class="nav == 703 ? 'active' : ''"
class="sub-btn" @click="doNav(703)">BIM应用</button>
<button v-if="showMenusNavIds.includes('704')" type="button" :class="nav == 704 ? 'active' : ''" class="sub-btn" @click="doNav(704)">BIM</button>
<button v-if="showMenusNavIds.includes('705')" type="button" :class="nav == 705 ? 'active' : ''" class="sub-btn" @click="doNav(705)">4D</button>
<button v-if="showMenusNavIds.includes('704')" type="button" :class="nav == 704 ? 'active' : ''"
class="sub-btn" @click="doNav(704)">BIM交底</button>
<button v-if="showMenusNavIds.includes('705')" type="button" :class="nav == 705 ? 'active' : ''"
class="sub-btn" @click="doNav(705)">4D模拟</button>
</div>
</div>
</div>
@ -121,14 +163,17 @@
<i class="el-icon-switch-button"></i>
</span>
</div>
<i class="set-fullscreen set-font-size" style="margin-left: 16px; position: absolute; top: 0px; right: 24px" @click="toggleFullScreen">
<svg class="icon" v-if="!isFullScreen" style="width: 20px; vertical-align: middle; fill: currentColor; overflow: hidden" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3304">
<i class="set-fullscreen set-font-size" style="margin-left: 16px; position: absolute; top: 0px; right: 24px"
@click="toggleFullScreen">
<svg class="icon" v-if="!isFullScreen"
style="width: 20px; vertical-align: middle; fill: currentColor; overflow: hidden" viewBox="0 0 1024 1024"
version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3304">
<path
d="M145.066667 85.333333h153.6c25.6 0 42.666667-17.066667 42.666666-42.666666S324.266667 0 298.666667 0H34.133333C25.6 0 17.066667 8.533333 8.533333 17.066667 0 25.6 0 34.133333 0 42.666667v256c0 25.6 17.066667 42.666667 42.666667 42.666666s42.666667-17.066667 42.666666-42.666666V145.066667l230.4 230.4c17.066667 17.066667 42.666667 17.066667 59.733334 0 17.066667-17.066667 17.066667-42.666667 0-59.733334L145.066667 85.333333z m170.666666 563.2L162.133333 802.133333l-76.8 76.8V725.333333C85.333333 699.733333 68.266667 682.666667 42.666667 682.666667s-42.666667 17.066667-42.666667 42.666666v256c0 25.6 17.066667 42.666667 42.666667 42.666667h256c25.6 0 42.666667-17.066667 42.666666-42.666667s-17.066667-42.666667-42.666666-42.666666H145.066667l76.8-76.8 153.6-153.6c17.066667-17.066667 17.066667-42.666667 0-59.733334-17.066667-17.066667-42.666667-17.066667-59.733334 0z m665.6 34.133334c-25.6 0-42.666667 17.066667-42.666666 42.666666v153.6l-76.8-76.8-153.6-153.6c-17.066667-17.066667-42.666667-17.066667-59.733334 0-17.066667 17.066667-17.066667 42.666667 0 59.733334l153.6 153.6 76.8 76.8H725.333333c-25.6 0-42.666667 17.066667-42.666666 42.666666s17.066667 42.666667 42.666666 42.666667h256c25.6 0 42.666667-17.066667 42.666667-42.666667v-256c0-25.6-17.066667-42.666667-42.666667-42.666666z m0-682.666667h-256c-25.6 0-42.666667 17.066667-42.666666 42.666667s17.066667 42.666667 42.666666 42.666666h153.6l-76.8 76.8-153.6 153.6c-17.066667 17.066667-17.066667 42.666667 0 59.733334 17.066667 17.066667 42.666667 17.066667 59.733334 0l153.6-153.6 76.8-76.8v153.6c0 25.6 17.066667 42.666667 42.666666 42.666666s42.666667-17.066667 42.666667-42.666666v-256c0-25.6-17.066667-42.666667-42.666667-42.666667z"
fill
p-id="3305" />
fill p-id="3305" />
</svg>
<svg class="icon" v-else style="width: 24px; vertical-align: middle; fill: currentColor; overflow: hidden" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3952">
<svg class="icon" v-else style="width: 24px; vertical-align: middle; fill: currentColor; overflow: hidden"
viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3952">
<path
d="M384 597.333333h-256c-25.6 0-42.666667 17.066667-42.666667 42.666667s17.066667 42.666667 42.666667 42.666667h153.6L17.066667 947.2c-17.066667 17.066667-17.066667 42.666667 0 59.733333 17.066667 17.066667 42.666667 17.066667 59.733333 0L341.333333 742.4v153.6c0 25.6 17.066667 42.666667 42.666667 42.666667s42.666667-17.066667 42.666667-42.666667v-256c0-25.6-17.066667-42.666667-42.666667-42.666667z m358.4 85.333334h153.6c25.6 0 42.666667-17.066667 42.666667-42.666667s-17.066667-42.666667-42.666667-42.666667h-256c-25.6 0-42.666667 17.066667-42.666667 42.666667v256c0 25.6 17.066667 42.666667 42.666667 42.666667s42.666667-17.066667 42.666667-42.666667V742.4l264.533333 264.533333c17.066667 17.066667 42.666667 17.066667 59.733333 0 17.066667-17.066667 17.066667-42.666667 0-59.733333L742.4 682.666667zM640 426.666667h256c25.6 0 42.666667-17.066667 42.666667-42.666667s-17.066667-42.666667-42.666667-42.666667H742.4L1006.933333 76.8c17.066667-17.066667 17.066667-42.666667 0-59.733333-17.066667-17.066667-42.666667-17.066667-59.733333 0L682.666667 281.6V128c0-25.6-17.066667-42.666667-42.666667-42.666667s-42.666667 17.066667-42.666667 42.666667v256c0 25.6 17.066667 42.666667 42.666667 42.666667z m-256-341.333334c-25.6 0-42.666667 17.066667-42.666667 42.666667v153.6L76.8 8.533333C59.733333 0 25.6 0 8.533333 8.533333 0 25.6 0 59.733333 8.533333 76.8L281.6 341.333333H128c-25.6 0-42.666667 17.066667-42.666667 42.666667s17.066667 42.666667 42.666667 42.666667h256c25.6 0 42.666667-17.066667 42.666667-42.666667v-256c0-25.6-17.066667-42.666667-42.666667-42.666667z"
p-id="3953" />
@ -271,6 +316,7 @@ export default {
});
},
doNav(n) {
console.log("--->",n);
if (this.nav == n) {
return;
}
@ -294,6 +340,9 @@ export default {
case 304:
this.$router.push("/towerCrane");
break;
case 303:
this.$router.push("/excavation");
break;
case 306:
this.$router.push("/powerIot");
break;
@ -358,7 +407,7 @@ export default {
location.href = window.XDBSAPP;
});
})
.catch(() => {});
.catch(() => { });
},
},
};
@ -367,6 +416,7 @@ export default {
<style lang="less">
.div-header {
line-height: 100px;
.header-title-user-info {
font-size: 20px;
@ -379,10 +429,12 @@ export default {
right: 10px;
}
}
.sp-title {
line-height: 40px;
display: inline-block;
}
.header-center {
text-align: center;
color: #3da2ff;
@ -415,14 +467,17 @@ export default {
.header-btn-list-item {
.header-btn-list-padding {
padding: 0px;
&.grid3 {
display: grid;
grid-template-columns: 33% 33% 33%;
}
&.grid2 {
display: grid;
grid-template-columns: 50% 50%;
}
button {
width: 120px;
}
@ -458,9 +513,11 @@ export default {
}
}
}
.header-sel-project-pop {
top: 60px !important;
}
@media (min-width: 1921px) and (max-width: 2560px) {
.div-header {
.head-nav {
@ -479,10 +536,12 @@ export default {
}
}
}
.sp-title {
line-height: 48px !important;
font-size: 36px;
}
.header-center {
font-size: 42px !important;
padding: 0px 60px;
@ -526,6 +585,7 @@ export default {
.header-center {
font-size: 52px !important;
padding: 0px 60px;
.prj-logo {
width: 100px;
height: 100px;
@ -533,10 +593,12 @@ export default {
border-radius: 50px;
}
}
.sp-title {
line-height: 50px !important;
font-size: 40px;
}
.header-title-user-info {
font-size: 30px !important;

View File

@ -0,0 +1,173 @@
import Vue from 'vue'
Vue.component("trend-line-chart", {
template: `
<div :style="{'height': height+'px'}" ref="chart">
</div>
`,
props: {
chartdata:{
type:Object
},
height:{
type:Number
},
data:{
type:Array
},
fn:{
type:Function
}
},
data() {
return {
option:{}
}
},
mounted(){
this.init()
},
methods: {
init(){
this.getChartData()
},
getChartData(){
//品类金额占比 饼图
var myChart = echarts.init(this.$refs.chart);
this.echartPie(myChart,this.chartdata)
},
echartPie(myChart,data){
let newPromise = new Promise((resolve) => {
resolve()
})
//然后异步执行echarts的初始化函数
newPromise.then(() => {
var series =[]
if(data && data.data){
for (let i = 0; i < data.data.length; i++) {
series.push({
name:data.legend[i],
type: "line",
smooth: true,
symbol: "circle",
symbolSize: 5,
showSymbol: true,
lineStyle: {
normal: {
width: 2,
},
},
data: data.data[i],
})
}
}
var unit = ''
if(data.unit){
unit = '单位:'+data.unit
}
this.option = {
color : data.color,
dataZoom:[
{show:true,type:'slider'},
{type:'inside'}
],
tooltip: {
trigger: "axis",
axisPointer: {
lineStyle: {
color: "#57617B",
},
},
},
grid: {
top:'15%',
left: "1%",
right: "3%",
bottom: "1%",
containLabel: true,
},
xAxis: {
type: "category",
boundaryGap: false,
data: data.dataX,
axisLine: {
//坐标轴轴线相关设置。数学上的x轴
show: true,
lineStyle: {
color: "#25597e",
type: "dashed",
},
},
axisTick: {
show: false
},
axisLabel: {
//坐标轴刻度标签的相关设置
textStyle: {
color: "#c5d9fc",
margin: 20,
fontSize:16
},
},
},
yAxis: {
name:unit,
nameTextStyle: {
color: '#fff',
fontSize: 14,
},
type: "value",
axisLine: {
//坐标轴轴线相关设置。数学上的x轴
show: false,
lineStyle: {
color: "#c5d9fc",
type: "dashed",
},
},
axisTick: {
show: false
},
axisLabel: {
show: true,
//坐标轴刻度标签的相关设置
textStyle: {
color: "#c5d9fc",
margin: 20,
fontSize:16
},
},
splitLine: {
show: true,
lineStyle: {
color: "#25597e",
type: "dashed",
},
},
},
series: series
};
if(this.fn){
this.option=this.fn(this.option);
}
myChart.setOption(this.option,true);
window.onresize = myChart.resize;
})
},
},
watch:{
/*chartdata: {
deep:true,
handler: function (val, oldVal){
this.init()
}
},*/
data: function (val, oldVal){
this.init()
}
}
})

View File

@ -92,6 +92,12 @@ const routes = [
name: "towerCrane",
meta: { nav: 304 },
component: () => import(/* webpackChunkName: "towerCrane" */ "../views/safety/towerCrane.vue"),
},
{
path: "/excavation",
name: "excavation",
meta: { nav: 303 },
component: () => import(/* webpackChunkName: "excavation" */ "../views/safety/excavation.vue"),
},
{
path: "/powerIot",

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,142 @@
.el-tooltip__popper {
max-width: 50%;
}
.font-size-tools .set-font-size {
cursor: pointer;
position: relative;
}
.font-size-tools .set-font-size.active {
color: aqua;
}
.font-size-tools .set-font-size.active .svg-icon * {
fill: aqua;
}
.font-size-tools .set-font-size .svg-icon {
width: 40px !important;
height: 40px !important;
}
.font-size-tools .set-font-size.font-size2 {
margin-right: 4px;
}
.font-size-tools .set-font-size.font-size2::after {
content: "+";
font-style: normal;
right: 0px;
font-weight: bold;
position: absolute;
font-size: 16px !important;
}
.font-size-tools .set-font-size.font-size0::after {
content: "-";
font-style: normal;
right: 0px;
font-weight: bold;
position: absolute;
font-size: 16px !important;
}
.finish-0 {
color: #e6a23c;
}
.finish-1 {
color: red;
}
.finish-2 {
color: #01A9FF;
}
.finish-3 {
color: green;
}
.finish-4 {
color: #a2c8f9;
}
.hide-scroll {
overflow: hidden;
}
.bg-date-picker {
border: none;
background: transparent;
}
.bg-date-picker .el-range-input {
background: transparent;
}
.bg-date-picker .el-range-separator {
color: #fff;
}
.bg-date-picker-pop {
color: #eee;
}
.bg-date-picker-pop .el-picker-panel__sidebar {
background: transparent;
border-right-color: #01a9ff;
}
.bg-date-picker-pop .el-picker-panel__icon-btn {
color: #01A9FF;
}
.bg-date-picker-pop .el-picker-panel__icon-btn:hover {
color: #ced7db;
}
.bg-date-picker-pop .el-date-range-picker__content .el-date-table th {
border-bottom-color: #01a9ff;
}
.bg-date-picker-pop .el-date-range-picker__content .el-date-table td.in-range div {
background-color: #01A9FF;
}
.bg-date-picker-pop .el-date-range-picker__content.is-left {
border-right-color: #01a9ff;
}
.bg-date-picker-pop .popper__arrow {
border-bottom-color: #01A9FF !important;
}
.bg-date-picker-pop .popper__arrow::after {
border-bottom-color: #01A9FF !important;
border-top-color: #01a9ff !important;
}
.el-loading-mask {
background-color: rgba(255, 255, 255, 0.4);
}
.el-loading-mask .el-loading-spinner {
height: 100px;
}
.el-loading-mask .el-loading-spinner .circular {
right: unset;
width: 100px;
height: 100px;
}
.el-pagination.bg-pagination {
text-align: center;
}
.el-pagination.bg-pagination .btn-next,
.el-pagination.bg-pagination .btn-prev {
background-color: rgba(1, 169, 255, 0.4);
color: #fff;
}
.el-pagination.bg-pagination .btn-next {
margin-left: 20px;
}
.el-pagination.bg-pagination .el-pagination__total {
color: #fff;
}
.el-pagination.bg-pagination .el-pager li {
background-color: rgba(1, 169, 255, 0.4);
margin-left: 20px;
color: #fff;
}
.el-pagination.bg-pagination .el-pager li.active {
background-color: #01a9ff;
}
.el-message-box {
background-color: rgba(1, 169, 255, 0.5);
border: solid 1px #01a9ff;
}
.el-message-box__title {
color: #fff;
}
.el-message-box__btns {
text-align: center;
}
.el-message-box__content {
color: #fff;
}
.head-title-tab {
white-space: nowrap;
}

View File

@ -100,7 +100,7 @@
border-bottom-color:#01A9FF !important;
&::after{
border-bottom-color:#01A9FF !important;
top:0px !important;
border-top-color: #01a9ff !important;
}
}
}

View File

@ -222,10 +222,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</delete>
<select id="queryByState" parameterType="PitmonitSouthsmosAlarm" resultMap="PitmonitSouthsmosAlarmResult">
SELECT a.*,c.unitName AS deptName,b.project_id as projectId
SELECT a.*,b.project_id as projectId
FROM dev_pitmonit_southsmos_alarm a
JOIN sur_project_pit_monit_cfg b ON a.cfgId = b.id
JOIN sur_project_unit_info c ON b.sub_dept_id = c.unitId AND b.project_id = c.projectId
left JOIN sur_project_unit_info c ON b.sub_dept_id = c.unitId AND b.project_id = c.projectId
WHERE
a.is_del = 0
<if test="status != null and status != ''"> and a.status = #{status}</if>

View File

@ -185,7 +185,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT a.*, c.unitName AS deptName, b.project_id AS projectId
FROM dev_pitmonit_southsmos_data a
JOIN sur_project_pit_monit_cfg b ON a.cfgId = b.id
JOIN sur_project_unit_info c ON b.sub_dept_id = c.unitId AND b.project_id = c.projectId
left JOIN sur_project_unit_info c ON b.sub_dept_id = c.unitId AND b.project_id = c.projectId
JOIN LatestData ld ON a.id = ld.max_id
WHERE b.project_id = #{id}
AND a.is_del = 0
@ -194,7 +194,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT a.cfgid, a.spId, a.NAME, a.meNameEn,c.unitName AS deptName,c.projectId,a.position as remark
FROM dev_pitmonit_southsmos_surveypoint a
JOIN sur_project_pit_monit_cfg b ON a.cfgId = b.id
JOIN sur_project_unit_info c ON b.sub_dept_id=c.unitId AND b.project_id=c.projectId
left JOIN sur_project_unit_info c ON b.sub_dept_id=c.unitId AND b.project_id=c.projectId
WHERE b.project_id = #{id}
)
SELECT sp.cfgid, sp.spId, sp.NAME AS spName, sp.meNameEn AS datatype,

View File

@ -399,7 +399,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
pi.licence_number, pi.project_person, pi.project_person_phone, pi.longitude, pi.latitude, pi.project_time_limit, pi.total_investment,
pi.floor_area, pi.total_output_value, pi.planned_completion_time, pi.scheduled_start_time, pi.actual_operating_time, pi.actual_completion_time,
pi.contract_amount, pi.paid_amount, pi.on_account_amount, pi.project_schedule, pi.project_summarize, pi.project_qr_code, pi.project_status,
pi.project_sort, pi.is_del, pi.create_by, pi.create_time, pi.update_by, pi.update_time, pi.remark,pi.bim_config,
pi.project_sort, pi.is_del, pi.create_by, pi.create_time, pi.update_by, pi.update_time, pi.remark,pi.bim_config,ps.pit_img_url ps_pit_img_url,
ps.id ps_id,ps.org_name ps_org_name,ps.org_logo ps_org_logo,ps.org_image ps_org_image,ps.org_video ps_org_video,ps.org_plane ps_org_plane,cfg.vendors_code
from pro_project_info pi
left join pro_project_info_setting ps on pi.id=ps.project_id

View File

@ -168,6 +168,9 @@ public class ProCostOutputController extends BaseController
*/
@PostMapping("/addYearInvestment")
public AjaxResult addYearInvestment(@RequestBody ProCostOutput where){
if(where.getProjectId()==null || where.getYear()==null || where.getComId()==null){
return AjaxResult.error("项目ID、年度、公司ID不能为空!");
}
List<ProCostOutput> list=proCostOutputService.selectProCostOutputList(where);
if(list.size()==0){
proCostOutputService.addYearInvestment(where);
@ -177,10 +180,13 @@ public class ProCostOutputController extends BaseController
}
}
@PostMapping("/addMonthInvestment")
public AjaxResult addMonthInvestment(@RequestBody ProCostOutput where) {
List<ProCostOutput> list=proCostOutputService.selectProCostOutputList(where);
public AjaxResult addMonthInvestment(@RequestBody ProCostOutput data) {
if(data.getProjectId()==null || data.getYear()==null || data.getComId()==null){
return AjaxResult.error("项目ID、年度、公司ID不能为空!");
}
List<ProCostOutput> list=proCostOutputService.selectProCostOutputList(data);
if(list.size()==0){
proCostOutputService.addMonthInvestment(where);
proCostOutputService.addMonthInvestment(data);
return AjaxResult.success("增加月度投资成功!");
}else{
return AjaxResult.error("此月度投资已存在!");

View File

@ -0,0 +1,81 @@
package com.yanzhu.manage.controller.bigscreen;
import com.yanzhu.common.core.web.controller.BaseController;
import com.yanzhu.common.core.web.domain.AjaxResult;
import com.yanzhu.device.domain.PitmonitSouthsmosAlarm;
import com.yanzhu.device.domain.PitmonitSouthsmosData;
import com.yanzhu.manage.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/***
*
*/
@RestController
@RequestMapping("/bgscreen/pitmonit")
public class PitMonitController extends BaseController {
@Autowired
private IPitmonitSouthsmosDataService dataService;
@Autowired
private IPitmonitSouthsmosAlarmService alarmService;
@Autowired
private IPitmonitSouthsmosDeviceService deviceService;
@Autowired
private IPitmonitSouthsmosDevSpService devSpService;
@Autowired
private IPitmonitSouthsmosElementItemService elementItemService;
@Autowired
private IPitmonitSouthsmosElementService elementService;
@Autowired
private IPitmonitSouthsmosSurveypointService surveypointService;
@Autowired
private IPitmonitSouthsmosThresholdService thresholdService;
@Autowired
private IProjectPitMonitCfgService cfgService;
@GetMapping("/totalCount")
public AjaxResult totalCount(Long prjId) {
int dataCount=dataService.getCountByPrjId(prjId);
int devCount=deviceService.getCountByPrjId(prjId);
Map<String,Integer> map=new HashMap<>();
map.put("data",dataCount);
map.put("dev",devCount);
return AjaxResult.success(map);
}
@GetMapping("/alarm")
public AjaxResult alarmList(Long prjId){
String status="false";
List<PitmonitSouthsmosAlarm> list=alarmService.queryByState(prjId,status);
return AjaxResult.success(list);
}
/**
*
*/
@GetMapping("/getLastDataForElement")
public AjaxResult getLastDataForElement(Long prjId){
List<PitmonitSouthsmosData> list=dataService.getLastDataForElement(prjId);
return AjaxResult.success(list);
}
/**
*
*/
@PostMapping("/selectByDate")
public AjaxResult selectByDate(@RequestBody PitmonitSouthsmosData where){
List<PitmonitSouthsmosData> list=dataService.selectByDate(where);
return AjaxResult.success(list);
}
/**
*
*/
@GetMapping("/monitDays")
public AjaxResult monitDays(Long prjId){
Long days=dataService.monitDays(prjId);
return AjaxResult.success(days);
}
}

View File

@ -143,7 +143,10 @@ public class ProCostOutputServiceImpl implements IProCostOutputService
it.setRemark("");
it.setIsDel(0l);
it.setCostType(2l);//年度投资
insertProCostOutput(it);
if(selectProCostOutputList(it).size()==0){
insertProCostOutput(it);
}
}
@Override
@ -154,7 +157,9 @@ public class ProCostOutputServiceImpl implements IProCostOutputService
it.setCostType(9l);//月度投资
for(int i=1;i<=12;i++){
it.setMonth(i*1l);
insertProCostOutput(it);
if(selectProCostOutputList(it).size()==0){
insertProCostOutput(it);
}
}
}

View File

@ -1,275 +1,277 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
/>
<script src="/cdn/webcfg.js?20250913"></script>
<script>
window.yanzhuAppTitle = window.webCfg?.webTitle || "数字建安施工";
</script>
<link rel="icon" href="/cdn/bsimages/faviconnew.ico?v=6" />
<title>数字建安施工</title>
<script
type="text/javascript"
src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=eseRcUMFiUlnWA6miQLejNpvS70H8SRN"
></script>
<script src="/cdn/Cesium/Cesium.js"></script>
<script src="/cdn/Cesium/BIMGISEngine_edit.js?v=20250909"></script>
<script src="/cdn/Cesium/initApi.js?v=20230920"></script>
<script src="/cdn/echarts/echarts.min.js"></script>
<script src="/cdn/bim/sapi/BIMGISEngine250906.js?v=2025090602"></script>
<script src="/cdn/bim/sapi/config.js?v=20250816"></script>
<link rel="stylesheet" href="/cdn/Cesium/Widgets/widgets.css" />
<!--[if lt IE 11
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<script src="/cdn/webcfg.js?20250913"></script>
<script>
window.yanzhuAppTitle = window.webCfg?.webTitle || "数字建安施工";
</script>
<link rel="icon" href="/cdn/bsimages/faviconnew.ico?v=6" />
<title>数字建安施工</title>
<script
type="text/javascript"
src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=eseRcUMFiUlnWA6miQLejNpvS70H8SRN"></script>
<script src="/cdn/Cesium/Cesium.js"></script>
<script src="/cdn/Cesium/BIMGISEngine_edit.js?v=20250909"></script>
<script src="/cdn/Cesium/initApi.js?v=20230920"></script>
<script src="/cdn/echarts/echarts.min.js"></script>
<script src="/cdn/bim/sapi/BIMGISEngine250906.js?v=2025090602"></script>
<script src="/cdn/bim/sapi/config.js?v=20250816"></script>
<link rel="stylesheet" href="/cdn/Cesium/Widgets/widgets.css" />
<!--[if lt IE 11
]><script>
window.location.href = "/html/ie.html";
</script><!
[endif]-->
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
<style>
html,
body,
#app {
height: 100%;
margin: 0px;
padding: 0px;
}
.chromeframe {
margin: 0.2em 0;
background: #ccc;
color: #000;
padding: 0.2em 0;
}
#loader-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
z-index: 1001;
}
#loader:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
-ms-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
}
#loader:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
#loader {
display: block;
position: relative;
left: 50%;
top: 50%;
width: 150px;
height: 150px;
margin: -75px 0 0 -75px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 2s linear infinite;
-ms-animation: spin 2s linear infinite;
-moz-animation: spin 2s linear infinite;
-o-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
z-index: 1001;
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
#loader:before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-webkit-animation: spin 3s linear infinite;
-moz-animation: spin 3s linear infinite;
-o-animation: spin 3s linear infinite;
-ms-animation: spin 3s linear infinite;
animation: spin 3s linear infinite;
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loader:after {
content: "";
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;
border-radius: 50%;
border: 3px solid transparent;
border-top-color: #fff;
-moz-animation: spin 1.5s linear infinite;
-o-animation: spin 1.5s linear infinite;
-ms-animation: spin 1.5s linear infinite;
-webkit-animation: spin 1.5s linear infinite;
animation: spin 1.5s linear infinite;
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171c6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
-ms-transform: rotate(0deg);
transform: rotate(0deg);
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
100% {
-webkit-transform: rotate(360deg);
-ms-transform: rotate(360deg);
transform: rotate(360deg);
}
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#loader-wrapper .loader-section {
position: fixed;
top: 0;
width: 51%;
height: 100%;
background: #7171c6;
z-index: 1000;
-webkit-transform: translateX(0);
-ms-transform: translateX(0);
transform: translateX(0);
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
#loader-wrapper .loader-section.section-left {
left: 0;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
#loader-wrapper .loader-section.section-right {
right: 0;
}
.no-js #loader-wrapper {
display: none;
}
.loaded #loader-wrapper .loader-section.section-left {
-webkit-transform: translateX(-100%);
-ms-transform: translateX(-100%);
transform: translateX(-100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.no-js h1 {
color: #222222;
}
.loaded #loader-wrapper .loader-section.section-right {
-webkit-transform: translateX(100%);
-ms-transform: translateX(100%);
transform: translateX(100%);
-webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
}
#loader-wrapper .load_title {
font-family: "Open Sans";
color: #fff;
font-size: 19px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
.loaded #loader {
opacity: 0;
-webkit-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
}
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #fff;
opacity: 0.5;
}
.loaded #loader-wrapper {
visibility: hidden;
-webkit-transform: translateY(-100%);
-ms-transform: translateY(-100%);
transform: translateY(-100%);
-webkit-transition: all 0.3s 1s ease-out;
transition: all 0.3s 1s ease-out;
}
#translate {
position: absolute;
top: 11px;
left: 50%;
}
.no-js #loader-wrapper {
display: none;
}
/* 隐藏原生的 select 样式 */
#translate select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
padding: 7px;
border: 1px solid rgb(159, 206, 255);
border-radius: 5px;
background-color: rgb(235, 245, 255);
color: rgb(72, 162, 255);
font-size: 14px;
font-weight: bold;
width: 150px;
}
.no-js h1 {
color: #222222;
}
/* 美化 select 的下拉箭头 */
#translate::after {
content: "▼";
/* Unicode编码表示向下的箭头 */
position: absolute;
color: rgb(72, 162, 255);
top: 8px;
right: 10px;
font-size: 12px;
}
#loader-wrapper .load_title {
font-family: "Open Sans";
color: #fff;
font-size: 19px;
width: 100%;
text-align: center;
z-index: 9999999999999;
position: absolute;
top: 60%;
opacity: 1;
line-height: 30px;
}
/* 美化选项内容 */
#translate option {
padding: 5px;
background-color: #f9f9f9;
color: rgb(72, 162, 255);
}
</style>
</head>
#loader-wrapper .load_title span {
font-weight: normal;
font-style: italic;
font-size: 13px;
color: #fff;
opacity: 0.5;
}
#translate {
position: absolute;
top: 11px;
left: 50%;
}
/* 隐藏原生的 select 样式 */
#translate select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
padding: 7px;
border: 1px solid rgb(159, 206, 255);
border-radius: 5px;
background-color: rgb(235, 245, 255);
color: rgb(72, 162, 255);
font-size: 14px;
font-weight: bold;
width: 150px;
}
/* 美化 select 的下拉箭头 */
#translate::after {
content: "▼"; /* Unicode编码表示向下的箭头 */
position: absolute;
color: rgb(72, 162, 255);
top: 8px;
right: 10px;
font-size: 12px;
}
/* 美化选项内容 */
#translate option {
padding: 5px;
background-color: #f9f9f9;
color: rgb(72, 162, 255);
}
</style>
</head>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
<body>
<div id="app">
<div id="loader-wrapper">
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
</div>
<script type="module" src="/src/main.js"></script>
<script>
window.document.title = window.yanzhuAppTitle;
</script>
<!-- 全局配置-多语言切换-开始 -->
<!-- <script src="<%= BASE_URL %>static/translate.js"></script> -->
<script src="/cdn/tools/translate.js"></script>
</div>
<script type="module" src="/src/main.js"></script>
<script>
window.document.title = window.yanzhuAppTitle;
</script>
<!-- 全局配置-多语言切换-开始 -->
<!-- <script src="<%= BASE_URL %>static/translate.js"></script> -->
<!-- <script src="/cdn/tools/translate.js"></script>
<script>
//设置本地语种(当前网页的语种)。如果不设置,默认就是 'chinese_simplified' 简体中文
// translate.language.setDefaultTo('english') //设置默认翻译为的语种
@ -296,6 +298,7 @@
translate.execute()
}, 2000)
});
</script>
</body>
</html>
</script> -->
</body>
</html>

View File

@ -17,7 +17,6 @@
<div id="index-map" style="width: 100%; height: 600px"></div>
</el-dialog>
</template>
<script setup>
import { reactive, ref } from "vue";
const { proxy } = getCurrentInstance();
@ -31,47 +30,6 @@ const data = reactive({
});
const emit = defineEmits(["docom"]);
// API
const baiduMapLoaded = ref(false);
// API
function loadBaiduMap() {
return new Promise((resolve, reject) => {
if (window.BMapGL) {
baiduMapLoaded.value = true;
resolve();
return;
}
//
if (window.baiduMapLoading) {
const checkInterval = setInterval(() => {
if (window.BMapGL) {
clearInterval(checkInterval);
baiduMapLoaded.value = true;
resolve();
}
}, 100);
return;
}
window.baiduMapLoading = true;
const script = document.createElement('script');
script.src = 'https://api.map.baidu.com/api?v=1.0&type=webgl&ak=eseRcUMFiUlnWA6miQLejNpvS70H8SRN&services=&callback=onBMapLoadComplete';
script.async = true;
script.defer = true;
script.onerror = reject;
window.onBMapLoadComplete = function() {
baiduMapLoaded.value = true;
window.baiduMapLoading = false;
resolve();
};
document.head.appendChild(script);
});
}
function doOk() {
emit("docom", point.value, cityInfo.value);
@ -83,24 +41,15 @@ function getAddress() {
return addr;
}
async function showDlg(opt) {
function showDlg(opt) {
title.value = opt?.title || "选择地址";
show.value = true;
try {
await loadBaiduMap();
setTimeout(() => {
initMap(opt);
}, 400);
} catch (error) {
proxy.$modal.msgError("地图加载失败,请检查网络连接");
console.error("百度地图加载失败:", error);
}
setTimeout(() => {
initMap(opt);
}, 400);
}
function currentPoint() {
if (!window.BMapGL) return;
let geolocation = new BMapGL.Geolocation();
geolocation.enableSDKLocation();
geolocation.getCurrentPosition((e) => {
@ -113,8 +62,6 @@ function currentPoint() {
}
function mapClick(e) {
if (!window.BMapGL) return;
point.value = e.latlng;
let myGeo = new BMapGL.Geocoder({ extensions_town: true });
myGeo.getLocation(e.latlng, (r) => {
@ -137,9 +84,8 @@ function mapClick(e) {
}
function initMap(opt) {
if (!window.BMapGL) return;
let imap = new BMapGL.Map("index-map");
map.value = imap;
let point = new BMapGL.Point(116.404, 39.915);
//
@ -174,7 +120,6 @@ function initMap(opt) {
currentPoint();
}
}
function initMapData(opt) {
if (opt.latitude && opt.longitude) {
point.value = {};
@ -193,10 +138,7 @@ defineExpose({
showDlg,
initMapData,
});
function search() {
if (!window.BMapGL) return;
if (!data.txtAarea) {
proxy.$modal.msgError("请输入要搜索的地址");
return;
@ -212,7 +154,6 @@ function search() {
});
}
</script>
<style lang="scss">
.baidu-map-dialog {
.el-dialog__body {

View File

@ -1,26 +1,84 @@
<template>
<div class="custom-viewpoint-container">
<el-card>
<template #header>
<div class="card-header">
<span>视点管理</span>
<el-button type="primary" @click="AddViewPoint"></el-button>
</div>
</template>
<el-table :data="viewpointList" border>
<el-table-column prop="name" label="视点名称" width="180" />
<el-table-column prop="description" label="描述" />
<el-table-column label="操作" width="150">
<template v-slot="scope">
<el-button type="primary" text @click="ApplyViewPoint(scope.row)"></el-button>
<el-button type="danger" text @click="DelViewPoint(scope.$index)"></el-button>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
<div class="custom-viewpoint">
<el-tabs v-model="tab" size="small" @tab-click="ChangeTab">
<el-tab-pane label="漫游设置" name="tab1">
<el-form :model="form" :rules="rules" ref="ruleForm" label-width="30%">
<el-form-item label="漫游名称" prop="name">
<el-input v-model="form.name" style="width: 100%" />
</el-form-item>
<el-form-item label="移动速度" prop="moveRate" v-if="isClient && false">
<el-radio-group v-model="form.moveRate" size="small">
<el-radio-button v-for="(it, idx) in speed" :label="it.label" :value="it.value"
:key="idx" />
</el-radio-group>
</el-form-item>
<el-form-item label="漫游时长" prop="time">
<el-input-number v-model="form.time" :step="1" :min="1" style="width: 100%" />
<template #append></template>
</el-form-item>
<el-form-item label="轨迹创建">
<el-button @click="GetViewPort"></el-button>
</el-form-item>
<div>
<el-table :data="form.viewPortPoints" border style="width: 100%" max-height="50vh">
<el-table-column prop="name" label="视点">
<template #default="scope">{{ '视点' + (++scope.$index) }}</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="text" @click="DelViewPoint(scope.$index)"></el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-form-item style="margin-top: 10px">
<el-button @click="StartViewPortRoam"></el-button>
<el-button @click="StopViewPortRoam"></el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="漫游历史" name="tab2">
<el-table :data="roamList" style="width: 100%">
<el-table-column prop="name" label="名称" />
<el-table-column label="操作" width="220px" class-name="opt-td">
<template #default="scope">
<el-button v-if="scope.row.play === 0" type="primary" link
@click="playIR(scope.row)">播放</el-button>
<el-button v-else-if="scope.row.play === 1" type="primary" auto-insert-spacelink
@click="playIRPause(scope.row)">暂停</el-button>
<el-button v-else-if="scope.row.play === 2" type="primary" link
@click="playContinue(scope.row)">继续</el-button>
<el-button link @click="playCancel(scope.row)" type="primary">取消</el-button>
<el-button link @click="delCamera(scope.row, scope.$index)" type="danger">删除</el-button>
<el-button link @click="renamed(scope.row)" type="success">改名</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination-container">
<el-pagination v-model:current-page="pagination.current" v-model:page-size="pagination.pageSize"
:page-sizes="[10, 20, 30, 50]" :total="pagination.total" layout="total, prev, pager, next"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
</el-tab-pane>
</el-tabs>
<el-dialog title="漫游重命名" v-model="visibleRenamed" width="280px" :before-close="() => visibleRenamed = false">
<el-form ref="formRenamedRef" :rules="rulesRenamed" :model="formRenamed" label-width="80px">
<el-form-item label="漫游名称" prop="name">
<el-input v-model="formRenamed.name" maxlength="20" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="备注" v-show="false">
<el-input type="textarea" v-model="formRenamed.remark" :rows="4" placeholder="备注"></el-input>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="visibleRenamed = false">取消</el-button>
<el-button type="primary" @click="handSaveRenamed"></el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import { roamingAdd, roamingGet, roamingUpdateByName, roamingDeleteById } from '@/api/bim/bim.js'
import { _isMobile } from '@/utils/public'
@ -275,9 +333,9 @@ export default {
})
},
resetScene() {
try{
try {
api.Camera.stopViewPortRoam()
}catch(e){
} catch (e) {
}
api.Model.location(api.m_model.keys().toArray()[0])
@ -358,36 +416,35 @@ export default {
},
}
</script>
<style lang="scss">
.custom-viewpoint-container {
width: 360px;
padding: 0px 10px 10px;
.custom-viewpoint {
width: 360px;
padding: 0px 10px 10px;
.el-tabs__content {
padding: 0px;
.opt-td {
.cell {
.el-tabs__content {
padding: 0px;
}
.opt-td {
.cell {
padding: 0px;
}
}
}
}
.pagination-container {
margin-top: 0px;
height: 32px;
display: flex;
justify-content: flex-end;
.pagination-container {
margin-top: 0px;
height: 32px;
display: flex;
justify-content: flex-end;
.el-pagination {
font-size: 12px;
.el-pagination {
font-size: 12px;
.el-pagination__total,
.el-pagination__sizes {
margin-right: 16px;
}
.el-pagination__total,
.el-pagination__sizes {
margin-right: 16px;
}
}
}
}
}
</style>

View File

@ -1,44 +1,34 @@
<template>
<div class="flow-form-container">
<div class="form-header">
<el-button type="primary" @click="saveFormJson">
<el-icon><Promotion /></el-icon>
</el-button>
<el-button type="success" @click="previewForm"></el-button>
</div>
<div class="form-content">
<el-alert
title="表单设计器使用说明"
type="info"
description="1. 从左侧拖拽组件到中间画布区域 2. 点击组件可进行属性配置 3. 点击保存按钮保存表单设计"
show-icon
/>
<el-row :gutter="20">
<el-col :span="6">
<div class="components-panel">
<h3>组件库</h3>
<!-- 组件列表 -->
</div>
</el-col>
<el-col :span="12">
<div class="canvas-panel">
<h3>设计区域</h3>
<!-- 设计画布 -->
</div>
</el-col>
<el-col :span="6">
<div class="properties-panel">
<h3>属性配置</h3>
<!-- 属性面板 -->
</div>
</el-col>
</el-row>
</div>
<div>
<v-form-designer ref="vfDesigner" :designer-config="designerConfig">
<!-- 保存按钮 -->
<template #customSaveButton>
<el-button type="text" @click="saveFormJson"><el-icon>
<Promotion />
</el-icon></el-button>
</template>
</v-form-designer>
<!--系统表单信息-->
<el-dialog :title="formTitle" v-model="formOpen" width="500px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="表单名称" prop="formName">
<el-input v-model="form.formName" placeholder="请输入表单名称" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="FlowForm">
import {addForm, getForm, updateForm} from "@/api/flowable/form";
import { addForm, getForm, updateForm } from "@/api/flowable/form";
import { StrUtil } from '@/utils/StrUtil'
//
@ -69,7 +59,7 @@ const data = reactive({
},
});
const { form, rules , designerConfig} = toRefs(data);
const { form, rules, designerConfig } = toRefs(data);
onMounted(() => {
const formId = proxy.$route.query && proxy.$route.query.formId;
@ -81,10 +71,10 @@ onMounted(() => {
})
form.value = res.data;
})
}else {
} else {
proxy.$nextTick(() => {
// json
vfDesigner.value.setFormJson({"widgetList":[],"formConfig":{"modelName":"formData","refName":"vForm","rulesName":"rules","labelWidth":80,"labelPosition":"left","size":"","labelAlign":"label-left-align","cssCode":"","customClass":"","functions":"","layoutType":"PC","onFormCreated":"","onFormMounted":"","onFormDataChange":"","onFormValidate":""}})
vfDesigner.value.setFormJson({ "widgetList": [], "formConfig": { "modelName": "formData", "refName": "vForm", "rulesName": "rules", "labelWidth": 80, "labelPosition": "left", "size": "", "labelAlign": "label-left-align", "cssCode": "", "customClass": "", "functions": "", "layoutType": "PC", "onFormCreated": "", "onFormMounted": "", "onFormDataChange": "", "onFormValidate": "" } })
})
}
})
@ -112,7 +102,7 @@ function submitForm() {
});
}
//
const obj = { path: "/flowable/form", query: { t: Date.now()} };
const obj = { path: "/flowable/form", query: { t: Date.now() } };
proxy.$tab.closeOpenPage(obj);
}
});
@ -136,14 +126,14 @@ function reset() {
}
</script>
<style lang="scss" scoped>
body {
margin: 0; /* 如果页面出现垂直滚动条则加入此行CSS以消除之 */
margin: 0;
/* 如果页面出现垂直滚动条则加入此行CSS以消除之 */
}
.el-container.main-container{
.el-container.main-container {
background: #fff;
margin-left: 0 !important;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div class="login main-login">
<el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
<h3 class="title">{{title}}</h3>
<h3 class="title">{{ title }}</h3>
<el-form-item prop="username" style="margin-top:60px;">
<el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
<template #prefix>
@ -45,7 +45,6 @@
</div>
</div>
</template>
<script setup>
import { getCodeImg } from '@/api/login'
import Cookies from 'js-cookie'
@ -139,11 +138,12 @@ function getCookie() {
getCode()
getCookie()
setTimeout(()=>{
translate.execute();
},1000);
setTimeout(() => {
if (translate && translate.execute) {
translate.execute();
}
}, 1000);
</script>
<style lang='scss'>
.login.main-login {
display: flex;
@ -261,11 +261,11 @@ setTimeout(()=>{
border: solid 1px #1262b5;
}
.el-checkbox__input + .el-checkbox__label {
.el-checkbox__input+.el-checkbox__label {
color: #aaa;
}
.el-checkbox__input.is-checked + .el-checkbox__label {
.el-checkbox__input.is-checked+.el-checkbox__label {
color: var(--el-checkbox-checked-text-color) !important;
}

View File

@ -1,17 +1,37 @@
<template>
<div class="cost-month-container">
<el-dialog v-model="data.showPop2" title="确认取消" width="30%">
<span>确定要取消当前操作吗</span>
<template #footer>
<span class="dialog-footer">
<el-button size="small" @click="data.showPop2 = false">取消</el-button>
<el-button size="small" type="primary" @click="confirmCancel"></el-button>
</span>
</template>
</el-dialog>
</div>
<div class="cost-month" style="border:solid 1px #409eff;margin: 12px 0px;padding: 6px 12px 0px;position: relative;">
<el-popover placement="top" :visible="data.showPop2" ref="pop" width="300px">
<p>选择年份</p>
<div style="margin-bottom: 12px;">
<el-date-picker v-model="data.selYear" type="year" placeholder="选择年份" style="width:100%"
:picker-options="{ disabledDate: doPick }">
</el-date-picker>
</div>
<div style="text-align: right; margin: 0">
<el-button size="small" type="text" @click="data.showPop2 = false">取消</el-button>
<el-button type="primary" size="small" @click="doAddYear"></el-button>
</div>
<template #reference>
<el-button size="small" type="success" @click="data.showPop2 = true" style="margin-right: 12px;"
class="btn-add-year" round>增加年份</el-button>
</template>
</el-popover>
<el-tabs type="card" v-model="data.activeName">
<el-tab-pane v-for="(it, idx) in data.monthInv" :label="'' + it.year" :name="'' + it.year" :key="idx">
<el-row>
<el-col v-for="(item, idxx) in it.value" :key="idxx" :span="12">
<el-form-item :label="data.names[item.month]" class="w200"
:class="item.money * 1 < 0 ? 'txt-error' : ''">
<el-input-number :precision="2" v-model="item.money" placeholder="年度投资">
</el-input-number>
<span class="sp-unit">万元</span>
</el-form-item>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup>
import { addMonthInvestment } from '@/api/manage/costOutput.js'
const { proxy } = getCurrentInstance();

View File

@ -1,17 +1,32 @@
<template>
<div class="cost-year-container">
<el-dialog v-model="data.showPop" title="确认取消" width="30%">
<span>确定要取消当前操作吗</span>
<template #footer>
<span class="dialog-footer">
<el-button size="small" @click="doCancel"></el-button>
<el-button size="small" type="primary" @click="confirmCancel"></el-button>
</span>
</template>
</el-dialog>
</div>
<div class="cost-year" style="border:solid 1px #409eff;margin: 12px 0px;padding: 12px 12px 0px;position: relative;">
<el-popover placement="top" :visible="data.showPop2" width="300px">
<p>选择年份</p>
<div style="margin-bottom: 12px;">
<el-date-picker v-model="data.selYear" type="year" placeholder="选择年份" style="width:100%"
:picker-options="{ disabledDate: doPick }">
</el-date-picker>
</div>
<div style="text-align: right; margin: 0">
<el-button size="small" type="text" @click="doCancel"></el-button>
<el-button type="primary" size="small" @click="doAddYear"></el-button>
</div>
<template #reference>
<el-button class="btn-add-year" size="small" @click="data.showPop2 = true" type="success"
style="margin-right: 12px;" round>增加年份</el-button>
</template>
</el-popover>
<el-tabs type="card" v-model="data.activeName">
<el-tab-pane v-for="(it, idx) in data.yearInv" :label="'' + it.year" :name="'' + it.year" :key="idx">
<el-form-item label="年度投资" class="w400" :class="it.money * 1 < 0 ? 'txt-error' : ''">
<el-input-number :precision="2" v-model="it.money" placeholder="年度投资">
</el-input-number>
<span class="sp-unit">万元</span>
</el-form-item>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script setup>
import { addYearInvestment } from '@/api/manage/costOutput.js'
const { proxy } = getCurrentInstance();

View File

@ -57,12 +57,12 @@
<el-tag effect="plain"> {{ scope.row.projectTimeLimit + " 天" }} </el-tag>
</template>
</el-table-column>
<el-table-column label="总投资" align="center" prop="totalInvestment">
<el-table-column label="总投资" align="center" prop="totalInvestment" width="120">
<template #default="scope">
<el-tag effect="dark"> {{ scope.row.totalInvestment + " 万元" }} </el-tag>
</template>
</el-table-column>
<el-table-column label="合同金额" align="center" prop="contractAmount">
<el-table-column label="合同金额" align="center" prop="contractAmount" width="120">
<template #default="scope">
<el-tag effect="dark"> {{ scope.row.contractAmount + " 万元" }} </el-tag>
</template>