需求修改

xuhongjie
严飞永 3 months ago
parent aed1adb622
commit e912954367

@ -1,10 +1,10 @@
# 页面标题
VUE_APP_TITLE = 苏州工业园区工业上楼项目系统
VUE_APP_TITLE = 苏州工业园区工业上楼管理系统
# 开发环境配置
ENV = 'development'
# 苏州工业园区工业上楼项目系统/开发环境
# 苏州工业园区工业上楼管理系统/开发环境
VUE_APP_BASE_API = ''
# 路由懒加载

@ -1,8 +1,8 @@
# 页面标题
VUE_APP_TITLE = 苏州工业园区工业上楼项目系统
VUE_APP_TITLE = 苏州工业园区工业上楼管理系统
# 生产环境配置
ENV = 'production'
# 苏州工业园区工业上楼项目系统/生产环境
# 苏州工业园区工业上楼管理系统/生产环境
# VUE_APP_BASE_API = 'http://39.101.188.84:7071'

@ -1,5 +1,5 @@
# 页面标题
VUE_APP_TITLE = 苏州工业园区工业上楼项目系统
VUE_APP_TITLE = 苏州工业园区工业上楼管理系统
BABEL_ENV = production
@ -8,5 +8,5 @@ NODE_ENV = production
# 测试环境配置
ENV = 'staging'
# 苏州工业园区工业上楼项目系统/测试环境
# 苏州工业园区工业上楼管理系统/测试环境
VUE_APP_BASE_API = '/stage-api'

@ -1,7 +1,7 @@
{
"name": "ruoyi",
"version": "3.8.9",
"description": "苏州工业园区工业上楼项目系统",
"description": "苏州工业园区工业上楼管理系统",
"author": "若依",
"license": "MIT",
"scripts": {

@ -177,12 +177,12 @@ export function editElemention(data) {
});
}
// 删除指标
// 删除指标或要素
export function deleteElemention(idList) {
return request({
url: `/gysl/mx/delete`,
method: 'delete',
params: { idList }
params: { idList: idList.join(',') }
});
}
@ -242,7 +242,9 @@ export function deleteXmzsk(idList) {
return request({
url: '/gysl/xmzsk/delete',
method: 'delete',
params: { idList }
params: {
idList: idList.join(',') // 将数组转换为逗号分隔的字符串
}
});
}
@ -714,4 +716,15 @@ export function getXfcyglPage(params) {
method: 'get',
params
});
}
}
//消息通知数量
export function getMessageCount() {
return request({
url: '/gysl/qyStats/qyNoticeCount',
method: 'get'
})
}
//月度进展信息

@ -0,0 +1,86 @@
<template>
<div>
<!-- 政务端消息通知数量 -->
<!-- 大于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>
<script>
import { checkRole } from "@/utils/permission";
import { getMessageCount } from '@/api/ManageApi/index'
export default {
data() {
return {
counts: 0
}
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
//
return isCompany && !isCommon;
}
},
mounted() {
this.getCounts();
},
methods: {
checkRole,
//
async getCounts() {
try {
const response = await getMessageCount();
if (response && response.code === 200) {
this.counts = response.data; // counts
} else {
console.error('获取数据失败:', response);
}
} catch (error) {
console.error('获取数据失败:', error);
}
},
handleCommand(command) {
this.$message('点击了: ' + command)
}
}
}
</script>
<style scoped>
.item {
margin-right: 10px;
margin-top: .5rem;
.el-dropdown-link {
cursor: pointer;
color: black;
}
.el-dropdown-link i {
font-size: 2rem;
/* 增大图标的大小 */
}
}
</style>

