You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

426 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="container">
<!-- 顶部信息 -->
<div class="containertop">
<div class="topleft">
<img src="../../../assets/images/detailsicon/1.png" alt="">
<span>企业入驻信息</span>
</div>
<div class="topright" v-if="action === 'fill' || !action || action === 'okay'">
<el-button v-if="!isEditing" type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="edit">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="编辑"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
编辑
</el-button>
<el-button v-else type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="save">
<img src="../../../assets/images/detailsicon/icon-bj@2x.png" alt="保存"
style="width: 0.6rem; height: 0.6rem; margin-right: 4px;">
保存
</el-button>
</div>
</div>
<!-- 内容区 -->
<div class="content">
<div class="descriptionsdiv">
<el-descriptions class="margin-top" :column="4" border>
<el-descriptions-item label="入驻企业数(家)">
<span>{{ tableData.length }}</span>
</el-descriptions-item>
<el-descriptions-item label="入驻企业行业类型">
<el-input v-if="isEditing" v-model="form.rzqyhylx" style="width: 100%;"></el-input>
<span v-else>{{ form.rzqyhylx || "" }}</span>
</el-descriptions-item>
<el-descriptions-item label="人员数量(人)">
<el-input v-if="isEditing" v-model.number="form.rysl" style="width: 100%;"></el-input>
<span v-else>{{ form.rysl || "" }}</span>
</el-descriptions-item>
<el-descriptions-item label="入住率(%">
<el-input v-if="isEditing" v-model.number="form.rzl" style="width: 100%;"></el-input>
<span v-else>{{ form.rzl || "" }}</span>
</el-descriptions-item>
<el-descriptions-item label="已出租(售)面积(平方米)">
<el-input v-if="isEditing" v-model.number="form.yczmj" style="width: 100%;"></el-input>
<span v-else>{{ form.yczmj || "" }}</span>
</el-descriptions-item>
<el-descriptions-item label="空置出租(售)面积(平方米)">
<el-input v-if="isEditing" v-model.number="form.kzczmj" style="width: 100%;"></el-input>
<span v-else>{{ form.kzczmj || "" }}</span>
</el-descriptions-item>
<el-descriptions-item label="工业厂房平均租金(元/平方米*月)">
<el-input v-if="isEditing" v-model.number="form.gycfpjzj" style="width: 100%;"></el-input>
<span v-else>{{ form.gycfpjzj || "" }}</span>
</el-descriptions-item>
<el-descriptions-item label="工业厂房平均物业费(元/平方米*月)">
<el-input v-if="isEditing" v-model.number="form.gycfpjwyf" style="width: 100%;"></el-input>
<span v-else>{{ form.gycfpjwyf || "" }}</span>
</el-descriptions-item>
</el-descriptions>
<div class="btnarea" v-if="action === 'fill' || !action || action === 'okay'">
<el-button type="primary" size="mini" @click="handleImport">
批量导入
</el-button>
</div>
<!-- 表格显示区 -->
<div class="contenttwo">
<div class="descriptionsdiv">
<el-table :data="tableData" style="width: 98%">
<el-table-column label="序号" width="200">
<template slot-scope="scope">
{{ (pagination.currentPage - 1) * pagination.pageSize + scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="name" label="企业名称" width="300">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model="scope.row.name" style="width: 100%;"></el-input>
<span v-else style="color: #2B62F1;">{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column prop="code" label="统一社会信用代码" width="300">
</el-table-column>
<el-table-column prop="sshy" label="所属行业" width="300">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model="scope.row.sshy" style="width: 100%;"></el-input>
<span v-else>{{ scope.row.sshy }}</span>
</template>
</el-table-column>
<el-table-column prop="zjjg" label='租金价格' width="250">
<template slot-scope="scope">
<el-input v-if="scope.row.isEditing" v-model.number="scope.row.zjjg" style="width: 100%;"></el-input>
<span v-else>{{ scope.row.zjjg }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="200" align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.isEditing" size="mini" type="text" icon="el-icon-check"
@click="saveRow(scope.row)">保存</el-button>
<el-button v-else size="mini" type="text" icon="el-icon-edit"
@click="editRow(scope.row)">编辑</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" style="color: #F25353;"
@click="deleteRow(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination :current-page="pagination.currentPage" :page-sizes="[10, 20, 50, 100]"
:page-size="pagination.pageSize" layout="total, prev, pager, next, jumper" :total="pagination.total"
@current-change="handleCurrentChange" @size-change="handleSizeChange">
</el-pagination>
</div>
</div>
</div>
<!-- 导入弹窗 -->
<el-dialog title="数据导入" :visible.sync="upload.open" width="400px" append-to-body :close-on-click-modal="false">
<el-upload ref="upload" :limit="1" accept=".xlsx,.xls" :headers="upload.headers" :action="upload.url"
:disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess"
:auto-upload="false" :data="upload.data" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
@click="importTemplate">下载模板</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button @click="upload.open = false">取 消</el-button>
<el-button type="primary" @click="submitFileForm" :loading="upload.isUploading">
</el-button>
</div>
</el-dialog>
</div>
</div>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
import { download } from "@/utils/request";
import { getqyBasicInformationPage, updateqyBasicInformation, deleteqyBasicInformation } from "@/api/ManageApi/index";
export default {
props: {
qyrzInfo: {
type: Object,
required: true,
default: () => ({
rzqys: 0,
rzqyhylx: '',
rysl: 0,
rzl: 0,
yczmj: 0,
kzczmj: 0,
gycfpjzj: 0,
gycfpjwyf: 0
})
},
action: {
type: String,
required: true
},
xmId: {
type: Number,
required: true
}
},
data() {
return {
isEditing: false,
form: {
...this.qyrzInfo
},
tableData: [], // 初始化为空数组
pagination: {
currentPage: 1,
pageSize: 10,
total: 0
},
upload: {
open: false,
isUploading: false,
updateSupport: 0,
headers: {
Authorization: "Bearer " + getToken(),
},
url: process.env.VUE_APP_BASE_API + "/gysl/enterprise/importEnterprise",
data: {
xmId: this.xmId
}
}
};
},
created() {
this.fetchTableData(); // 仅加载数据,不主动保存
},
methods: {
async fetchTableData() {
const params = { xmId: this.xmId, current: 1, size: 10 };
try {
const response = await getqyBasicInformationPage(params);
this.tableData = response.data.records.map(item => ({ ...item, isEditing: false }));
this.pagination.total = response.data.total;
// 数据加载完成后,更新 form.rzqys 并通知父组件
this.form.rzqys = this.tableData.length;
this.$emit('update-data', { ...this.form }); // 确保传递完整数据
} catch (error) {
console.error('获取数据失败:', error);
}
}
},
watch: {
qyrzInfo: {
handler(newVal) {
// 仅合并父组件传入的字段,保留子组件自己的状态(如 tableData 生成的 rzqys
this.form = {
...newVal,
rzqys: this.tableData.length // 优先使用本地计算的 rzqys
};
},
immediate: true,
deep: true
}
},
methods: {
// 获取表格数据
fetchTableData() {
const params = {
xmId: this.xmId,
current: this.pagination.currentPage,
size: this.pagination.pageSize
};
return getqyBasicInformationPage(params).then(response => {
// console.log('Fetched Data:', response.data.records);
this.tableData = response.data.records.map(item => ({
...item,
isEditing: false
}));
// console.log('Table Data:', this.tableData);
this.pagination.total = response.data.total;
}).catch();
},
// 编辑/保存方法
edit() {
this.isEditing = true;
},
save() {
const formData = {
...this.form,
rzqys: this.tableData.length,
rysl: Number(this.form.rysl),
rzl: Number(this.form.rzl),
yczmj: Number(this.form.yczmj),
kzczmj: Number(this.form.kzczmj),
gycfpjzj: Number(this.form.gycfpjzj),
gycfpjwyf: Number(this.form.gycfpjwyf)
};
this.$emit('update-data', formData);
this.isEditing = false;
},
// 表格编辑相关方法
editRow(row) {
row.isEditing = true;
},
saveRow(row) {
row.isEditing = false;
updateqyBasicInformation(row).then(response => {
this.$modal.msgSuccess('保存成功');
}).catch(error => {
console.error('保存失败:', error);
this.$modal.msgError('保存失败');
});
},
deleteRow(index) {
const id = this.tableData[index].id;
deleteqyBasicInformation([id]).then(response => {
this.$modal.msgSuccess('删除成功');
this.tableData.splice(index, 1);
// 重新获取表格数据以确保分页正确
this.fetchTableData().then(() => {
// 更新 form 数据
this.form.rzqys = this.tableData.length;
// 调用 save 方法发送最新的数据
this.save();
});
}).catch(error => {
console.error('删除失败:', error);
this.$modal.msgError('删除失败');
});
},
// 导入相关方法
handleImport() {
this.upload.open = true;
},
//模板下载
importTemplate() {
download(
"/gysl/enterprise/importTemplate",
{},
`企业入驻模板_${new Date().getTime()}.xlsx`
);
},
handleFileUploadProgress() {
this.upload.isUploading = true;
},
handleFileSuccess(response) {
this.upload.isUploading = false;
this.upload.open = false;
this.$refs.upload.clearFiles();
if (response.code === 200) {
this.$modal.msgSuccess(response.msg);
// 重新获取表格数据
this.fetchTableData().then(() => {
// 更新 form 数据
this.form.rzqys = this.tableData.length;
// 调用 save 方法发送最新的数据
this.save();
});
} else {
this.$modal.msgError(response.msg || "导入失败");
}
},
submitFileForm() {
if (this.$refs.upload.uploadFiles.length === 0) {
this.$modal.msgWarning("请先选择文件");
return;
}
// 将 xmId 添加到请求参数中
const formData = new FormData();
formData.append('file', this.$refs.upload.uploadFiles[0].raw);
formData.append('xmId', this.upload.data.xmId);
this.$refs.upload.submit(formData);
},
// 分页处理
handleCurrentChange(page) {
this.pagination.currentPage = page;
this.fetchTableData();
},
handleSizeChange(size) {
this.pagination.pageSize = size;
this.fetchTableData();
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.content {
padding: 1rem;
display: flex;
}
.containertop {
height: auto;
display: flex;
justify-content: space-between;
padding: .7rem 0;
padding: .5rem;
border-bottom: 1px solid #E5E5E5;
}
.topleft {
height: 2rem;
width: 8rem;
display: flex;
gap: 0.4rem;
align-items: center;
}
.topleft img {
width: 0.81rem;
height: 0.81rem;
}
.topleft span {
width: auto;
height: 0.88rem;
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 500;
font-size: 0.88rem;
color: #3D424C;
line-height: 0.88rem;
text-align: right;
font-style: normal;
text-transform: none;
}
.descriptionsdiv {
width: 100%;
margin-left: 1rem;
height: auto;
}
.contenttwo {
margin-top: 1rem;
margin-left: -1rem;
}
.btnarea {
margin-top: 1rem;
}
.block {
width: 98%;
display: flex;
justify-content: space-between;
margin-top: 1rem;
}
</style>