main
严飞永 4 weeks ago
parent 568ce5118e
commit 22eaa5ba54

@ -1,3 +0,0 @@
<template>
<div>1234</div>
</template>

@ -145,7 +145,7 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="建设起止时间"> <el-form-item label="建设起止时间" required>
<el-date-picker v-model="form.begainTime" type="month" value-format="yyyy-MM" placeholder="开始日期" <el-date-picker v-model="form.begainTime" type="month" value-format="yyyy-MM" placeholder="开始日期"
style="width: 11rem;"></el-date-picker> style="width: 11rem;"></el-date-picker>
~ ~
@ -319,7 +319,15 @@ export default {
], ],
introduction: [ introduction: [
{ max: 1000, message: '项目简介长度不能超过1000个字', trigger: 'blur' } { max: 1000, message: '项目简介长度不能超过1000个字', trigger: 'blur' }
] ],
tyshxydm: [
{ required: true, message: "请填写", trigger: "blur" },
{
pattern: /^[a-zA-Z0-9]{18}$/,
message: "请输入正确格式的18位统一社会信用代码",
trigger: "blur",
},
],
}, },
// select // select
ssgnqMap: { ssgnqMap: {

@ -440,6 +440,8 @@ export default {
this.selectedBuilding = building; // 使building this.selectedBuilding = building; // 使building
}, },
handleAddBuilding() { handleAddBuilding() {
this.$refs.buildingFormRef.validate((valid) => {
if (valid) {
const api = this.buildingForm.id ? updatejzxx : addjzxx; // ID const api = this.buildingForm.id ? updatejzxx : addjzxx; // ID
const form = { const form = {
...this.buildingForm ...this.buildingForm
@ -458,6 +460,11 @@ export default {
console.error(form.id ? '更新失败:' : '新增失败:', error); console.error(form.id ? '更新失败:' : '新增失败:', error);
this.$message.error(form.id ? '更新失败' : '新增失败'); this.$message.error(form.id ? '更新失败' : '新增失败');
}); });
} else {
this.$message.error('请填写完整的楼栋信息');
return false;
}
});
}, },
handleDelete(id) { handleDelete(id) {
console.log('Deleting building with ID:', id); // console.log('Deleting building with ID:', id); //

@ -26,36 +26,35 @@
<div class="descriptionsdiv"> <div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="4" border> <el-descriptions class="margin-top" :column="4" border>
<el-descriptions-item label="入驻企业数(家)"> <el-descriptions-item label="入驻企业数(家)">
<el-input v-if="isEditing" v-model.number="form.rzqys" style="width: 100%;"></el-input> <span>{{ tableData.length }}</span>
<span v-else>{{ form.rzqys }}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="入驻企业行业类型"> <el-descriptions-item label="入驻企业行业类型">
<el-input v-if="isEditing" v-model="form.rzqyhylx" style="width: 100%;"></el-input> <el-input v-if="isEditing" v-model="form.rzqyhylx" style="width: 100%;"></el-input>
<span v-else>{{ form.rzqyhylx }}</span> <span v-else>{{ form.rzqyhylx || "" }}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="人员数量(人)"> <el-descriptions-item label="人员数量(人)">
<el-input v-if="isEditing" v-model.number="form.rysl" style="width: 100%;"></el-input> <el-input v-if="isEditing" v-model.number="form.rysl" style="width: 100%;"></el-input>
<span v-else>{{ form.rysl }}</span> <span v-else>{{ form.rysl || "" }}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="入住率(%"> <el-descriptions-item label="入住率(%">
<el-input v-if="isEditing" v-model.number="form.rzl" style="width: 100%;"></el-input> <el-input v-if="isEditing" v-model.number="form.rzl" style="width: 100%;"></el-input>
<span v-else>{{ form.rzl }}</span> <span v-else>{{ form.rzl || "" }}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="已出租(售)面积(平方米)"> <el-descriptions-item label="已出租(售)面积(平方米)">
<el-input v-if="isEditing" v-model.number="form.yczmj" style="width: 100%;"></el-input> <el-input v-if="isEditing" v-model.number="form.yczmj" style="width: 100%;"></el-input>
<span v-else>{{ form.yczmj }}</span> <span v-else>{{ form.yczmj || "" }}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="空置出租(售)面积(平方米)"> <el-descriptions-item label="空置出租(售)面积(平方米)">
<el-input v-if="isEditing" v-model.number="form.kzczmj" style="width: 100%;"></el-input> <el-input v-if="isEditing" v-model.number="form.kzczmj" style="width: 100%;"></el-input>
<span v-else>{{ form.kzczmj }}</span> <span v-else>{{ form.kzczmj || "" }}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="工业厂房平均租金(元/平方米*月)"> <el-descriptions-item label="工业厂房平均租金(元/平方米*月)">
<el-input v-if="isEditing" v-model.number="form.gycfpjzj" style="width: 100%;"></el-input> <el-input v-if="isEditing" v-model.number="form.gycfpjzj" style="width: 100%;"></el-input>
<span v-else>{{ form.gycfpjzj }}</span> <span v-else>{{ form.gycfpjzj || "" }}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="工业厂房平均物业费(元/平方米*月)"> <el-descriptions-item label="工业厂房平均物业费(元/平方米*月)">
<el-input v-if="isEditing" v-model.number="form.gycfpjwyf" style="width: 100%;"></el-input> <el-input v-if="isEditing" v-model.number="form.gycfpjwyf" style="width: 100%;"></el-input>
<span v-else>{{ form.gycfpjwyf }}</span> <span v-else>{{ form.gycfpjwyf || "" }}</span>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<div class="btnarea" v-if="action === 'fill' || !action || action === 'okay'"> <div class="btnarea" v-if="action === 'fill' || !action || action === 'okay'">
@ -104,14 +103,9 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="block"> <div class="block">
<el-pagination <el-pagination :current-page="pagination.currentPage" :page-sizes="[10, 20, 50, 100]"
:current-page="pagination.currentPage" :page-size="pagination.pageSize" layout="total, prev, pager, next, jumper" :total="pagination.total"
:page-sizes="[10, 20, 50, 100]" @current-change="handleCurrentChange" @size-change="handleSizeChange">
:page-size="pagination.pageSize"
layout="total, prev, pager, next, jumper"
:total="pagination.total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange">
</el-pagination> </el-pagination>
</div> </div>
</div> </div>
@ -218,7 +212,7 @@ export default {
current: this.pagination.currentPage, current: this.pagination.currentPage,
size: this.pagination.pageSize size: this.pagination.pageSize
}; };
getqyBasicInformationPage(params).then(response => { return getqyBasicInformationPage(params).then(response => {
console.log('Fetched Data:', response.data.records); // console.log('Fetched Data:', response.data.records); //
this.tableData = response.data.records.map(item => ({ this.tableData = response.data.records.map(item => ({
...item, ...item,
@ -238,7 +232,7 @@ export default {
save() { save() {
const formData = { const formData = {
...this.form, ...this.form,
rzqys: Number(this.form.rzqys), rzqys: this.tableData.length,
rysl: Number(this.form.rysl), rysl: Number(this.form.rysl),
rzl: Number(this.form.rzl), rzl: Number(this.form.rzl),
yczmj: Number(this.form.yczmj), yczmj: Number(this.form.yczmj),
@ -256,7 +250,6 @@ export default {
}, },
saveRow(row) { saveRow(row) {
row.isEditing = false; row.isEditing = false;
//
updateqyBasicInformation(row).then(response => { updateqyBasicInformation(row).then(response => {
this.$modal.msgSuccess('保存成功'); this.$modal.msgSuccess('保存成功');
}).catch(error => { }).catch(error => {
@ -270,7 +263,12 @@ export default {
this.$modal.msgSuccess('删除成功'); this.$modal.msgSuccess('删除成功');
this.tableData.splice(index, 1); this.tableData.splice(index, 1);
// //
this.fetchTableData(); this.fetchTableData().then(() => {
// form
this.form.rzqys = this.tableData.length;
// save
this.save();
});
}).catch(error => { }).catch(error => {
console.error('删除失败:', error); console.error('删除失败:', error);
this.$modal.msgError('删除失败'); this.$modal.msgError('删除失败');
@ -301,12 +299,16 @@ export default {
if (response.code === 200) { if (response.code === 200) {
this.$modal.msgSuccess(response.msg); this.$modal.msgSuccess(response.msg);
// //
this.fetchTableData(); this.fetchTableData().then(() => {
this.$emit("refresh-data"); // // form
this.form.rzqys = this.tableData.length;
// save
this.save();
});
} else { } else {
this.$modal.msgError(response.msg || "导入失败"); this.$modal.msgError(response.msg || "导入失败");
} }
}, },
submitFileForm() { submitFileForm() {
if (this.$refs.upload.uploadFiles.length === 0) { if (this.$refs.upload.uploadFiles.length === 0) {
this.$modal.msgWarning("请先选择文件"); this.$modal.msgWarning("请先选择文件");
@ -317,7 +319,7 @@ export default {
formData.append('file', this.$refs.upload.uploadFiles[0].raw); formData.append('file', this.$refs.upload.uploadFiles[0].raw);
formData.append('xmId', this.upload.data.xmId); formData.append('xmId', this.upload.data.xmId);
this.$refs.upload.submit(formData); // this.$refs.upload.submit(formData);
}, },
// //

@ -152,10 +152,15 @@ export default {
// //
this.$emit('update-info', updatedData); this.$emit('update-info', updatedData);
// anotherInfo
this.anotherInfo = updatedData;
// 退 // 退
this.isEditMode = false; this.isEditMode = false;
this.$message.success('保存成功');
} catch (error) { } catch (error) {
console.error('保存失败:', error); console.error('保存失败:', error);
this.$message.error('保存失败: ' + (error.message || '请检查网络连接'));
} finally { } finally {
this.saveLoading = false; this.saveLoading = false;
} }
@ -186,10 +191,12 @@ export default {
this.editedData = this.editedData.filter(i => i.id !== item.id); this.editedData = this.editedData.filter(i => i.id !== item.id);
} }
// anotherInfo
this.anotherInfo = this.anotherInfo.filter(i => i.id !== item.id);
// //
this.$emit('delete-info', item.id); this.$emit('delete-info', item.id);
this.$message.success('删除成功'); this.$message.success('删除成功');
location.reload(); //
} catch (error) { } catch (error) {
this.$message.error('删除失败: ' + (error.message || '请检查网络连接')); this.$message.error('删除失败: ' + (error.message || '请检查网络连接'));
} }
@ -225,10 +232,20 @@ export default {
// API // API
const response = await addxmqt(requestData); const response = await addxmqt(requestData);
console.log('新增成功:', response); console.log('新增成功:', response);
// anotherInfo
this.anotherInfo.push({
id: response.data.id, // ID
zdname: this.form.zdname,
zdinfor: this.form.zdinfor
});
//
this.dialogVisible = false; this.dialogVisible = false;
this.$message.success('新增成功'); this.$message.success('新增成功');
location.reload(); // } catch (error) {
} catch (error) { } this.$message.error('新增失败: ' + (error.message || '请检查网络连接'));
}
}, },
// //

@ -135,7 +135,7 @@ export default {
type: Object, type: Object,
required: true required: true
}, },
xmId:{ xmId: {
type: Number, type: Number,
required: true required: true
}, },
@ -196,9 +196,9 @@ export default {
/** 导出 */ /** 导出 */
handleExport() { handleExport() {
this.download( this.download(
"/gysl/basicInformation/export", "/gysl/planInformation/export",
{ {
xmid: this.form.xmId xmId: this.form.xmId
}, },
`规划信息${new Date().getTime()}.xlsx` `规划信息${new Date().getTime()}.xlsx`
); );
@ -206,6 +206,7 @@ export default {
// //
edit() { edit() {
this.isEditing = true; this.isEditing = true;
document.addEventListener('click', this.handleClickOutside);
}, },
// //
save() { save() {
@ -214,20 +215,18 @@ export default {
// //
this.$emit('update-data', formData); this.$emit('update-data', formData);
this.isEditing = false; this.isEditing = false;
document.removeEventListener('click', this.handleClickOutside);
} }
}, },
// //
validateForm() { validateForm() {
for (const field in this.rules) { const requiredFields = ['zydmj', 'rjl', 'zjzmj', 'jzds', 'zgjzcs', 'fhdj'];
const rules = this.rules[field]; for (const field of requiredFields) {
const value = this.form[field]; if (!this.form[field]) {
for (const rule of rules) { this.$message.error('请填写完整的规划信息');
if (rule.required && !value) {
this.$message.error(rule.message);
return false; return false;
} }
} }
}
return true; return true;
}, },
// //
@ -249,6 +248,12 @@ export default {
// //
handleFileUploaded(fileName) { handleFileUploaded(fileName) {
this.form.ghwj = `${this.baseUrl}/${fileName}`; // baseURL this.form.ghwj = `${this.baseUrl}/${fileName}`; // baseURL
},
handleClickOutside(event) {
const saveButton = this.$el.querySelector('.el-button:contains("保存")');
if (!this.$el.contains(event.target) || saveButton.contains(event.target)) {
return;
}
} }
} }
}; };

@ -19,7 +19,7 @@
<!-- 展示区域 --> <!-- 展示区域 -->
<div class="image-container"> <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"> <img :src="baseUrl + item.img" alt="项目图片" class="image">
<div class="close-button" @click="removeImage(index)"> <div class="close-button" @click="removeImage(index)">
<img src="../../../assets/images/detailsicon/icon-关闭@2x.png" alt=""> <img src="../../../assets/images/detailsicon/icon-关闭@2x.png" alt="">
</div> </div>
@ -28,7 +28,7 @@
<div class="dianjibox" @click="handleItemClick(item)"></div> <div class="dianjibox" @click="handleItemClick(item)"></div>
<div class="bottombox"> <div class="bottombox">
<div class="bottomtext"><span>{{ item.xmmc || '未命名项目' }}</span></div> <div class="bottomtext"><span>{{ item.xmmc || '未命名项目' }}</span></div>
<div class="bottomtime"><span>{{ formatDate(item.createTime) }}</span></div> <div class="bottomtime"><span>{{ item.sj }}</span></div>
</div> </div>
</div> </div>
</div> </div>
@ -88,7 +88,7 @@
<el-input v-model="form.newsEvent" type="textarea" :rows="4" placeholder="请输入新闻事件"></el-input> <el-input v-model="form.newsEvent" type="textarea" :rows="4" placeholder="请输入新闻事件"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="附件上传"> <el-form-item label="附件上传">
<fileUpload v-model="form.fj" /> <FileUpload @file-uploaded="handleFileUploaded" v-model="form.fj" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
@ -125,7 +125,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-form-item label="项目图片"> <el-form-item label="项目图片">
<img :src="currentItem.img" style="max-width: 100%; max-height: 200px;" v-if="currentItem.img"> <img :src="baseUrl + currentItem.img" style="max-width: 100%; max-height: 200px;" v-if="currentItem.img">
<span v-else></span> <span v-else></span>
</el-form-item> </el-form-item>
<el-form-item label="说明"> <el-form-item label="说明">
@ -137,6 +137,9 @@
<el-form-item label="新闻事件"> <el-form-item label="新闻事件">
<el-input v-model="currentItem.newsEvent" type="textarea" :rows="4"></el-input> <el-input v-model="currentItem.newsEvent" type="textarea" :rows="4"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="附件">
<el-input v-model="fjFileName" :disabled="true"></el-input>
</el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button type="primary" @click="detailVisible = false"> </el-button> <el-button type="primary" @click="detailVisible = false"> </el-button>
@ -165,6 +168,7 @@ export default {
}, },
data() { data() {
return { return {
baseUrl: process.env.VUE_APP_BASE_API,
detailVisible: false, detailVisible: false,
currentItem: {}, currentItem: {},
dialogVisible: false, dialogVisible: false,
@ -195,6 +199,9 @@ export default {
computed: { computed: {
dialogTitle() { dialogTitle() {
return this.isEditMode ? '编辑项目巡礼' : '新增项目巡礼'; return this.isEditMode ? '编辑项目巡礼' : '新增项目巡礼';
},
fjFileName() {
return this.currentItem.fj ? this.currentItem.fj.split('/').pop() : '无附件';
} }
}, },
created() { created() {
@ -260,7 +267,10 @@ export default {
} }
} }
}, },
//
handleFileUploaded(fileName) {
this.form.fj = `${this.baseUrl}/${fileName}`; // baseURL
},
// //
openAddDialog() { openAddDialog() {
this.isEditMode = false; this.isEditMode = false;
@ -366,6 +376,7 @@ export default {
...this.form, ...this.form,
xmId: this.xmId, xmId: this.xmId,
id: 0, id: 0,
fj: "",
createTime: "", createTime: "",
createBy: "", createBy: "",
createId: 0, createId: 0,

@ -1,165 +0,0 @@
<template>
<div class="maintenance">
<!-- 导入按钮 -->
<el-button type="primary" icon="plus" @click="handleOpenUploadDialog"> Excel</el-button>
<!-- 表格 -->
<el-table :data="tableData" style="width: 100%" border>
<el-table-column
v-for="(header, index) in tableHeaders"
:key="index"
:prop="header"
:label="header"
></el-table-column>
</el-table>
<!-- 上传文件的弹窗 -->
<el-dialog title="上传 Excel 文件" :visible.sync="uploadDialogVisible" width="30%">
<el-upload
action="#"
accept=".xlsx,.xls"
:before-upload="beforeUpload"
:on-change="handleFileChange"
:auto-upload="false"
:show-file-list="false"
>
<el-button type="primary" icon="upload">选择文件</el-button>
<el-button type="primary" icon="download" @click="downloadTemplate"></el-button>
</el-upload>
<div v-if="fileName">
已选择文件: {{ fileName }}
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="uploadDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleUploadFile"></el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import * as XLSX from 'xlsx';
export default {
data() {
return {
title: 'Excel 文件处理',
uploadDialogVisible: false, //
tableHeaders: [], //
tableData: [], //
selectedFile: null, //
fileName: '', //
};
},
methods: {
//
handleOpenUploadDialog() {
this.uploadDialogVisible = true;
},
//
beforeUpload(file) {
const isExcel =
file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
file.type === 'application/vnd.ms-excel';
if (!isExcel) {
this.$message.error('只能上传 Excel 文件!');
return false;
}
const requiredHeaders = ['企业名称', '统一信用代码', '所属行业', '租金价格(元/每平方米*月)'];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
//
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// JSON
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
//
if (jsonData.length > 0) {
const headers = jsonData[0];
const hasRequiredHeaders = requiredHeaders.every(header => headers.includes(header));
if (!hasRequiredHeaders) {
this.$message.error('上传的文件格式不正确,请使用模板文件!');
return false;
}
}
// handleFileChange
this.handleFileChange({ raw: file, name: file.name });
return true;
};
reader.readAsBinaryString(file);
return false; //
},
//
handleFileChange(file) {
if (file) {
this.selectedFile = file.raw; //
this.fileName = file.name; //
}
},
//
handleUploadFile() {
if (!this.selectedFile) {
this.$message.warning('请先选择文件!');
return;
}
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result;
const workbook = XLSX.read(data, { type: 'binary' });
//
const sheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[sheetName];
// JSON
const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
//
if (jsonData.length > 0) {
this.tableHeaders = jsonData[0]; //
this.tableData = jsonData.slice(1).map((row) => {
const rowData = {};
this.tableHeaders.forEach((header, index) => {
rowData[header] = row[index];
});
return rowData;
});
}
this.$message.success('文件上传并解析成功!');
this.uploadDialogVisible = false; //
};
reader.readAsBinaryString(this.selectedFile);
},
//
downloadTemplate() {
const link = document.createElement('a');
link.href = '/template.xlsx'; //
link.download = 'template.xlsx';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
},
};
</script>
<style scoped>
.maintenance {
padding: 20px;
}
</style>

@ -1,51 +1,95 @@
<template> <template>
<div class="container"> <div class="container">
<div> <div>
<div class="top">
<div class="title">整体项目情况</div> <div class="title">整体项目情况</div>
<table> <div class="importdiv">
<thead> <el-date-picker v-model="selectedYear" type="year" placeholder="选择年份" format="yyyy"
<tr> value-format="yyyy" @change="handleYearChange">
<th>项目总数</th> </el-date-picker>
<th>建筑面积(万平方米)</th> <!-- <el-button icon="el-icon-upload2" style="background-color: #2B62F1; color: #FFFFFF;"
<th>已建数量()</th> @click="handleExport">
<th>在建数量()</th> 报告导出
<th>拟建数量()</th> </el-button> -->
<th style="visibility: hidden;">拟建数量()</th> </div>
</tr> </div>
</thead> <div class="mainarea">
<tbody> <div class="itemone">
<tr> <img src="@/assets/images/icon-xmzs@2x.png" alt="">
<td>{{ projectData.allProject }}</td> <div class="itemleft">
<td>{{ projectData.allGrossArea }}</td> <div class="lefttitle">项目总数</div>
<td>{{ projectData.allBuilding1 }}</td> <div class="number">{{ projectData.allProject }}</div>
<td>{{ projectData.allBuilding2 }}</td> </div>
<td>{{ projectData.allBuilding3 }}</td> </div>
</tr> <div class="itemone">
</tbody> <img src="@/assets/images/icon-jzmj@2x.png" alt="">
</table> <div class="itemleft">
<div class="lefttitle">建筑面积(万平方米)</div>
<div class="number">{{ projectData.allGrossArea }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">已建数量()</div>
<div class="number">{{ projectData.allBuilding1 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">在建数量()</div>
<div class="number">{{ projectData.allBuilding2 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">拟建数量()</div>
<div class="number">{{ projectData.allBuilding3 }}</div>
</div>
</div>
</div>
</div> </div>
<div> <div>
<div class="title">当年项目情况</div> <div class="title">当年项目情况</div>
<table> <div class="mainarea">
<thead> <div class="itemone">
<tr> <img src="@/assets/images/icon-xkgxms@2x.png" alt="">
<th>新开工项目数</th> <div class="itemleft">
<th>建筑面积(万平方米)</th> <div class="lefttitle">新开工项目数</div>
<th>已建数量()</th> <div class="number">{{ currentYearData.currentYearProject }}</div>
<th>在建数量()</th> </div>
<th style="visibility: hidden;">拟建数量()</th> </div>
<th style="visibility: hidden;">拟建数量()</th> <div class="itemone">
</tr> <img src="@/assets/images/icon-jzmj@2x.png" alt="">
</thead> <div class="itemleft">
<tbody> <div class="lefttitle">建筑面积(万平方米)</div>
<tr> <div class="number">{{ currentYearData.currentYearGrossArea }}</div>
<td>{{ currentYearData.currentYearProject }}</td> </div>
<td>{{ currentYearData.currentYearGrossArea }}</td> </div>
<td>{{ currentYearData.currentYearBuilding1 }}</td> <div class="itemone">
<td>{{ currentYearData.currentBuilding2 || 0 }}</td> <img src="@/assets/images/icon-yjsl@2x.png" alt="">
</tr> <div class="itemleft">
</tbody> <div class="lefttitle">已建数量()</div>
</table> <div class="number">{{ currentYearData.currentYearBuilding1 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">在建数量()</div>
<div class="number">{{ currentYearData.currentBuilding2 }}</div>
</div>
</div>
<div class="itemone">
<img src="@/assets/images/icon-yjsl@2x.png" alt="">
<div class="itemleft">
<div class="lefttitle">拟建数量()</div>
<div class="number">{{ currentYearData.currentBuilding2 }}</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -56,6 +100,7 @@ import { allproject } from '@/api/ManageApi';
export default { export default {
data() { data() {
return { return {
selectedYear: new Date().getFullYear().toString(),
projectData: { projectData: {
allProject: 0, // allProject: 0, //
allGrossArea: 0, // allGrossArea: 0, //
@ -66,8 +111,8 @@ export default {
currentYearData: { currentYearData: {
currentYearProject: 0, // currentYearProject: 0, //
currentYearGrossArea: 0, // currentYearGrossArea: 0, //
currentYearBuilding1: 0, // currentYearBuilding1: 0, //
currentBuilding2: 0 // currentBuilding2: 0 //
}, },
loading: false, loading: false,
error: null error: null
@ -77,10 +122,33 @@ export default {
this.fetchProjectData(); this.fetchProjectData();
}, },
methods: { methods: {
/** 导出按钮操作 */
handleExport() {
this.download(
"/gysl/zwStats/exportBg",
{
years: this.selectedYear
},
`项目整体情况${this.selectedYear}.docx`
);
},
// Handle year change
handleYearChange(year) {
if (year) {
this.selectedYear = year;
this.fetchProjectData();
}
},
async fetchProjectData() { async fetchProjectData() {
this.loading = true; this.loading = true;
try { try {
const response = await allproject(); // API years
const response = await allproject({
years: this.selectedYear,
_t: Date.now() //
});
this.projectData = { this.projectData = {
allProject: response.data.allProject || 0, allProject: response.data.allProject || 0,
allGrossArea: response.data.allGrossArea || 0, allGrossArea: response.data.allGrossArea || 0,
@ -94,8 +162,10 @@ export default {
currentYearBuilding1: response.data.currentYearBuilding1 || 0, currentYearBuilding1: response.data.currentYearBuilding1 || 0,
currentBuilding2: response.data.currentBuilding2 || 0 currentBuilding2: response.data.currentBuilding2 || 0
}; };
} } catch (error) {
finally { console.error("获取数据失败:", error);
this.$message.error("数据加载失败");
} finally {
this.loading = false; this.loading = false;
} }
} }
@ -104,10 +174,16 @@ export default {
</script> </script>
<style scoped> <style scoped>
.importdiv {
display: flex;
gap: .5rem;
}
/* Your existing styles remain unchanged */
.container { .container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 1.5rem; gap: 2rem;
} }
table { table {
@ -127,7 +203,7 @@ th {
} }
.title { .title {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi; font-family: alibold;
font-weight: 600; font-weight: 600;
font-size: 1.25rem; font-size: 1.25rem;
color: #3D424C; color: #3D424C;
@ -139,8 +215,8 @@ th {
margin-left: .4rem; margin-left: .4rem;
} }
thead tr { .lefttitle {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi; font-family: aliregular;
font-weight: 400; font-weight: 400;
font-size: 0.88rem; font-size: 0.88rem;
color: #7B8599; color: #7B8599;
@ -149,14 +225,46 @@ thead tr {
font-style: normal; font-style: normal;
text-transform: none; text-transform: none;
} }
tbody tr {
font-family: DIN, DIN; .number {
font-family: DINbold;
font-weight: 600; font-weight: 600;
font-size: 1.5rem; font-size: 1.25rem;
color: #292C33; color: #3D424C;
line-height: 2.11rem; line-height: 1.69rem;
text-align: left; text-align: left;
font-style: normal; font-style: normal;
text-transform: none; text-transform: none;
margin-left: .4rem;
}
.mainarea {
padding: .5rem;
height: auto;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 1rem;
}
.itemone {
width: 12rem;
height: 3rem;
/* background-color: lightblue; */
display: flex;
gap: .3rem;
}
.itemleft {
display: flex;
flex-direction: column;
margin-left: .5rem;
}
.top {
display: flex;
width: 100%;
justify-content: space-between;
} }
</style> </style>

@ -16,6 +16,7 @@ export default {
{ value: 54, name: '国企', itemStyle: { color: '#36C3FB' } }, { value: 54, name: '国企', itemStyle: { color: '#36C3FB' } },
{ value: 65, name: '民企', itemStyle: { color: '#5B76F9' } }, { value: 65, name: '民企', itemStyle: { color: '#5B76F9' } },
{ value: 32, name: '外企', itemStyle: { color: '#FAC858' } }, { value: 32, name: '外企', itemStyle: { color: '#FAC858' } },
{ value: 32, name: '其他', itemStyle: { color: '#50DFB3' } },
], ],
}; };
}, },
@ -31,7 +32,7 @@ export default {
} else {} } else {}
}, },
processData(data) { processData(data) {
const names = ['国企', '民企', '外企']; const names = ['国企', '民企', '外企','其他'];
const counts = data.map(item => item.count); const counts = data.map(item => item.count);
return names.map((name, index) => ({ return names.map((name, index) => ({
value: counts[index] || 0, value: counts[index] || 0,
@ -50,7 +51,7 @@ export default {
orient: 'vertical', // orient: 'vertical', //
right: '20%', // right: '20%', //
top: 'center', // top: 'center', //
itemGap: 35, // itemGap: 30, //
formatter: function (name) { formatter: function (name) {
// //
const item = this.chartData.find(item => item.name === name); const item = this.chartData.find(item => item.name === name);

@ -26,7 +26,6 @@
<div class="search-results" v-if="searchList && searchList.length > 0"> <div class="search-results" v-if="searchList && searchList.length > 0">
<div class="search-item" v-for="(item, index) in searchList" :key="index" @click="centerMap(item)"> <div class="search-item" v-for="(item, index) in searchList" :key="index" @click="centerMap(item)">
<div class="item-name">{{ item.name }}</div> <div class="item-name">{{ item.name }}</div>
<div class="item-address">{{ item.address }}</div>
</div> </div>
</div> </div>
<!-- 右侧地图区域 --> <!-- 右侧地图区域 -->
@ -167,6 +166,11 @@ export default {
}); });
}, },
centerMap(item) { centerMap(item) {
if (!item.jsdd) {
this.$message.warning('该项目未落图!');
return;
}
this.searchBox = item.name; this.searchBox = item.name;
this.searchList = []; this.searchList = [];
this.selectedProject = { this.selectedProject = {

@ -31,12 +31,12 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="7"> <!-- <el-col :span="7">
<el-form-item label="项目法人单位"> <el-form-item label="项目法人单位">
<el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目名称" clearable <el-input v-model="queryParams.xmfrdwxz" placeholder="请输入项目名称" clearable
@keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
</el-col> </el-col> -->
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">

@ -293,11 +293,15 @@ export default {
/** 单片材料导出按钮操作 */ /** 单片材料导出按钮操作 */
handleExporttwo() { handleExporttwo() {
if (this.ids.length === 0) {
this.$message.warning('请选择要导出的项目');
return;
}
this.download( this.download(
"/gysl/basicInformation/wordExport", "/gysl/basicInformation/wordExport",
{ {
ids: this.ids.join(","), ids: this.ids.join(","),
}, },
`单片材料${new Date().getTime()}.zip` `单片材料${new Date().getTime()}.zip`
); );
@ -305,9 +309,10 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const projectName = row.name; //
const ids = row.id || this.ids; const ids = row.id || this.ids;
this.$modal this.$modal
.confirm('是否确认删除项目id为"' + ids + '"的数据项?') .confirm(`是否确认删除项目"${projectName}"`)
.then(() => { .then(() => {
return deleteBasicInformation(ids); return deleteBasicInformation(ids);
}) })

@ -10,7 +10,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="建设起止时间"> <!-- <el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime" <el-date-picker v-model="queryParams.begainTime"
type="date" placeholder="开始日期" value-format="yyyy-MM-dd" type="date" placeholder="开始日期" value-format="yyyy-MM-dd"
style="width: 11rem;" :clearable="true"> style="width: 11rem;" :clearable="true">
@ -21,6 +21,15 @@
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
style="width: 10.5rem;" :clearable="true"> style="width: 10.5rem;" :clearable="true">
</el-date-picker> </el-date-picker>
</el-form-item> -->
<el-form-item label="建设起止时间">
<el-date-picker v-model="queryParams.begainTime" type="month" placeholder="开始月份" value-format="yyyy-MM"
style="width: 9rem;" :clearable="true">
</el-date-picker>
~
<el-date-picker v-model="queryParams.endTime" type="month" placeholder="结束月份" value-format="yyyy-MM"
style="width: 9rem;" :clearable="true">
</el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="5"> <el-col :span="5">
@ -67,7 +76,7 @@
<el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" /> <el-table-column label="项目法人单位" align="center" prop="xmfrdwxz" />
<el-table-column label="项目建设起止时间" align="center"> <el-table-column label="项目建设起止时间" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ formatMonthYear(scope.row.begainTime) }} {{ formatMonthYear(scope.row.endTime) }} {{ scope.row.begainTime }} {{ scope.row.endTime }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="项目评价" align="center" width="130" sortable="custom" prop="pjdj"> <el-table-column label="项目评价" align="center" width="130" sortable="custom" prop="pjdj">
@ -83,13 +92,8 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination v-show="total > 0" :total="total" :page.sync="queryParams.current" :limit.sync="queryParams.size"
v-show="total > 0" @pagination="getList" />
:total="total"
:page.sync="queryParams.current"
:limit.sync="queryParams.size"
@pagination="getList"
/>
</div> </div>
<!-- 详情对话框 --> <!-- 详情对话框 -->
@ -238,16 +242,13 @@ export default {
const params = { const params = {
current: this.queryParams.current, current: this.queryParams.current,
size: this.queryParams.size, size: this.queryParams.size,
...(this.queryParams.name && { name: this.queryParams.name }), name: this.queryParams.name,
...(this.queryParams.xzfl && { xzfl: this.queryParams.xzfl }), xzfl: this.queryParams.xzfl,
...(this.queryParams.pjdj && { pjdj: this.queryParams.pjdj }), pjdj: this.queryParams.pjdj,
// begainTime: this.queryParams.begainTime || null,
...(this.queryParams.begainTime && { begainTime: this.queryParams.begainTime }), endTime: this.queryParams.endTime || null
...(this.queryParams.endTime && { endTime: this.queryParams.endTime })
}; };
console.log('最终查询参数:', params); //
getProjectEvaluationList(params) getProjectEvaluationList(params)
.then(response => { .then(response => {
this.postList = response.data.records; this.postList = response.data.records;
@ -293,8 +294,11 @@ export default {
// //
}, },
formatMonthYear(date) { formatMonthYear(date) {
if (!date) return ''; // if (!date) return '';
return date.split('-').slice(0, 2).join('-'); return date;
// //
// const fullDate = date.includes('-') ? date : `${date}-01`; //
// return fullDate.split('-').slice(0, 2).join('-');
} }
}, },
mounted() { mounted() {

@ -81,18 +81,12 @@
</Others> </Others>
</div> </div>
<div class="footer" v-if="showCompanySection"> <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>
<div class="footer" v-if="checkRole(['common']) && action === 'fill'"> <div class="footer" v-if="checkRole(['common']) && action === 'fill'">
<el-button type="primary" v-if="checkRole(['common'])" @click="aduitAll"></el-button> <el-button type="primary" v-if="checkRole(['common'])" @click="aduitAll"></el-button>
</div> </div>
<div class="footer" v-if="checkRole(['common']) && action === 'okay'"> <div class="footer" v-if="checkRole(['common']) && action === 'okay'">
<el-button type="primary" v-if="checkRole(['common'])" @click="aduitAll"></el-button> <el-button type="primary" v-if="checkRole(['common'])" @click="aduitAlltwo"></el-button>
</div> </div>
</div> </div>
<!-- 返回顶部 --> <!-- 返回顶部 -->
@ -340,6 +334,22 @@ export default {
.finally(() => { .finally(() => {
this.loading = false; this.loading = false;
}); });
},
//
aduitAlltwo() {
this.loading = true;
const submitData = this.prepareSubmitData();
auditBasicInformation(submitData)
.then(response => {
console.log('提交成功:', response);
this.$message.success('修改成功');
this.isSubmitted = true;
this.$router.push('/manage');
})
.finally(() => {
this.loading = false;
});
}, },
// //
prepareSubmitData() { prepareSubmitData() {

@ -81,7 +81,6 @@
</Others> </Others>
</div> </div>
<div class="footer"> <div class="footer">
<el-button type="primary" v-if="checkRole(['admin', 'common'])" @click="aduitAll"></el-button>
<el-button type="primary" <el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'" v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="submitAll">提交审核</el-button> @click="submitAll">提交审核</el-button>
@ -299,17 +298,62 @@ export default {
// //
submitAll() { submitAll() {
this.loading = true; this.loading = true;
const submitData = this.prepareSubmitData();
console.log('准备提交的完整数据:', JSON.stringify(submitData, null, 2)); // //
fillBasicInformation(submitData) console.log('qyrzInformation:', this.qyrzInformation);
.then(response => { console.log('wysmxInformations:', this.wysmxInformations);
this.$message.success('提交成功');
this.isSubmitted = true; // wysmxInformations null
this.$router.push('/manage'); if (this.wysmxInformations.length === 0 || this.wysmxInformations.includes(null)) {
}) this.$message.error('请填写模型管理信息');
.finally(() => {
this.loading = false; this.loading = false;
}); return;
}
// qyrzInformation rzqys
if (this.qyrzInformation.rzqys === 0 || this.qyrzInformation.rzqys === null || this.qyrzInformation.rzqys === undefined) {
this.$message.error('请导入入驻信息');
this.loading = false;
return;
}
// planInformation
const planRequiredFields = ['zydmj', 'rjl', 'zjzmj', 'jzds', 'zgjzcs', 'fhdj'];
const planMissingFields = planRequiredFields.filter(field => !this.planInformation[field]);
if (planMissingFields.length > 0) {
this.$message.error('请填写完整的规划信息');
this.loading = false;
return;
}
// basicInformation
const basicRequiredFields = ['ssgnq', 'begainTime', 'endTime', 'xzfl', 'jsms'];
const basicMissingFields = basicRequiredFields.filter(field => !this.basicInformation[field]);
if (basicMissingFields.length > 0) {
this.$message.error('请填写完整的基本信息');
this.loading = false;
return;
}
//
// const submitData = this.prepareSubmitData();
// console.log(':', JSON.stringify(submitData, null, 2)); //
// fillBasicInformation(submitData)
// .then(response => {
// this.$message.success('');
// this.isSubmitted = true;
// this.$router.push('/manage');
// })
// .catch(error => {
// this.$message.error('');
// console.error(':', error);
// })
// .finally(() => {
// this.loading = false;
// });
}, },
// //

@ -173,7 +173,7 @@ export default {
/* 第一行:第一个模块占两列 */ /* 第一行:第一个模块占两列 */
.item-1 { .item-1 {
width: 67rem; width: 67rem;
background-image: url(../../../src/assets/images/allbg.png); /* background-image: url(../../../src/assets/images/allbg.png); */
background-size: 100% 100%; background-size: 100% 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
} }

@ -37,7 +37,7 @@ module.exports = {
proxy: { proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: `http://192.168.0.107:7071/`, target: `http://192.168.0.108:7071/`,
// target: `http://39.101.188.84:7071/`, // target: `http://39.101.188.84:7071/`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {

Loading…
Cancel
Save