@ -3,29 +3,23 @@
<div class="navbarleft">
<div class="logoimg">
<img src="../../assets/images/bluelogo@2x.png" alt="">
<span>苏州工业园区工业上楼项目系统</span>
<span>苏州工业园区工业上楼管理系统</span>
</div>
</div>
<div class="right-menu">
<el-badge :value="unreadMessages" :hidden="unreadMessages === 0" class="item">
<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 v-for="(message, index) in messages" :key="index" :command="message">
{{ message }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-badge>
<bearicon />
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
<div class="avatar-wrapper">
<img :src="avatar" class="user-avatar">
<i class="el-icon-caret-bottom"/>
<div v-if="checkRole(['common'])">
<span>{{ username }}</span>
</div>
<div v-if="showCompanySection">
<span>{{ username }}</span>
</div>
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="logout">
<el-dropdown-item @click.native="logout">
<span>退出登录</span>
</el-dropdown-item>
</el-dropdown-menu>
@ -44,74 +38,101 @@ import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch'
import RuoYiGit from '@/components/RuoYi/Git'
import RuoYiDoc from '@/components/RuoYi/Doc'
import bearicon from '@/components/bearicon'
import { checkPermi, checkRole } from "@/utils/permission";
import { getMessageCount } from '@/api/ManageApi/index'
export default {
components: {
Breadcrumb,
TopNav,
Hamburger,
Screenfull,
SizeSelect,
Search,
RuoYiGit,
RuoYiDoc
},
data() {
return {
messages: [
'消息1',
'消息2',
'消息3',
'消息4'
]
}
},
computed: {
...mapGetters([
'sidebar',
'avatar',
'device'
]),
setting: {
get() {
return this.$store.state.settings.showSettings
},
set(val) {
this.$store.dispatch('settings/changeSetting', {
key: 'showSettings',
value: val
})
}
components: {
Breadcrumb,
TopNav,
Hamburger,
Screenfull,
SizeSelect,
Search,
RuoYiGit,
RuoYiDoc,
bearicon
},
topNav: {
get() {
return this.$store.state.settings.topNav
}
data() {
return {
messages: [],
}
},
unreadMessages() {
return this.messages.length
}
},
methods: {
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
computed: {
...mapGetters([
'sidebar',
'avatar',
'device',
'name' // Make sure this getter exists in your Vuex store
]),
username() {
// Return the username from Vuex store or localStorage
return this.name || localStorage.getItem('username') || '账号名称';
},
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
//
return isCompany && !isCommon;
},
setting: {
get() {
return this.$store.state.settings.showSettings
},
set(val) {
this.$store.dispatch('settings/changeSetting', {
key: 'showSettings',
value: val
})
}
},
topNav: {
get() {
return this.$store.state.settings.topNav
}
},
unreadMessages() {
return this.messages.length
}
},
async logout() {
this.$confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
// location.href = '/index';
this.$router.replace('/login')
})
}).catch(() => { });
mounted() {
this.getCounts();
},
handleCommand(command) {
this.$message('点击了: ' + command)
methods: {
checkPermi,
checkRole,
//
async getCounts() {
try {
const response = await getMessageCount();
if (response && response.code === 200) {
this.counts = response.data; // counts
} else {
console.error('获取数据失败:', response);
}
} catch (error) {
console.error('获取数据失败:', error);
}
},
toggleSideBar() {
this.$store.dispatch('app/toggleSideBar')
},
async logout() {
this.$confirm('确定注销并退出系统吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
this.$router.replace('/login')
})
}).catch(() => { });
},
handleCommand(command) {
this.$message('点击了: ' + command)
}
}
}
}
</script>
@ -122,17 +143,20 @@ export default {
height: 50px;
overflow: hidden;
position: relative;
.logoimg{
.logoimg {
display: flex;
align-items: center;
gap: .8rem;
}
.logoimg img{
.logoimg img {
width: 3.69rem;
height: 2rem;
margin-left:1.2rem ;
margin-left: 1.2rem;
}
.logoimg span{
.logoimg span {
width: auto;
height: 2.06rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
@ -145,7 +169,8 @@ export default {
text-transform: none;
}
.navbarleft{
.navbarleft {
display: flex;
align-items: center;
}
@ -209,7 +234,7 @@ export default {
margin-right: 30px;
.avatar-wrapper {
margin-top: 5px;
margin-top: 2px;
position: relative;
.user-avatar {
@ -223,7 +248,7 @@ export default {
cursor: pointer;
position: absolute;
right: -20px;
top: 15px;
top: 17px;
font-size: 12px;
}
}
@ -232,12 +257,15 @@ export default {
.item {
margin-right: 10px;
margin-top: .5rem;
.el-dropdown-link {
cursor: pointer;
color: black;
}
.el-dropdown-link i {
font-size: 2rem; /* 增大图标的大小 */
font-size: 2rem;
/* 增大图标的大小 */
}
}
}

@ -44,7 +44,11 @@
{{ fileTypeMap[scope.row.lx] || scope.row.lx }}
</template>
</el-table-column>
<el-table-column label="附件" align="center" prop="fj" />
<el-table-column label="附件" align="center" prop="fj">
<template slot-scope="scope">
{{ getFileName(scope.row.fj) }}
</template>
</el-table-column>
<el-table-column label="上传用户" align="center" prop="scyh" />
<el-table-column label="上传时间" align="center" prop="scsj" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@ -223,6 +227,14 @@ export default {
this.getList();
},
methods: {
//
getFileName(filePath) {
if (filePath) {
return filePath.split('/').pop();
}
return '';
},
querySearchAsync(queryString, cb) {
let results = [];
// getXmzskPage API

@ -145,10 +145,12 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="建设起止时间" prop="begainTime">
<el-date-picker v-model="form.begainTime" type="daterange" range-separator=""
start-placeholder="开始日期" end-placeholder="结束日期"
style="width: 22.5rem;"></el-date-picker>
<el-form-item label="建设起止时间">
<el-date-picker v-model="form.begainTime" type="date" placeholder="开始日期"
style="width: 11rem;"></el-date-picker>
~
<el-date-picker v-model="form.endTime" type="date" placeholder="结束日期"
style="width: 10.5rem;"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
@ -172,6 +174,13 @@
</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-form-item>
</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-form-item>
@ -256,13 +265,84 @@ export default {
jsjd: '',
},
rules: {
name: [
{ required: true, message: '项目名称不能为空', trigger: 'blur' },
{ max: 50, message: '项目名称长度不能超过50个字', trigger: 'blur' }
],
xmfrdwxz: [
{ required: true, message: '项目法人单位不能为空', trigger: 'blur' },
{ max: 50, message: '项目法人单位长度不能超过50个字', trigger: 'blur' }
],
nature: [
{ required: true, message: '项目法人单位性质不能为空', trigger: 'change' }
],
sgdw: [
{ max: 50, message: '施工单位长度不能超过50个字', trigger: 'blur' }
],
sjdw: [
{ max: 50, message: '设计单位长度不能超过50个字', trigger: 'blur' }
],
ztze: [
{ required: true, message: '总投资额不能为空', trigger: 'blur' },
{ type: 'number', message: '总投资额必须是数字', trigger: 'blur' },
{ max: 50, message: '总投资额长度不能超过50个字', trigger: 'blur' }
],
ssgnq: [
{ required: true, message: '所属功能区不能为空', trigger: 'change' }
],
begainTime: [
{ required: true, message: '建设起始时间不能为空', trigger: 'change' }
],
endTime: [
{ required: true, message: '建设结束时间不能为空', trigger: 'change' }
],
xzfl: [
{ required: true, message: '现状分类不能为空', trigger: 'change' }
],
jsdd: [
{ max: 50, message: '建设地点长度不能超过50个字', trigger: 'blur' }
],
prioritize: [
{ max: 50, message: '重点发展产业长度不能超过50个字', trigger: 'blur' }
],
jsms: [
{ required: true, message: '建设模式不能为空', trigger: 'change' }
],
label: [
{ max: 50, message: '项目标签长度不能超过50个字', trigger: 'blur' }
],
projectLeader: [
{ required: true, message: '项目负责人不能为空', trigger: 'blur' },
{ max: 50, message: '项目负责人长度不能超过50个字', trigger: 'blur' }
],
phone: [
{ required: true, message: '联系方式不能为空', trigger: 'blur' },
{ pattern: /^[\d-]+$/, message: '联系方式只能包含数字和连字符', trigger: 'blur' },
{ max: 50, message: '联系方式长度不能超过50个字', trigger: 'blur' }
],
issuingTime: [
{ max: 50, message: '施工许可证发放时间长度不能超过50个字', trigger: 'blur' }
],
acceptanceTime: [
{ max: 50, message: '竣工验收时间长度不能超过50个字', trigger: 'blur' }
],
jsjd: [
{ max: 50, message: '建设进度长度不能超过50个字', trigger: 'blur' }
],
unitIntroduction: [
{ max: 1000, message: '项目法人单位简介长度不能超过1000个字', trigger: 'blur' }
],
introduction: [
{ max: 1000, message: '项目简介长度不能超过1000个字', trigger: 'blur' }
]
},
// select
ssgnqMap: {
1: '高端制造与国际贸易区',
2: '阳澄湖半岛旅游度假区',
3: '金鸡湖商务区',
4: '苏相合作区'
2: '独墅湖科教创新区',
3: '阳澄湖半岛旅游度假区',
4: '金鸡湖商务区',
5: '苏相合作区'
},
xmfrdwxzMap: {
1: '国企',
@ -276,7 +356,7 @@ export default {
},
xzflMap: {
1: '已建',
2: '建',
2: '建',
3: '拟建',
}
};
@ -287,7 +367,8 @@ export default {
this.descriptions = this.formatDescriptions(newVal);
this.form = {
...newVal,
begainTime: [new Date(newVal.begainTime), new Date(newVal.endTime)],
begainTime: newVal.begainTime ? new Date(newVal.begainTime) : '',
endTime: newVal.endTime ? new Date(newVal.endTime) : '',
};
},
immediate: true,
@ -300,16 +381,19 @@ export default {
return [
{ label: '项目名称', value: data.name },
{ label: '项目法人单位', value: data.xmfrdwxz },
{ label: '项目法人单位性质', value: this.xmfrdwxzMap[data.nature] || '未知' },
{ label: '项目法人单位性质', value: this.xmfrdwxzMap[data.nature] || '' },
{ label: '施工单位', value: data.sgdw },
{ label: '设计单位', value: data.sjdw },
{ label: '总投资额(万元)', value: data.ztze },
{ label: '所属功能区', value: this.ssgnqMap[data.ssgnq] || '未知' },
{ label: '建设起止时间', value: `${data.begainTime}${data.endTime}` },
{ label: '现状分类', value: this.xzflMap[data.xzfl] || '未知' },
{ label: '所属功能区', value: this.ssgnqMap[data.ssgnq] || '' },
{
label: '建设起止时间',
value: `${data.begainTime ? data.begainTime : ''}${data.endTime ? data.endTime : ''}`
},
{ label: '现状分类', value: this.xzflMap[data.xzfl] || '' },
{ label: '建设地点', value: data.jsdd },
{ label: '重点发展产业', value: data.prioritize },
{ label: '建设模式', value: this.jsmsMap[data.jsms] || '未知' },
{ label: '建设模式', value: this.jsmsMap[data.jsms] || '' },
{ label: '项目标签', value: data.label },
{ label: '项目负责人', value: data.projectLeader },
{ label: '联系方式', value: data.phone },
@ -349,14 +433,19 @@ export default {
return true;
},
//
//
prepareFormData(formData) {
// begainTime endTime
const [begainTime, endTime] = this.formatDateRange(formData.begainTime);
//
const formatDate = (date) => {
if (!date) return '';
// Date
return date instanceof Date ? date.toISOString().split('T')[0] : date;
};
return {
...formData, //
begainTime, //
endTime, //
...formData,
begainTime: formatDate(formData.begainTime), // begainTime
endTime: formatDate(formData.endTime), // endTime
createBy: '',
createId: 0,
createTime: '',
@ -365,23 +454,22 @@ export default {
updateTime: '',
};
},
//
formatDateRange(dateRange) {
if (!dateRange || dateRange.length !== 2) return ['', '']; //
// YYYY-MM-DD
const formatDate = (date) => {
if (!date) return '';
// Date Date
const d = date instanceof Date ? date : new Date(date);
return d.toISOString().split('T')[0]; // YYYY-MM-DD
};
// formatDateRange(dateRange) {
// if (!dateRange || dateRange.length !== 2) return ['', '']; //
// // YYYY-MM-DD
// const formatDate = (date) => {
// if (!date) return '';
// // Date Date
// const d = date instanceof Date ? date : new Date(date);
// return d.toISOString().split('T')[0]; // YYYY-MM-DD
// };
return [
formatDate(dateRange[0]), //
formatDate(dateRange[1]) //
];
},
// return [
// formatDate(dateRange[0]), //
// formatDate(dateRange[1]) //
// ];
// },
//
handleAttachmentSuccess(response, file) {
this.form.fj = response.url;

@ -13,7 +13,8 @@
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
新增
</el-button>
<el-button type="primary" size="medium" plain v-if="action === 'fill' || !action"
<el-button
type="primary" size="medium" plain v-if="buildings.length !== 0 && (action === 'fill' || !action)"
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="编辑"
@ -21,12 +22,16 @@
编辑
</el-button>
<el-button type="primary" size="medium" plain v-if="action === 'fill' || !action"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;"
@click="handleImport"
>
<i class="el-icon-download" style="width: 0.6rem; height: 0.6rem; margin-right: 4px;"></i>
导入
</el-button>
<el-button type="primary" size="medium" plain v-if="action === 'fill' || !action"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
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;">
导出
@ -35,17 +40,20 @@
</div>
<!-- 栋数楼栋名称 -->
<div class="tagdiv">
<div class="tagitem" v-for="building in buildings" :key="building.id" @click="selectBuilding(building.id)"
:class="getTagItemClass(building)">
<div v-if="buildings.length === 0" class="no-data"
style="width: 100%; display: flex;align-items: center;justify-content: center;color: gray;">
暂无数据
</div>
<div class="tagitem" v-for="building in buildings" :key="building.id" @click="selectBuilding(building)"
: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"
alt="" @click.stop="handleDelete(building.id)">
<img src="@/assets/images/detailsicon/icon-gb@2x.png" v-if="action === 'fill' || !action" alt=""
@click.stop="handleDelete(building.id)">
</div>
</div>
<!-- 内容区 -->
<div class="content" v-if="selectedBuilding">
<div class="content" v-if="buildings.length > 0">
<div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="4" border>
<el-descriptions-item>
@ -221,7 +229,7 @@ export default {
xmId: {
type: [Number, String],
required: true
},
},
action: {
type: String,
required: true
@ -255,7 +263,8 @@ export default {
updateTime: '',
xmId: 0,
zj: 0
}
},
rules:[]
};
},
created() {
@ -276,28 +285,28 @@ export default {
addBuildingTag() {
this.dialogVisible = true;
this.buildingForm = {
bzcmj: 0,
bzcmj: '',
createBy: '',
createId: 0,
createId: '',
createTime: '',
floor: 0,
fourYscg: 0,
fourYslmhz: 0,
id: 0,
floor: '',
fourYscg: '',
fourYslmhz: '',
id: '',
name: '',
scdmhz: 0,
scgd: 0,
scdmhz: '',
scgd: '',
sfwzyld: 2,
sfydzk: 2,
sfyqcpd: 2,
totalBuildingHeight: 0,
twoAndFourCg: 0,
twoAndThreeLmhz: 0,
totalBuildingHeight: '',
twoAndFourCg: '',
twoAndThreeLmhz: '',
updateBy: '',
updateId: 0,
updateId: '',
updateTime: '',
xmId: this.xmId,
zj: 0
zj: ''
};
},
fetchBuildings() {
@ -308,29 +317,19 @@ export default {
if (response.code === 200 && response.data) {
this.buildings = Object.values(response.data); //
console.log('Buildings data after assignment:', this.buildings);
//
if (this.buildings.length > 0) {
this.selectedBuilding = this.buildings[0];
}
} else {
console.error('数据格式不正确:', response);
}
})
.catch(error => {
console.error('数据获取失败:', error);
});
},
selectBuilding(id) {
console.log('Selected building ID:', id);
getjzxxById(id)
.then(response => {
console.log('Building details response:', response);
if (response.code === 200 && response.data) {
this.selectedBuilding = response.data; // selectedBuilding
console.log('Selected building data:', this.selectedBuilding);
} else {
console.error('数据格式不正确:', response);
}
})
.catch(error => {
console.error('数据获取失败:', error);
});
selectBuilding(building) {
this.selectedBuilding = building; // 使building
},
handleAddBuilding() {
const api = this.buildingForm.id ? updatejzxx : addjzxx; // ID
@ -473,6 +472,37 @@ export default {
cursor: pointer;
}
.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;
border: 1px solid transparent;
/* 添加透明边框保持布局稳定 */
transition: all 0.3s ease;
/* 添加过渡效果 */
}
.tagitem.active-tag {
border: 1px solid #2B62F1;
/* 选中时的蓝色边框 */
box-shadow: 0 0 0 2px rgba(43, 98, 241, 0.2);
/* 可选的外发光效果 */
}
.tagitem:hover {
background: #f0f0f0;
/* 鼠标悬停时的背景色变化 */
}
.important-building {
background-color: rgba(43, 98, 241, 0.1);
}
.important-building {
background-color: rgba(43, 98, 241, 0.1);
}

@ -64,7 +64,7 @@
</el-button>
</div>
<!-- 表格显示区 -->
<div class="contenttwo">
<div class="contenttwo">
<div class="descriptionsdiv">
<el-table :data="tableData" style="width: 98%">
<el-table-column prop="id" label="序号" width="200">
@ -173,7 +173,7 @@ export default {
headers: {
Authorization: "Bearer " + getToken()
},
url: process.env.VUE_APP_BASE_API + "/api/enterprise/import" //
url: process.env.VUE_APP_BASE_API + "/api/enterprise/import"
}
};
},

@ -31,6 +31,10 @@
<div v-if="image.isOnline" class="online-status online">线</div>
<div v-else class="online-status offline">离线</div>
</div>
<div v-if="images.length === 0" class="no-data"
style="width: 100%; display: flex;align-items: center;justify-content: center;color: gray;">
暂无数据
</div>
</div>
</div>
</template>
@ -46,17 +50,23 @@ export default {
data() {
return {
images: [
{ src: 'https://picsum.photos/300/200?random=1', isOnline: true },
{ src: 'https://picsum.photos/300/200?random=2', isOnline: false },
{ src: 'https://picsum.photos/300/200?random=3', isOnline: true },
// { src: 'https://picsum.photos/300/200?random=1', isOnline: true },
// { src: 'https://picsum.photos/300/200?random=2', isOnline: false },
// { src: 'https://picsum.photos/300/200?random=3', isOnline: true },
]
};
},
methods: {
removeImage(index) {
if (confirm('确定要删除该实况吗?')) {
this.$confirm('确定要删除该实况吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.images.splice(index, 1);
}
}).catch(() => {
//
});
}
}
};

@ -38,6 +38,10 @@
<div class="iconguanbi2" @click="handleEditMemo(memo)"> <img
src="../../../assets/images/detailsicon/icon-bj@2x.png" alt=""></div>
</div>
<div v-if="memos.length === 0" class="no-data"
style="width: 100%; display: flex;align-items: center;justify-content: center;color: gray;">
暂无数据
</div>
</div>
</div>

@ -15,33 +15,31 @@
<div class="content">
<div class="descriptionsdiv">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="month" label="进度月份" width="180">
<el-table-column prop="month" label="进度月份" width="200">
</el-table-column>
<el-table-column prop="status" label="状态" width="120" align="center">
<el-table-column prop="status" label="状态" width="200" align="center">
<template slot-scope="scope">
<span :style="getStatusColor(scope.row.status)">{{ scope.row.status }}</span>
</template>
</el-table-column>
<el-table-column prop="monthlyInvestment" label="当月完成投资" width="210" align="center">
<el-table-column prop="monthlyInvestment" label="当月完成投资" width="220" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.monthlyInvestment" style="width: 100%;"></el-input>
<span v-else>{{ scope.row.monthlyInvestment }}</span>
</template>
</el-table-column>
<el-table-column prop="cumulativeInvestment" label="累计完成投资" width="220" align="center">
<el-table-column prop="cumulativeInvestment" label="累计完成投资" width="280" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.cumulativeInvestment" style="width: 100%;"></el-input>
<span v-else>{{ scope.row.cumulativeInvestment }}</span>
</template>
</el-table-column>
<el-table-column prop="cumulativeArea" label='截止目前累计建成面积(平方米)' width="260" align="center">
<el-table-column prop="cumulativeArea" label='截止目前累计建成面积(平方米)' width="280" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.cumulativeArea" style="width: 100%;"></el-input>
<span v-else>{{ scope.row.cumulativeArea }}</span>
</template>
</el-table-column>
<el-table-column prop="loanAmount" label='贷款额度(万元)' width="200" align="center">
</el-table-column>
<el-table-column prop="progressDetails" label='项目进展详情' width="180" align="center">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model="scope.row.progressDetails" style="width: 100%;"></el-input>
@ -72,46 +70,7 @@ export default {
data() {
return {
tableData: [
{
month: '2016-05',
status: '未更新',
monthlyInvestment: 1000,
cumulativeInvestment: 1000,
cumulativeArea: 1000,
loanAmount: 500,
progressDetails: '项目进展详情1',
isEditing: false,
},
{
month: '2016-06',
status: '已更新',
monthlyInvestment: 1000,
cumulativeInvestment: 2000,
cumulativeArea: 1500,
loanAmount: 600,
progressDetails: '项目进展详情2',
isEditing: false,
},
{
month: '2016-07',
status: '未更新',
monthlyInvestment: 1000,
cumulativeInvestment: 3000,
cumulativeArea: 2000,
loanAmount: 700,
progressDetails: '项目进展详情3',
isEditing: false,
},
{
month: '2016-08',
status: '已更新',
monthlyInvestment: 1000,
cumulativeInvestment: 4000,
cumulativeArea: 2500,
loanAmount: 800,
progressDetails: '项目进展详情4',
isEditing: false,
}
],
currentPage: 1,
pageSize: 10,

@ -7,27 +7,26 @@
<span>其他信息</span>
</div>
<div class="topright" v-if="action === 'fill' || !action">
<el-button type="primary" size="medium" plain v-if="checkRole(['admin','common'])"
<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="openDialog('add')">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="新增"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
新增
</el-button>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;"
@click="toggleEditMode"
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="toggleEditMode"
:loading="saveLoading">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
{{ isEditMode ? '保存' : '编辑' }}
</el-button>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;">
<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>
<el-button type="primary" size="medium" plain
<el-button type="primary" size="medium" plain v-if="checkRole(['admin', 'common'])"
style="border: none;background-color: rgba(242,83,83,0.1);color: #F25353;" @click="deleteData">
<img src="../../../assets/images/detailsicon/icon-delet@2x.png" alt="删除"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
@ -71,7 +70,7 @@
</template>
<script>
import { checkPermi, checkRole } from "@/utils/permission";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
props: {
@ -83,6 +82,10 @@ export default {
action: {
type: String,
required: true
},
xmId:{
type: Number,
default: 0
}
},
created() {
@ -104,7 +107,7 @@ export default {
methods: {
checkPermi,
checkRole,
//
openDialog(type) {
if (type === 'add') {
@ -116,7 +119,7 @@ export default {
this.dialogVisible = true;
}
},
//
toggleEditMode() {
if (this.isEditMode) {
@ -129,7 +132,7 @@ export default {
this.editedData = JSON.parse(JSON.stringify(this.anotherInfo));
}
},
//
handleFieldChange(item) {
const index = this.editedData.findIndex(i => i.zdname === item.zdname);
@ -137,20 +140,20 @@ export default {
this.editedData[index] = { ...item };
}
},
//
saveChanges() {
this.saveLoading = true;
try {
//
const updatedData = this.editedData.map(item => ({
...item,
}));
//
this.$emit('update-info', updatedData);
// 退
this.isEditMode = false;
} catch (error) {
@ -159,7 +162,17 @@ export default {
this.saveLoading = false;
}
},
/**导出 */
handleExport() {
this.download(
"/gysl/projectOtherInfo/export",
{
xmId: this.xmId,
...this.anotherInfo,
},
`其他信息${new Date().getTime()}.xlsx`
);
},
//
submitForm() {
const newItem = {
@ -168,13 +181,13 @@ export default {
createTime: new Date().toISOString(),
//
};
//
this.$emit('add-info', newItem);
this.dialogVisible = false;
},
//
deleteData() {
this.$confirm('确定要删除这些信息吗?', '提示', {
@ -187,7 +200,7 @@ export default {
this.$message({
type: 'info',
message: '已取消删除'
});
});
});
}
}

@ -18,7 +18,7 @@
<!-- 展示区域 -->
<div class="image-container">
<div v-for="(item, index) in projectList" :key="index" class="image-box" >
<div v-for="(item, index) in projectList" :key="index" class="image-box">
<img :src="item.img" alt="项目图片" class="image">
<div class="close-button" @click="removeImage(index)">
<img src="../../../assets/images/detailsicon/icon-关闭@2x.png" alt="">
@ -32,6 +32,10 @@
</div>
</div>
</div>
<div v-if="projectList.length === 0" class="no-data"
style="width: 100%; display: flex;align-items: center;justify-content: center;color: gray;">
暂无数据
</div>
<!-- 新增弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="50%">
@ -82,7 +86,7 @@
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submitForm" :loading="loading">{{ isEditMode ? '保存' : '确 定'
}}</el-button>
}}</el-button>
</span>
</el-dialog>
<!-- 新增详情弹窗 -->
@ -191,7 +195,6 @@ export default {
//
handleItemClick(item) {
//
event.stopPropagation();
//
const isActionButton = event.target.closest('.close-button') ||
@ -227,8 +230,7 @@ export default {
},
//
async removeImage(index,event) {
event.stopPropagation();
async removeImage(index, event) {
try {
await this.$confirm('确定要删除该项目巡礼吗?', '提示', {
confirmButtonText: '确定',
@ -501,7 +503,7 @@ export default {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 1.13rem;
color: #FFFFFF;
color: black;
line-height: 1.56rem;
text-align: left;
font-style: normal;
@ -512,7 +514,7 @@ export default {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 0.75rem;
color: rgba(255, 255, 255, 0.8);
color: black;
line-height: 1rem;
text-align: left;
font-style: normal;
@ -536,7 +538,8 @@ export default {
width: 1.2rem;
height: 1.2rem;
}
.dianjibox{
.dianjibox {
width: 18rem;
height: 11rem;
/* background-color: red; */

@ -21,7 +21,7 @@
<div class="tablehead">
<img src="@/assets/images/icon-pjdj@2x.png" alt="">
<span>评价等级</span>
<span style="margin-top: .3rem;">12/60</span>
<span style="margin-top: .3rem;"></span>
</div>
<div class="tablebody">
<div class="table-container">

@ -21,7 +21,7 @@
</el-button>
</div>
</div>
<!-- 编辑/新增对话框 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="500px">
<el-form :model="form" label-width="120px" :rules="rules" ref="formRef">

@ -15,7 +15,9 @@
<template slot-scope="scope">
<el-button size="mini" 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')">详情</el-button>
<el-button size="mini" type="text" @click="getInfo(scope.row, 'detail')"
v-if="statusMap[scope.row.status] !== '待填报'"
>详情</el-button>
</template>
</el-table-column>
</el-table>
@ -60,7 +62,7 @@ export default {
},
xzflMap: {
1: '已建',
2: '建',
2: '建',
3: '拟建'
},
//

@ -69,7 +69,7 @@ export default {
formatter: function (name) {
//
const item = this.chartData.find(item => item.name === name);
return `${name} ${item.value} (${item.percent}%)`;
return `${name} ${item.value}`;
}.bind(this)
},
series: [

@ -1,96 +1,146 @@
<template>
<div class="projectList">
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="name" label="项目名称" width="170">
<template slot-scope="scope">
<span style="color: #2B62F1;">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column prop="ssgnq" label="所在区域">
</el-table-column>
<el-table-column prop="ztze" label='总投资额(万元)' width="88">
</el-table-column>
<el-table-column prop="zydmj" label='建筑面积(万平方米)' width="88">
</el-table-column>
<el-table-column prop="status" label="状态" width="70">
<template slot-scope="scope">
<span :style="getStatusColor(scope.row.status)">{{ scope.row.status }}</span>
</template>
</el-table-column>
</el-table>
</div>
<div>
<!-- 表格内容区 -->
<div class="tablebox">
<!-- 标签行 -->
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" stripe>
<el-table-column label="项目名称" align="center" width="150" >
<template slot-scope="scope">
<span style="color: #2B62F1;cursor: pointer;" @click="getInfo(scope.row, 'detail')">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column label="总投资额(万元)" align="center" prop="ztze" />
<el-table-column label="所在区域" align="center" width="100" prop="ssgnq">
<template slot-scope="scope">
<span>{{ ssgnqMap[scope.row.ssgnq] }}</span>
</template>
</el-table-column>
<el-table-column label="总用地面积(平方米)" align="center" width="100" prop="zydmj" />
<el-table-column label="状态" align="center" width="100" prop="xzfl">
<template slot-scope="scope">
<span :style="{ color: xzflColors[xzflMap[scope.row.xzfl]] }">{{
xzflMap[scope.row.xzfl] }}</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import { xmlist } from '@/api/ManageApi'
import { getBasicInformationPage } from "@/api/ManageApi/index";
import { checkPermi, checkRole } from "@/utils/permission";
export default {
data() {
return {
tableData: [],
ssgnqMap:{
1:'高贸区',
2:'科创区',
3:'度假区',
4:'商务区',
5:'苏相合作区'
}
}
},
created() {
this.getxmList();
},
methods: {
async getxmList() {
const response = await xmlist();
if (response && response.code === 200 && response.data.records) {
this.tableData = this.processData(response.data.records);
}
name: "TableContent",
dicts: ["xzfl"],
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
postList: [],
//
xzflColors: {
'在建': '#6EDABE',
'拟建': '#FFBF6B',
'已建': '#2B62F1'
},
//
ssgnqMap: {
1: '高贸区',
2: '科创区',
3: '度假区',
4: '商务区',
5: '苏相合作区'
},
xzflMap: {
1: '已建',
2: '在建',
3: '拟建'
},
//
queryParams: {
pageNum: 1,
pageSize: 10,
xzfl: '',
name: '',
xmfrdwxz: '',
dateRange: '', //
status: ''
},
};
},
processData(data) {
return data.map(item => ({
name: item.name,
ssgnq: this.getRegion(item.ssgnq),
ztze: item.ztze,
zydmj: item.zydmj || 0,
status: this.getStatus(item.xzfl)
}));
created() {
this.getList();
},
getStatus(xzfl) {
switch (xzfl) {
case 1:
return '已建';
case 2:
return '在建';
case 3:
return '拟建';
default:
return '未知';
}
},
getRegion(ssgnq) {
return this.ssgnqMap[ssgnq] || '未知区域';
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;
});
},
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id);
this.single = selection.length !== 1;
this.multiple = !selection.length;
},
/** 详情按钮操作 */
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 } });
},
},
getStatusColor(status) {
switch (status) {
case '在建':
return 'color: #2DD29F;';
case '拟建':
return 'color: #F08445;';
case '已建':
return 'color: #2B62F1;';
default:
return 'color: #000000;';
}
}
}
}
};
</script>
<style scoped>
.projectList {
padding: 0 .5rem 0rem 0;
height: 15rem;
overflow-y: auto;
.tablebox {
background-color: #fff;
border-radius: .5rem;
margin: .5rem;
}
.tablehead {
display: flex;
justify-content: space-between;
align-items: center;
}
.tablebtntwo {
margin-top: 1rem;
margin-bottom: 1rem;
}
</style>

@ -12,11 +12,13 @@
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="项目建设起止时间">
<el-date-picker v-model="queryParams.dateRange" type="daterange" format="yyyy-MM-dd"
value-format="yyyy-MM-dd" :style="{ width: '100%' }" start-placeholder="开始日期"
end-placeholder="结束日期" range-separator="至" clearable @change="handleQuery"></el-date-picker>
<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">
@ -104,7 +106,9 @@
<template slot-scope="scope">
<el-button size="mini" 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')">详情</el-button>
<el-button size="mini" type="text" @click="getInfo(scope.row, 'detail')"
v-if="statusMap[scope.row.status] !== '待填报'"
>详情</el-button>
</template>
</el-table-column>
</el-table>
@ -151,7 +155,7 @@ export default {
},
xzflMap: {
1: '已建',
2: '建',
2: '建',
3: '拟建'
},
//

@ -7,21 +7,23 @@
label-width="200">
<el-row>
<el-col :span="5">
<el-form-item label="项目名称" prop="postName" style="width: 100%;">
<el-input v-model="queryParams.postName" placeholder="请输入项目名称" clearable
<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="9">
<el-form-item label="项目建设起止时间" prop="">
<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="queryParams.dateRange"></el-date-picker>
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.startTime" 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.postCode" placeholder="现状分类" clearable>
<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>
@ -94,10 +96,19 @@
</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" prop="id" />
<el-table-column label="序号" align="center">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column label="项目名称" align="center" prop="name" width="200" />
<el-table-column label="现状分类" align="center" prop="xzfl" />
<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 }}
@ -149,9 +160,9 @@ export default {
postList: [],
//
statusColors: {
'审核通过': '#6EDABE',
'待填报': '#FFBF6B',
'待审核': '#7693D8'
'审核通过': '#6EDABE',
'待填报': '#FFBF6B',
'待审核': '#7693D8'
},
//
statusMap: {
@ -159,14 +170,20 @@ export default {
2: '待审核',
3: '审核通过'
},
xzflMap: {
1: '已建',
2: '在建',
3: '拟建'
},
//
queryParams: {
pageNum: 1,
pageSize: 10,
postCode: undefined,
postName: undefined,
xzfl: undefined,
name: undefined,
xmfrdwxz: undefined,
dateRange: [],
startTime: undefined,
status: undefined
},
//
@ -186,15 +203,51 @@ export default {
checkPermi,
checkRole,
/** 查询项目列表 */
/** 查询项目列表 */
getList() {
this.loading = true;
getBasicInformationPage(this.queryParams).then((response) => {
//
const params = {
pageNum: this.queryParams.pageNum,
pageSize: this.queryParams.pageSize,
...(this.queryParams.name && { name: this.queryParams.name }),
...(this.queryParams.xzfl && { xzfl: this.queryParams.xzfl }),
...(this.queryParams.xmfrdwxz && { xmfrdwxz: this.queryParams.xmfrdwxz }),
...(this.queryParams.status && { status: this.queryParams.status })
};
//
if (this.queryParams.startTime) {
params.startTime = this.formatDate(this.queryParams.startTime);
}
if (this.queryParams.endTime) {
params.endTime = this.formatDate(this.queryParams.endTime);
}
console.log('最终查询参数:', params); //
getBasicInformationPage(params).then((response) => {
this.postList = response.data.records;
this.total = response.data.total;
this.loading = false;
}).catch(() => {
this.loading = false;
});
},
//
formatDate(date) {
if (!date) return null;
const d = new Date(date);
let month = '' + (d.getMonth() + 1);
let day = '' + d.getDate();
const year = d.getFullYear();
if (month.length < 2) month = '0' + month;
if (day.length < 2) day = '0' + day;
return [year, month, day].join('-');
},
/** 导入按钮操作 */
handleImport() {
this.upload.open = true;
@ -267,9 +320,19 @@ export default {
this.$router.push({ path: `/manage-info/${id}` });
},
/** 重置按钮操作 */
/** 重置按钮操作 */
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();
},
/** 搜索按钮操作 */

@ -88,12 +88,12 @@ export default {
form: {},
//
rules: {
// postName: [
// { required: true, message: '', trigger: 'blur' }
// ],
// postCode: [
// { required: true, message: '', trigger: 'blur' }
// ]
postName: [
{ required: true, message: '评价要素不能为空', trigger: 'blur' }
],
postCode: [
{ required: true, message: '评分规则不能为空', trigger: 'blur' }
]
}
};
},

@ -9,11 +9,14 @@
<el-input v-model="queryParams.name" placeholder="请输入项目名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="9">
<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="queryParams.dateRange">
<el-col :span="8">
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime" type="month" placeholder="开始日期" value-format="yyyy-MM"
style="width: 11rem;" :clearable="true">
</el-date-picker>
~
<el-date-picker v-model="queryParams.endTime" type="month" placeholder="结束日期" value-format="yyyy-MM"
style="width: 10.5rem;" :clearable="true">
</el-date-picker>
</el-form-item>
</el-col>
@ -44,7 +47,8 @@
</div>
<!-- 表格内容区 -->
<div class="tablebox">
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<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 label="序号" align="center" prop="id" />
<el-table-column label="项目名称" align="center" prop="name" />
@ -59,15 +63,16 @@
{{ scope.row.begainTime }} {{ scope.row.endTime }}
</template>
</el-table-column>
<el-table-column label="项目评价" align="center" width="130">
<el-table-column label="项目评价" align="center" width="130" sortable="custom" prop="pjdj">
<template slot-scope="scope">
{{ scope.row.pjdj }} / {{ total }}
</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" icon="el-icon-view" @click="handleInfo(scope.row)"></el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"></el-button>
<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>
</template>
</el-table-column>
</el-table>
@ -141,6 +146,8 @@
<script>
import { getProjectEvaluationList, updateProjectEvaluationList } from '@/api/ManageApi/index.js';
import { checkPermi, checkRole } from "@/utils/permission"; //
export default {
dicts: [
@ -151,7 +158,7 @@ export default {
//
xzflMap: {
'1': '已建',
'2': '建',
'2': '建',
'3': '拟建'
},
postList: [],
@ -163,7 +170,9 @@ export default {
name: '',
dateRange: '',
xzfl: '',
pjdj: ''
pjdj: '',
begainTime: null,
endTime: null
},
showSearch: true,
dialogVisible: false,
@ -189,6 +198,15 @@ export default {
};
},
methods: {
checkPermi,
checkRole,
handleSortChange({ prop, order }) {
if (order === 'ascending') {
this.postList.sort((a, b) => a[prop] - b[prop]);
} else if (order === 'descending') {
this.postList.sort((a, b) => b[prop] - a[prop]);
}
},
handleQuery() {
this.getList();
},
@ -197,7 +215,8 @@ export default {
current: 1,
size: 10,
name: '',
dateRange: '',
begainTime: '',
endTime: '',
xzfl: '',
pjdj: ''
};
@ -205,19 +224,25 @@ export default {
},
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
current: this.queryParams.current,
size: this.queryParams.size,
...(this.queryParams.name && { name: this.queryParams.name }),
...(this.queryParams.xzfl && { xzfl: this.queryParams.xzfl }),
...(this.queryParams.pjdj && { pjdj: this.queryParams.pjdj }),
//
...(this.queryParams.begainTime && { begainTime: this.queryParams.begainTime }),
...(this.queryParams.endTime && { endTime: this.queryParams.endTime })
};
console.log('最终查询参数:', params); //
getProjectEvaluationList(params)
.then(response => {
this.postList = response.data.records;
this.total = response.data.total;
})
.catch(error => {
console.error('获取项目评价清单失败:', error);
})
.finally(() => {
this.loading = false;
});
@ -225,12 +250,10 @@ export default {
handleSelectionChange(selection) {
//
},
handleInfo(row) {
this.infoForm = {
...row,
dateRange: [row.begainTime, row.endTime]
};
this.infoDialogVisible = true;
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 } });
},
handleUpdate(row) {
this.editForm = {

@ -4,7 +4,7 @@
</div>
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<img src="@/assets/images/logo@2x.png" alt="">
<div class="title">苏州工业园区工业上楼项目系统</div>
<div class="title">苏州工业园区工业上楼管理系统</div>
<div class="logintabs">
<!-- @tab-click="handleClick" -->
<el-tabs

@ -30,71 +30,54 @@
</div>
<!-- 规划信息 -->
<div id="programme">
<Programme
:action="action"
:planInfo="planInformation" @update-data="handleDataUpdate('planInformation', $event)">
<Programme :action="action" :planInfo="planInformation"
@update-data="handleDataUpdate('planInformation', $event)">
</Programme>
</div>
<!-- 建筑信息 -->
<div id="buildings">
<Buildings
:action="action"
:xmId="projectId"></Buildings>
<Buildings :action="action" :xmId="projectId"></Buildings>
</div>
<!-- 要素模型信息 -->
<div id="models">
<Models
:action="action"
:wysmxInfo="wysmxInformations" @updata-data="handleDataUpdate('wysmxInformations', $event)">
<Models :action="action" :wysmxInfo="wysmxInformations"
@updata-data="handleDataUpdate('wysmxInformations', $event)">
</Models>
</div>
<!-- 月度进展信息 -->
<div id="months">
<Months
:action="action"></Months>
<Months :action="action"></Months>
</div>
<!-- 企业入驻信息 -->
<div id="companyenter">
<Companyenter
:id="projectId"
:action="action"
:qyrzInfo="qyrzInformation" @update-data="handleDataUpdate('qyrzInformation', $event)">
<Companyenter :id="projectId" :action="action" :qyrzInfo="qyrzInformation"
@update-data="handleDataUpdate('qyrzInformation', $event)">
</Companyenter>
</div>
<!-- 项目画像 -->
<div id="projectpicture">
<Projectpicture
:action="action" :id="projectId"></Projectpicture>
<Projectpicture :action="action" :id="projectId"></Projectpicture>
</div>
<!-- 项目图例 -->
<div id="projectpicturetwo">
<Projectpicturetwo22
:action="action"
:xmId="projectId"> </Projectpicturetwo22>
<Projectpicturetwo22 :action="action" :xmId="projectId"> </Projectpicturetwo22>
</div>
<!-- 项目巡礼 -->
<div id="projectgift">
<Projectgift
:action="action"
:xmId="projectId"></Projectgift>
<Projectgift :action="action" :xmId="projectId"></Projectgift>
</div>
<!-- 现场实况 -->
<div id="liver">
<Liver
:action="action"
></Liver>
<Liver :action="action"></Liver>
</div>
<!-- 项目备忘录 -->
<div id="memo">
<Memo
:action="action"
:xmId="projectId"></Memo>
<Memo :action="action" :xmId="projectId"></Memo>
</div>
<!-- 其他信息 -->
<div class="bottombox" id="others">
<Others
:action="action"
:anotherInfo="projectOtherInfos" @update-data="handleDataUpdate('projectOtherInfos', $event)">
<Others :action="action" :xmId="projectId" :anotherInfo="projectOtherInfos"
@update-data="handleDataUpdate('projectOtherInfos', $event)">
</Others>
</div>
<div class="footer">
@ -230,7 +213,8 @@ export default {
yczmj: 0
},
// buildingInformation: [],
projectRemarks: []
projectRemarks: [],
loading: false,
};
},
created() {
@ -287,6 +271,7 @@ export default {
},
//
submitAll() {
this.loading = true; //
const submitData = this.prepareSubmitData();
// 便
@ -299,10 +284,14 @@ export default {
this.$message.success('数据提交成功');
this.isContainerVisible = false;
this.isSubmitted = true;
this.$router.push('/manage');
})
.catch(error => {
console.error('提交失败:', error);
this.$message.error('数据提交失败');
})
.finally(() => {
this.loading = false;
});
},
@ -310,9 +299,6 @@ export default {
aduitAll() {
const submitData = this.prepareSubmitData();
// 便
console.log('提交的数据结构:', JSON.stringify(submitData, null, 2));
auditBasicInformation(submitData)
.then(response => {
console.log('提交成功:', response);
@ -320,10 +306,6 @@ export default {
this.isContainerVisible = false;
this.isSubmitted = true;
})
.catch(error => {
console.error('提交失败:', error);
this.$message.error('数据提交失败');
});
},
//
@ -407,7 +389,7 @@ export default {
}
.custom-menu {
margin: 1rem;
margin: 1rem 0rem;
display: flex;
gap: 1rem;
border: none;
@ -453,10 +435,10 @@ export default {
#back-to-top {
position: fixed;
bottom: 5px;
bottom: 40%;
right: 5px;
z-index: 99;
font-size: 18px;
font-size: 23px;
}
.footer {

@ -1,11 +1,12 @@
<template>
<div>
<!-- 企业端 -->
<div v-if="checkRole(['admin', 'company'])">
<div v-if="showCompanySection">
<!-- <div> -->
<qiyeduan />
</div>
<!-- 政务端 -->
<div v-if="checkRole(['admin', 'common'])">
<div v-if="checkRole(['common'])">
<zhengwuduan />
</div>
</div>
@ -21,6 +22,14 @@ export default {
methods: {
checkPermi,
checkRole
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
//
return isCompany && !isCommon;
}
}
}
</script>

@ -11,11 +11,13 @@
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="9">
<el-form-item label="项目建设起止时间" prop="">
<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="queryParams.dateRange"></el-date-picker>
<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">
@ -139,7 +141,7 @@ export default {
},
xzflMap: {
1: '已建',
2: '建',
2: '建',
3: '拟建'
},
//

@ -1,6 +1,7 @@
<template>
<div>
<div v-if="checkRole(['admin', 'common'])">
<!-- 政务端 -->
<div v-if="checkRole(['common'])">
<div class="headerbox">
<el-form size="small" :inline="true" label-width="7rem">
<el-row style="margin-top: 1rem;">
@ -35,20 +36,18 @@
<div v-for="(element, index) in tableData" :key="index" 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)">删除要素</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.indicators" style="width: 100%">
<el-table-column label="序号" width="180">
<template slot-scope="scope">
@ -60,16 +59,16 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text"
@click="handleUpdateIndicator(scope.row)">编辑</el-button>
<el-button size="mini" type="text" @click="handleDelete(scope.row)"
style="color: #F25353;">删除</el-button>
@click="handleUpdateIndicator(element, scope.row)">编辑指标</el-button>
<el-button size="mini" type="text" @click="handleDelete(element, scope.row)"
style="color: #F25353;">删除指标</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
<!-- 这是新增要素/编辑要素弹窗 -->
<!-- 新增/编辑要素弹窗 -->
<el-dialog :title="form.id ? '编辑要素' : '新增要素'" :visible.sync="dialogVisible" width="30%">
<el-form :model="form" label-width="80px">
<el-form-item label="类型">
@ -88,7 +87,7 @@
</span>
</el-dialog>
<!-- 这是新增指标/编辑指标弹窗 -->
<!-- 新增/编辑指标弹窗 -->
<el-dialog :title="indicatorForm.id ? '编辑指标' : '新增指标'" :visible.sync="indicatorDialogVisible" width="30%">
<el-form :model="indicatorForm" label-width="80px">
<el-form-item label="具体指标">
@ -104,8 +103,8 @@
</span>
</el-dialog>
</div>
<div v-if="checkRole(['admin', 'company'])">
<!-- 企业端 -->
<div v-if="showCompanySection">
<tianbao />
</div>
</div>
@ -129,13 +128,12 @@ export default {
dialogVisible: false,
indicatorDialogVisible: false,
form: {
id: 0,
id: null,
type: '',
name: '',
tableData: [],
},
indicatorForm: {
id: 0,
id: null,
jtzb: '',
xxyq: '',
elementId: null
@ -149,9 +147,11 @@ export default {
//
getUserInfo() {
const user = this.$store.state.user || {};
return {
name: this.$store.state.user?.name || 'admin',
userId: this.$store.state.user?.userId || 1
name: user.name || 'admin',
userId: user.userId || 1,
userName: user.userName || 'admin'
};
},
@ -160,9 +160,9 @@ export default {
getAllElements(this.searchForm).then(response => {
this.tableData = response.data.map(item => ({
...item,
indicators: item.list || [] // listindicators
indicators: item.list || []
}));
});
})
},
//
@ -177,7 +177,7 @@ export default {
//
resetForm() {
this.form = {
id: 0,
id: null,
type: '',
name: ''
};
@ -186,7 +186,7 @@ export default {
//
resetIndicatorForm() {
this.indicatorForm = {
id: 0,
id: null,
jtzb: '',
xxyq: '',
elementId: null
@ -198,21 +198,18 @@ export default {
const user = this.getUserInfo();
const payload = {
...this.form,
createBy:'',
createId: 0,
updateBy: '',
updateId: 0
createBy: user.userName,
createId: user.userId,
updateBy: user.userName,
updateId: user.userId
};
console.log('提交要素数据格式:', JSON.stringify(payload, null, 2));
addElement(payload).then(response => {
this.$message.success('操作成功');
const api = this.form.id ? editElemention : addElement;
api(payload).then(response => {
this.$message.success(this.form.id ? '编辑成功' : '新增成功');
this.dialogVisible = false;
this.fetchElements();
}).catch(error => {
this.$message.error('操作失败');
});
})
},
//
@ -226,6 +223,20 @@ export default {
this.dialogVisible = true;
},
//
handleDeleteElement(element) {
this.$confirm('确定删除该要素及其所有指标吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteElemention([element.id]).then(() => {
this.$message.success('删除成功');
this.fetchElements();
})
});
},
//
showAddIndicatorDialog(element) {
this.currentElement = element;
@ -239,38 +250,39 @@ export default {
const user = this.getUserInfo();
const payload = {
...this.indicatorForm,
name: this.currentElement.name,
type: this.currentElement.type,
createBy: '',
createId: 0,
updateBy: '',
updateId: 0
name: this.currentElement.name,
type: this.currentElement.type,
createBy: user.userName,
createId: user.userId,
updateBy: user.userName,
updateId: user.userId
};
console.log('提交指标数据格式:', JSON.stringify(payload, null, 2));
// // id
const api = this.indicatorForm.id ? editElemention : addElement;
api(payload).then(response => {
this.$message.success('操作成功');
this.$message.success(this.indicatorForm.id ? '指标编辑成功' : '指标新增成功');
this.indicatorDialogVisible = false;
this.fetchElements();
})
}).catch(error => {
this.$message.error('操作失败: ' + (error.message || '未知错误'));
});
},
//
handleUpdateIndicator(indicator) {
handleUpdateIndicator(element, indicator) {
this.currentElement = element;
this.indicatorForm = {
...indicator,
elementId: this.currentElement?.id
elementId: element.id
};
this.indicatorDialogVisible = true;
},
//
handleDelete(indicator) {
this.$confirm('确定删除该指标吗?', '提示', {
handleDelete(element, indicator) {
this.$confirm('确定删除该指标吗?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@ -279,11 +291,18 @@ export default {
this.$message.success('删除成功');
this.fetchElements();
}).catch(error => {
this.$message.error('删除失败');
this.$message.error('删除失败: ' + (error.message || error));
});
});
}
},
computed: {
showCompanySection() {
const isCompany = this.checkRole(['company']);
const isCommon = this.checkRole(['common']);
return isCompany && !isCommon;
}
},
mounted() {
this.fetchElements();
}
@ -323,13 +342,4 @@ export default {
.headertwo {
display: flex;
}
.form-container {
max-width: 1500px;
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
</style>

@ -28,7 +28,7 @@
<div class="mainarea" style="height: 22rem; overflow: auto;">
<div class="mainareaitem" v-for="(item, index) in postList" :key="index">
<div class="itemleft">
<div class="xmmctitle">{{ item.name }}</div>
<div class="xmmctitle" @click="getInfo(item, 'detail')">{{ item.name }}</div>
<div class="lefttwo">
<div>现状分类{{ xzflMap[item.xzfl] }}</div>
<div>总投资额{{ item.ztze }}</div>
@ -85,7 +85,7 @@ export default {
},
xzflMap: {
1: '已建',
2: '建',
2: '建',
3: '拟建'
},
//
@ -96,6 +96,12 @@ export default {
this.getList();
},
methods: {
/** 详情按钮操作 */
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 } });
},
getStatusClass(status) {
const statusClasses = {
1: 'status-red', //
@ -238,6 +244,7 @@ export default {
.xmmctitle {
color: #2B62F1;
cursor: pointer;
}
.lefttwo {

@ -31,13 +31,13 @@ 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://39.101.188.84:7071/`,
target: `http://192.168.0.112:7071/`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''

Loading…
Cancel
Save