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.
crmeb/admin/src/views/pm/building/pmbuilding-add-and-update.vue

386 lines
13 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>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="!dataForm.id ? '添加' : '修改'"
:close-on-click-modal="false"
:visible.sync="visible">
<!-- 新增和修改表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="楼栋编号" prop="buildingNo">
<el-input v-model="dataForm.buildingNo" placeholder="楼栋编号"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总层数" prop="totalFloors">
<el-input-number v-model="dataForm.totalFloors" placeholder="总层数" :min="1" :precision="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单元数" prop="unitCount">
<el-input-number v-model="dataForm.unitCount" placeholder="单元数" :min="1" :precision="0" style="width: 100%"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="楼栋类型" prop="buildingType">
<el-select v-model="dataForm.buildingType" placeholder="请选择楼栋类型" style="width: 100%">
<el-option
v-for="dict in dict.type.building_type"
:key="dict.value"
:label="dict.label"
:value="dict.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="dataForm.remark" placeholder="备注" type="textarea"></el-input>
</el-form-item>
</el-form>
<!-- 房屋列表 -->
<div v-if="houseList.length > 0" class="house-list-container">
<div class="house-list-title">房屋列表</div>
<el-table :data="houseList" style="width: 100%">
<el-table-column prop="unitNo" label="单元号" width="100"></el-table-column>
<el-table-column prop="floorNo" label="楼层号" width="100"></el-table-column>
<el-table-column prop="houseNo" label="房号" width="120"></el-table-column>
<el-table-column prop="houseType" label="户型" width="120"></el-table-column>
<el-table-column prop="usableArea" label="实用面积" width="100"></el-table-column>
<el-table-column prop="propertyType" label="产权类型">
<template slot-scope="scope">
<dict-tag v-if="dict.type.property_type && dict.type.property_type.length > 0" :options="dict.type.property_type" :value="scope.row.propertyType"/>
<span v-else>{{ scope.row.propertyType }}</span>
</template>
</el-table-column>
<el-table-column prop="houseStatus" label="房屋状态">
<template slot-scope="scope">
<dict-tag v-if="dict.type.house_status && dict.type.house_status.length > 0" :options="dict.type.house_status" :value="scope.row.houseStatus"/>
<span v-else>{{ scope.row.houseStatus }}</span>
</template>
</el-table-column>
<el-table-column prop="propertyCertNo" label="房产证号" width="150"></el-table-column>
<el-table-column prop="remark" label="备注"></el-table-column>
<el-table-column label="操作" width="180" fixed="right">
<template slot-scope="scope">
<el-button type="text" size="small" @click="editHouse(scope.row, scope.$index)">修改</el-button>
<el-button type="text" size="small" @click="deleteHouse([scope.row.id])">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<div class="house-pagination-container">
<el-pagination
background
layout="prev, pager, next, sizes, jumper, total"
:current-page="housePageIndex"
:page-size="housePageSize"
:page-sizes="[10, 20, 50, 100]"
:total="houseTotal"
@size-change="handleHouseSizeChange"
@current-change="handleHouseCurrentChange"
style="margin-top: 10px;"
/>
</div>
</div>
<span slot="footer" class="dialog-footer">
<!-- 如果是编辑状态,显示房屋管理相关按钮 -->
<!-- <el-button type="info" @click="addHouseHandle">新增房屋</el-button>-->
<el-button @click="$emit('close')">取消</el-button>
<el-button type="primary" @click="dataSubmit()"></el-button>
</span>
</el-dialog>
<!-- 房屋新增/修改弹窗 -->
<PmhouseAddAndUpdate
ref="pmhouseAddUpdate"
:visible="houseVisible"
:default-building-id="dataForm.id"
:default-project-id="dataForm.projectId"
@close="houseVisible = false"
@refresh-data-list="refreshHouseList"
@add-house-to-list="addHouseToList"
/>
</div>
</template>
<script>
import * as api from '@/api/pmbuilding.js'
import * as houseApi from '@/api/pmhouse.js'
import PmhouseAddAndUpdate from '../houser/pmhouse-add-and-update.vue'
export default {
dicts: ['project_status','building_type','property_type','house_status'],
components: {
PmhouseAddAndUpdate
},
props: {
visible: {
type: Boolean,
default: false
},
defaultProjectId: {
type: [String, Number],
default: ''
}
},
data () {
return {
dataForm: {
id: '' ,
projectId: '' ,
buildingNo: '' ,
totalFloors: '' ,
unitCount: '' ,
buildingType: '' ,
remark: '' ,
},
// 房屋列表数据
houseList: [],
// 房屋分页参数
housePageIndex: 1,
housePageSize: 10,
houseTotal: 0,
// 房屋新增/修改弹窗显示状态
houseVisible: false,
dataRule: {
buildingNo: [
{ required: true, message: '楼栋编号 为必填项', trigger: 'blur' }
],
totalFloors: [
{ required: true, message: '总层数 为必填项', trigger: 'blur' }
],
unitCount: [
{ required: true, message: '单元数 为必填项', trigger: 'blur' }
],
buildingType: [
{ required: true, message: '楼栋类型 为必填项', trigger: 'blur' }
],
remark: [
{ required: false, message: '请输入备注', trigger: 'blur' }
],
}
}
},
watch: {
// 监听默认项目ID变化自动设置到表单中
defaultProjectId: {
handler (newVal) {
if (newVal && !this.dataForm.id) {
this.dataForm.projectId = newVal
}
},
immediate: true
},
// 监听visible变化当对话框关闭时重置表单
visible (newVal) {
if (!newVal) {
this.$emit('close')
}
}
},
methods: {
init (id, buildingData) { // 初始化表单验证规则
this.$nextTick(function() {
// 重置表单
if (this.$refs['dataForm']) {
this.$refs['dataForm'].resetFields()
}
// 初始化dataForm
this.dataForm = {
id: '',
projectId: this.defaultProjectId || '',
buildingNo: '',
totalFloors: '',
unitCount: '',
buildingType: '',
remark: ''
}
// 清空房屋列表
this.houseList = []
// 如果提供了完整的楼栋数据,直接使用(编辑模式)
if (buildingData) {
this.dataForm = JSON.parse(JSON.stringify(buildingData))
// 确保项目ID正确
if (this.defaultProjectId) {
this.dataForm.projectId = this.defaultProjectId
}
// 加载房屋列表
this.loadHouseList(this.dataForm.id)
}
// 如果只有id从API加载数据编辑模式但没有完整数据
else if (id) {
this.dataForm.id = id
api.pmbuildingDetailApi(id).then(function(res) {
// 合并API返回的数据到dataForm
Object.assign(this.dataForm, res)
// 确保projectId正确
if (this.defaultProjectId) {
this.dataForm.projectId = this.defaultProjectId
}
// 加载房屋列表
this.loadHouseList(this.dataForm.id)
}.bind(this))
}
}.bind(this))
},
// 加载房屋列表
loadHouseList (buildingId) {
if (!buildingId) return
// 调用房屋API获取该楼栋下的房屋列表支持分页
houseApi.pmhouseListApi({
buildingId: buildingId,
page: this.housePageIndex,
limit: this.housePageSize
}).then(res => {
this.houseList = res.list || []
this.houseTotal = res.count || 0
}).catch(err => {
this.$message.error('加载房屋列表失败')
console.error(err)
})
},
// 新增房屋
addHouseHandle () {
this.houseVisible = true
// 重置房屋表单
this.$nextTick(() => {
this.$refs.pmhouseAddUpdate.init(null)
})
},
// 编辑房屋
editHouse (row, index) {
// 打开房屋编辑弹窗
this.houseVisible = true
// 等待弹窗渲染完成后初始化数据
this.$nextTick(() => {
this.$refs.pmhouseAddUpdate.init(row.id, row)
})
},
// 删除房屋
deleteHouse (ids) {
this.$confirm(`确定要删除${ids.length > 1 ? '这些房屋' : '该房屋'}吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
houseApi.pmhouseDeleteApi(ids).then(() => {
this.$message.success('删除成功')
// 重新加载房屋列表
this.loadHouseList(this.dataForm.id)
// 通知父组件刷新房屋列表
this.$emit('refreshHouseList')
}).catch(err => {
this.$message.error('删除失败')
console.error(err)
})
}).catch(() => {
// 用户取消删除
})
},
// 刷新房屋列表
refreshHouseList () {
// 重新加载当前楼栋的房屋列表
this.loadHouseList(this.dataForm.id)
// 通知父组件刷新房屋列表
this.$emit('refreshHouseList')
},
// 房屋列表分页大小变化
handleHouseSizeChange (size) {
this.housePageSize = size
this.housePageIndex = 1
this.loadHouseList(this.dataForm.id)
},
// 房屋列表当前页码变化
handleHouseCurrentChange (current) {
this.housePageIndex = current
this.loadHouseList(this.dataForm.id)
},
// 添加房屋到列表(用于楼栋未保存时的临时存储)
addHouseToList (houseData) {
// 深拷贝房屋数据,避免引用问题
const newHouse = JSON.parse(JSON.stringify(houseData))
// 新增房屋时将id设置为null以便后端自动生成
newHouse.id = null
// 添加到房屋列表
this.houseList.push(newHouse)
},
// 表单数据提交
dataSubmit () {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
// 深拷贝数据,避免引用问题
const buildingData = JSON.parse(JSON.stringify(this.dataForm))
// 确保id为字符串类型避免类型转换问题
if (buildingData.id === '') {
buildingData.id = null
}
// 将临时保存的房屋数据添加到楼栋数据中
buildingData.pmHouses = this.houseList.filter(house => {
// 只包含未保存到数据库的房屋id为null
return house.id === null
})
// 调用 API 保存楼栋数据
if (buildingData.id) {
// 编辑模式
api.pmbuildingUpdateApi(buildingData).then(() => {
this.$message.success('修改成功')
this.$emit('refreshDataList')
this.$emit('close')
}).catch(err => {
this.$message.error('修改失败')
this.$emit('refreshDataList')
console.error(err)
})
} else {
// 新增模式
api.pmbuildingCreateApi(buildingData).then(() => {
this.$message.success('添加成功')
this.$emit('refreshDataList')
this.$emit('close')
}).catch(err => {
this.$message.error('添加失败')
this.$emit('refreshDataList')
console.error(err)
})
}
}
})
}
}
}
</script>
<style scoped>
.house-list-container {
margin-top: 10px;
border: 1px solid #e4e7ed;
border-radius: 4px;
overflow: hidden;
}
.house-list-title {
padding: 8px 16px;
background-color: #f5f7fa;
border-bottom: 1px solid #e4e7ed;
font-weight: bold;
color: #303133;
}
</style>