xuhongjie
严飞永 2 weeks ago
parent 75e0dca397
commit 0b8f3c21d9

@ -5,4 +5,4 @@ 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'

@ -41,7 +41,7 @@
"clipboard": "2.0.8",
"core-js": "3.37.1",
"echarts": "^5.4.0",
"element-ui": "2.15.14",
"element-ui": "^2.15.13",
"file-saver": "2.0.5",
"fuse.js": "6.4.3",
"highlight.js": "9.18.5",

@ -8,13 +8,20 @@ export function getBasicInformationPage(params) {
params
})
}
// 通过主键查询单条所有数据
// 通过主键查询单条所有数据(企业端)
export function getBasicInformationById(id) {
return request({
url: `/gysl/basicInformation/stagingInfo/${id}`,
method: 'get'
});
}
// 通过主键查询单条所有数据(政务端)
export function getzwBasicInformationById(id) {
return request({
url: `/gysl/basicInformation/${id}`,
method: 'get'
});
}
// 企业端提交填报
export function fillBasicInformation(data) {
@ -169,15 +176,17 @@ export function addElement(data) {
});
}
// 查询所有要素
export function getAllElements() {
export function getAllElements(params) {
return request({
url: '/gysl/mx/page',
method: 'get',
params
});
}
// 编辑要素或者指标
// 编辑指标
export function editElemention(data) {
return request({
url: '/gysl/mx/edit',
@ -186,7 +195,17 @@ export function editElemention(data) {
});
}
// 删除指标或要素
//编辑要素
export function updateYsElement(data){
return request({
url:'/gysl/mx/updateYs',
method:'post',
data
})
}
// 删除指标
export function deleteElemention(idList) {
return request({
url: `/gysl/mx/delete`,
@ -195,6 +214,15 @@ export function deleteElemention(idList) {
});
}
//删除要素
export function deleteYsElement(params) {
return request({
url: '/gysl/mx/deleteYs',
method: 'delete',
params
})
}
// 目录管理
// 新增目录
export function addCatalog(data) {

@ -3,24 +3,15 @@
<!-- 政务端消息通知数量 -->
<!-- 大于0的时候显示的图标 -->
<el-badge :is-dot="counts > 0" class="item" v-if="checkRole(['common'])">
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
<i class="el-icon-bell"></i>
</span>
</el-dropdown>
</el-badge>
<!-- 企业端消息通知数量 -->
<el-badge :is-dot="counts > 0" class="item" v-if="showCompanySection">
<el-dropdown trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
<i class="el-icon-bell"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>
消息数量: {{ counts }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-badge>
</div>
</template>

@ -253,7 +253,7 @@ export default {
//
importTemplate() {
download(
"/api/enterprise/template", //
"/gysl/enterprise/importTemplate",
{},
`企业入驻模板_${new Date().getTime()}.xlsx`
);

@ -24,11 +24,22 @@
<td class="left-column">{{ row.ysmc }}</td>
<td class="right-columns" v-for="(item, itemIndex) in row.list" :key="itemIndex">
<div v-if="item.isEditing">
<span class="label-color">{{ item.zdname }}</span>
<el-input v-model="item.zdinfor" size="small" style="width: 12rem;"></el-input>
<span class="label-color">{{ item.zdname || '暂无指标' }}</span>
<!-- 使用下拉框el-select渲染第一个数据集的所有字段其他数据集使用输入框el-input -->
<el-select v-if="rowIndex === 0" v-model="item.zdinfor" size="small"
style="width: 12rem;">
<el-option v-for="option in getOptionsForItem(rowIndex, itemIndex)"
:key="option.value" :label="option.label" :value="option.value">
</el-option>
</el-select>
<el-input v-else v-model="item.zdinfor" size="small" style="width: 12rem;"
:disabled="item.zdname === '暂无指标'"
:placeholder="item.zdname === '暂无指标' ? '暂无数据' : '请输入内容'">
</el-input>
</div>
<div v-else>
<span class="label-color">{{ item.zdname }}</span> {{ item.zdinfor || '无' }}
<span class="label-color">{{ item.zdname || '暂无指标' }}</span> {{ item.zdinfor ||
'无' }}
</div>
</td>
</tr>
@ -55,7 +66,27 @@ export default {
data() {
return {
isEditingAll: false,
form: []
form: [],
optionsMap: {
'0-0': [
{ value: '一级', label: '一级' },
{ value: '二级', label: '二级' },
{ value: '三级', label: '三级' },
{ value: '四级', label: '四级' },
],
'0-1': [
{ value: '甲', label: '甲' },
{ value: '乙', label: '乙' },
{ value: '丙', label: '丙' },
{ value: '丁', label: '丁' },
{ value: '戊', label: '戊' },
],
'0-2': [
{ value: '有', label: '有' },
{ value: '无', label: '无' },
],
//
}
};
},
watch: {
@ -68,8 +99,8 @@ export default {
xmId: item.xmId,
ysmc: item.ysmc,
list: item.list.map(subItem => ({
zdname: subItem.zdname,
zdinfor: subItem.zdinfor,
zdname: subItem.zdname || '暂无指标',
zdinfor: subItem.zdinfor || '',
isEditing: false
}))
}));
@ -99,6 +130,10 @@ export default {
});
}
this.isEditingAll = !this.isEditingAll;
},
getOptionsForItem(rowIndex, itemIndex) {
// rowIndex itemIndex
return this.optionsMap[`${rowIndex}-${itemIndex}`] || [];
}
},
created() {

@ -41,8 +41,8 @@
<template v-else>
{{ item.zdinfor }}
</template>
<el-button v-if="isEditMode" type="text" size="small" @click="handleDeleteField(item)"
style="margin-left: 1rem;color: #F25353;">删除</el-button>
<el-button v-if="checkRole(['admin', 'common']) && isEditMode" type="text" size="small" @click="handleDeleteField(item)"
style="margin-left: 1rem;color: #F25353;">删除</el-button>
</el-descriptions-item>
</el-descriptions>
</div>

@ -1,6 +1,6 @@
<template>
<div class="container">
<el-table :data="tableData" style="width: 100%" :show-header="false">
<el-table :data="tableData" style="width: 100%" :show-header="false" @row-click="handleRowClick">
<el-table-column width="80">
<template slot-scope="scope">
<img :src="getIcon(scope.$index)" alt="icon" style="width: 2.19rem; height: 1.25rem;">
@ -11,17 +11,37 @@
<el-table-column prop="date" width="100">
</el-table-column>
</el-table>
<!-- 详情弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">
<div>
<p><strong>时间:</strong> {{ selectedMessage.date || '暂无' }}</p>
<p><strong>内容:</strong> {{ selectedMessage.name }}</p>
</div>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleConfirm"></el-button>
<el-button @click="dialogVisible = false">关闭</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getAllMessages } from '@/api/ManageApi/index';
import { markSmartReminderAsRead } from '@/api/ManageApi/index';
export default {
name: 'MessageTable',
data() {
return {
tableData: []
tableData: [],
dialogVisible: false,
selectedMessage: {
id: '',
name: '',
date: ''
},
dialogTitle: '消息详情'
};
},
mounted() {
@ -36,6 +56,7 @@ export default {
},
processData(data) {
return data.map(item => ({
id: item.id, // id
name: item.content,
date: this.formatDate(item.createTime)
}));
@ -44,11 +65,43 @@ export default {
return index === 0 ? require('@/assets/images/new@2x.png') : require('@/assets/images/other.png');
},
formatDate(dateString) {
if (!dateString) {
return '';
}
const date = new Date(dateString);
if (isNaN(date.getTime())) {
return '';
}
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
},
handleRowClick(row) {
this.selectedMessage = row;
this.dialogVisible = true;
},
handleConfirm() {
if (this.selectedMessage.id) {
markSmartReminderAsRead(this.selectedMessage.id)
.then(response => {
if (response && response.code === 200) {
this.$message.success('消息已标记为已读');
this.dialogVisible = false;
//
this.getData(); //
} else {
this.$message.error('标记为已读失败');
}
})
.catch(error => {
console.error('标记为已读失败:', error);
this.$message.error('标记为已读失败');
});
} else {
this.$message.error('消息 ID 不存在');
this.dialogVisible = false;
}
}
}
};

@ -15,7 +15,7 @@
<!-- 详情弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="40%">
<div>
<p><strong>时间:</strong> {{ selectedMessage.date }}</p>
<p><strong>时间:</strong> {{ selectedMessage.date || '暂无' }}</p>
<p><strong>内容:</strong> {{ selectedMessage.name }}</p>
</div>
<span slot="footer" class="dialog-footer">

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

@ -13,12 +13,14 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime" type="date" placeholder="开始日期"
<el-form-item label="建设时间">
<el-date-picker v-model="queryParams.startTime" type="date" placeholder="开始日期"
value-format="yyyy-MM-dd"
style="width: 11rem;"></el-date-picker>
~
<el-date-picker v-model="queryParams.endTime" type="date" placeholder="结束日期"
style="width: 10.5rem;"></el-date-picker>
<el-date-picker v-model="queryParams.endTime" type="date" placeholder="开始日期"
value-format="yyyy-MM-dd"
style="width: 11rem;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="5">
@ -165,11 +167,12 @@ export default {
queryParams: {
pageNum: 1,
pageSize: 10,
xzfl: '',
name: '',
xmfrdwxz: '',
dateRange: '', //
status: ''
xzfl: undefined,
name: undefined,
xmfrdwxz: undefined,
startTime: undefined,
endTime: undefined,
status: undefined
},
//
upload: {

@ -1,52 +1,52 @@
<template>
<div>
<!-- 政务端页面 -->
<!-- 表单查询项 -->
<div class="headerbox">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
label-width="200">
<el-row>
<el-col :span="5">
<el-form-item label="项目名称" prop="name" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable style="width: 15rem;"
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime" type="date" placeholder="开始日期"
style="width: 11rem;"></el-date-picker>
~
<el-date-picker v-model="queryParams.endTime" type="date" placeholder="结束日期"
style="width: 10.5rem;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="现状分类">
<el-select v-model="queryParams.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-col>
</el-row>
<el-row>
<el-col :span="5">
<el-form-item label="项目法人单位">
<el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目法人单位" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</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-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 表单查询项 -->
<div class="headerbox">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="200">
<el-row>
<el-col :span="5">
<el-form-item label="项目名称" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime"
type="date" placeholder="开始日期" value-format="yyyy-MM-dd"
style="width: 11rem;" :clearable="true">
</el-date-picker>
~
<el-date-picker v-model="queryParams.endTime"
type="date" placeholder="结束日期"
value-format="yyyy-MM-dd"
style="width: 10.5rem;" :clearable="true">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="现状分类">
<el-select v-model="queryParams.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-col>
<el-col :span="5">
<el-form-item label="项目法人单位">
<el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
</el-row>
<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-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 表格内容区 -->
<div class="tablebox">
<!-- 标签行 -->
@ -115,7 +115,7 @@
</template>
</el-table-column>
<el-table-column label="总投资额(万元)" align="center" width="130" prop="ztze" />
<el-table-column label="总用地面积(平方米)" align="center" width="180" prop="zydmj" />
<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]] }">{{
@ -124,11 +124,11 @@
</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 size="mini" type="text" @click="getAdd(scope.row, 'fill')"
v-if="statusMap[scope.row.status] === '待审核'">详情</el-button>
<el-button size="mini" type="text" @click="getInfo(scope.row, 'fill')"
<el-button size="mini" type="text" @click="getAdd(scope.row, 'fill')"
v-if="statusMap[scope.row.status] === '审核通过'">详情</el-button>
<el-button size="mini" type="text" @click="getInfo(scope.row, 'detail')"
<el-button size="mini" type="text" @click="getAdd(scope.row, 'detail')"
v-if="statusMap[scope.row.status] === '待填报'">详情</el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)"
style="color: #F25353;">删除</el-button>
@ -187,7 +187,8 @@ export default {
xzfl: undefined,
name: undefined,
xmfrdwxz: undefined,
dateRange: [],
startTime: undefined,
endTime: undefined,
status: undefined
},
//
@ -209,10 +210,19 @@ export default {
/** 查询项目列表 */
getList() {
this.loading = true;
//
console.log('发送前的查询参数:', JSON.stringify(this.queryParams, null, 2));
getBasicInformationPage(this.queryParams).then((response) => {
console.log('API响应:', response); //
this.postList = response.data.records;
this.total = response.data.total;
this.loading = false;
}).catch(error => {
console.error('API请求错误:', error);
console.error('错误详情:', error.response); //
this.loading = false;
});
},
@ -281,16 +291,25 @@ export default {
})
.catch(() => { });
},
/** 详情按钮操作 */
getInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
/** 详情按钮操作 */
getAdd(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "新增");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-info/${id}`, query: { action: type } });
this.$router.push({ path: `/manage-add/${id}`, query: { action: type } });
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
this.queryParams = {
pageNum: 1,
pageSize: 10,
xzfl: undefined,
name: undefined,
xmfrdwxz: undefined,
startTime: undefined,
endTime: undefined,
status: undefined,
};
this.getList();
},
/** 搜索按钮操作 */
@ -301,7 +320,6 @@ export default {
},
};
</script>
<style scoped>
.headerbox {
background-color: #fff;

@ -11,11 +11,14 @@
</el-col>
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime" type="month" placeholder="开始日期" value-format="yyyy-MM"
<el-date-picker v-model="queryParams.begainTime"
type="date" placeholder="开始日期" value-format="yyyy-MM-dd"
style="width: 11rem;" :clearable="true">
</el-date-picker>
~
<el-date-picker v-model="queryParams.endTime" type="month" placeholder="结束日期" value-format="yyyy-MM"
<el-date-picker v-model="queryParams.endTime"
type="date" placeholder="结束日期"
value-format="yyyy-MM-dd"
style="width: 10.5rem;" :clearable="true">
</el-date-picker>
</el-form-item>
@ -64,7 +67,7 @@
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" />
<el-table-column label="项目建设起止时间" align="center">
<template slot-scope="scope">
{{ scope.row.begainTime }} {{ scope.row.endTime }}
{{ formatMonthYear(scope.row.begainTime) }} {{ formatMonthYear(scope.row.endTime) }}
</template>
</el-table-column>
<el-table-column label="项目评价" align="center" width="130" sortable="custom" prop="pjdj">
@ -157,7 +160,6 @@
import { getProjectEvaluationList, updateProjectEvaluationList } from '@/api/ManageApi/index.js';
import { checkPermi, checkRole } from "@/utils/permission"; //
export default {
dicts: [
'xzfl', 'pjdj'
@ -261,7 +263,7 @@ export default {
handleInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-info/${id}`, query: { action: type } });
this.$router.push({ path: `/manage-add/${id}`, query: { action: type } });
},
handleUpdate(row) {
this.editForm = {
@ -289,6 +291,10 @@ export default {
},
handleDelete(row) {
//
},
formatMonthYear(date) {
if (!date) return '';
return date.split('-').slice(0, 2).join('-');
}
},
mounted() {
@ -297,6 +303,7 @@ export default {
};
</script>
<style scoped>
.headerbox {
background-color: #fff;

@ -0,0 +1,481 @@
<template>
<div class="bigone">
<!-- 标题 -->
<div class="containerheadone" id="listtop">
<Title :basicInfo="basicInformation"></Title>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="goBack">
返回
</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"
class="custom-menu">
<el-menu-item v-for="(item, index) in sections" :key="index" :index="item.id"
class="custom-menu-item">
{{ item.label }}
</el-menu-item>
</el-menu>
</div>
<!-- 基本信息 -->
<div id="basic">
<Basic :action="action" :basicInfo="basicInformation"
@update-data="handleDataUpdate('basicInformation', $event)">
</Basic>
</div>
<!-- 规划信息 -->
<div id="programme">
<Programme :action="action" :planInfo="planInformation"
@update-data="handleDataUpdate('planInformation', $event)">
</Programme>
</div>
<!-- 建筑信息 -->
<div id="buildings">
<Buildings :action="action" :xmId="projectId"></Buildings>
</div>
<!-- 要素模型信息 -->
<div id="models">
<Models :action="action" :wysmxInfo="wysmxInformations"
@updata-data="handleDataUpdate('wysmxInformations', $event)">
</Models>
</div>
<!-- 月度进展信息 -->
<div id="months">
<Months :action="action"></Months>
</div>
<!-- 企业入驻信息 -->
<div id="companyenter">
<Companyenter :id="projectId" :action="action" :qyrzInfo="qyrzInformation"
@update-data="handleDataUpdate('qyrzInformation', $event)">
</Companyenter>
</div>
<!-- 项目画像 -->
<div id="projectpicture">
<Projectpicture :action="action" :id="projectId"></Projectpicture>
</div>
<!-- 项目图例 -->
<div id="projectpicturetwo">
<Projectpicturetwo22 :action="action" :xmId="projectId"> </Projectpicturetwo22>
</div>
<!-- 项目巡礼 -->
<div id="projectgift">
<Projectgift :action="action" :xmId="projectId"></Projectgift>
</div>
<!-- 现场实况 -->
<div id="liver">
<Liver :action="action"></Liver>
</div>
<!-- 项目备忘录 -->
<div id="memo">
<Memo :action="action" :xmId="projectId"></Memo>
</div>
<!-- 其他信息 -->
<div class="bottombox" id="others">
<Others :action="action" :xmId="projectId" :anotherInfo="projectOtherInfos"
@update-data="handleDataUpdate('projectOtherInfos', $event)">
</Others>
</div>
<div class="footer" v-if="showCompanySection">
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="submitAll">提交审核</el-button>
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="saveAll">暂存</el-button>
</div>
<div class="footer" v-if="checkRole(['common']) && action === 'fill'">
<el-button type="primary" v-if="checkRole(['common'])" @click="aduitAll"></el-button>
</div>
</div>
<!-- 返回顶部 -->
<el-button icon="el-icon-caret-top" circle id="back-to-top" @click="scrollToTop" plain></el-button>
</div>
</template>
<script>
import Title from '@/views/components/ProjectDetails/Title.vue';
import Basic from '@/views/components/ProjectDetails/Basic.vue';
import Buildings from '@/views/components/ProjectDetails/Buildings.vue';
import Companyenter from '@/views/components/ProjectDetails/Companyenter.vue';
import Liver from '@/views/components/ProjectDetails/Liver.vue';
import Memo from '@/views/components/ProjectDetails/Memo.vue';
import Models from '@/views/components/ProjectDetails/Models.vue';
import Months from '@/views/components/ProjectDetails/Months.vue';
import Programme from '@/views/components/ProjectDetails/Programme.vue';
import Projectgift from '@/views/components/ProjectDetails/Projectgift.vue';
import Projectpicture from '@/views/components/ProjectDetails/Projectpicture.vue';
import Projectpicturetwo22 from '@/views/components/ProjectDetails/Projectpicturetwo22.vue';
import Others from '@/views/components/ProjectDetails/Others.vue';
import { checkPermi, checkRole } from "@/utils/permission";
import { getzwBasicInformationById, fillBasicInformation, auditBasicInformation, tempBasicInformation } from '@/api/ManageApi/index';
export default {
components: {
Title,
Basic,
Buildings,
Companyenter,
Liver,
Memo,
Models,
Months,
Programme,
Projectgift,
Projectpicture,
Projectpicturetwo22,
Others,
},
data() {
return {
activeSection: 'basic',
sections: [
{ id: 'basic', label: '基本信息' },
{ id: 'programme', label: '规划信息' },
{ id: 'buildings', label: '建筑信息' },
{ id: 'models', label: '要素模型信息' },
{ id: 'months', label: '月度进展信息' },
{ id: 'companyenter', label: '企业入驻信息' },
{ id: 'projectpicture', label: '项目画像' },
{ id: 'projectpicturetwo', label: '项目图例' },
{ id: 'projectgift', label: '项目巡礼' },
{ id: 'liver', label: '现场实况' },
{ id: 'memo', label: '项目备忘录' },
{ id: 'others', label: '其他信息' }
],
projectId: null,
isContainerVisible: true,
isSubmitted: false,
basicInformation: {
acceptanceTime: "",
begainTime: "",
endTime: "",
fj: "",
introduction: "",
issuingTime: "",
jsdd: "",
jsjd: "",
jsms: 0,
label: "",
latitude: "",
longitude: "",
name: "",
nature: 0,
id: 0,
phone: "",
prioritize: "",
projectLeader: "",
sgdw: "",
sjdw: "",
ssgnq: 0,
status: 0,
tyshxydm: "",
unitIntroduction: "",
xmfrdwxz: "",
xzfl: 0,
zjzmj: 0,
ztze: 0,
zydmj: 0
},
planInformation: {
bzcjzmj: 0,
dsjzmj: 0,
dxjzmj: 0,
fhdj: "",
fjdctcw: 0,
ghwj: "",
jdctcw: 0,
jrjljzmj: 0,
jzds: 0,
jzmd: 0,
ldl: 0,
id: 0,
rjl: 0,
xmId: 0,
zgjzcs: 0,
zgjzgd: 0,
zjzmj: 0,
zydmj: 0
},
projectOtherInfos: [],
wysmxInformations: [],
qyrzInformation: {
gycfpjwyf: 0,
gycfpjzj: 0,
kzczmj: 0,
params: {},
remark: "",
rysl: 0,
id: 0,
rzl: 0,
rzqyhylx: "",
rzqys: 0,
xmId: 0,
yczmj: 0
},
projectRemarks: [],
loading: false,
};
},
created() {
// projectId
this.projectId = Number(this.$route.params.id);
this.loadData();
this.action = this.$route.query.action;
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
//
return isCompany && !isCommon;
}
},
methods: {
checkPermi,
checkRole,
loadData() {
console.log('Loading data for project ID:', this.projectId);
getzwBasicInformationById(this.projectId).then(response => {
const data = response.data;
this.basicInformation = data.basicInformation;
this.planInformation = data.planInformation;
this.projectOtherInfos = data.projectOtherInfos;
this.wysmxInformations = data.wysmxResponses;
this.qyrzInformation = data.qyrzInformation;
this.projectRemarks = data.projectRemarks
});
},
scrollToSection(id) {
this.activeSection = id;
const element = document.getElementById(id);
if (element) {
element.scrollIntoView({ behavior: 'smooth' });
}
},
scrollToTop() {
const basicSection = document.getElementById('listtop');
if (basicSection) {
basicSection.scrollIntoView({ behavior: 'smooth' });
}
},
goBack() {
this.$router.go(-1);
},
//
handleDataUpdate(dataKey, updatedData) {
if (dataKey === 'projectOtherInfos' || dataKey === 'wysmxInformations') {
if (Array.isArray(updatedData)) {
this[dataKey] = updatedData;
} else {
this[dataKey].push(updatedData);
}
} else {
this[dataKey] = updatedData;
}
console.log(`接收到 ${dataKey} 更新:`, updatedData);
},
//
isDefault(obj, defaultObj) {
for (const key in defaultObj) {
if (obj[key] !== defaultObj[key]) {
return false;
}
}
return true;
},
//
saveAll() {
this.loading = true;
const tempData = this.prepareSubmitData(); //
tempBasicInformation(tempData)
.then(response => {
this.$message.success('暂存成功');
console.log('暂存数据:', response);
this.$router.go(-1);
})
.catch(error => {
this.$message.error('暂存失败');
console.error('暂存错误:', error);
})
.finally(() => {
this.loading = false;
});
},
//
submitAll() {
this.loading = true;
const submitData = this.prepareSubmitData(); //
//
if (this.isDefault(this.planInformation, this.defaultPlanInformation)) {
this.$message.error('规划信息未填写');
this.scrollToSection('programme');
this.loading = false;
return;
}
fillBasicInformation(submitData)
.then(response => {
this.$message.success('提交成功');
this.isSubmitted = true;
this.$router.push('/manage');
})
.finally(() => {
this.loading = false;
});
},
//
aduitAll() {
this.loading = true;
const submitData = this.prepareSubmitData();
auditBasicInformation(submitData)
.then(response => {
console.log('提交成功:', response);
this.$message.success('审核通过');
this.isContainerVisible = false;
this.isSubmitted = true;
his.$router.push('/manage');
})
},
//
prepareSubmitData() {
return {
basicInformation: this.basicInformation,
planInformation: this.planInformation,
projectOtherInfos: this.projectOtherInfos,
qyrzInformation: this.qyrzInformation,
wysmxInformations: this.formatWysmxData() //
};
},
//
formatWysmxData() {
return this.wysmxInformations.flatMap(item =>
item.list.map(listItem => ({
createTime: this.formatDate(new Date()),
updateTime: this.formatDate(new Date()),
xmId: this.projectId,
ysmc: item.ysmc,
zdinfor: listItem.zdinfor,
zdname: listItem.zdname,
id: 0, // 0
createBy: "",
updateBy: "",
createId: 0,
updateId: 0
}))
);
},
//
formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
}
};
</script>
<style scoped>
.containerbody {
height: auto;
padding: .3rem .5rem;
display: flex;
flex-direction: column;
gap: 1rem;
position: relative;
overflow: auto;
}
.containerheadone {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
padding: 0 1rem 0 .7rem;
}
.containerhead {
display: flex;
justify-content: space-between;
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 {
margin: 1rem 0rem;
display: flex;
gap: 1rem;
border: none;
}
.custom-menu-item {
color: #3D424C;
width: auto;
height: 2rem;
background: #F4F7FE;
border-radius: 0.25rem 0.25rem 0.25rem 0.25rem;
display: flex;
align-items: center;
justify-content: center;
}
/* 高亮 */
.custom-menu-item.is-active {
background-color: #2B62F1;
color: #fff !important;
}
/* 悬停 */
.custom-menu-item:hover {
background-color: #2B62F1;
color: #fff !important;
}
/* 默认的下划线 */
.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,
.el-menu--horizontal .el-menu-item:not(.is-disabled):hover {
background-color: #2B62F1;
border-bottom: none;
}
.bottombox {
margin-bottom: 2rem;
}
.bigone {
position: relative;
}
#back-to-top {
position: fixed;
bottom: 40%;
right: 5px;
z-index: 99;
font-size: 23px;
}
.footer {
display: flex;
padding: 0 0 2rem 0;
justify-content: center;
}
</style>

@ -1,104 +1,97 @@
<template>
<div>
<!-- 企业端 -->
<div class="bigone" v-if="showCompanySection">
<!-- 标题 -->
<div class="containerheadone" id="listtop">
<Title :basicInfo="basicInformation"></Title>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="goBack">
返回
</el-button>
<div class="bigone">
<!-- 标题 -->
<div class="containerheadone" id="listtop">
<Title :basicInfo="basicInformation"></Title>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="goBack">
返回
</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"
class="custom-menu">
<el-menu-item v-for="(item, index) in sections" :key="index" :index="item.id"
class="custom-menu-item">
{{ item.label }}
</el-menu-item>
</el-menu>
</div>
<div style="display: flex;justify-content: center;">
<el-button type="primary" v-if="isSubmitted" disabled>已提交</el-button>
<!-- 基本信息 -->
<div id="basic">
<Basic :action="action" :basicInfo="basicInformation"
@update-data="handleDataUpdate('basicInformation', $event)">
</Basic>
</div>
<div class="containerbody" v-if="isContainerVisible">
<!-- 目录 -->
<div class="containerhead">
<el-menu :default-active="activeSection" mode="horizontal" @select="scrollToSection"
class="custom-menu">
<el-menu-item v-for="(item, index) in sections" :key="index" :index="item.id"
class="custom-menu-item">
{{ item.label }}
</el-menu-item>
</el-menu>
</div>
<!-- 基本信息 -->
<div id="basic">
<Basic :action="action" :basicInfo="basicInformation"
@update-data="handleDataUpdate('basicInformation', $event)">
</Basic>
</div>
<!-- 规划信息 -->
<div id="programme">
<Programme :action="action" :planInfo="planInformation"
@update-data="handleDataUpdate('planInformation', $event)">
</Programme>
</div>
<!-- 建筑信息 -->
<div id="buildings">
<Buildings :action="action" :xmId="projectId"></Buildings>
</div>
<!-- 要素模型信息 -->
<div id="models">
<Models :action="action" :wysmxInfo="wysmxInformations"
@updata-data="handleDataUpdate('wysmxInformations', $event)">
</Models>
</div>
<!-- 月度进展信息 -->
<div id="months">
<Months :action="action"></Months>
</div>
<!-- 企业入驻信息 -->
<div id="companyenter">
<Companyenter :id="projectId" :action="action" :qyrzInfo="qyrzInformation"
@update-data="handleDataUpdate('qyrzInformation', $event)">
</Companyenter>
</div>
<!-- 项目画像 -->
<div id="projectpicture">
<Projectpicture :action="action" :id="projectId"></Projectpicture>
</div>
<!-- 项目图例 -->
<div id="projectpicturetwo">
<Projectpicturetwo22 :action="action" :xmId="projectId"> </Projectpicturetwo22>
</div>
<!-- 项目巡礼 -->
<div id="projectgift">
<Projectgift :action="action" :xmId="projectId"></Projectgift>
</div>
<!-- 现场实况 -->
<div id="liver">
<Liver :action="action"></Liver>
</div>
<!-- 项目备忘录 -->
<div id="memo">
<Memo :action="action" :xmId="projectId"></Memo>
</div>
<!-- 其他信息 -->
<div class="bottombox" id="others">
<Others :action="action" :xmId="projectId" :anotherInfo="projectOtherInfos"
@update-data="handleDataUpdate('projectOtherInfos', $event)">
</Others>
</div>
<div class="footer">
<el-button type="primary" v-if="checkRole(['admin', 'common'])" @click="aduitAll"></el-button>
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="submitAll">提交审核</el-button>
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="saveAll">暂存</el-button>
</div>
<!-- 规划信息 -->
<div id="programme">
<Programme :action="action" :planInfo="planInformation"
@update-data="handleDataUpdate('planInformation', $event)">
</Programme>
</div>
<!-- 建筑信息 -->
<div id="buildings">
<Buildings :action="action" :xmId="projectId"></Buildings>
</div>
<!-- 要素模型信息 -->
<div id="models">
<Models :action="action" :wysmxInfo="wysmxInformations"
@updata-data="handleDataUpdate('wysmxInformations', $event)">
</Models>
</div>
<!-- 月度进展信息 -->
<div id="months">
<Months :action="action"></Months>
</div>
<!-- 企业入驻信息 -->
<div id="companyenter">
<Companyenter :id="projectId" :action="action" :qyrzInfo="qyrzInformation"
@update-data="handleDataUpdate('qyrzInformation', $event)">
</Companyenter>
</div>
<!-- 项目画像 -->
<div id="projectpicture">
<Projectpicture :action="action" :id="projectId"></Projectpicture>
</div>
<!-- 项目图例 -->
<div id="projectpicturetwo">
<Projectpicturetwo22 :action="action" :xmId="projectId"> </Projectpicturetwo22>
</div>
<!-- 项目巡礼 -->
<div id="projectgift">
<Projectgift :action="action" :xmId="projectId"></Projectgift>
</div>
<!-- 现场实况 -->
<div id="liver">
<Liver :action="action"></Liver>
</div>
<!-- 项目备忘录 -->
<div id="memo">
<Memo :action="action" :xmId="projectId"></Memo>
</div>
<!-- 其他信息 -->
<div class="bottombox" id="others">
<Others :action="action" :xmId="projectId" :anotherInfo="projectOtherInfos"
@update-data="handleDataUpdate('projectOtherInfos', $event)">
</Others>
</div>
<div class="footer">
<el-button type="primary" v-if="checkRole(['admin', 'common'])" @click="aduitAll"></el-button>
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="submitAll">提交审核</el-button>
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="saveAll">暂存</el-button>
</div>
<!-- 返回顶部 -->
<el-button icon="el-icon-caret-top" circle id="back-to-top" @click="scrollToTop" plain></el-button>
</div>
<!-- 政务端 -->
<div class="bigone" v-if="checkRole(['common'])">
123
</div>
<!-- 返回顶部 -->
<el-button icon="el-icon-caret-top" circle id="back-to-top" @click="scrollToTop" plain></el-button>
</div>
</template>
@ -232,14 +225,6 @@ export default {
this.loadData();
this.action = this.$route.query.action;
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
//
return isCompany && !isCommon;
}
},
methods: {
checkPermi,
checkRole,
@ -284,7 +269,7 @@ export default {
}
console.log(`接收到 ${dataKey} 更新:`, updatedData);
},
//
isDefault(obj, defaultObj) {
for (const key in defaultObj) {
if (obj[key] !== defaultObj[key]) {
@ -314,15 +299,7 @@ export default {
//
submitAll() {
this.loading = true;
const submitData = this.prepareSubmitData(); //
//
if (this.isDefault(this.planInformation, this.defaultPlanInformation)) {
this.$message.error('规划信息未填写');
this.scrollToSection('programme');
this.loading = false;
return;
}
const submitData = this.prepareSubmitData();
fillBasicInformation(submitData)
.then(response => {
@ -370,7 +347,7 @@ export default {
ysmc: item.ysmc,
zdinfor: listItem.zdinfor,
zdname: listItem.zdname,
id: 0, // 0
id: item.id,
createBy: "",
updateBy: "",
createId: 0,

@ -1,319 +1,256 @@
<template>
<div>
<!-- 企业端页面 -->
<!-- 表单查询项 -->
<div class="headerbox">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="200">
<el-row>
<el-col :span="5">
<el-form-item label="项目名称" prop="name" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable style="width: 15rem;"
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime" type="date" placeholder="开始日期"
style="width: 11rem;"></el-date-picker>
~
<el-date-picker v-model="queryParams.endTime" type="date" placeholder="结束日期"
style="width: 10.5rem;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="现状分类">
<el-select v-model="queryParams.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-col>
</el-row>
<el-row>
<el-col :span="5">
<el-form-item label="项目法人单位">
<el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目法人单位" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</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-form-item>
</el-col>
</el-row>
</el-form>
<div>
<!-- 政务端页面 -->
<!-- 表单查询项 -->
<div class="headerbox">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
label-width="200">
<el-row>
<el-col :span="5">
<el-form-item label="项目名称" style="width: 100%;">
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.startTime" type="date" placeholder="开始日期"
value-format="yyyy-MM-dd" style="width: 11rem;" :clearable="true">
</el-date-picker>
~
<el-date-picker v-model="queryParams.endTime" type="date" placeholder="结束日期"
value-format="yyyy-MM-dd" style="width: 10.5rem;" :clearable="true">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="现状分类">
<el-select v-model="queryParams.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-col>
<el-col :span="5">
<el-form-item label="项目法人单位">
<el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目法人单位" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
</el-row>
<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-form-item>
</el-col>
</el-row>
</el-form>
</div>
<!-- 表格内容区 -->
<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 label="序号" align="center">
<template slot-scope="scope">
{{ (scope.$index + 1) + (queryParams.pageNum - 1) * queryParams.pageSize }}
</template>
</el-table-column>
<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>
</template>
</el-table-column>
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" width="200" />
<el-table-column label="统一信用代码" align="center" prop="tyshxydm" width="200" />
<el-table-column label="项目建设起止时间" align="center" width="200">
<template slot-scope="scope">
{{ scope.row.begainTime }} {{ scope.row.endTime }}
</template>
</el-table-column>
<el-table-column label="总投资额(万元)" align="center" width="130" prop="ztze" />
<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>
</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="getAdd(scope.row, 'detail')">详情</el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)" v-if="checkRole(['admin'])"
style="color: #F25353;">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
</div>
</div>
<!-- 表格内容区 -->
<div class="tablebox">
<!-- 标签行 -->
<!-- 导入弹窗 -->
<el-dialog title="导入" :visible.sync="upload.open" width="400px" append-to-body>
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入xlsxlsx格式文件</span>
</div>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="upload.open = false">取消</el-button>
<el-button type="primary" @click="submitFileForm" :loading="upload.isUploading">确定</el-button>
</span>
</el-dialog>
<!-- 导出行 -->
<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-col>
</el-row> -->
</div>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" stripe>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{ (scope.$index + 1) + (queryParams.pageNum - 1) * queryParams.pageSize }}
</template>
</el-table-column>
<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>
</template>
</el-table-column>
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" width="200" />
<!-- <el-table-column label="统一信用代码" align="center" prop="tyshxydm" width="200" /> -->
<el-table-column label="项目建设起止时间" align="center" width="200">
<template slot-scope="scope">
{{ scope.row.begainTime }} {{ scope.row.endTime }}
</template>
</el-table-column>
<el-table-column label="总投资额(万元)" align="center" width="130" prop="ztze" />
<el-table-column label="总用地面积(平方米)" align="center" 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>
</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)"></el-button>
<el-button v-if="checkRole(['admin'])" size="mini" type="text" @click="handleDelete(scope.row)"
style="color: #F25353;">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
</div>
</div>
</template>
<script>
import { getBasicInformationPage } from "@/api/ManageApi/index";
import { getToken } from "@/utils/auth";
import { checkPermi, checkRole } from "@/utils/permission";
import { getBasicInformationPage, deleteBasicInformation } from "@/api/ManageApi/index";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
name: "Post",
dicts: ["xzfl"],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
statusColors: {
'审核通过': '#6EDABE',
'待填报': '#FFBF6B',
'待审核': '#7693D8'
},
//
statusMap: {
1: '待填报',
2: '待审核',
3: '审核通过'
},
xzflMap: {
1: '已建',
2: '在建',
3: '拟建'
},
//
queryParams: {
pageNum: 1,
pageSize: 10,
xzfl: '',
name: '',
xmfrdwxz: '',
dateRange: '', //
status: ''
},
//
upload: {
open: false, //
isUploading: false, //
updateSupport: 0, //
headers: { Authorization: "Bearer " + getToken() }, //
url: process.env.VUE_APP_BASE_API + "/gysl/basicInformation/import", //
},
};
},
created() {
this.getList();
},
methods: {
checkPermi,
checkRole,
/** 查询项目列表 */
getList() {
this.loading = true;
//
const params = {
...this.queryParams,
begainTime: this.queryParams.dateRange ? this.queryParams.dateRange[0] : undefined,
endTime: this.queryParams.dateRange ? this.queryParams.dateRange[1] : undefined
};
console.log('【查询参数】', params); //
getBasicInformationPage(params).then((response) => {
this.postList = response.data.records;
this.total = response.data.total;
this.loading = false;
}).catch(error => {
console.error('查询失败:', error);
this.loading = false;
});
},
//
processDateRange() {
if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) {
dicts: ["xzfl"],
data() {
return {
begainTime: this.queryParams.dateRange[0],
endTime: this.queryParams.dateRange[1]
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
statusColors: {
'审核通过': '#6EDABE',
'待填报': '#FFBF6B',
'待审核': '#7693D8'
},
//
statusMap: {
1: '待填报',
2: '待审核',
3: '审核通过'
},
xzflMap: {
1: '已建',
2: '再建',
3: '拟建'
},
//
queryParams: {
pageNum: 1,
pageSize: 10,
xzfl: undefined,
name: undefined,
xmfrdwxz: undefined,
startTime: undefined,
endTime: undefined,
status: undefined,
isFmqd: 1
}
};
}
return {};
},
/** 导入按钮操作 */
handleImport() {
this.upload.open = true;
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
created() {
this.getList();
},
methods: {
checkPermi,
checkRole,
/** 查询项目列表 */
getList() {
this.loading = true;
// isFmqd=2
const params = {
...this.queryParams,
isFmqd: 1
};
//
handleFileSuccess(response, file, fileList) {
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.$alert(
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
response.msg +
"</div>",
"导入结果",
{ dangerouslyUseHTMLString: true }
);
this.getList();
},
getBasicInformationPage(params).then((response) => {
this.postList = response.data.records;
this.total = response.data.total;
this.loading = false;
}).catch(error => {
console.error('API请求错误:', error);
this.loading = false;
});
},
//
submitFileForm() {
this.$refs.upload.submit();
},
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 导出按钮操作 */
handleExport() {
this.download('/gysl/basicInformation/exportInfo', {
...this.queryParams,
idList: this.ids[0]
}, `post_${new Date().getTime()}.xlsx`)
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal
.confirm('是否确认删除项目id为"' + ids + '"的数据项?')
.then(() => {
return deleteBasicInformation(ids);
})
.then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
})
.catch(() => { });
},
/** 详情按钮操作 */
getAdd(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "新增");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-add/${id}`, query: { action: type } });
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 10,
xzfl: undefined,
name: undefined,
xmfrdwxz: undefined,
startTime: undefined,
endTime: undefined,
status: undefined,
isFmqd: 1
};
this.getList();
},
/** 详情按钮操作 */
getInfo(row, type) {
this.$store.commit("SET_CRUMBS", this.$route.meta.title + "详情");
const id = row.id || this.ids[0];
this.$router.push({ path: `/manage-info/${id}`, query: { action: type } });
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 10,
xzfl: '',
name: '',
xmfrdwxz: '',
dateRange: '',
status: ''
};
this.handleQuery();
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
}
}
};
</script>
<style scoped>
.headerbox {
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
}
.tablebox {
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
background-color: #fff;
border-radius: .5rem;
padding: 1rem;
margin: .5rem;
border: 1px solid #eee;
}
.tablehead {
display: flex;
justify-content: space-between;
align-items: center;
display: flex;
justify-content: space-between;
align-items: center;
}
.headbtn {
display: flex;
display: flex;
}
.tablebtntwo {
margin-top: 1rem;
margin-bottom: 1rem;
margin-top: 1rem;
margin-bottom: 1rem;
}
</style>

@ -32,54 +32,57 @@
<el-button type="primary" icon="el-icon-plus"
@click="dialogVisible = true; resetForm()">新增要素</el-button>
<!-- 渲染所有要素 -->
<div v-for="(element, elementIndex) in tableData" :key="elementIndex" class="tablebox">
<div class="boxheader">
<div class="headerone">
<div>{{ element.type == 1 ? '关键要素' : '重要要素' }}</div>
<div>{{ element.name }}</div>
</div>
<div class="headertwo">
<el-button type="primary" icon="el-icon-edit" size="mini"
@click="handleDeleteElement(element, elementIndex)">删除要素</el-button>
<el-button type="primary" icon="el-icon-edit" size="mini"
@click="handleUpdate(element)">编辑要素</el-button>
<el-button type="primary" icon="el-icon-plus"
@click="showAddIndicatorDialog(element)">新增指标</el-button>
<!-- 要素列表渲染 -->
<div v-if="tableData.length > 0" class="tablebox" style="margin: .5rem;">
<div v-for="(element, elementIndex) in tableData" :key="elementIndex" class="tablebox">
<div class="boxheader">
<div class="headerone">
<div>{{ element.type == 1 ? '关键要素' : '重要要素' }}</div>
<div>{{ element.name }}</div>
</div>
<div class="headertwo">
<el-button type="primary" icon="el-icon-delete" size="mini"
@click="handleDeleteElement(element, elementIndex)">删除要素</el-button>
<el-button type="primary" icon="el-icon-edit" size="mini"
@click="handleUpdate(element)">编辑要素</el-button>
<el-button type="primary" icon="el-icon-plus"
@click="showAddIndicatorDialog(element)">新增指标</el-button>
</div>
</div>
<el-table :data="element.list" style="width: 100%" border>
<el-table-column label="序号" width="80" align="center">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="jtzb" label="具体指标" width="180"></el-table-column>
<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"
@click="handleUpdateIndicator(element, scope.row)">编辑</el-button>
<el-button size="mini" type="text" style="color: #F56C6C;"
@click="handleDeleteIndicator(element, scope.row, elementIndex, scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-table :data="element.list" style="width: 100%">
<el-table-column label="序号" width="180">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="jtzb" label="具体指标" width="180"></el-table-column>
<el-table-column prop="xxyq" label="详细要求" width="950"></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="handleUpdateIndicator(element, scope.row)">编辑指标</el-button>
<el-button size="mini" type="text"
@click="handleDelete(element, scope.row, elementIndex, scope.$index)"
style="color: #F25353;">删除指标</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div v-else style="text-align: center; margin: 1rem;">暂无数据</div>
</div>
<!-- 新增/编辑要素弹窗 -->
<el-dialog :title="form.id ? '编辑要素' : '新增要素'" :visible.sync="dialogVisible" width="30%">
<el-form :model="form" :rules="rules" ref="elementForm" label-width="80px">
<el-form-item label="类型" prop="type">
<el-select v-model="form.type" placeholder="请选择类型">
<!-- 要素新增对话框 -->
<el-dialog title="新增要素" :visible.sync="dialogVisible" width="500px">
<el-form :model="form" :rules="formRules" ref="elementForm" label-width="80px">
<el-form-item label="要素类型" prop="type">
<el-select v-model="form.type" placeholder="请选择类型" style="width: 100%">
<el-option v-for="dict in dict.type.yslx" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
:value="dict.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称"></el-input>
<el-form-item label="要素名称" prop="name">
<el-input v-model="form.name" placeholder="请输入要素名称"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
@ -88,14 +91,35 @@
</span>
</el-dialog>
<!-- 新增/编辑指标弹窗 -->
<el-dialog :title="indicatorForm.id ? '编辑指标' : '新增指标'" :visible.sync="indicatorDialogVisible" width="30%">
<el-form :model="indicatorForm" :rules="rules" ref="indicatorForm" label-width="80px">
<!-- 编辑要素对话框 -->
<el-dialog title="编辑要素" :visible.sync="editDialogVisible" width="500px">
<el-form :model="editForm" :rules="formRules" ref="editElementForm" label-width="80px">
<el-form-item label="要素类型" prop="type">
<el-select v-model="editForm.type" placeholder="请选择类型" style="width: 100%">
<el-option v-for="dict in dict.type.yslx" :key="dict.value" :label="dict.label"
:value="dict.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="要素名称" prop="name">
<el-input v-model="editForm.name" placeholder="请输入要素名称"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false"> </el-button>
<el-button type="primary" @click="submitEditElementForm"> </el-button>
</span>
</el-dialog>
<!-- 指标编辑/新增对话框 -->
<el-dialog :title="indicatorForm.id ? '编辑指标' : '新增指标'" :visible.sync="indicatorDialogVisible" width="500px">
<el-form :model="indicatorForm" :rules="indicatorRules" ref="indicatorForm" label-width="80px">
<el-form-item label="具体指标" prop="jtzb">
<el-input v-model="indicatorForm.jtzb" placeholder="请输入具体指标"></el-input>
</el-form-item>
<el-form-item label="详细要求" prop="xxyq">
<el-input v-model="indicatorForm.xxyq" placeholder="请输入详细要求"></el-input>
<el-input type="textarea" :rows="3" v-model="indicatorForm.xxyq"
placeholder="请输入详细要求"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
@ -104,6 +128,7 @@
</span>
</el-dialog>
</div>
<!-- 企业端 -->
<div v-if="showCompanySection">
<tianbao />
@ -112,43 +137,89 @@
</template>
<script>
import { addElement, getAllElements, editElemention, deleteElemention } from '@/api/ManageApi/index';
import {
addElement,
getAllElements,
editElemention,
deleteElemention,
updateYsElement,
deleteYsElement
} from '@/api/ManageApi/index';
import { checkPermi, checkRole } from "@/utils/permission";
import tianbao from '@/views/components/tianbao/tianbao.vue'
export default {
name: 'ElementManagement',
dicts: ['yslx'],
components: { tianbao },
data() {
return {
//
searchForm: {
name: '',
jtzb: ''
},
//
tableData: [],
//
dialogVisible: false,
editDialogVisible: false,
indicatorDialogVisible: false,
//
form: {
type: '',
name: ''
},
//
editForm: {
id: 0,
type: '',
name: '',
oldName: '',
oldType: ''
},
//
indicatorForm: {
id: 0,
jtzb: '',
xxyq: '',
elementId: 0
},
//
currentElement: null,
currentElementIndex: -1,
rules: {
//
formRules: {
type: [{ required: true, message: '请选择要素类型', trigger: 'change' }],
name: [{ required: true, message: '请输入要素名称', trigger: 'blur' }],
name: [{ required: true, message: '请输入要素名称', trigger: 'blur' }]
},
indicatorRules: {
jtzb: [{ required: true, message: '请输入具体指标', trigger: 'blur' }],
xxyq: [{ required: true, message: '请输入详细要求', trigger: 'blur' }]
}
},
//
useNewApi: true
};
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
return isCompany && !isCommon;
}
},
created() {
this.fetchElements();
},
methods: {
checkPermi,
checkRole,
@ -163,9 +234,14 @@ export default {
};
},
//
//
fetchElements() {
getAllElements(this.searchForm).then(response => {
const params = {
name: this.searchForm.name,
jtzb: this.searchForm.jtzb
};
getAllElements(params).then(response => {
if (response.code === 200) {
this.tableData = response.data.map(item => ({
...item,
@ -179,7 +255,7 @@ export default {
});
},
//
//
resetSearchForm() {
this.searchForm = {
name: '',
@ -188,10 +264,9 @@ export default {
this.fetchElements();
},
//
//
resetForm() {
this.form = {
id: 0,
type: '',
name: ''
};
@ -217,13 +292,20 @@ export default {
});
},
//
//
submitElementForm() {
this.$refs.elementForm.validate(valid => {
if (valid) {
this.handleAddElement();
} else {
return false;
}
});
},
//
submitEditElementForm() {
this.$refs.editElementForm.validate(valid => {
if (valid) {
this.handleEditElement();
}
});
},
@ -232,14 +314,16 @@ export default {
submitIndicatorForm() {
this.$refs.indicatorForm.validate(valid => {
if (valid) {
this.handleAddIndicator();
} else {
return false;
if (this.indicatorForm.id) {
this.handleEditIndicator();
} else {
this.handleAddIndicator();
}
}
});
},
//
//
handleAddElement() {
const user = this.getUserInfo();
const payload = {
@ -247,64 +331,76 @@ export default {
createBy: user.userName,
createId: user.userId,
updateBy: user.userName,
updateId: user.userId,
updateId: user.userId
};
const api = this.form.id ? editElemention : addElement;
api(payload).then(response => {
addElement(payload).then(response => {
if (response.code === 200) {
this.$message.success(this.form.id ? '要素编辑成功' : '要素新增成功');
this.$message.success('新增成功');
this.dialogVisible = false;
this.fetchElements();
} else {}
})
} else {
this.$message.error(response.msg || '新增失败');
}
}).catch(error => {
this.$message.error('新增失败: ' + (error.message || '未知错误'));
});
},
//
handleEditElement() {
const payload = {
newName: this.editForm.name,
newType: this.editForm.type,
oldName: this.editForm.oldName,
oldType: this.editForm.oldType
};
updateYsElement(payload).then(response => {
if (response.code === 200) {
this.$message.success('编辑成功');
this.editDialogVisible = false;
this.fetchElements();
} else {
this.$message.error(response.msg || '编辑失败');
}
}).catch(error => {
this.$message.error('编辑失败: ' + (error.message || '未知错误'));
});
},
//
handleUpdate(element) {
this.currentElement = element;
this.form = {
type: element.type,
name: element.name
this.editForm = {
id: element.id,
type: element.type.toString(),
name: element.name,
oldName: element.name,
oldType: element.type.toString()
};
this.dialogVisible = true;
this.editDialogVisible = true;
},
//
//
handleDeleteElement(element, elementIndex) {
this.$confirm(`确定删除要素"${element.name}"及其所有指标吗?`, '警告', {
this.$confirm(`确定删除要素"${element.name}"吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// IDID + ID
const idList = [element.id];
if (element.list && element.list.length > 0) {
element.list.forEach(indicator => {
if (indicator.id) { // ID
idList.push(indicator.id);
}
});
}
//
console.log('删除要素请求参数:', {
idList: idList.join(','),
elementIndex
});
const deletePromise = this.useNewApi
? deleteYsElement({ name: element.name, lx: element.type })
: deleteElemention([element.id]);
// API
deleteElemention(idList).then(response => {
deletePromise.then(response => {
if (response.code === 200) {
this.$message.success('删除成功');
//
this.tableData.splice(elementIndex, 1);
} else {
this.$message.error(response.msg || '删除失败');
}
}).catch(error => {
console.error('删除失败:', error);
this.$message.error('删除失败: ' + (error.message || '未知错误'));
});
}).catch(() => {
@ -312,7 +408,7 @@ export default {
});
},
//
//
showAddIndicatorDialog(element) {
this.currentElement = element;
this.resetIndicatorForm();
@ -320,7 +416,7 @@ export default {
this.indicatorDialogVisible = true;
},
//
//
handleAddIndicator() {
const user = this.getUserInfo();
const payload = {
@ -333,22 +429,44 @@ export default {
updateId: user.userId
};
const api = this.indicatorForm.id ? editElemention : addElement;
api(payload).then(response => {
addElement(payload).then(response => {
if (response.code === 200) {
this.$message.success(this.indicatorForm.id ? '指标编辑成功' : '指标新增成功');
this.$message.success('新增成功');
this.indicatorDialogVisible = false;
this.fetchElements();
} else {
this.$message.error(response.msg || '操作失败');
this.$message.error(response.msg || '新增失败');
}
}).catch(error => {
this.$message.error('操作失败: ' + (error.message || '未知错误'));
this.$message.error('新增失败: ' + (error.message || '未知错误'));
});
},
//
handleEditIndicator() {
const user = this.getUserInfo();
const payload = {
...this.indicatorForm,
name: this.currentElement.name,
type: this.currentElement.type,
updateBy: user.userName,
updateId: user.userId
};
editElemention(payload).then(response => {
if (response.code === 200) {
this.$message.success('编辑成功');
this.indicatorDialogVisible = false;
this.fetchElements();
} else {
this.$message.error(response.msg || '编辑失败');
}
}).catch(error => {
this.$message.error('编辑失败: ' + (error.message || '未知错误'));
});
},
//
handleUpdateIndicator(element, indicator) {
this.currentElement = element;
this.indicatorForm = {
@ -359,22 +477,15 @@ export default {
},
//
handleDelete(element, indicator, elementIndex, indicatorIndex) {
this.$confirm('确定删除该指标吗?', '警告', {
handleDeleteIndicator(element, indicator, elementIndex, indicatorIndex) {
this.$confirm('确定删除该指标吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
console.log('删除指标请求参数:', {
idList: [indicator.id].join(','),
elementIndex,
indicatorIndex
});
deleteElemention([indicator.id]).then(response => {
if (response.code === 200) {
this.$message.success('删除成功');
// list
this.tableData[elementIndex].list.splice(indicatorIndex, 1);
} else {
this.$message.error(response.msg || '删除失败');
@ -386,16 +497,6 @@ export default {
this.$message.info('已取消删除');
});
}
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
return isCompany && !isCommon;
}
},
mounted() {
this.fetchElements();
}
};
</script>

@ -26,7 +26,7 @@
</el-col>
<el-col :span="3">
<el-form-item label="更新时间" prop="updateTime">
<el-date-picker v-model="queryParams.updateTime" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
<el-date-picker v-model="queryParams.startTime" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
:style="{ width: '13.5rem' }" placeholder="选择日期" clearable @change="handleQuery" />
</el-form-item>
</el-col>
@ -169,7 +169,7 @@ export default {
pageSize: 10,
gydl: undefined,
slmllb: undefined,
updateTime: undefined
startTime: undefined
},
//
form: {
@ -211,8 +211,7 @@ export default {
//
headers: { Authorization: "Bearer " + getToken() },
//
// url: process.env.VUE_APP_BASE_API + "/tc/assetCurrent/import"
url: location.origin + "/gysl/ml/importMl",
url: process.env.VUE_APP_BASE_API + "/gysl/ml/importMl",
},
};
},
@ -352,7 +351,7 @@ export default {
/** 下载模板操作 */
importTemplate() {
this.download(
"/tc/assetCurrent/importTemplate",
"/gysl/ml/importTemplate",
{},
`目录导入模板${new Date().getTime()}.xlsx`
);

@ -240,8 +240,7 @@ export default {
//
headers: { Authorization: "Bearer " + getToken() },
//
// url: process.env.VUE_APP_BASE_API + "/tc/assetCurrent/import"
url: location.origin + "/gysl/xfcygl/imporXfcy",
url: process.env.VUE_APP_BASE_API + "/gysl/xfcygl/imporXfcy",
},
};
},
@ -381,9 +380,9 @@ export default {
/** 下载模板操作 */
importTemplate() {
this.download(
"/tc/assetCurrent/importTemplate",
"/gysl/xfcygl/importTemplate",
{},
`目录导入模板${new Date().getTime()}.xlsx`
`细分产业模板${new Date().getTime()}.xlsx`
);
},
//

@ -31,14 +31,14 @@ module.exports = {
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
public:'192.168.0.119',
// public:'192.168.0.119',
port: port,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `http://192.168.0.112: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