# Conflicts:
#	src/views/compilation/handbook/index.vue
yfy
项洋 1 week ago
commit fe865db344

@ -5,4 +5,5 @@ VUE_APP_TITLE = 苏州工业园区工业上楼管理系统
ENV = 'production'
# 苏州工业园区工业上楼管理系统/生产环境
VUE_APP_BASE_API = 'http://39.101.188.84:7071'
# VUE_APP_BASE_API = 'http://39.101.188.84:7071'
VUE_APP_BASE_API = ''

@ -15,8 +15,8 @@ export default {
components: { ThemePicker },
mounted() {
autofit.init({
dh: 1030, // 稿
dw: 1950, // 稿
dh: 850, // 稿
dw: 1900, // 稿
el: "body", // DOM
resize: true // resize
})

@ -8,7 +8,7 @@ export function getBasicInformationPage(params) {
params
})
}
//标签管理 查询所有数据
//产业标签 查询所有数据
export function getCybqInformationPage(params) {
return request({
url:'/gysl/Cybq/page',
@ -16,6 +16,13 @@ export function getCybqInformationPage(params) {
params
})
}
//产业标签 通过主键查询单条数据
export function getSpanById(id) {
return request({
url: `/gysl/Cybq/${id}`,
method: "get",
});
}
// 通过主键查询单条所有数据(企业端)
export function getBasicInformationById(id) {
@ -672,18 +679,20 @@ export function allinformation(params){
}
// //投资主体
export function investall() {
export function investall(params) {
return request({
url: '/gysl/zwStats/investors',
method: 'get'
method: 'get',
params
})
}
// 功能区
export function fungong(){
export function fungong(params){
return request({
url:'/gysl/zwStats/ribbon',
method:'get'
method:'get',
params
})
}

@ -36,3 +36,23 @@ export function deletespan(idList) {
},
});
}
// 月度进展信息修改
export function updateProjectProgress(data) {
return request({
url: "/gysl/projectProgress/edit",
method: "put",
data,
});
}
// 月度进展信息删除
export function deletemonth(idList) {
return request({
url: "/gysl/projectProgress/delete",
method: "delete",
params: {
idList: idList.join(","), // 将数组转换为逗号分隔的字符串
},
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

@ -84,7 +84,7 @@
overflow: hidden !important;
text-overflow: ellipsis !important;
white-space: nowrap !important;
border-radius: 0.25rem;
// border-radius: 0.25rem;
height: 45px;
line-height: 45px;
}
@ -102,8 +102,8 @@
}
& .is-active > .el-submenu__title {
background-color: #2b62f1 !important;
color: white !important;
background-color: rgb(227, 236, 254);
// color: white !important;
}
& .nest-menu .el-submenu > .el-submenu__title,

@ -2,21 +2,27 @@
<el-breadcrumb class="app-breadcrumb" separator="/">
<transition-group name="breadcrumb">
<el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span>
<a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
<!-- <span class="no-redirect" v-show="crumbs"> /{{ crumbs }}</span> -->
<span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">
{{ item.meta.title }}</span>
<!-- <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a> -->
<span class="no-redirect" v-show="crumbs"> / {{ crumbs }}</span>
</el-breadcrumb-item>
</transition-group>
</el-breadcrumb>
</template>
<script>
import { mapGetters } from "vuex";
export default {
data() {
return {
levelList: null
}
},
computed: {
...mapGetters(["crumbs"])
},
watch: {
$route(route) {
// if you go to the redirect page, do not update the breadcrumbs
@ -32,25 +38,16 @@ export default {
methods: {
getBreadcrumb() {
// only show routes with meta.title
let matched = []
const router = this.$route
const pathNum = this.findPathNum(router.path)
// multi-level menu
if (pathNum > 2) {
const reg = /\/\w+/gi
const pathList = router.path.match(reg).map((item, index) => {
if (index !== 0) item = item.slice(1)
return item
})
this.getMatched(pathList, this.$store.getters.defaultRoutes, matched)
} else {
matched = router.matched.filter(item => item.meta && item.meta.title)
}
//
if (!this.isDashboard(matched[0])) {
matched = [{ path: "/index", meta: { title: "首页" } }].concat(matched)
}
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
let matched = this.$route.matched.filter(
(item) => item.meta && item.meta.title
);
// //
// if (!this.isDashboard(matched[0])) {
// matched = [{ path: "/index", meta: { title: "" } }].concat(matched);
// }
this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false);
},
findPathNum(str, char = "/") {
let index = str.indexOf(char)
@ -96,6 +93,7 @@ export default {
font-size: 14px;
line-height: 50px;
margin-left: 8px;
.no-redirect {
color: #97a8be;
cursor: text;

@ -60,7 +60,7 @@ export default {
// , ['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => ["doc", "xls", "ppt", "txt", "pdf"],
default: () => ["doc", "docx", "xls", "ppt", "txt", "pdf"],
},
//
isShowTip: {

@ -3,27 +3,23 @@
<!-- 政务端消息通知数量 -->
<!-- 大于0的时候显示的图标 -->
<el-badge :is-dot="countstwo > 0" class="item" v-if="checkRole(['common'])">
<span class="el-dropdown-link">
<i class="el-icon-bell"></i>
</span>
<img src="@/assets/images/icon-tz@2x.png" alt="">
</el-badge>
<!-- 企业端消息通知数量 -->
<el-badge :is-dot="counts > 0" class="item" v-if="showCompanySection">
<span class="el-dropdown-link">
<i class="el-icon-bell"></i>
</span>
<img src="@/assets/images/icon-tz@2x.png" alt="">
</el-badge>
</div>
</template>
<script>
import { checkRole } from "@/utils/permission";
import { getMessageCount,getMessageCounttwo } from '@/api/ManageApi/index'
import { getMessageCount, getMessageCounttwo } from '@/api/ManageApi/index'
export default {
data() {
return {
counts: 0 ,
counts: 0,
countstwo: 0,
}
},
@ -47,12 +43,8 @@ export default {
const response = await getMessageCount();
if (response && response.code === 200) {
this.counts = response.data; // counts
} else {
console.error('获取数据失败:', response);
}
} catch (error) {
console.error('获取数据失败:', error);
}
} else { }
} catch (error) {}
},
//
async getCountstwo() {
@ -60,16 +52,9 @@ export default {
const response = await getMessageCounttwo();
if (response && response.code === 200) {
this.countstwo = response.data; // counts
} else {
console.error('获取数据失败:', response);
}
} catch (error) {
console.error('获取数据失败:', error);
}
} else { }
} catch (error) { }
},
handleCommand(command) {
this.$message('点击了: ' + command)
}
}
}
</script>
@ -84,8 +69,13 @@ export default {
color: black;
}
img {
width: 1.5rem;
height: 1.6rem;
}
.el-dropdown-link i {
font-size: 2rem;
font-size: 1rem;
/* 增大图标的大小 */
}
}

@ -45,10 +45,11 @@ export default {
<style lang="scss" scoped>
.app-main {
/* 50= navbar 50 */
min-height: 100%;
height: 100%;
width: 100%;
position: relative;
overflow: hidden;
overflow-y: auto;
}
.fixed-header + .app-main {

@ -8,7 +8,7 @@
</div>
<div class="right-menu">
<bearicon />
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-container right-menu-item hover-effect" >
<div class="avatar-wrapper">
<div v-if="checkRole(['common'])">
<span>{{ name }}</span>
@ -16,14 +16,9 @@
<div v-if="showCompanySection">
<span>{{ name }}</span>
</div>
<i class="el-icon-caret-bottom" />
<img src="@/assets/images/退出登录.png" alt="" @click="logout">
</div>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="logout" >
<span>退出登录</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
@ -192,16 +187,20 @@ export default {
.avatar-wrapper {
margin-top: 2px;
position: relative;
display: flex;
align-items: center;
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 10px;
}
.el-icon-caret-bottom {
img{
width: 1rem;
height: 1rem;
margin-left: 1rem;
cursor: pointer;
}
.el-icon-caret-bottom {
position: absolute;
right: -20px;
top: 17px;
@ -215,7 +214,6 @@ export default {
margin-top: .5rem;
.el-dropdown-link {
cursor: pointer;
color: black;
}

@ -1,24 +1,13 @@
<template>
<div :class="{'has-logo':showLogo}" style="padding: 0 1rem ;">
<div :class="{ 'has-logo': showLogo }" style="padding: 0 1rem ;">
<logo v-if="showLogo" :collapse="isCollapse" />
<el-scrollbar wrap-class="scrollbar-wrapper">
<el-menu
:default-active="activeMenu"
:collapse="isCollapse"
text-color="#3D424D"
:unique-opened="true"
active-text-color="white"
:collapse-transition="false"
mode="vertical"
>
<sidebar-item
v-for="(route, index) in sidebarRouters"
:key="route.path + index"
:item="route"
:base-path="route.path"
/>
<div>
<el-menu :default-active="activeMenu" :collapse="isCollapse" text-color="#3D424D" :unique-opened="true"
active-text-color="white" :collapse-transition="false" mode="vertical">
<sidebar-item v-for="(route, index) in sidebarRouters" :key="route.path + index" :item="route"
:base-path="route.path" />
</el-menu>
</el-scrollbar>
</div>
</div>
</template>

@ -102,7 +102,8 @@ export default {
border-radius: 1rem 1rem 0 0;
margin-right: .3rem;
flex: 1;
overflow: hidden;
// overflow: hidden;
overflow-y: auto;
background-color: #FAFAFA;
}

@ -6,6 +6,7 @@ import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isPathMatch } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import { extractPrefix } from '@/utils/common';
NProgress.configure({ showSpinner: false })
@ -16,6 +17,10 @@ const isWhiteList = (path) => {
}
router.beforeEach((to, from, next) => {
if(!extractPrefix(to.path)){
store.commit("SET_CRUMBS",false);
}
NProgress.start()
if (getToken()) {
to.meta.title && store.dispatch('settings/setTitle', to.meta.title)

@ -16,6 +16,6 @@ const getters = {
topbarRouters:state => state.permission.topbarRouters,
defaultRoutes:state => state.permission.defaultRoutes,
sidebarRouters:state => state.permission.sidebarRouters,
crmbs: state => state.permission.crumbs
crumbs: (state) => state.permission.crumbs,
}
export default getters

@ -12,7 +12,7 @@ const permission = {
defaultRoutes: [],
topbarRouters: [],
sidebarRouters: [],
crumbs:""
crumbs:"",
},
mutations: {
SET_CRUMBS: (state, crumbs) => {

@ -0,0 +1,8 @@
export function extractPrefix(str) {
const pattern = /(.+?)(-info|-add|-edit)/;
const match = str.match(pattern);
if (match) {
return match[1];
}
return null;
}

@ -6,12 +6,22 @@
<el-form size="small" :inline="true" label-width="200">
<el-row>
<el-col :span="5">
<<<<<<< HEAD
<el-form-item label="手册名称" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入手册名称" clearable />
=======
<el-form-item label="手册名称" style="width: 100%">
<el-input
v-model="queryParams.name"
placeholder="请输入手册名称"
clearable
/>
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="创建时间">
<<<<<<< HEAD
<el-date-picker
v-model="queryParams.startTime"
type="date"
@ -19,13 +29,36 @@
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
=======
<el-date-picker
v-model="queryParams.startTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
>
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<<<<<<< HEAD
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
=======
<el-button
type="primary"
icon="el-icon-search"
@click="handleQuery"
>查询</el-button
>
<el-button icon="el-icon-refresh" @click="resetQuery"
>重置</el-button
>
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
</el-form-item>
</el-col>
</el-row>
@ -38,7 +71,7 @@
<!-- <el-button
type="primary"
icon="el-icon-plus"
size="mini"
:loading="exportLoading"
@click="handleExport"
>项目手册导出</el-button
@ -52,7 +85,11 @@
>
</div>
<el-table v-loading="loading" :data="postList">
<<<<<<< HEAD
<el-table-column type="selection" width="55" align="center" /> -->
=======
<!-- <el-table-column type="selection" width="55" align="center" /> -->
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
<el-table-column label="序号" align="center">
<template slot-scope="scope">
<span>{{ scope.$index + 1 }}</span>
@ -63,28 +100,32 @@
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
style="color: gray"
@click="handlePreview(scope.row)"
>预览</el-button
>
<el-button
size="mini"
type="text"
style="color: #67c23a"
@click="handleEdit(scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="text"
style="color: #f56c6c"
@click="handleDelete(scope.row)"
>删除</el-button
>
<el-button
<<<<<<< HEAD
size="mini"
=======
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
type="text"
style="color: #409eff"
@click="handleExport(scope.row.id)"
@ -114,7 +155,7 @@
</div>
<el-button-group class="navigation-buttons">
<el-button
size="mini"
type="primary"
icon="el-icon-arrow-left"
:disabled="currentPage <= 1"
@ -122,7 +163,7 @@
>上一页</el-button
>
<el-button
size="mini"
type="primary"
icon="el-icon-arrow-right"
:disabled="currentPage >= pageCount"
@ -131,7 +172,7 @@
>
</el-button-group>
<el-button
size="mini"
type="info"
icon="el-icon-back"
@click="previewMode = false"
@ -251,6 +292,7 @@
label="项目名称"
align="center"
></el-table-column>
<<<<<<< HEAD
<el-table-column
prop="xzfl"
label="现状分类"
@ -258,6 +300,14 @@
>
<template slot-scope="scope">
<dict-tag :options="dict.type.xzfl" :value="scope.row.xzfl"/>
=======
<el-table-column prop="xzfl" label="现状分类" align="center">
<template slot-scope="scope">
<dict-tag
:options="dict.type.xzfl"
:value="scope.row.xzfl"
/>
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
</template>
</el-table-column>
<el-table-column
@ -403,7 +453,11 @@ export default {
FileUpload,
},
// 使
<<<<<<< HEAD
dicts: ['xzfl'],
=======
dicts: ["xzfl"],
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
data() {
return {
queryParams: {
@ -558,7 +612,11 @@ export default {
this.editingHandbook = null;
this.selectedProjectIds = [];
this.selectedProjects = [];
<<<<<<< HEAD
this.projectParams.pageNum = 1 ;
=======
this.projectParams.pageNum = 1;
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
this.getProjectList();
},
handleAddDialogClose(done) {
@ -628,7 +686,11 @@ export default {
handleRowClick(row) {
this.$refs.projectTable.toggleRowSelection(row);
const selectedRows = this.$refs.projectTable.selection;
<<<<<<< HEAD
const isSelected = selectedRows.some(item => item.id === row.id);
=======
const isSelected = selectedRows.some((item) => item.id === row.id);
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
if (isSelected) {
//
if (!this.selectedProjectIds.includes(row.id)) {
@ -637,8 +699,17 @@ export default {
}
} else {
//
<<<<<<< HEAD
this.selectedProjectIds = this.selectedProjectIds.filter(id => id !== row.id);
this.selectedProjects = this.selectedProjects.filter(item => item.id !== row.id);
=======
this.selectedProjectIds = this.selectedProjectIds.filter(
(id) => id !== row.id
);
this.selectedProjects = this.selectedProjects.filter(
(item) => item.id !== row.id
);
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
}
},
@ -672,7 +743,11 @@ export default {
if (!this.$refs.projectTable) return;
this.$refs.projectTable.clearSelection();
if (!this.selectedProjectIds.length) return;
<<<<<<< HEAD
=======
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
this.projectList.forEach((row) => {
if (this.selectedProjectIds.includes(row.id)) {
this.$refs.projectTable.toggleRowSelection(row, true);
@ -722,10 +797,16 @@ export default {
},
//
handleSelect(selection, row) {
<<<<<<< HEAD
//
const isSelected = selection.some(item => item.id === row.id);
=======
//
const isSelected = selection.some((item) => item.id === row.id);
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
if (isSelected) {
//
if (!this.selectedProjectIds.includes(row.id)) {
@ -734,6 +815,7 @@ export default {
}
} else {
//
<<<<<<< HEAD
this.selectedProjectIds = this.selectedProjectIds.filter(id => id !== row.id);
this.selectedProjects = this.selectedProjects.filter(item => item.id !== row.id);
}
@ -745,19 +827,43 @@ export default {
// ID
const currentPageIds = this.projectList.map(item => item.id);
=======
this.selectedProjectIds = this.selectedProjectIds.filter(
(id) => id !== row.id
);
this.selectedProjects = this.selectedProjects.filter(
(item) => item.id !== row.id
);
}
},
// /
handleSelectAll(selection) {
// ID
const currentPageIds = this.projectList.map((item) => item.id);
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
//
if (selection.length === 0) {
// -
this.selectedProjectIds = this.selectedProjectIds.filter(
<<<<<<< HEAD
id => !currentPageIds.includes(id)
);
this.selectedProjects = this.selectedProjects.filter(
project => !currentPageIds.includes(project.id)
=======
(id) => !currentPageIds.includes(id)
);
this.selectedProjects = this.selectedProjects.filter(
(project) => !currentPageIds.includes(project.id)
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
);
} else {
// -
//
const projectIdsNotInCurrentPage = this.selectedProjectIds.filter(
<<<<<<< HEAD
id => !currentPageIds.includes(id)
);
const projectsNotInCurrentPage = this.selectedProjects.filter(
@ -767,6 +873,23 @@ export default {
//
this.selectedProjectIds = [...projectIdsNotInCurrentPage, ...currentPageIds];
this.selectedProjects = [...projectsNotInCurrentPage, ...this.projectList];
=======
(id) => !currentPageIds.includes(id)
);
const projectsNotInCurrentPage = this.selectedProjects.filter(
(project) => !currentPageIds.includes(project.id)
);
//
this.selectedProjectIds = [
...projectIdsNotInCurrentPage,
...currentPageIds,
];
this.selectedProjects = [
...projectsNotInCurrentPage,
...this.projectList,
];
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
}
},
//
@ -785,11 +908,19 @@ export default {
imageUrl: detail.tailingImg,
subtitle: detail.tail,
};
<<<<<<< HEAD
//
this.selectedProjectIds = [];
this.selectedProjects = [];
=======
//
this.selectedProjectIds = [];
this.selectedProjects = [];
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
if (detail.xmId) {
const projectIds = detail.xmId.split(",");
this.selectedProjectIds = projectIds.map((id) => Number(id));
@ -797,7 +928,11 @@ export default {
if (detail.projectName && Array.isArray(detail.projectName)) {
this.selectedProjects = detail.projectName;
}
<<<<<<< HEAD
this.projectParams.pageNum = 1 ;
=======
this.projectParams.pageNum = 1;
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
this.getProjectList();
}
@ -857,7 +992,11 @@ export default {
.tablebtntwo {
width: 100%;
display: flex;
<<<<<<< HEAD
justify-content: right;
=======
justify-content: left;
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
margin: 10px 0 20px;
}
@ -872,22 +1011,22 @@ export default {
padding: 12px 0;
}
.el-table__row {
transition: all 0.2s;
// .el-table__row {
// // transition: all 0.2s;
&:hover {
background-color: #ecf5ff;
}
}
// // &:hover {
// // background-color: #ecf5ff;
// // }
// }
.el-button--text {
padding: 0 5px;
font-weight: 500;
transition: all 0.3s;
// transition: all 0.3s;
&:hover {
transform: scale(1.05);
}
// &:hover {
// transform: scale(1.05);
// }
}
}
@ -953,12 +1092,12 @@ export default {
padding: 7px 15px;
font-weight: 500;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
transition: all 0.2s ease;
// transition: all 0.2s ease;
&:hover:not([disabled]) {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
// &:hover:not([disabled]) {
// transform: translateY(-2px);
// box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
// }
&[disabled] {
opacity: 0.6;
@ -1129,12 +1268,20 @@ export default {
transition: all 0.3s;
margin-right: 30px;
::v-deep .el-input {
<<<<<<< HEAD
flex: 1!important;
max-width: 100%!important;
}
::v-deep .el-input__inner {
width: 100%!important;
=======
flex: 1 !important;
max-width: 100% !important;
}
::v-deep .el-input__inner {
width: 100% !important;
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
}
&:hover {
box-shadow: 0 0 0 1px #409eff;
@ -1201,11 +1348,19 @@ export default {
background-color: #f8f8f8;
border-radius: 4px;
position: relative;
<<<<<<< HEAD
transition: all 0.2s;
&:hover {
background-color: #f0f0f0;
=======
// transition: all 0.2s;
&:hover {
background-color: #f0f0f0;
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
.remove-btn {
opacity: 1;
}
@ -1231,11 +1386,19 @@ export default {
color: #909399;
padding: 2px;
margin-left: 8px;
<<<<<<< HEAD
&:hover {
color: #F56C6C;
opacity: 1;
transform: scale(1.1);
=======
&:hover {
color: #f56c6c;
opacity: 1;
// transform: scale(1.1);
>>>>>>> 920c391d958f28235c74f3f866465688cae9eb68
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -40,9 +40,6 @@
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-download" size="medium" @click="handleImport"></el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="primary" icon="el-icon-download" size="medium" @click="handleExport"></el-button>
</el-col> -->
</el-row>
</div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
@ -51,10 +48,10 @@
<template slot-scope="scope">
<a v-if="scope.row.lx === '3'" :href="scope.row.wz" target="_blank"
style="color: #409EFF; text-decoration: underline;">
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
<dict-tag :options="dict.type.wjlx" :value="scope.row.lx" />
</a>
<span v-else>
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
<dict-tag :options="dict.type.wjlx" :value="scope.row.lx" />
</span>
</template>
</el-table-column>
@ -108,7 +105,7 @@
<el-date-picker v-model="form.scsj" type="date" placeholder="选择日期" value-format="yyyy-MM-dd"
style="width: 100%;" />
</el-form-item>
<el-form-item v-if="form.lx !== '3'" label="附件" prop="fj" required>
<el-form-item v-if="form.lx !== '3'" label="附件" prop="fj">
<fileload v-model="form.fj"></fileload>
</el-form-item>
<el-form-item v-if="form.lx === '3'" label="附件" prop="fj">
@ -262,15 +259,18 @@ export default {
],
scsj: [
{ required: true, message: "上传时间不能为空", trigger: "change" }
],
fj: [
{ required: true, message: "附件不能为空", trigger: "blur" }
]
},
//
fileTypeMap: {
1: "政策文件",
2: "研究报告",
3: "网络信息",
4: "其他",
},
// fileTypeMap: {
// 1: "",
// 2: "",
// 3: "",
// 4: "",
// },
select: 'http', //
//
upload: {
@ -285,7 +285,7 @@ export default {
//
headers: { Authorization: "Bearer " + getToken() },
//
url: process.env.VUE_APP_BASE_API + "",
url: process.env.VUE_APP_BASE_API + "/gysl/xmzsk/import",
},
};
},
@ -358,7 +358,7 @@ export default {
updateId: undefined,
updateTime: undefined
};
this.select = 'http'; //
this.select = 'https'; //
this.resetForm("form");
},
/** 搜索按钮操作 */
@ -389,6 +389,9 @@ export default {
const catalogId = row.id;
this.form = { ...row };
this.setProtocolType(this.form.wz); //
this.$nextTick(() => {
this.handleTypeChange(); // DOM
});
this.open = true;
this.title = "修改项目知识库";
},
@ -409,9 +412,7 @@ export default {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
}).catch(error => {
console.error('API Request Error:', error);
});
}).catch(error => { });
}
}
});
@ -419,7 +420,8 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const catalogIds = row.id || this.ids;
this.$modal.confirm('是否确认删除项目知识库编号为"' + catalogIds + '"的数据项?').then(() => {
const getFileName = row.name; // pjys
this.$modal.confirm(`是否确认删除"${getFileName}"的数据项?`).then(() => {
return deleteXmzsk([catalogIds]);
}).then(() => {
this.getList();
@ -463,10 +465,17 @@ export default {
if (this.form.lx !== '3') {
this.form.wz = undefined;
this.select = 'http';
// fj
this.rules.fj[0].required = true;
} else {
this.setProtocolType(this.form.wz);
// fj
this.rules.fj[0].required = false;
}
//
this.$refs.form.clearValidate('fj');
},
/**导出 */
// handleExport() {
// this.download(
@ -484,7 +493,7 @@ export default {
/** 下载模板操作 */
importTemplate() {
this.download(
"/gysl/ml/importTemplate",
"/gysl/xmzsk/importTemplate",
{},
`知识库导入模板${new Date().getTime()}.xlsx`
);

@ -18,9 +18,9 @@
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini"
<el-button type="primary" icon="el-icon-search"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -30,7 +30,7 @@
<!-- 表格内容区 -->
<div v-if="!previewMode" class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" align="center" prop="id" />
<el-table-column label="文件标题" align="center" prop="title" />
<el-table-column label="发布单位" align="center" prop="unit" />
@ -38,7 +38,7 @@
<el-table-column label="发布时间" align="center" prop="createTime" />
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="text" style="color: gray;"
<el-button type="text"
@click="handlePreview(scope.row)">预览</el-button>
</template>
</el-table-column>
@ -52,7 +52,7 @@
<div class="previewhead">
<h3>{{ previewData.title }}</h3>
<div class="headtwo">
<el-button size="mini" @click="previewMode = false">返回</el-button>
<el-button @click="previewMode = false">返回</el-button>
</div>
</div>
<div class="previewcontent">

@ -18,9 +18,9 @@
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini"
<el-button type="primary" icon="el-icon-search"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -30,15 +30,13 @@
<!-- 表格内容区 -->
<div v-if="!previewMode" class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="id" />
<el-table-column label="文件标题" align="center" prop="title" />
<el-table-column label="发布单位" align="center" prop="unit" />
<!-- <el-table-column label="发布人" align="center" prop="author" /> -->
<el-table-column label="发布时间" align="center" prop="createTime" />
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="text" style="color: gray;"
<el-button type="text"
@click="handlePreview(scope.row)">预览</el-button>
</template>
</el-table-column>
@ -52,7 +50,7 @@
<div class="previewhead">
<h3>{{ previewData.title }}</h3>
<div class="headtwo">
<el-button size="mini" @click="previewMode = false">返回</el-button>
<el-button @click="previewMode = false">返回</el-button>
</div>
</div>
<div class="previewcontent">

@ -45,14 +45,14 @@
<el-row>
<el-col :span="12">
<el-form-item label="项目名称" prop="name">
<el-input v-model="form.name" maxlength="50"></el-input>
<el-input v-model="form.name" maxlength="50" placeholder="请输入项目名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="建设地点" prop="jsdd">
<el-row :gutter="10">
<el-col :span="20">
<el-input v-model="form.jsdd" maxlength="50" readonly></el-input>
<el-input v-model="form.jsdd" maxlength="50" placeholder="请点击右侧落图" readonly></el-input>
</el-col>
<el-col :span="3">
<span @click="showMap" style="color: #2B62F1;cursor: pointer;">落图</span>
@ -64,12 +64,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="项目法人单位" prop="xmfrdwxz">
<el-input v-model="form.xmfrdwxz" maxlength="50"></el-input>
<el-input v-model="form.xmfrdwxz" maxlength="50" placeholder="请输入项目法人单位"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="重点发展产业" prop="prioritize">
<el-input v-model="form.prioritize" maxlength="50"></el-input>
<el-input v-model="form.prioritize" maxlength="50" placeholder="请输入重点发展产业"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -95,36 +95,36 @@
<el-row>
<el-col :span="12">
<el-form-item label="施工单位" prop="sgdw">
<el-input v-model="form.sgdw" maxlength="50"></el-input>
<el-input v-model="form.sgdw" maxlength="50" placeholder="请输入施工单位"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目标签" prop="label">
<el-input v-model="form.label" maxlength="50"></el-input>
<el-input v-model="form.label" maxlength="50" placeholder="请输入项目标签"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="设计单位" prop="sjdw">
<el-input v-model="form.sjdw" maxlength="50"></el-input>
<el-input v-model="form.sjdw" maxlength="50" placeholder="请输入设计单位"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目负责人" prop="projectLeader">
<el-input v-model="form.projectLeader" maxlength="50"></el-input>
<el-input v-model="form.projectLeader" maxlength="50" placeholder="请输入项目负责人"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="总投资额(万元)" prop="ztze">
<el-input v-model.number="form.ztze" maxlength="50"></el-input>
<el-input v-model.number="form.ztze" maxlength="50" placeholder="请输入总投资额"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系方式" prop="phone">
<el-input v-model="form.phone" maxlength="50"></el-input>
<el-input v-model="form.phone" maxlength="50" placeholder="请输入联系方式" ></el-input>
</el-form-item>
</el-col>
</el-row>
@ -139,7 +139,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="施工许可证发放时间" prop="issuingTime">
<el-input v-model="form.issuingTime" maxlength="50"></el-input>
<el-input v-model="form.issuingTime" maxlength="50" placeholder="请输入施工许可证发放时间"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -155,7 +155,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="竣工验收时间" prop="acceptanceTime">
<el-input v-model="form.acceptanceTime" maxlength="50"></el-input>
<el-input v-model="form.acceptanceTime" maxlength="50" placeholder="请输入竣工验收时间"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -170,14 +170,14 @@
</el-col>
<el-col :span="12">
<el-form-item label="建设进度" prop="jsjd">
<el-input v-model="form.jsjd" maxlength="50"></el-input>
<el-input v-model="form.jsjd" maxlength="50" placeholder="请输入建设进度"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="统一社会信用代码" prop="tyshxydm">
<el-input v-model="form.tyshxydm" maxlength="50"></el-input>
<el-input v-model="form.tyshxydm" maxlength="50" placeholder="请输入统一社会信用代码"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -194,10 +194,10 @@
</el-col>
</el-row>
<el-form-item label="项目法人单位简介" prop="unitIntroduction">
<el-input v-model="form.unitIntroduction" type="textarea" rows="4" maxlength="1000"></el-input>
<el-input v-model="form.unitIntroduction" type="textarea" rows="4" maxlength="1000" placeholder="请输入项目法人单位简介"></el-input>
</el-form-item>
<el-form-item label="项目简介" prop="introduction">
<el-input v-model="form.introduction" type="textarea" rows="4" maxlength="1000"></el-input>
<el-input v-model="form.introduction" type="textarea" rows="4" maxlength="1000" placeholder="请输入项目简介"></el-input>
</el-form-item>
<el-form-item label="项目代表性照片">
<ImageUpload v-model="form.fj" />

@ -13,8 +13,7 @@
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
新增
</el-button>
<el-button type="primary" size="medium" plain
v-if="buildings.length !== 0"
<el-button type="primary" size="medium" plain v-if="buildings.length !== 0"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;"
@click="handleEdit(selectedBuilding)">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
@ -44,8 +43,8 @@
:class="[getTagItemClass(building), { 'active-tag': selectedBuilding && selectedBuilding.id === building.id }]">
<img src="@/assets/images/detailsicon/icon-楼栋@2x.png" alt="">
<span>{{ building.name }}</span>
<img src="@/assets/images/detailsicon/icon-gb@2x.png" v-if="action === 'fill' || !action || action === 'okay'"
alt=""
<img src="@/assets/images/detailsicon/icon-gb@2x.png"
v-if="action === 'fill' || !action || action === 'okay'" alt=""
@click.stop="handleDelete(building.id)">
</div>
</div>
@ -114,7 +113,7 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="楼栋名称:" prop="name">
<el-input v-model="buildingForm.name"></el-input>
<el-input placeholder="请输入楼栋名称" v-model="buildingForm.name"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
@ -129,55 +128,55 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="首层高度(米):" prop="scgd">
<el-input v-model="buildingForm.scgd"></el-input>
<el-input v-model="buildingForm.scgd" placeholder="请输入首层高度"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="层数:" prop="floor">
<el-input v-model="buildingForm.floor"></el-input>
<el-input v-model="buildingForm.floor" placeholder="请输入层数"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="4层以上层高" prop="fourYscg">
<el-input v-model="buildingForm.fourYscg"></el-input>
<el-input v-model="buildingForm.fourYscg" placeholder="请输入层4层以上层高"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="柱距:" prop="zj">
<el-input v-model="buildingForm.zj"></el-input>
<el-input v-model="buildingForm.zj" placeholder="请输入柱距"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="2至4层层高" porp="twoAndFourCg">
<el-input v-model="buildingForm.twoAndFourCg"></el-input>
<el-input v-model="buildingForm.twoAndFourCg" placeholder="请输入2至4层层高"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总建筑高度(米):" prop="totalBuildingHeight">
<el-input v-model="buildingForm.totalBuildingHeight"></el-input>
<el-input v-model="buildingForm.totalBuildingHeight" placeholder="请输入总建筑高度"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="首层地面荷载(吨/平方米):" prop="scdmhz">
<el-input v-model="buildingForm.scdmhz"></el-input>
<el-input v-model="buildingForm.scdmhz" placeholder="请输入首层地面荷载"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="二至三层楼面荷载(吨/平方米):" prop="twoAndThreeLmhz">
<el-input v-model="buildingForm.twoAndThreeLmhz"></el-input>
<el-input v-model="buildingForm.twoAndThreeLmhz" placeholder="请输入二至三层楼面荷载"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="标准层面积(千平方米):" prop="bzcmj">
<el-input v-model="buildingForm.bzcmj"></el-input>
<el-input v-model="buildingForm.bzcmj" placeholder="请输入标准层面积"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
@ -200,7 +199,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="四层及以上楼面荷载(吨/平方米):" prop="fourYslmhz">
<el-input v-model="buildingForm.fourYslmhz"></el-input>
<el-input v-model="buildingForm.fourYslmhz" placeholder="请输入四层及以上楼面荷载"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -336,7 +335,6 @@ export default {
checkPermi,
checkRole,
/** 导出 */
/** 导出 */
handleExport() {
this.download(
"/gysl/buildingInformation/export",
@ -419,18 +417,17 @@ export default {
};
},
fetchBuildings() {
// console.log('Fetching data for xmId:', this.xmId);
getjzxxinformationByxmId({ xmId: this.xmId })
.then(response => {
// console.log('API response:', response);
if (response.code === 200 && response.data) {
this.buildings = Object.values(response.data); //
// console.log('Buildings data after assignment:', this.buildings);
this.buildings = Object.values(response.data);
//
if (this.buildings.length > 0) {
this.selectedBuilding = this.buildings[0];
}
} else {}
} else { }
})
},
@ -574,17 +571,6 @@ export default {
text-transform: none;
}
.tagitem {
width: 6.25rem;
height: 2rem;
background: #FAFAFA;
border-radius: 2.13rem 2.13rem 2.13rem 2.13rem;
display: flex;
justify-content: space-around;
align-items: center;
cursor: pointer;
}
.tagitem {
width: 6.25rem;
height: 2rem;
@ -616,7 +602,4 @@ export default {
background-color: rgba(43, 98, 241, 0.1);
}
.important-building {
background-color: rgba(43, 98, 241, 0.1);
}
</style>

@ -171,7 +171,7 @@ export default {
form: {
...this.qyrzInfo
},
tableData: [], //
tableData: [],
pagination: {
currentPage: 1,
pageSize: 10,
@ -192,7 +192,7 @@ export default {
};
},
created() {
this.fetchTableData(); //
this.fetchTableData();
},
methods: {
async fetchTableData() {
@ -202,21 +202,19 @@ export default {
this.tableData = response.data.records.map(item => ({ ...item, isEditing: false }));
this.pagination.total = response.data.total;
// form.rzqys
// form.rzqys
this.form.rzqys = this.tableData.length;
this.$emit('update-data', { ...this.form }); //
} catch (error) {
console.error('获取数据失败:', error);
}
this.$emit('update-data', { ...this.form });
} catch (error) {}
}
},
watch: {
qyrzInfo: {
handler(newVal) {
// tableData rzqys
// tableData rzqys
this.form = {
...newVal,
rzqys: this.tableData.length // 使 rzqys
rzqys: this.tableData.length //rzqys
};
},
immediate: true,
@ -232,12 +230,10 @@ export default {
size: this.pagination.pageSize
};
return getqyBasicInformationPage(params).then(response => {
// console.log('Fetched Data:', response.data.records);
this.tableData = response.data.records.map(item => ({
...item,
isEditing: false
}));
// console.log('Table Data:', this.tableData);
this.pagination.total = response.data.total;
}).catch();
},
@ -270,7 +266,6 @@ export default {
updateqyBasicInformation(row).then(response => {
this.$modal.msgSuccess('保存成功');
}).catch(error => {
console.error('保存失败:', error);
this.$modal.msgError('保存失败');
});
},
@ -279,15 +274,11 @@ export default {
deleteqyBasicInformation([id]).then(response => {
this.$modal.msgSuccess('删除成功');
this.tableData.splice(index, 1);
//
this.fetchTableData().then(() => {
// form
this.form.rzqys = this.tableData.length;
// save
this.save();
});
}).catch(error => {
console.error('删除失败:', error);
this.$modal.msgError('删除失败');
});
},
@ -331,7 +322,7 @@ export default {
this.$modal.msgWarning("请先选择文件");
return;
}
// xmId
// xmId
const formData = new FormData();
formData.append('file', this.$refs.upload.uploadFiles[0].raw);
formData.append('xmId', this.upload.data.xmId);

@ -6,7 +6,7 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>现场实况</span>
</div>
<div class="topright" v-if="action === 'fill' || !action">
<div class="topright" v-if="action === 'fill' || !action" style="visibility: hidden;">
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="">
<img src="../../../assets/images/detailsicon/icon-xz@2x.png" alt="编辑"

@ -6,9 +6,13 @@
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>月度进展信息</span>
</div>
<div class="topright" style="visibility: hidden;">
<el-button></el-button>
<el-button></el-button>
<div class="topright" v-if="action === 'fill' || !action || action === 'okay'">
<el-button type="primary" size="medium" plain v-if="checkRole(['admin', 'common'])"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="handleExport">
<img src="../../../assets/images/detailsicon/icon-dc@2x.png" alt="导出"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
导出
</el-button>
</div>
</div>
<!-- 内容区 -->
@ -22,18 +26,18 @@
<span :style="getStatusColor(scope.row.status)">{{ scope.row.status }}</span>
</template>
</el-table-column>
<el-table-column prop="monthlyInvestment" label="当月完成投资" align="center">
<el-table-column prop="monthDoneAmount" label="当月完成投资" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.monthlyInvestment"
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.monthDoneAmount"
style="width: 100%;"></el-input>
<span v-else>{{ scope.row.monthlyInvestment }}</span>
<span v-else>{{ scope.row.monthDoneAmount }}</span>
</template>
</el-table-column>
<el-table-column prop="cumulativeInvestment" label="累计完成投资" align="center">
<el-table-column prop="totalDoneAmount" label="累计完成投资" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.cumulativeInvestment"
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.totalDoneAmount"
style="width: 100%;"></el-input>
<span v-else>{{ scope.row.cumulativeInvestment }}</span>
<span v-else>{{ scope.row.totalDoneAmount }}</span>
</template>
</el-table-column>
<el-table-column prop="cumulativeArea" label='截止目前累计建成面积(平方米)' align="center">
@ -51,11 +55,10 @@
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.isEditing" size="mini" type="text" icon="el-icon-check"
<el-button v-if="scope.row.isEditing" type="text" icon="el-icon-check"
@click="handleSave(scope.row)">保存</el-button>
<el-button v-else size="mini" type="text" icon="el-icon-edit"
@click="handleEdit(scope.row)">编辑</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" style="color: #F25353;"
<el-button v-else type="text" icon="el-icon-edit" @click="handleEdit(scope.row)"></el-button>
<el-button type="text" icon="el-icon-delete" style="color: #F25353;"
@click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
@ -72,7 +75,11 @@
</template>
<script>
//
import { getMonthInformationPage } from "@/api/ManageApi/index";
//Apitwo
import { updateProjectProgress, deletemonth } from "@/api/manageApitwo/index";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
props: {
@ -94,6 +101,18 @@ export default {
};
},
methods: {
checkPermi,
checkRole,
/** 导出 */
handleExport() {
this.download(
"/gysl/projectProgress/export",
{
xmId: this.xmId
},
`月度信息${new Date().getTime()}.xlsx`
);
},
getStatusColor(status) {
switch (status) {
case "未更新":
@ -105,33 +124,78 @@ export default {
}
},
handleEdit(row) {
row.originalData = { ...row };
row.isEditing = true;
},
handleSave(row) {
row.isEditing = false;
console.log("保存:", row);
async handleSave(row) {
try {
const updateData = {
id: row.id,
monthDoneAmount: row.monthDoneAmount,
totalDoneAmount: row.totalDoneAmount,
cumulativeArea: row.cumulativeArea,
progressDetails: row.progressDetails,
};
const response = await updateProjectProgress(updateData);
if (response.code === 200) {
this.$message({
type: "success",
message: "保存成功!",
message: "更新成功!",
});
row.isEditing = false;
row.status = "已更新";
this.getMonthInformationPage();
} else {
this.$message.error(response.msg || "更新失败");
Object.assign(row, row.originalData);
}
} catch (error) {
console.error("更新失败:", error);
this.$message.error("更新失败");
Object.assign(row, row.originalData);
} finally {
delete row.originalData;
}
},
handleDelete(row) {
this.$confirm("你确定要删除此条记录吗?", "提示", {
this.$confirm("确定要删除此条月度进展记录吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
if (Array.isArray(this.tableData)) {
const index = this.tableData.indexOf(row);
if (index !== -1) {
this.tableData.splice(index, 1);
}
}
.then(async () => {
try {
//
const response = await deletemonth([row.id]);
if (response.code === 200) {
this.$message({
type: "success",
message: "删除成功!",
});
//
const index = this.tableData.findIndex(item => item.id === row.id);
if (index !== -1) {
this.tableData.splice(index, 1);
}
//
this.total -= 1;
//
if (this.tableData.length === 0 && this.current > 1) {
this.current -= 1;
this.getMonthInformationPage();
}
} else {
this.$message.error(response.msg || "删除失败");
}
} catch (error) {
console.error("删除失败:", error);
this.$message.error("删除失败,请稍后重试");
}
})
.catch(() => {
this.$message({
@ -174,6 +238,7 @@ export default {
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.content {
padding: 1rem;
display: flex;
@ -189,6 +254,7 @@ export default {
.topleft {
width: 8rem;
height: 2rem;
display: flex;
gap: 0.4rem;
align-items: center;

@ -36,7 +36,7 @@
<el-descriptions-item v-for="(item, index) in anotherInfo" :key="index" :label="item.zdname">
<template v-if="isEditMode">
<el-input v-model="item.zdinfor" size="small" @change="handleFieldChange(item)"
style="width:8rem;"></el-input>
style="width:7rem;"></el-input>
</template>
<template v-else>
{{ item.zdinfor }}
@ -332,7 +332,7 @@ export default {
.tagdiv {
width: 100%;
padding: 1rem;
padding: 1rem 2rem 1rem 0;
}
.block {

@ -31,15 +31,27 @@
<div class="content">
<div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="4" border>
<el-descriptions-item label="总用地面积(平方米)">
<el-descriptions-item>
<template slot="label">
<span style="color: red;">*</span>
总用地面积(平方米)
</template>
<el-input v-if="isEditing" v-model="form.zydmj" style="width: 100%;"></el-input>
<span v-else>{{ form.zydmj }}</span>
</el-descriptions-item>
<el-descriptions-item label="容积率">
<el-descriptions-item>
<template slot="label">
<span style="color: red;">*</span>
容积率
</template>
<el-input v-if="isEditing" v-model="form.rjl" style="width: 100%;"></el-input>
<span v-else>{{ form.rjl }}</span>
</el-descriptions-item>
<el-descriptions-item label="总建筑面积(平方米)">
<el-descriptions-item>
<template slot="label">
<span style="color: red;">*</span>
总建筑面积平方米
</template>
<el-input v-if="isEditing" v-model="form.zjzmj" style="width: 100%;"></el-input>
<span v-else>{{ form.zjzmj }}</span>
</el-descriptions-item>
@ -59,7 +71,11 @@
<el-input v-if="isEditing" v-model="form.ldl" style="width: 100%;"></el-input>
<span v-else>{{ form.ldl }}</span>
</el-descriptions-item>
<el-descriptions-item label="建筑栋数(栋)">
<el-descriptions-item>
<template slot="label">
<span style="color: red;">*</span>
建筑栋数
</template>
<el-input v-if="isEditing" v-model="form.jzds" style="width: 100%;"></el-input>
<span v-else>{{ form.jzds }}</span>
</el-descriptions-item>
@ -71,7 +87,11 @@
<el-input v-if="isEditing" v-model="form.dxjzmj" style="width: 100%;"></el-input>
<span v-else>{{ form.dxjzmj }}</span>
</el-descriptions-item>
<el-descriptions-item label="最高建筑层数(层)">
<el-descriptions-item>
<template slot="label">
<span style="color: red;">*</span>
最高建筑层数
</template>
<el-input v-if="isEditing" v-model="form.zgjzcs" style="width: 100%;"></el-input>
<span v-else>{{ form.zgjzcs }}</span>
</el-descriptions-item>
@ -87,7 +107,11 @@
<el-input v-if="isEditing" v-model="form.fjdctcw" style="width: 100%;"></el-input>
<span v-else>{{ form.fjdctcw }}</span>
</el-descriptions-item>
<el-descriptions-item label="防火等级">
<el-descriptions-item>
<template slot="label">
<span style="color: red;">*</span>
防火等级
</template>
<el-input v-if="isEditing" v-model="form.fhdj" style="width: 100%;"></el-input>
<span v-else>{{ form.fhdj }}</span>
</el-descriptions-item>
@ -192,7 +216,6 @@ export default {
methods: {
checkPermi,
checkRole,
//
/** 导出 */
handleExport() {
this.download(

@ -61,8 +61,8 @@ export default {
map: null,
keyword: "", //
searchList: [], //
searchBox: false, //
searchDebounce: null, //
searchBox: false,
searchDebounce: null,
};
},
methods: {
@ -205,8 +205,8 @@ export default {
.main-content {
display: flex;
width: 82rem;
padding: 0 1rem 1rem 1rem;
width: 74rem;
padding: 0 1rem 1rem 0rem;
}
.map-container {

@ -39,8 +39,6 @@ import 'mars2d/mars2d.css';
import * as mars2d from 'mars2d';
import axios from 'axios';
const attributionHtml = `©2024 高德软件- <span>审图号GS(2021)6375号</span>
- 甲测资字11111093 - <a href="https://map.amap.com/doc/serviceitem.html" target="_blank" trace="tos">服务条款</a> `
export default {
data() {
@ -163,7 +161,6 @@ export default {
this.$message.warning('未能获取详细地址信息');
}
}).catch(error => {
console.error('逆地理编码失败:', error);
this.$message.error('获取地址信息失败');
}).finally(() => {
this.loadingAddress = false;

@ -1,4 +1,5 @@
<template>
<!-- 标签管理 -->
<div class="descriptionsdivtwo">
<div class="tablehead">
<div class="headleft">
@ -13,9 +14,9 @@
<!-- 按照type分组显示 -->
<div class="type-group" v-for="group in groupedTags" :key="group.type">
<div class="group-title" @click="toggleGroup(group.type)">
<div>
<div style="display: flex; align-items: center;gap: .5rem;">
<i :class="isGroupOpen(group.type) ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
{{ TypeMap[group.type] }}
<dict-tag :options="dict.type.bqlx" :value="group.type" />
</div>
<div v-if="(action === 'fill' || !action || action === 'okay') && checkRole(['admin', 'common'])">
<el-button size="mini" type="text" icon="el-icon-delete" style="color: #F25353;"
@ -115,15 +116,6 @@ export default {
type: [{ required: true, message: '请选择标签类型', trigger: 'change' }],
name: [{ required: true, message: '请输入标签名称', trigger: 'blur' }]
},
TypeMap: {
1: "新一代信息技术",
2: "高端装备制造",
3: "生物医药及大健康",
4: "纳米技术应用及新材料",
5: "人工智能及数字产业",
6: "新能源及绿色产业"
},
openGroups: []
}
},

@ -43,12 +43,12 @@
</el-radio-group>
</el-form-item>
<el-form-item label="提醒方法" prop="method">
<!-- <el-form-item label="提醒方法" prop="method">
<el-radio-group v-model="ruleForm.method">
<el-radio label="短信提醒" disabled>短信提醒</el-radio>
<el-radio label="邮件提醒" disabled>邮件提醒</el-radio>
</el-radio-group>
</el-form-item>
</el-form-item> -->
<el-form-item
label="提醒时间"
@ -124,7 +124,7 @@
data() {
return {
dialogVisible: false,
dialogTitle: "新增智能提醒规则",
dialogTitle: "新增智能提醒",
ruleForm: {
rulesName: "",
alertRecipients: "2",

@ -137,6 +137,7 @@ export default {
if (year) {
this.selectedYear = year;
this.fetchProjectData();
this.$emit('year-change', this.selectedYear); //
}
},

@ -4,13 +4,6 @@
<div class="top">
<div class="title">整体项目情况</div>
<div class="importdiv">
<!-- <el-date-picker v-model="selectedYear" type="year" placeholder="选择年份" format="yyyy"
value-format="yyyy" @change="handleYearChange">
</el-date-picker> -->
<!-- <el-button icon="el-icon-upload2" style="background-color: #2B62F1; color: #FFFFFF;"
@click="handleExport">
报告导出
</el-button> -->
</div>
</div>
<div class="mainarea">

@ -1,10 +1,11 @@
<template>
<!-- 产业导向目录分析 -->
<div>
<div class="itemsall">
<span>{{ totalCount }}</span>
<span>项目总数</span>
</div>
<div ref="chart" style="width: 30rem; height: 13rem;"></div>
<div ref="chart" style="width: 30rem; height: 9rem;"></div>
</div>
</template>
@ -59,14 +60,14 @@ export default {
orient: 'vertical', //
right: '10%', //
top: 'center', //
itemGap: 50, //
itemGap: 30, //
formatter: function (name) {
//
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value}`;
}.bind(this),
textStyle: {
fontSize: 16, //
fontSize: 14, //
fontfamily: 'alibold'
}
},
@ -78,7 +79,7 @@ export default {
center: ['30%', '50%'],
data: this.chartData,
label: {
show: false //
show: false
},
emphasis: {
itemStyle: {
@ -104,14 +105,14 @@ export default {
flex-direction: column;
justify-content: center;
align-items: center;
top: 3.8rem;
left: 7rem;
top: 3.2rem;
left: 7.5rem;
}
.itemsall span:nth-child(1) {
font-family: DINbold;
font-weight: 500;
font-size: 2rem;
font-size: 1.2rem;
color: #292C33;
text-align: left;
font-style: normal;
@ -121,7 +122,7 @@ export default {
.itemsall span:nth-child(2) {
font-family: alibold;
font-weight: 400;
font-size: 1rem;
font-size: .7rem;
color: #9E9E9E;
text-align: left;
font-style: normal;

@ -1,10 +1,11 @@
<template>
<!-- 产业数据分析 -->
<div>
<div class="itemsall">
<span>{{ totalCount }}</span>
<span>项目总数</span>
</div>
<div ref="chart" style="width: 30rem; height: 13rem;"></div>
<div ref="chart" style="width: 30rem; height: 9rem;"></div>
</div>
</template>
@ -17,7 +18,7 @@ export default {
data() {
return {
chartData: [
{ value: 54, name: '细分产业分析', itemStyle: { color: '#36C3FB' } },
{ value: 54, name: '细分产业分析', itemStyle: { color: '#36C3FB' }},
{ value: 65, name: '目录分析', itemStyle: { color: '#F6B600' } },
],
totalCount: 0
@ -31,9 +32,9 @@ export default {
const response = await allchanye();
if (response && response.code === 200 && response.data) {
this.chartData = this.processData(response.data);
this.calculateTotal(); //
this.calculateTotal();
this.renderChart();
} else {}
} else { }
},
processData(data) {
const names = ['细分产业分析', '目录分析'];
@ -59,12 +60,16 @@ export default {
orient: 'vertical', //
right: '10%', //
top: 'center', //
itemGap: 50, //
itemGap: 30, //
formatter: function (name) {
//
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value}`;
}.bind(this)
}.bind(this),
textStyle: {
fontSize: 14, //
fontfamily: 'alibold'
}
},
series: [
{
@ -100,14 +105,14 @@ export default {
flex-direction: column;
justify-content: center;
align-items: center;
top: 3.8rem;
left: 7rem;
top: 3.2rem;
left: 7.5rem;
}
.itemsall span:nth-child(1) {
font-family: DINbold;
font-weight: 500;
font-size: 2rem;
font-size: 1.2rem;
color: #292C33;
text-align: left;
font-style: normal;
@ -117,7 +122,7 @@ export default {
.itemsall span:nth-child(2) {
font-family: alibold;
font-weight: 400;
font-size: 1rem;
font-size: .7rem;
color: #9E9E9E;
text-align: left;
font-style: normal;

@ -1,12 +1,14 @@
<template>
<!-- 产业导向细分产业分析 -->
<div class="progress-container">
<div class="progress-item" v-for="(item, index) in progressData" :key="index">
<span class="progress-label">{{ item.label }}</span>
<div class="progress-bar-wrapper">
<div class="progress-bar" :style="{ width: item.percentage + '%', background: item.color }">
<div class="progress-bar" :style="getProgressBarStyle(item)">
</div>
</div>
<span class="progress-value">{{item.value}}</span>
<span class="progress-value">{{item.value}}
</span>
</div>
</div>
</template>
@ -18,7 +20,9 @@ export default {
name: 'ProgressBarWithLabel',
data() {
return {
progressData: [],
progressData: [
],
maxValue: 0
};
},
@ -29,13 +33,10 @@ export default {
async fetchData() {
try {
const response = await allchanyexfcyfx();
// response.data
const data = response.data;
//
this.maxValue = Math.max(...data.map(item => item.count));
// progressData
this.progressData = data.map((item, index) => ({
label: item.ssgnq,
value: item.count,
@ -45,6 +46,19 @@ export default {
} catch (error) {
console.error('Error fetching data:', error);
}
},
getProgressBarStyle(item) {
if (item.value === 0) {
return {
width: '100%',
background: '#e0e0e0'
};
} else {
return {
width: item.percentage + '%',
background: 'linear-gradient(90deg, #ffffff, #5B76F9)'
};
}
}
}
};
@ -53,9 +67,10 @@ export default {
<style scoped>
.progress-container {
width: 100%;
max-width: 34rem;
margin: 0 auto;
font-family: Arial, sans-serif;
height: 9rem;
padding: 0 3rem 0 0;
overflow: auto;
font-family: aliregular;
}
.progress-item {
@ -91,7 +106,6 @@ export default {
.progress-value {
width: 1.5rem;
/* background-color: red; */
text-align: right;
margin-left: .3rem;
color: #333;

@ -1,13 +0,0 @@
<template>
<div>
<div>123</div>
</div>
</template>
<script>
</script>
<style scoped>
</style>

@ -7,17 +7,15 @@
<el-table-column label="项目名称" align="center" prop="name" width="200" />
<el-table-column label="当前状态" align="center" prop="status">
<template slot-scope="scope">
<span :style="{ color: statusColors[statusMap[scope.row.status]] }">{{
statusMap[scope.row.status] }}</span>
<dict-tag :options="dict.type.tbzt" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="getInfo(scope.row, 'fill')"
<el-button type="text" @click="getInfo(scope.row, 'fill')"
v-if="statusMap[scope.row.status] === '待填报'">填报</el-button>
<el-button size="mini" type="text" @click="getInfo(scope.row, 'detail')"
v-if="statusMap[scope.row.status] !== '待填报'"
>详情</el-button>
<el-button type="text" @click="getInfo(scope.row, 'detail')"
v-if="statusMap[scope.row.status] !== '待填报'">详情</el-button>
</template>
</el-table-column>
</el-table>
@ -31,7 +29,7 @@ import { checkPermi, checkRole } from "@/utils/permission";
export default {
name: "TableContent",
dicts: ["xzfl"],
dicts: ["xzfl", 'tbzt'],
data() {
return {
//
@ -114,7 +112,7 @@ export default {
/** 详情按钮操作 */
getInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
this.$store.commit("SET_CRUMBS", "项目详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-info/${id}`, query: { action: type } });
},

@ -1,6 +1,7 @@
<template>
<!-- 功能区 -->
<div ref="chart" style="width: 30rem; height: 10rem;"></div>
<div style="width: 100%; height: 100%;">
<div ref="chart" style="width: 100%; height: 100%;"></div>
</div>
</template>
<script>
@ -9,8 +10,15 @@ import { fungong } from '@/api/ManageApi/index';
export default {
name: 'FunctionChart',
props: {
years: {
type: String,
default: new Date().getFullYear().toString()
}
},
data() {
return {
functionnumber: 0,
chartData: [
{ value: 54, name: '高端制造与国际贸易区', itemStyle: { color: '#36C3FB' } },
{ value: 65, name: '独墅湖科教创新区', itemStyle: { color: '#5B76F9' } },
@ -23,15 +31,27 @@ export default {
mounted() {
this.getData();
},
watch: {
years: {
immediate: true,
handler(newVal) {
this.getData();
}
}
},
methods: {
async getData() {
try {
const response = await fungong();
const response = await fungong({ years: this.years });
if (response && response.code === 200 && response.data) {
const totalnumber = response.data.reduce((sum, item) => sum + item.count, 0);
this.functionnumber = totalnumber;
this.chartData = this.processData(response.data);
this.renderChart();
} else { }
} catch (error) { }
} else {
}
} catch (error) {
}
},
processData(data) {
const names = ['高端制造与国际贸易区', '独墅湖科教创新区', '阳澄湖半岛旅游度假区', '金鸡湖商务区', '苏相合作区'];
@ -58,16 +78,43 @@ export default {
}
},
legend: {
orient: 'vertical', //
right: '0%', //
top: 'center', //
itemGap: 18, //
orient: 'vertical',
right: '10%',
top: 'center',
itemGap: 10,
formatter: function (name) {
//
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value}`;
}.bind(this),
},
graphic: [
{
type: 'text',
left: '29%',
top: '40%',
style: {
text: this.functionnumber.toString(),
textAlign: 'center',
fill: '#292C33',
fontSize: '1.25rem',
fontFamily: 'DINbold',
fontWeight: '500'
}
},
{
type: 'text',
left: '26%',
top: '55%',
style: {
text: '项目总数',
textAlign: 'center',
fill: '#9E9E9E',
fontSize: '0.68rem',
fontFamily: 'alibold',
fontWeight: '400'
}
}
],
series: [
{
name: '项目分布',
@ -76,7 +123,7 @@ export default {
center: ['30%', '50%'],
data: this.chartData,
label: {
show: false //
show: false
},
emphasis: {
itemStyle: {

@ -1,17 +1,24 @@
<template>
<!-- 投资主体 -->
<div ref="chart" style="width: 30rem; height: 10rem;"></div>
<div style="width: 100%; height: 100%;">
<div ref="chart" style="width: 100%; height: 100%;"></div>
</div>
</template>
<script>
import * as echarts from 'echarts';
import { investall } from '@/api/ManageApi/index';
export default {
name: 'RingChart',
props: {
years: {
type: String,
default: new Date().getFullYear().toString()
}
},
data() {
return {
functionnumber: 0,
chartData: [
{ value: 54, name: '国企', itemStyle: { color: '#36C3FB' } },
{ value: 65, name: '民企', itemStyle: { color: '#5B76F9' } },
@ -23,21 +30,36 @@ export default {
mounted() {
this.getData();
},
watch: {
years: {
immediate: true,
handler(newVal) {
this.getData();
}
}
},
methods: {
async getData() {
const response = await investall();
const response = await investall({
years: this.years,
});
if (response && response.code === 200 && response.data) {
const totalCount = response.data.reduce((sum, item) => sum + item.count, 0);
this.functionnumber = totalCount;
this.chartData = this.processData(response.data);
this.renderChart();
} else {}
},
processData(data) {
const names = ['国企', '民企', '外企','其他'];
const names = ['国企', '民企', '外企', '其他'];
const counts = data.map(item => item.count);
const total = counts.reduce((sum, count) => sum + count, 0);
return names.map((name, index) => ({
value: counts[index] || 0,
name: name,
itemStyle: { color: ['#36C3FB', '#5B76F9', '#FAC858'][index] },
itemStyle: { color: ['#36C3FB', '#5B76F9', '#FAC858', '#50DFB3'][index] },
percent: total > 0 ? ((counts[index] || 0) / total * 100).toFixed(2) : '0.00'
}));
},
renderChart() {
@ -45,19 +67,47 @@ export default {
const myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item'
trigger: 'item',
formatter: ({name, value, percent}) => `${name}: ${value}个 (${percent}%)`
},
legend: {
orient: 'vertical', //
right: '20%', //
top: 'center', //
itemGap: 30, //
orient: 'vertical',
right: '27.7%',
top: 'center',
itemGap: 18,
formatter: function (name) {
//
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value}`;
}.bind(this)
},
graphic: [
{
type: 'text',
left: '29%',
top: '40%',
style: {
text: this.functionnumber.toString(),
textAlign: 'center',
fill: '#292C33',
fontSize: 20,
fontFamily: 'DINbold',
fontWeight: '500'
}
},
{
type: 'text',
left: '26%',
top: '55%',
style: {
text: '项目总数',
textAlign: 'center',
fill: '#9E9E9E',
fontSize: '0.68rem',
fontFamily: 'alibold',
fontWeight: '400'
}
}
],
series: [
{
name: '项目分布',
@ -66,7 +116,7 @@ export default {
center: ['30%', '50%'],
data: this.chartData,
label: {
show: false //
show: false
},
emphasis: {
itemStyle: {
@ -85,4 +135,5 @@ export default {
};
</script>
<style scoped></style>
<style scoped>
</style>

@ -33,6 +33,7 @@
<!-- 右侧地图区域 -->
<div class="map-container">
<div id="mars2dContainerSSS" class="mars2d-container"></div>
</div>
</div>
</div>
@ -67,7 +68,11 @@ import ProjectList from '@/views/components/analysis/projectList.vue'
import { getBasicInformationPage } from "@/api/ManageApi/index";
import { debounce } from 'lodash';
//
import suzhouData from '@/assets/json/suzhou.json'
//
//
const clickOutside = {
bind(el, binding, vnode) {
el.clickOutsideEvent = function (event) {
@ -92,6 +97,8 @@ export default {
data() {
const basePathUrl = window.basePathUrl || "";
return {
markerIcon: require('@/assets/images/detailsicon/icon-定位@2x.png'),
projectMarker: null,
isCollapsed: false,
searchBox: '',
searchList: [],
@ -138,11 +145,11 @@ export default {
show: true
}
],
center: { lat: 31.3456, lng: 120.5957 },
center: { lat: 31.3356, lng: 120.7157 },
zoom: 11,
minZoom: 10,
maxZoom: 20,
zoomControl: true,
// zoomControl: true,
chinaCRS: 'GCJ02'
},
map: null
@ -166,22 +173,18 @@ export default {
this.map.on('load', this.onMapLoad);
},
//
onMapLoad() {
// console.log('');
this.addSuzhouIndustrialParkLayer();
},
//
//
async addSuzhouIndustrialParkLayer() {
try {
const response = await fetch('/config/suzhou.json');
const geoJsonData = await response.json();
const geoJsonData = suzhouData; // 使
const graphicLayer = new mars2d.layer.GraphicLayer({
name: "苏州园区高亮区域",
zIndex: 10
});
this.map.addLayer(graphicLayer);
// 3. GeoJSON
const polygon = mars2d.Util.geoJsonToGraphics(geoJsonData, {
style: {
fill: true,
@ -195,14 +198,9 @@ export default {
tooltip: "苏州工业园区"
});
graphicLayer.addGraphic(polygon);
} catch (error) {}
},
handleClear() {
this.showLocationIcon = false;
this.searchList = [];
this.hasSearched = false;
} catch (error) {
console.error('加载苏州园区数据失败:', error);
}
},
toggleCollapse() {
this.isCollapsed = !this.isCollapsed;
@ -212,6 +210,7 @@ export default {
this.searchList = [];
this.hasSearched = false;
this.showLocationIcon = false;
this.showLocationIcon = false;
return;
}
this.debouncedSearch();
@ -234,18 +233,23 @@ export default {
this.hasSearched = true;
if (response && response.code === 200 && response.data) {
this.searchList = response.data.records;
if (this.searchList.length === 0) {
this.$message.warning('查无此项目');
}
} else {
this.searchList = [];
this.$message.warning('查无此项目');
}
})
.catch(error => {
console.error('搜索失败:', error);
this.hasSearched = true;
this.searchList = [];
this.$message.error('搜索失败,请重试');
});
},
centerMap(item) {
if (!item.jsdd) {
if (!item.longitude || !item.latitude) {
this.$message.warning('该项目未落图!');
return;
}
@ -267,56 +271,61 @@ export default {
this.map.flyTo([lat, lng], 17);
}
this.showLocationIcon = true;
this.setRandomIconPosition();
this.showDialog();
//
this.map.flyTo([item.latitude, item.longitude], 17);
//
this.addProjectMarker(item);
},
handleClear() {
this.showLocationIcon = false;
this.searchList = [];
this.hasSearched = false;
this.searchBox = '';
this.dialogVisible = false;
//
if (this.projectMarker) {
this.map.removeLayer(this.projectMarker);
this.projectMarker = null;
}
this.map.setView(this.mapOptions.center, this.mapOptions.zoom);
},
addProjectMarker(item) {
if (this.projectMarker) {
this.map.removeLayer(this.projectMarker);
}
this.projectMarker = new mars2d.graphic.Marker({
latlng: [item.latitude, item.longitude],
style: {
image: this.markerIcon,
width: 32,
height: 44,
anchor: [16, 44]
},
interactive: true,
cursor: 'pointer'
});
//
this.projectMarker.on(mars2d.EventType.click, (event) => {
this.selectedProject = { ...item };
this.dialogVisible = true;
});
this.map.addLayer(this.projectMarker);
},
showDialog() {
if (this.selectedProject.name) {
this.dialogVisible = true;
} else {
this.$message.warning('请选择一个项目');
}
},
closeDialog() {
this.dialogVisible = false;
},
setRandomIconPosition() {
//
const maxTop = 105;
const maxLeft = 110;
const randomTop = Math.floor(Math.random() * maxTop);
const randomLeft = Math.floor(Math.random() * maxLeft);
this.iconPosition = {
position: 'absolute',
top: `${randomTop}px`,
left: `${randomLeft}px`,
cursor: 'pointer'
};
}
}
}
</script>
<style scoped>
.container {
position: relative;
}
.containertwo {
position: relative;
}
.mapareaone {
height: 24.5rem;
grid-column: span 2;
width: 100%;
position: relative;
}
/* 控制按钮样式 */
.collapse-control {
position: absolute;
left: -1.5rem;
@ -328,7 +337,7 @@ export default {
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
z-index: 1001;
transition: all 0.3s ease;
}
@ -338,7 +347,7 @@ export default {
}
.leftdiv {
width: 36%;
width: 38%;
height: 100%;
position: absolute;
left: 0rem;
@ -346,7 +355,9 @@ export default {
background: #FFFFFF;
border-radius: 0.5rem;
transition: all 0.3s ease;
z-index: 9999;
z-index: 1000;
overflow: hidden;
overflow-y: auto;
}
.mainarea {
@ -354,20 +365,6 @@ export default {
overflow: auto;
}
.blueicon {
width: 20rem;
height: 20rem;
position: absolute;
background-image: url(../../../assets/images/行政区划@2x.png);
background-repeat: no-repeat;
background-size: 100% 100%;
top: 4.5rem;
right: 7.4rem;
display: flex;
justify-content: center;
align-items: center;
}
.icondiv {
width: 8rem;
height: 8rem;
@ -389,7 +386,7 @@ export default {
position: absolute;
right: 1rem;
top: 1rem;
z-index: 9999;
z-index: 900;
}
.search-results {
@ -401,7 +398,7 @@ export default {
border: 1px solid #E5E5E5;
border-radius: 0.5rem;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
z-index: 9999;
z-index: 900;
max-height: 15rem;
overflow-y: auto;
}
@ -425,12 +422,12 @@ export default {
color: #606266;
}
/* 悬浮div样式 */
/* 悬浮div */
.app-container {
position: absolute;
top: 19%;
left: 39%;
height: 17rem;
top: 20%;
left: 53%;
height: 15rem;
width: 18rem;
background-color: #fff;
border-radius: 4px;
@ -488,7 +485,24 @@ export default {
font-family: aliregular;
}
/* 地图容器样式 */
/* 所有容器 */
.container {
position: relative;
height: 100%;
}
.mapareaone {
height: 100%;
grid-column: span 2;
width: 100%;
position: relative;
}
.containertwo {
height: 100%;
position: relative;
}
.map-container {
width: 100%;
height: 100%;

@ -1,8 +1,8 @@
<template>
<div class="container">
<el-table :data="tableData" style="width: 100%" :show-header="false" @row-click="handleRowClick">
<el-table-column width="80">
<template slot-scope="scope">
<el-table-column>
<template slot-scope="scope" width="80">
<img :src="getIcon(scope.$index)" alt="icon" style="width: 2.19rem; height: 1.25rem;">
</template>
</el-table-column>
@ -13,21 +13,18 @@
</span>
</template>
</el-table-column>
<el-table-column prop="date" width="100">
<el-table-column prop="alertTime">
<template slot-scope="scope">
{{ scope.row.date }}
{{ formatDate(scope.row.alertTime) }}
</template>
</el-table-column>
</el-table>
<!-- <div v-if="tableData.length === 0" class="no-data">
暂无数据
</div> -->
<!-- 详情弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">
<div>
<p><strong>时间:</strong> {{ selectedMessage.date || '暂无' }}</p>
<p><strong>内容:</strong> {{ selectedMessage.name }}</p>
<p><strong>时间:</strong> {{ selectedMessage.alertTime}}</p>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleConfirm"></el-button>
@ -50,7 +47,7 @@ export default {
selectedMessage: {
id: '',
name: '',
date: ''
alertTime: ''
},
dialogTitle: '消息详情'
};
@ -70,7 +67,7 @@ export default {
return data.map(item => ({
id: item.id,
name: item.content,
date: this.formatDate(item.createTime),
alertTime: item.alertTime,
isRead: item.isRead // isRead
}));
},
@ -122,10 +119,10 @@ export default {
<style scoped>
.container {
width: 98%;
height: 14.5rem;
height: 11.5rem;
/* background-color: lightblue; */
}
.no-data{
.no-data {
color: gray;
}
</style>

@ -1,8 +1,8 @@
<template>
<div class="container">
<el-table :data="tableData" style="width: 100%" :show-header="false" @row-click="handleRowClick">
<el-table-column width="80">
<template slot-scope="scope">
<el-table-column>
<template slot-scope="scope" width="80">
<img :src="getIcon(scope.$index)" alt="icon" style="width: 2.19rem; height: 1.25rem;">
</template>
</el-table-column>
@ -13,21 +13,18 @@
</span>
</template>
</el-table-column>
<el-table-column prop="date" width="100">
<el-table-column prop="alertTime">
<template slot-scope="scope">
{{ scope.row.date }}
{{ formatDate(scope.row.alertTime) }}
</template>
</el-table-column>
</el-table>
<!-- <div v-if="tableData.length === 0" class="no-data">
暂无数据
</div> -->
<!-- 详情弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">
<div>
<p><strong>时间:</strong> {{ selectedMessage.date || '暂无' }}</p>
<p><strong>内容:</strong> {{ selectedMessage.name }}</p>
<p><strong>时间:</strong> {{ selectedMessage.alertTime}}</p>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleConfirm"></el-button>
@ -37,7 +34,6 @@
</div>
</template>
<script>
import { getAllMessagestwo } from '@/api/ManageApi/index';
import { markSmartReminderAsRead } from '@/api/ManageApi/index';
@ -51,7 +47,7 @@ export default {
selectedMessage: {
id: '',
name: '',
date: ''
alertTime: ''
},
dialogTitle: '消息详情'
};
@ -71,7 +67,7 @@ export default {
return data.map(item => ({
id: item.id,
name: item.content,
date: this.formatDate(item.createTime),
alertTime: item.alertTime,
isRead: item.isRead // isRead
}));
},
@ -122,10 +118,11 @@ export default {
<style scoped>
.container {
width: 30rem;
height: 14.5rem;
width: 98%;
height: 11.5rem;
/* background-color: lightblue; */
}
.no-data{
.no-data {
color: gray;
}
</style>

@ -139,7 +139,7 @@ export default {
/** 详情按钮操作 */
getInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
this.$store.commit("SET_CRUMBS", "项目详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-add/${id}`, query: { action: type } });
},

File diff suppressed because it is too large Load Diff

@ -50,9 +50,9 @@
<!-- 表格内容区 -->
<div class="tablebox">
<!-- 标签行 -->
<div class="tablehead">
<!-- <div class="tablehead">
<div class="headtitle"><span>项目清单</span></div>
</div>
</div> -->
<!-- 导入弹窗 -->
<el-dialog title="导入" :visible.sync="upload.open" width="400px" append-to-body>
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
@ -74,7 +74,7 @@
</div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" stripe>
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{ (scope.$index + 1) + (queryParams.current - 1) * queryParams.size }}
@ -83,7 +83,7 @@
<el-table-column label="项目名称" align="center" prop="name" width="200" />
<el-table-column label="现状分类" align="center" prop="xzfl">
<template slot-scope="scope">
<span>{{ xzflMap[scope.row.xzfl] }}</span>
<dict-tag :options="dict.type.xzfl" :value="scope.row.xzfl" />
</template>
</el-table-column>
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" width="200" />
@ -97,11 +97,10 @@
<el-table-column label="总用地面积(平方米)" align="center" width="180" prop="zydmj" />
<el-table-column label="当前状态" align="center" prop="status">
<template slot-scope="scope">
<span :style="{ color: statusColors[statusMap[scope.row.status]] }">{{
statusMap[scope.row.status] }}</span>
<dict-tag :options="dict.type.tbzt" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" >
<template slot-scope="scope">
<el-button size="medium" type="text" @click="getInfo(scope.row, 'fill')"
v-if="statusMap[scope.row.status] === '待填报'">填报</el-button>
@ -122,7 +121,7 @@ import { getToken } from "@/utils/auth";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
name: "Post",
dicts: ["xzfl"],
dicts: ["xzfl", "tbzt"],
data() {
return {
//
@ -151,11 +150,6 @@ export default {
2: '待审核',
3: '审核通过'
},
xzflMap: {
1: '已建',
2: '在建',
3: '拟建'
},
//
queryParams: {
current: 1,
@ -261,7 +255,7 @@ export default {
/** 详情按钮操作 */
getInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
this.$store.commit("SET_CRUMBS", "项目详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-info/${id}`, query: { action: type } });
},

@ -41,9 +41,8 @@
<el-row>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="medium"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="medium" @click="resetQuery"></el-button>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -52,13 +51,9 @@
<!-- 表格内容区 -->
<div class="tablebox">
<!-- 标签行 -->
<div class="tablehead">
<!-- <div class="tablehead">
<div class="headtitle"><span>项目清单</span></div>
<div class="headbtn">
<el-button type="primary" icon="el-icon-download" @click="importTemplate"></el-button>
<el-button type="primary" size="mini" @click="handleImport"></el-button>
</div>
</div>
</div> -->
<!-- 导入弹窗 -->
<el-dialog title="导入" :visible.sync="upload.open" width="400px" append-to-body>
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
@ -79,15 +74,23 @@
<div class="tablebtntwo">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-upload2" size="medium"
@click="handleExport">导出</el-button>
<el-button type="primary" @click="handleExport"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" size="medium" @click="handleExporttwo">
<el-button type="primary" @click="handleExporttwo">
单片材料导出
</el-button>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-download" @click="importTemplate"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" @click="handleImport"></el-button>
</el-col>
</el-row>
</div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" stripe>
<el-table-column type="selection" width="55" align="center" />
@ -99,7 +102,7 @@
<el-table-column label="项目名称" align="center" prop="name" width="200" />
<el-table-column label="现状分类" align="center" prop="xzfl">
<template slot-scope="scope">
<span>{{ xzflMap[scope.row.xzfl] }}</span>
<dict-tag :options="dict.type.xzfl" :value="scope.row.xzfl" />
</template>
</el-table-column>
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" width="200" />
@ -113,20 +116,18 @@
<el-table-column label="总用地面积(平方米)" align="center" width="180" prop="zydmj" />
<el-table-column label="当前状态" align="center" prop="status">
<template slot-scope="scope">
<span :style="{ color: statusColors[statusMap[scope.row.status]] }">{{
statusMap[scope.row.status] }}</span>
<dict-tag :options="dict.type.tbzt" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="medium" type="text" @click="getAdd(scope.row, 'fill')"
v-if="statusMap[scope.row.status] === '待审核'">详情</el-button>
<el-button size="medium" type="text" @click="getAdd(scope.row, 'okay')"
v-if="statusMap[scope.row.status] === '审核通过'">详情</el-button>
<el-button size="medium" type="text" @click="getAdd(scope.row, 'detail')"
v-if="statusMap[scope.row.status] === '待填报'">详情</el-button>
<el-button size="medium" type="text" @click="handleDelete(scope.row)"
style="color: #F25353;">删除</el-button>
<el-button type="text" @click="getAdd(scope.row, 'fill')"
v-if="scope.row.status === 2">审核</el-button>
<el-button type="text" @click="getAdd(scope.row, 'okay')"
v-if="scope.row.status === 3">编辑</el-button>
<el-button type="text" @click="getAdd(scope.row, 'detail')"
v-if="scope.row.status === 1">详情</el-button>
<el-button type="text" @click="handleDelete(scope.row)" style="color: #F25353;">删除</el-button>
</template>
</el-table-column>
</el-table>
@ -141,7 +142,7 @@ import { getBasicInformationPage, deleteBasicInformation } from "@/api/ManageApi
import { getToken } from "@/utils/auth";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
dicts: ["xzfl"],
dicts: ["xzfl",'tbzt'],
data() {
return {
ids: [],
@ -159,23 +160,6 @@ export default {
total: 0,
//
postList: [],
//
statusColors: {
'审核通过': '#6EDABE',
'待填报': '#FFBF6B',
'待审核': '#7693D8'
},
//
statusMap: {
1: '待填报',
2: '待审核',
3: '审核通过'
},
xzflMap: {
1: '已建',
2: '在建',
3: '拟建'
},
//
queryParams: {
current: 1,
@ -325,7 +309,7 @@ export default {
/** 详情按钮操作 */
getAdd(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "新增");
this.$store.commit("SET_CRUMBS","项目详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-add/${id}`, query: { action: type } });
},
@ -354,6 +338,11 @@ export default {
};
</script>
<style scoped>
.headtitle {
font-size: 1.25rem;
font-weight: 400;
}
.headerbox {
background-color: #fff;
border-radius: .5rem;
@ -383,5 +372,8 @@ export default {
.tablebtntwo {
margin-top: 1rem;
margin-bottom: 1rem;
width: 100%;
display: flex;
justify-content: space-between;
}
</style>

@ -11,8 +11,8 @@
</el-col>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -36,8 +36,8 @@
<el-table-column label="评价规则" align="center" prop="pfgz" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleUpdate(scope.row)"></el-button>
<el-button size="mini" type="text" style="color: red;" @click="handleDelete(scope.row)"></el-button>
<el-button type="text" @click="handleUpdate(scope.row)"></el-button>
<el-button type="text" style="color: red;" @click="handleDelete(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
@ -190,8 +190,9 @@ export default {
},
//
handleDelete(row) {
const postIds = row.id || this.ids; // 使 id
this.$modal.confirm('是否确认删除项目评价配置编号为"' + postIds + '"的数据项?').then(() => {
const postIds = row.id || this.ids;
const pjys = row.pjys; // pjys
this.$modal.confirm(`是否确认删除"${pjys}"的数据项?`).then(() => {
return deleteProjectEvaluation(postIds);
}).then(() => {
this.getList();

@ -30,7 +30,7 @@
<el-col :span="5">
<el-form-item label="评价等级">
<el-select v-model="queryParams.pjdj" placeholder="请选择评价等级" clearable>
<el-option v-for="dict in dict.type.pjdj" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-option v-for="dict in dict.type.qdpjdj" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
@ -38,8 +38,8 @@
<el-row>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -49,7 +49,7 @@
<div class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"
@sort-change="handleSortChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{ (scope.$index + 1) + (queryParams.current - 1) * queryParams.size }}
@ -58,7 +58,7 @@
<el-table-column label="项目名称" align="center" prop="name" />
<el-table-column label="现状分类" align="center">
<template slot-scope="scope">
{{ xzflMap[scope.row.xzfl] || scope.row.xzfl }}
<dict-tag :options="dict.type.xzfl" :value="scope.row.xzfl" />
</template>
</el-table-column>
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" />
@ -69,107 +69,31 @@
</el-table-column>
<el-table-column label="项目评价" align="center" width="130" sortable="custom" prop="pjdj">
<template slot-scope="scope">
{{ scope.row.pjdj }} / {{ total }}
{{ scope.row.pjdj }} / {{ scope.row.count }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleInfo(scope.row, 'detail')">详情</el-button>
<el-button size="mini" type="text" style="color: #F25353;" v-if="checkRole(['admin'])"
@click="handleDelete(scope.row)">删除</el-button>
<el-button type="text" @click="handleInfo(scope.row, 'detail')">详情</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.current" :limit.sync="queryParams.size"
@pagination="getList" />
</div>
<!-- 详情对话框 -->
<el-dialog title="项目详情" :visible.sync="infoDialogVisible" width="50%">
<el-form :model="infoForm" label-width="120px" :disabled="true">
<el-form-item label="项目名称">
<el-input v-model="infoForm.name" placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="项目建设起止时间">
<el-date-picker type="daterange" format="yyyy-MM-dd" value-format="yyyy-MM-dd" :style="{ width: '100%' }"
start-placeholder="开始日期" end-placeholder="结束日期" range-separator="至" clearable v-model="infoForm.dateRange">
</el-date-picker>
</el-form-item>
<el-form-item label="现状分类">
<el-select v-model="infoForm.xzfl" placeholder="现状分类" clearable>
<el-option v-for="dict in dict.type.xzfl" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="评价等级">
<el-select v-model="infoForm.pjdj" placeholder="请选择评价等级" clearable>
<el-option label="全部" :value="0" />
<el-option label="总投资额" :value="1" />
<el-option label="层数" :value="2" />
<el-option label="首层层高" :value="3" />
<el-option label="2层及以上层高" :value="4" />
<el-option label="首层地面荷载" :value="5" />
<el-option label="二层及以上楼面荷载" :value="6" />
</el-select>
</el-form-item>
<el-form-item label="项目法人单位">
<el-input v-model="infoForm.xmfrdwxz" placeholder="请输入项目法人单位" />
</el-form-item>
<el-form-item label="项目评价">
<el-input v-model="infoForm.pjdj" placeholder="请输入项目评价" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="infoDialogVisible = false"> </el-button>
</span>
</el-dialog>
<!-- 修改对话框 -->
<el-dialog title="修改项目" :visible.sync="dialogVisible" width="50%">
<el-form :model="editForm" label-width="120px">
<el-form-item label="项目名称">
<el-input v-model="editForm.name" placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="项目建设起止时间">
<el-date-picker type="daterange" format="yyyy-MM-dd" value-format="yyyy-MM-dd" :style="{ width: '100%' }"
start-placeholder="开始日期" end-placeholder="结束日期" range-separator="至" clearable v-model="editForm.dateRange">
</el-date-picker>
</el-form-item>
<el-form-item label="现状分类">
<el-select v-model="editForm.xzfl" placeholder="现状分类" clearable>
<el-option v-for="dict in dict.type.xzfl" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="项目法人单位">
<el-input v-model="editForm.xmfrdwxz" placeholder="请输入项目法人单位" />
</el-form-item>
<el-form-item label="项目评价">
<el-input v-model="editForm.pjdj" placeholder="请输入项目评价" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="updateProject"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getProjectEvaluationList, updateProjectEvaluationList } from '@/api/ManageApi/index.js';
import { checkPermi, checkRole } from "@/utils/permission"; //
import { checkPermi, checkRole } from "@/utils/permission";
export default {
dicts: [
'xzfl', 'pjdj'
'xzfl', 'qdpjdj'
],
data() {
return {
//
xzflMap: {
'1': '已建',
'2': '在建',
'3': '拟建'
},
postList: [],
loading: false,
total: 0,
@ -180,7 +104,8 @@ export default {
begainTime: '',
endTime: '',
xzfl: '',
pjdj: ''
pjdj: '',
qdpjdj:'',
},
showSearch: true,
dialogVisible: false,
@ -191,7 +116,6 @@ export default {
xzfl: '',
pjdj: '',
xmfrdwxz: '',
pjdj: ''
},
infoDialogVisible: false,
infoForm: {
@ -201,7 +125,6 @@ export default {
xzfl: '',
pjdj: '',
xmfrdwxz: '',
pjdj: ''
}
};
},
@ -256,7 +179,7 @@ export default {
//
},
handleInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
this.$store.commit("SET_CRUMBS", "项目详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-add/${id}`, query: { action: type } });
},

@ -43,7 +43,7 @@
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" />
<!-- <el-table-column type="selection" align="center" /> -->
<el-table-column label="序号" width="80" align="center">
<template slot-scope="scope">
{{ scope.$index + 1 }}
@ -168,12 +168,12 @@
<el-radio label="2">不定期提醒</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="提醒方法" prop="method">
<!-- <el-form-item label="提醒方法" prop="method">
<el-radio-group v-model="ruleForm.method" disabled>
<el-radio label="短信提醒">短信提醒</el-radio>
<el-radio label="邮件提醒">邮件提醒</el-radio>
</el-radio-group>
</el-form-item>
</el-form-item> -->
<el-form-item label="提醒时间" prop="alertTime" v-if="isReminder == 1">
<el-date-picker
v-model="ruleForm.alertTime"

@ -67,8 +67,8 @@ export default {
codeUrl: '',
activeName: 'second',
loginForm: {
username: 'admin',
password: 'admin123',
username: '',
password: '',
rememberMe: false,
code: '',
uuid: '',

@ -1,8 +1,8 @@
<template>
<div class="bigone">
<div class="containerbody" v-if="isContainerVisible">
<!-- 标题和目录 -->
<div fos>
<xiding>
<div style="padding: 0 0.9rem 0 0.5rem;">
<div class="containerheadone" id="listtop">
<Title :basicInfo="basicInformation"></Title>
<el-button type="primary" size="medium" plain
@ -21,6 +21,8 @@
</el-menu>
</div>
</div>
</xiding>
<div class="containerbody" v-if="isContainerVisible">
<!-- 基本信息 -->
<div id="basic">
<Basic :action="action" :basicInfo="basicInformation"
@ -79,8 +81,6 @@
@update-data="handleDataUpdate('projectOtherInfos', $event)">
</Others>
</div>
<div class="footer" v-if="showCompanySection">
</div>
<div class="footer" v-if="checkRole(['common']) && action === 'fill'">
<el-button type="primary" v-if="checkRole(['common'])" @click="aduitAll"></el-button>
</div>
@ -89,16 +89,19 @@
</div>
</div>
<!-- 返回顶部 -->
<!-- <el-button icon="el-icon-caret-top" circle id="back-to-top" @click="scrollToTop" plain></el-button> -->
<el-backtop target=".content-container" :visibility-height="0" :bottom="500" :right="10"></el-backtop>
<el-backtop target=".containerbody" :visibility-height="200" :bottom="50" :right="10" style="z-index: 1000;">
</el-backtop>
<!-- 消息提醒 -->
<div class="message-notice">
<el-tooltip class="item" effect="dark" content="新增智能提醒" placement="top-start">
<Supericon />
</el-tooltip>
</div>
</div>
</template>
<script>
import xiding from "./index2.vue"
import Title from '@/views/components/ProjectDetails/Title.vue';
import Basic from '@/views/components/ProjectDetails/Basic.vue';
import Buildings from '@/views/components/ProjectDetails/Buildings.vue';
@ -118,6 +121,7 @@ import { getzwBasicInformationById, fillBasicInformation, auditBasicInformation,
export default {
components: {
xiding,
Title,
Basic,
Buildings,
@ -230,6 +234,12 @@ export default {
this.loadData();
this.action = this.$route.query.action;
},
mounted() {
window.addEventListener('scroll', this.handleScroll);
},
beforeDestroy() {
window.removeEventListener('scroll', this.handleScroll);
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
@ -259,16 +269,9 @@ export default {
element.scrollIntoView({ behavior: 'smooth' });
}
},
// scrollToTop() {
// const basicSection = document.getElementById('listtop');
// if (basicSection) {
// basicSection.scrollIntoView({ behavior: 'smooth' });
// }
// },
goBack() {
this.$router.go(-1); //
this.$router.go(-1);
},
//
handleDataUpdate(dataKey, updatedData) {
if (dataKey === 'projectOtherInfos' || dataKey === 'wysmxInformations') {
if (Array.isArray(updatedData)) {
@ -279,9 +282,7 @@ export default {
} else {
this[dataKey] = updatedData;
}
// console.log(` ${dataKey} :`, updatedData);
},
isDefault(obj, defaultObj) {
for (const key in defaultObj) {
if (obj[key] !== defaultObj[key]) {
@ -290,11 +291,9 @@ export default {
}
return true;
},
//
saveAll() {
this.loading = true;
const tempData = this.prepareSubmitData(); //
// console.log(':', JSON.stringify(tempData, null, 2)); //
const tempData = this.prepareSubmitData();
tempBasicInformation(tempData)
.then(response => {
this.$message.success('暂存成功');
@ -308,11 +307,9 @@ export default {
this.loading = false;
});
},
//
submitAll() {
this.loading = true;
const submitData = this.prepareSubmitData();
// console.log(':', JSON.stringify(submitData, null, 2)); //
fillBasicInformation(submitData)
.then(response => {
this.$message.success('提交成功');
@ -323,51 +320,63 @@ export default {
this.loading = false;
});
},
//
aduitAll() {
this.loading = true;
const loading = this.$loading({
lock: true,
text: '正在提交审核...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const submitData = this.prepareSubmitData();
auditBasicInformation(submitData)
.then(response => {
// console.log(':', response);
this.$message.success('审核通过');
this.isSubmitted = true;
this.$router.push('/manage');
})
.catch(error => {
this.$message.error('审核失败');
console.error('审核错误:', error);
})
.finally(() => {
this.loading = false;
loading.close();
});
},
//
aduitAlltwo() {
this.loading = true;
const loading = this.$loading({
lock: true,
text: '正在提交修改...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const submitData = this.prepareSubmitData();
auditBasicInformation(submitData)
.then(response => {
// console.log(':', response);
this.$message.success('修改成功');
this.isSubmitted = true;
this.$router.push('/manage');
})
.catch(error => {
this.$message.error('修改失败');
console.error('修改错误:', error);
})
.finally(() => {
this.loading = false;
loading.close();
});
},
//
prepareSubmitData() {
return {
basicInformation: this.basicInformation,
planInformation: this.planInformation,
projectOtherInfos: this.projectOtherInfos,
qyrzInformation: this.qyrzInformation,
wysmxInformations: this.formatWysmxData() //
wysmxInformations: this.formatWysmxData()
};
},
//
formatWysmxData() {
return this.wysmxInformations.flatMap(item =>
item.list.map(listItem => ({
@ -385,8 +394,6 @@ export default {
}))
);
},
//
formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
@ -396,20 +403,34 @@ export default {
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
handleScroll() {
const sections = this.sections;
const scrollPosition = window.scrollY + window.innerHeight / 2;
sections.forEach(section => {
const element = document.getElementById(section.id);
if (element) {
const rect = element.getBoundingClientRect();
if (rect.top <= scrollPosition && rect.bottom >= scrollPosition) {
this.activeSection = section.id;
}
}
});
}
}
};
</script>
<style scoped>
.containerbody {
height: 100%;
height: calc(100% - 7rem);
padding: .3rem .5rem;
display: flex;
flex-direction: column;
gap: 1rem;
position: relative;
overflow: auto;
overflow: hidden;
overflow-y: auto;
}
.containerheadone {
@ -417,8 +438,8 @@ export default {
justify-content: space-between;
align-items: center;
width: 100%;
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
padding: 0 1rem 0 .7rem;
background-color: #fff;
}
.containerhead {
@ -427,8 +448,6 @@ export default {
align-items: center;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.custom-menu {
@ -475,22 +494,15 @@ export default {
.bigone {
position: relative;
height: 100%;
overflow: auto;
}
#back-to-top {
position: fixed;
bottom: 50%;
right: 5px;
z-index: 99;
font-size: 23px;
width: 100%;
overflow: hidden;
}
.message-notice {
position: fixed;
bottom: 40%;
right: 1%;
z-index: 99;
z-index: 1000;
font-size: 23px;
cursor: pointer;
}

@ -0,0 +1,63 @@
<template>
<div :class="{'sticky': isSticky}" ref="stickyElement">
<slot>这里是需要吸顶的内容</slot>
</div>
</template>
<script>
export default {
data() {
return {
isSticky: false,
stickyTop: 0,
lastScrollY: 0
}
},
mounted() {
this.stickyTop = this.$refs.stickyElement.offsetTop
window.addEventListener('scroll', this.handleScroll)
},
beforeDestroy() {
window.removeEventListener('scroll', this.handleScroll)
},
methods: {
handleScroll() {
const scrollY = window.pageYOffset || document.documentElement.scrollTop
const delta = scrollY - this.lastScrollY
//
if (scrollY >= this.stickyTop) {
this.isSticky = true
} else {
this.isSticky = false
}
this.lastScrollY = scrollY
}
}
}
</script>
<style scoped>
.sticky {
position: fixed;
top: 0;
left: 0;
width: 100%;
background-color: #ffffff;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
z-index: 1000;
transition: all 0.3s ease;
}
/* 原始状态样式(可根据需求自定义) */
[data-v-6a5d4122] {
/* 非吸顶时的原始样式,建议保留足够高度避免内容跳跃 */
height: 60px;
line-height: 60px;
padding: 0 20px;
background-color: #f8f9fa;
border-bottom: 1px solid #e9ecef;
}
</style>

@ -1,6 +1,8 @@
<template>
<div class="bigone">
<!-- 标题 -->
<!-- 标题和目录 -->
<xiding>
<div style="padding: 0 0.9rem 0 0.5rem;">
<div class="containerheadone" id="listtop">
<Title :basicInfo="basicInformation"></Title>
<el-button type="primary" size="medium" plain
@ -8,10 +10,6 @@
返回
</el-button>
</div>
<div style="display: flex;justify-content: center;">
<el-button type="primary" v-if="isSubmitted" disabled>已提交</el-button>
</div>
<div class="containerbody" v-if="isContainerVisible">
<!-- 目录 -->
<div class="containerhead">
<el-menu :default-active="activeSection" mode="horizontal" @select="scrollToSection"
@ -22,6 +20,9 @@
</el-menu-item>
</el-menu>
</div>
</div>
</xiding>
<div class="containerbody" v-if="isContainerVisible">
<!-- 基本信息 -->
<div id="basic">
<Basic :action="action" :basicInfo="basicInformation"
@ -46,7 +47,7 @@
</div>
<!-- 月度进展信息 -->
<div id="months">
<Months :action="action" :xmId=projectId></Months>
<Months :action="action" :xmId="projectId"></Months>
</div>
<!-- 企业入驻信息 -->
<div id="companyenter">
@ -68,7 +69,7 @@
</div>
<!-- 现场实况 -->
<div id="liver">
<Liver :action="action" :xmId=projectId></Liver>
<Liver :action="action"></Liver>
</div>
<!-- 项目备忘录 -->
<div id="memo">
@ -90,13 +91,13 @@
</div>
</div>
<!-- 返回顶部 -->
<!-- <el-button icon="el-icon-caret-top" circle id="back-to-top" @click="scrollToTop" plain></el-button>
-->
<el-backtop target=".content-container" :visibility-height="0" :bottom="500" :right="10"></el-backtop>
<el-backtop target=".containerbody" :visibility-height="200" :bottom="50" :right="10" style="z-index: 1000;">
</el-backtop>
</div>
</template>
<script>
import xiding from "./index2.vue"
import Title from '@/views/components/ProjectDetails/Title.vue';
import Basic from '@/views/components/ProjectDetails/Basic.vue';
import Buildings from '@/views/components/ProjectDetails/Buildings.vue';
@ -128,6 +129,7 @@ export default {
Projectpicture,
Projectdraw,
Others,
xiding
},
data() {
return {
@ -287,20 +289,28 @@ export default {
},
//
saveAll() {
this.loading = true;
//
const loading = this.$loading({
lock: true,
text: '正在暂存中...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
const tempData = this.prepareSubmitData(); //
// console.log(':', JSON.stringify(tempData, null, 2)); //
tempBasicInformation(tempData)
.then(response => {
//
this.$message.success('暂存成功');
// console.log(':', response);
})
.catch(error => {
//
this.$message.error('暂存失败');
console.error('暂存错误:', error);
})
.finally(() => {
this.loading = false;
//
loading.close();
});
},
//
@ -315,12 +325,18 @@ export default {
},
//
async submitAll() {
this.loading = true;
//
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
// wysmxInformations
if (this.wysmxInformations.length === 0 || this.wysmxInformations.includes(null)) {
this.$message.error('请填写模型管理信息');
this.loading = false;
loading.close();
return;
}
@ -328,7 +344,7 @@ export default {
const rzqys = await this.getEnterpriseCount();
if (rzqys === 0 || rzqys === null || rzqys === undefined) {
this.$message.error('请先导入企业入驻信息');
this.loading = false;
loading.close();
return;
}
@ -337,7 +353,7 @@ export default {
const planMissingFields = planRequiredFields.filter(field => !this.planInformation[field]);
if (planMissingFields.length > 0) {
this.$message.error('请填写完整的规划信息');
this.loading = false;
loading.close();
return;
}
@ -346,7 +362,7 @@ export default {
const basicMissingFields = basicRequiredFields.filter(field => !this.basicInformation[field]);
if (basicMissingFields.length > 0) {
this.$message.error('请填写完整的基本信息');
this.loading = false;
loading.close();
return;
}
@ -367,7 +383,7 @@ export default {
console.error('提交错误:', error);
})
.finally(() => {
this.loading = false;
loading.close();
});
},
@ -395,7 +411,7 @@ export default {
planInformation: this.planInformation,
projectOtherInfos: this.projectOtherInfos,
qyrzInformation: this.qyrzInformation,
wysmxInformations: this.formatWysmxData() //
wysmxInformations: this.formatWysmxData()
};
},
@ -435,13 +451,14 @@ export default {
<style scoped>
.containerbody {
height: auto;
height: calc(100% - 7rem);
padding: .3rem .5rem;
display: flex;
flex-direction: column;
gap: 1rem;
position: relative;
overflow: auto;
overflow: hidden;
overflow-y: auto;
}
.containerheadone {
@ -449,8 +466,8 @@ export default {
justify-content: space-between;
align-items: center;
width: 100%;
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
padding: 0 1rem 0 .7rem;
background-color: #fff;
}
.containerhead {
@ -459,8 +476,6 @@ export default {
align-items: center;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.custom-menu {
@ -506,14 +521,18 @@ export default {
.bigone {
position: relative;
height: 100%;
width: 100%;
overflow: hidden;
}
#back-to-top {
.message-notice {
position: fixed;
bottom: 50%;
right: 5px;
z-index: 99;
bottom: 40%;
right: 1%;
z-index: 1000;
font-size: 23px;
cursor: pointer;
}
.footer {

@ -0,0 +1,63 @@
<template>
<div :class="{'sticky': isSticky}" ref="stickyElement">
<slot>这里是需要吸顶的内容</slot>
</div>
</template>
<script>
export default {
data() {
return {
isSticky: false,
stickyTop: 0,
lastScrollY: 0
}
},
mounted() {
this.stickyTop = this.$refs.stickyElement.offsetTop
window.addEventListener('scroll', this.handleScroll)
},
beforeDestroy() {
window.removeEventListener('scroll', this.handleScroll)
},
methods: {
handleScroll() {
const scrollY = window.pageYOffset || document.documentElement.scrollTop
const delta = scrollY - this.lastScrollY
//
if (scrollY >= this.stickyTop) {
this.isSticky = true
} else {
this.isSticky = false
}
this.lastScrollY = scrollY
}
}
}
</script>
<style scoped>
.sticky {
position: fixed;
top: 0;
left: 0;
width: 100%;
background-color: #ffffff;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
z-index: 1000;
transition: all 0.3s ease;
}
/* 原始状态样式(可根据需求自定义) */
[data-v-6a5d4122] {
/* 非吸顶时的原始样式,建议保留足够高度避免内容跳跃 */
height: 60px;
line-height: 60px;
padding: 0 20px;
background-color: #f8f9fa;
border-bottom: 1px solid #e9ecef;
}
</style>

@ -41,9 +41,9 @@
<el-row>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini"
<el-button type="primary" icon="el-icon-search"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -52,7 +52,7 @@
<!-- 表格内容区 -->
<div class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" stripe>
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{ (scope.$index + 1) + (queryParams.current - 1) * queryParams.size }}
@ -61,7 +61,7 @@
<el-table-column label="项目名称" align="center" prop="name" width="200" />
<el-table-column label="现状分类" align="center" prop="xzfl">
<template slot-scope="scope">
<span>{{ xzflMap[scope.row.xzfl] }}</span>
<dict-tag :options="dict.type.xzfl" :value="scope.row.xzfl" />
</template>
</el-table-column>
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" width="200" />
@ -79,10 +79,10 @@
statusMap[scope.row.status] }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="getAdd(scope.row, 'detail')">详情</el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)" v-if="checkRole(['admin'])"
<el-button type="text" @click="getAdd(scope.row, 'detail')">详情</el-button>
<el-button type="text" @click="handleDelete(scope.row)" v-if="checkRole(['admin'])"
style="color: #F25353;">删除</el-button>
</template>
</el-table-column>
@ -126,11 +126,6 @@ export default {
2: '待审核',
3: '审核通过'
},
xzflMap: {
1: '已建',
2: '在建',
3: '拟建'
},
//
queryParams: {
current: 1,
@ -194,7 +189,7 @@ export default {
},
/** 详情按钮操作 */
getAdd(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "新增");
this.$store.commit("SET_CRUMBS", "项目详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-add/${id}`, query: { action: type } });
},

@ -19,9 +19,9 @@
</el-col>
<el-col :span="8">
<el-form-item style="margin-left: 2.5rem;">
<el-button type="primary" icon="el-icon-search" size="mini"
<el-button type="primary" icon="el-icon-search"
@click="fetchElements">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetSearchForm"></el-button>
<el-button icon="el-icon-refresh" @click="resetSearchForm"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -41,9 +41,9 @@
<div>{{ element.name }}</div>
</div>
<div class="headertwo">
<el-button type="primary" icon="el-icon-delete" size="mini"
<el-button type="primary" icon="el-icon-delete"
@click="handleDeleteElement(element, elementIndex)">删除要素</el-button>
<el-button type="primary" icon="el-icon-edit" size="mini"
<el-button type="primary" icon="el-icon-edit"
@click="handleUpdate(element)">编辑要素</el-button>
<el-button type="primary" icon="el-icon-plus"
@click="showAddIndicatorDialog(element)">新增指标</el-button>
@ -59,9 +59,9 @@
<el-table-column prop="xxyq" label="详细要求" min-width="300"></el-table-column>
<el-table-column label="操作" width="180" align="center">
<template slot-scope="scope">
<el-button size="mini" type="text"
<el-button type="text"
@click="handleUpdateIndicator(element, scope.row)">编辑</el-button>
<el-button size="mini" type="text" style="color: #F56C6C;"
<el-button type="text" style="color: #F56C6C;"
@click="handleDeleteIndicator(element, scope.row, elementIndex, scope.$index)">删除</el-button>
</template>
</el-table-column>

@ -34,9 +34,8 @@
<el-row>
<el-col :span="8">
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -57,9 +56,9 @@
<el-table-column label="用户类型" align="center" width="130" prop="yhlx" />
<el-table-column label="标签注释" align="center" width="180" prop="bqzs" />
<el-table-column label="标签状态" align="center" prop="bqzt" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="getAdd(scope.row, 'detail')">详情</el-button>
<el-button type="text" @click="getAdd(scope.row, 'detail')">详情</el-button>
</template>
</el-table-column>
</el-table>
@ -99,12 +98,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="标签值编码:">
<span>{{ detailData.yhlx }}</span>
<span>{{ detailData.bqzbm }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="有效状态:">
<span>{{ detailData.bqzs }}</span>
<span>{{ detailData.state }}</span>
</el-form-item>
</el-col>
</el-row>
@ -112,12 +111,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="标签注释:">
<span>{{ detailData.bqzt }}</span>
<span>{{ detailData.bqzs }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="用户类型:">
<span>{{ detailData.bqzs }}</span>
<span>{{ detailData.yhlx }}</span>
</el-form-item>
</el-col>
</el-row>
@ -130,7 +129,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="标签标记单位:">
<span>{{ detailData.bqzs }}</span>
<span>{{ detailData.bqbjdw }}</span>
</el-form-item>
</el-col>
</el-row>
@ -143,12 +142,10 @@
</el-col>
<el-col :span="12">
<el-form-item label="数据来源名称:">
<span>{{ detailData.bqzs }}</span>
<span>{{ detailData.sjlymc }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">关闭</el-button>
@ -158,7 +155,7 @@
</template>
<script>
import { getCybqInformationPage } from "@/api/ManageApi/index";
import { getCybqInformationPage, getSpanById } from "@/api/ManageApi/index";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
@ -191,19 +188,6 @@ export default {
endTime: undefined,
status: undefined,
},
//
defaultData: [
{
id: 0,
name: '默认企业名称',
tyshxydm: '123456789012345678',
bqdm: 'DEFAULT',
state: '有效',
yhlx: '企业用户',
bqzs: '默认标签注释',
bqzt: '默认标签状态'
}
],
//
dialogVisible: false,
//
@ -222,9 +206,8 @@ export default {
//api
getCybqInformationPage(this.queryParams).then((response) => {
//
this.postList = [...this.defaultData, ...response.data.records];
this.total = response.data.total + this.defaultData.length;
this.postList = [...response.data.records];
this.total = response.data.total;
this.loading = false;
}).catch();
},
@ -237,9 +220,17 @@ export default {
},
/** 详情按钮操作 */
getAdd(row, type) {
this.detailData = row;
/** 详情按钮操作 */
getAdd(row) {
this.loading = true;
getSpanById(row.id).then((response) => {
this.detailData = response.data;
this.dialogVisible = true;
this.loading = false;
}).catch((error) => {
this.$message.error("获取详情失败:" + error.message);
this.loading = false;
});
},
/** 重置按钮操作 */
resetQuery() {

@ -34,8 +34,8 @@
<el-row>
<el-col :span="8">
<el-form-item style="margin-left: -100px;">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -48,20 +48,20 @@
<div class="tablebtntwo">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"></el-button>
<el-button type="primary" icon="el-icon-plus" @click="handleAdd"></el-button>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-download" size="mini" @click="handleImport"></el-button>
<el-button type="primary" icon="el-icon-download" @click="handleImport"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-download" size="mini" @click="handleExport"></el-button>
<el-button type="primary" icon="el-icon-upload2" @click="handleExport"></el-button>
</el-col>
</el-row>
</div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" width="60" align="center">
<template slot-scope="scope">
{{ (queryParams.current - 1) * queryParams.size + scope.$index + 1 }}
@ -69,7 +69,7 @@
</el-table-column>
<el-table-column label="上楼目录类别" align="center">
<template slot-scope="scope">
{{ fileTypeMap[scope.row.slmllb] || scope.row.slmllb }}
<dict-tag :options="dict.type.shangloumulu" :value="scope.row.slmllb" />
</template>
</el-table-column>
<el-table-column label="工业大类" align="center" prop="gydl" />
@ -77,8 +77,8 @@
<el-table-column label="更新时间" align="center" prop="updateTime" width="180" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleUpdate(scope.row)"></el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)" style="color: red;">删除</el-button>
<el-button type="text" @click="handleUpdate(scope.row)"></el-button>
<el-button type="text" @click="handleDelete(scope.row)" style="color: red;">删除</el-button>
</template>
</el-table-column>
</el-table>
@ -193,10 +193,10 @@ export default {
],
},
//
fileTypeMap: {
1: "重点鼓励上楼",
2: "有条件上楼",
},
// fileTypeMap: {
// 1: "",
// 2: "",
// },
//
upload: {
//
@ -323,7 +323,7 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const catalogIds = row.id || this.ids;
this.$modal.confirm('是否确认删除项目知识库编号为"' + catalogIds + '"的数据项?').then(() => {
this.$modal.confirm('是否确认删除数据项?').then(() => {
return deleteCatalog([catalogIds]);
}).then(() => {
this.getList();

@ -3,7 +3,7 @@
<!-- 细分产业管理 -->
<!-- 表单查询项 -->
<div class="headerbox">
<el-form ref="queryForm" :model="queryParams" size="small" label-width="100px">
<el-form ref="queryForm" :model="queryParams" size="small" label-width="100px" style="margin-left: -30px;">
<el-row>
<el-col :span="5">
<el-form-item label="产业类别" prop="cylb">
@ -31,16 +31,16 @@
<el-col :span="3">
<el-form-item label="更新时间" prop="updateTime">
<el-date-picker v-model="queryParams.startTime" type="datetime" format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss" :style="{ width: '18rem' }" placeholder="选择日期时间" clearable />
value-format="yyyy-MM-dd HH:mm:ss" :style="{ width: '18rem' }" placeholder="选择日期时间"
clearable />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item style="margin-left: -70px;">
<el-button type="primary" icon="el-icon-search" size="mini"
@click="handleQuery">查询</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" @click="resetQuery"></el-button>
</el-form-item>
</el-col>
</el-row>
@ -52,22 +52,20 @@
<div class="tablebtntwo">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"></el-button>
<el-button type="primary" icon="el-icon-plus" @click="handleAdd"></el-button>
</el-col>
</el-row>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-download" size="mini"
@click="handleImport">导入</el-button>
<el-button type="primary" icon="el-icon-download" @click="handleImport"></el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-download" size="mini"
@click="handleExport">导出</el-button>
<el-button type="primary" icon="el-icon-upload2" @click="handleExport"></el-button>
</el-col>
</el-row>
</div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" width="60" align="center">
<template slot-scope="scope">
{{ (queryParams.current - 1) * queryParams.size + scope.$index + 1 }}
@ -75,23 +73,21 @@
</el-table-column>
<el-table-column label="产业类别" align="center" prop="cylb">
<template slot-scope="scope">
{{ cylbMap[scope.row.cylb] || scope.row.cylb }}
<dict-tag :options="dict.type.cylb" :value="scope.row.cylb" />
</template>
</el-table-column>
<el-table-column label="产业细分" align="center" prop="cyxf" />
<el-table-column label="原材料及生产环节" align="center" prop="ycljschj" />
<el-table-column label="上楼适应性" align="center" prop="slsyx">
<template slot-scope="scope">
{{ slsyxMap[scope.row.slsyx] || scope.row.slsyx }}
<dict-tag :options="dict.type.slsyx" :value="scope.row.slsyx" />
</template>
</el-table-column>
<el-table-column label="更新时间" align="center" prop="updateTime" width="180" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" >
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleUpdate(scope.row)"></el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)"
style="color: red;">删除</el-button>
<el-button type="text" @click="handleUpdate(scope.row)"></el-button>
<el-button type="text" @click="handleDelete(scope.row)" style="color: red;">删除</el-button>
</template>
</el-table-column>
</el-table>
@ -102,10 +98,10 @@
<!-- 添加或修改项目对话框 -->
<el-dialog :title="title" :visible.sync="open" width="40rem" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="160px">
<el-form-item label="产业类别" prop="cylb">
<el-select v-model="form.cylb" placeholder="请选择产业类别">
<el-form-item label="产业类别" prop="cylb" style="width: 100%;">
<el-select v-model="form.cylb" placeholder="请选择产业类别" style="width: 100%;">
<el-option v-for="dict in dict.type.cylb" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)"></el-option>
:value="dict.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="产业细分" prop="cyxf">
@ -115,7 +111,7 @@
<el-input v-model="form.ycljschj" placeholder="请输入原材料及生产环节" />
</el-form-item>
<el-form-item label="上楼适应性" prop="slsyx">
<el-select v-model="form.slsyx" placeholder="请选择上楼适应性">
<el-select v-model="form.slsyx" placeholder="请选择上楼适应性" style="width: 100%;">
<el-option v-for="dict in dict.type.slsyx" :key="dict.value" :label="dict.label"
:value="parseInt(dict.value)"></el-option>
</el-select>
@ -195,38 +191,24 @@ export default {
cylb: undefined,
ycljschj: undefined,
slsyx: undefined,
endTime:undefined,
startTime:undefined
endTime: undefined,
startTime: undefined
},
//
rules: {
cyxf: [
{ required: true, message: "文件名称不能为空", trigger: "blur" }
{ required: true, message: "产业细分不能为空", trigger: "blur" }
],
cylb: [
{ required: true, message: "产业类别不能为空", trigger: "change" }
],
scyh: [
{ required: true, message: "上传用户不能为空", trigger: "blur" }
slsyx: [
{ required: true, message: "上楼适应性不能为空", trigger: "blur" }
],
ycljschj: [
{ required: true, message: "上传时间不能为空", trigger: "change" }
{ required: true, message: "原材料及生产环节不能为空", trigger: "change" }
]
},
//
cylbMap: {
1: "新一代信息技术",
2: "高端装备制造",
3: "生物医药及大健康",
4: "纳米技术应用及新材料",
5: "人工智能及数字产业",
6: "新能源及绿色产业"
},
//
slsyxMap: {
1: '能上楼',
2: '低楼层'
},
upload: {
//
open: false,
@ -365,7 +347,7 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const catalogIds = row.id || this.ids;
this.$modal.confirm('是否确认删除项目知识库编号为"' + catalogIds + '"的数据项?').then(() => {
this.$modal.confirm('是否确认删除数据项?').then(() => {
return deleteXfcygl([catalogIds]);
}).then(() => {
this.getList();

@ -1,15 +1,13 @@
<template>
<div class="grid-container">
<!-- 第一行 -->
<div class="grid-item item-1">
<!-- 整体项目情况 -->
<div class="dashboard-container">
<!-- 1 -->
<div class="dashboard-row">
<div class="dashboard-col wide">
<div class="allarea">
<AllArea />
<AllArea @year-change="handleYearChange" />
</div>
</div>
<div class="grid-item item-2">
<!-- 消息通知 -->
<div class="dashboard-col narrow">
<div class="itemhead">
<span>消息通知</span>
</div>
@ -17,41 +15,33 @@
<Message />
</div>
</div>
<!-- 第二行 -->
<div class="grid-item item-1 bgcicon">
</div>
<!-- 2-->
<div class="dashboard-rowtwo">
<div class="dashboard-col wide bgcicon">
<MapArea />
</div>
<div style="display: flex;flex-direction: column;">
<div class="grid-item item-3">
<!-- 功能区 -->
<div class="itemhead">
<div class="dashboard-col narrow">
<div class="itemhead" style="margin: .5rem 0 0 0;">
<span>功能区</span>
</div>
<div class="relaitem">
<div class="itemsall">
<span>{{ functionnumber.functionnumber }}</span>
<span>项目总数</span>
</div>
<FunctionArea />
<FunctionArea :years="years" />
</div>
</div>
<div class="grid-item item-5">
<!-- 投资区 -->
<div class="itemhead">
<div class="itemhead" style="margin: 0;">
<span>投资主体</span>
</div>
<div class="relaitem">
<div class="itemsall">
<span>{{ allnumber.touzinumber }}</span>
<span>项目总数</span>
<InvestArea :years="years" />
</div>
<InvestArea />
</div>
</div>
</div>
<!-- 第三行 -->
<div class="grid-item item-3">
<!-- 产业数据分析 -->
<!-- 3 -->
<div class="dashboard-row">
<div class="dashboard-col">
<div class="itemhead">
<span>产业数据分析</span>
</div>
@ -59,8 +49,7 @@
<Cyeshuju />
</div>
</div>
<div class="grid-item item-5">
<!-- 产业导向目录分析 -->
<div class="dashboard-col">
<div class="itemhead">
<span>产业导向目录分析</span>
</div>
@ -68,17 +57,16 @@
<Cydxml />
</div>
</div>
<div class="grid-item item-5">
<!-- 产业导向细分产业分析 -->
<div class="dashboard-col">
<div class="itemhead">
<span>产业导向细分产业分析</span>
</div>
<div class="relaitem">
<!-- <Cyeshuju /> -->
<Cydxxfgl />
</div>
</div>
</div>
</div>
</template>
<script>
@ -107,6 +95,7 @@ export default {
},
data() {
return {
years: new Date().getFullYear().toString(),
allnumber: {
touzinumber: 0
},
@ -116,6 +105,10 @@ export default {
};
},
methods: {
handleYearChange(years) {
this.years = years;
console.log("index.vue: handleYearChange called with years:", years);
},
async getData() {
const response = await investall();
if (response && response.data) {
@ -144,34 +137,61 @@ export default {
};
</script>
<style scoped>
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
/* 三列 */
grid-template-rows: auto auto auto;
/* 三行 */
gap: .5rem;
/* 模块之间的间隔 */
padding: 0 .5rem;
/* 容器内边距 */
.dashboard-container {
display: flex;
flex-direction: column;
height: 100%;
padding: 0.5rem;
gap: 0.5rem;
box-sizing: border-box;
overflow: auto;
}
.dashboard-row {
display: flex;
flex: 1;
gap: 0.5rem;
}
.grid-item {
.dashboard-rowtwo {
display: flex;
flex: 3;
gap: 0.5rem;
}
.dashboard-col {
flex: 1;
background-color: #FFFFFF;
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
border-radius: 0.5rem;
display: flex;
flex-direction: column;
overflow: hidden;
}
.dashboard-col.wide {
flex: 2;
}
.dashboard-col.narrow {
flex: 1;
}
.itemhead {
width: 100%;
border-left: 0.25rem solid #2B62F1;
margin: 0.5rem 0;
margin: 0.5rem 0;
height: 1.25rem;
display: flex;
align-items: center;
}
.relaitem {
flex: 1;
position: relative;
}
@ -181,8 +201,9 @@ export default {
flex-direction: column;
justify-content: center;
align-items: center;
top: 3.7rem;
left: 7.5rem;
top: 33%;
left: 23%;
z-index: 1;
}
.itemsall span:nth-child(1) {
@ -218,41 +239,21 @@ export default {
}
.mainarea {
padding: 0rem 0rem 0 1.4rem;
flex: 1;
padding: 0 0 0 .5rem;
overflow: auto;
}
/* 第一行:第一个模块占两列 */
.item-1 {
grid-column: span 2;
/* background-image: url('~@/assets/images/allbg.png'); */
background-size: 100% 100%;
background-repeat: no-repeat;
}
.allarea {
width: 100%;
height: auto;
padding: .5rem 1rem;
flex: 1;
padding: 0rem 1rem 0 1rem;
display: flex;
flex-direction: column;
}
/* 最后一行:一个模块占一整行 */
.item-6 {
grid-column: span 3;
/* 占三列 */
.bgcicon {
padding: 0 !important;
}
/* .item-3 {
height: ;
} */
.mapareaone {
position: relative;
}
.bgcicon{
/* background-color: red; */
/* background-image: url(../../assets/images/map@2x.png); */
padding: 0!important;
background-repeat: no-repeat;
background-size: 100% 100%;
}
</style>

@ -26,10 +26,14 @@
<div class="itemleft">
<div class="xmmctitle" @click="getInfo(item, 'detail')">{{ item.name }}</div>
<div class="lefttwo">
<div>现状分类{{ xzflMap[item.xzfl] }}</div>
<div style="display: flex;">
现状分类<dict-tag :options="dict.type.xzfl" :value="item.xzfl" />
</div>
<div>总投资额{{ item.ztze }}</div>
<div>填报时间{{ item.updateTime }}</div>
<div>状态{{ statusMap[item.status] }}</div>
<div style="display: flex;align-items: center;">
状态<dict-tag :options="dict.type.tbzt" :value="item.status" />
</div>
</div>
</div>
<div class="itemright" :class="getStatusClass(item.status)">
@ -62,6 +66,7 @@ import { getBasicInformationPage } from "@/api/ManageApi/index";
export default {
name: "Pc2FbEcharts",
dicts:['xzfl','tbzt'],
components: {
AllArea2,
Message2,
@ -98,7 +103,7 @@ export default {
methods: {
/** 详情按钮操作 */
getInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
this.$store.commit("SET_CRUMBS", "项目详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-info/${id}`, query: { action: type } });
},

@ -410,7 +410,7 @@ export default {
}
.left-scrollbar .el-scrollbar__wrap {
box-sizing: border-box;
overflow-x: hidden !important;
overflow: hidden !important;
margin-bottom: 0 !important;
}
.center-tabs{
@ -483,7 +483,7 @@ export default {
}
.left-scrollbar .el-scrollbar__view{
overflow-x: hidden;
overflow: hidden;
}
.el-rate{

@ -27,7 +27,7 @@ module.exports = {
// 默认情况下Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。
// 例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/demo/Gyyq-Upstairs" : "/",
publicPath: process.env.NODE_ENV === "production" ? "" : "/",
// 在npm run build 或 yarn build 时 生成文件的目录名称要和baseUrl的生产环境路径一致默认dist
outputDir: 'dist',
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
@ -46,8 +46,8 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
// target: `http://192.168.0.106:7071/`,
target: `http://39.101.188.84:7071/`,
// target: `http://192.168.0.110:7071/`,
// target: `http://39.101.188.84:7071/`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''

Loading…
Cancel
Save