2024-04-02 11:36:34 +08:00

478 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<a-card :body-style="{padding: '24px 32px'}" :bordered='false'>
<a-form @submit='handleSubmit' :form='form' :label-col='{ span: 4 }' :wrapper-col='{ span: 6 }'>
<a-form-item style='display:none'>
<a-input v-decorator="['id']" />
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='所属地区'>
<a-select v-decorator="['tenantId', {rules: [{ required: true, message: '请选择所属地区' }]}]"
@change='selectTenant'
:disabled='tenantEnable'>
<a-select-option v-for='item in tenantList' :key='item.id'>{{ item.name }}</a-select-option>
</a-select>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='所属园区'>
<a-select v-decorator="['parkId', {rules: [{ required: true, message: '请选择所属园区' }]}]"
@change='selectPark'
:disabled='parkEnable'>
<a-select-option v-for='item in parkList' :key='item.id'>{{ item.name }}</a-select-option>
</a-select>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='所属楼宇'>
<a-select v-decorator="['buildingId', {rules: [{ required: true, message: '请选择所属楼宇' }]}]"
@change='selectBuilding'>
<a-select-option v-for='item in buildingList' :key='item.id'>{{ item.buildingName }}</a-select-option>
</a-select>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='所属楼层'>
<a-select v-decorator="['buildingDetailId', {rules: [{ required: true, message: '请选择所属楼层' }]}]">
<a-select-option v-for='item in buildingDetailList' :key='item.id'>{{ item.floorName }}</a-select-option>
</a-select>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='房间名称'>
<a-input placeholder='请输入房间名称'
v-decorator="['name', {rules: [{ required: true, message: '请填写房间名称' }]}]" />
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='租金'>
<a-input-group compact>
<a-input-number :min='1' style='width: 150px; text-align: center' placeholder='租金'
v-decorator="['rent', {rules: [{ required: true, message: '请输入租金' }]}]" />
<a-select style='width: 10%'
v-decorator="['rentType', {initialValue: '4', rules: [{ required: true, message: '请选择租金类型' }]}]">
<a-select-option value='1'> //</a-select-option>
<a-select-option value='2'> //</a-select-option>
<a-select-option value='3'> /</a-select-option>
<a-select-option value='4'> /</a-select-option>
</a-select>
</a-input-group>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='物业费'>
<a-input-group compact>
<a-input-number :min='1' style='width: 150px; text-align: center' placeholder='物业费'
v-decorator="['managementFee', {rules: [{ required: true, message: '请输入物业费' }]}]" />
<a-select style='width: 10%'
v-decorator="['managementFeeType', {initialValue: '4', rules: [{ required: true, message: '请选择物业费类型' }]}]">
<a-select-option value='1'> //</a-select-option>
<a-select-option value='2'> //</a-select-option>
<a-select-option value='3'> /</a-select-option>
<a-select-option value='4'> /</a-select-option>
</a-select>
</a-input-group>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='房间面积(平方米)'>
<a-input-number :min='1' style='width: 20%' placeholder='请输入房间面积'
v-decorator="['area', {rules: [{ required: true, message: '请输入房间面积' }]}]" />
<div>
<a-checkbox :checked='mdl.canBeDivided' @change='onChangeCheckBox' v-decorator="['canBeDivided']">可分割
</a-checkbox>
</div>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='收租面积(平方米)'>
<a-input-number :min='1' style='width: 20%' placeholder='请输入收租面积'
v-decorator="['rentArea', {rules: [{ required: true, message: '请输入收租面积' }]}]" />
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='公摊面积(平方米)'>
<a-input-number :min='0' style='width: 20%' placeholder='请输入公摊面积'
v-decorator="['commonArea', {rules: [{ required: true, message: '请输入公摊面积' }]}]" />
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='房型'>
<a-select v-decorator="['layout', {initialValue:'',rules: [{ required: true, message: '请选择房型' }]}]">
<a-select-option value='LOFT'>loft</a-select-option>
<a-select-option value='BUSINESS'>商业配套</a-select-option>
<a-select-option value='OFFICE'>办公场所</a-select-option>
<a-select-option value='OTHER'>其他</a-select-option>
</a-select>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='层高(米)'>
<a-input-number :min='1' style='width: 20%' placeholder='请输入层高' v-decorator="['floorHeight']" />
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='可入住日期'>
<a-date-picker @change='onChange'
v-decorator="['availableFrom', {rules: [{required: true, message: '请输入可入住日期'}]}]"
placeholder='可入住日期' />
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='装修类型'>
<a-select
v-decorator="['decorationType', {initialValue:'',rules: [{ required: true, message: '请选择装修类型' }]}]">
<a-select-option value='SIMPLE'>简装</a-select-option>
<a-select-option value='SPECIAL'>精装</a-select-option>
<a-select-option value='ROUGH'>毛坯房</a-select-option>
</a-select>
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='奖金(元)'>
<a-input-number :min='1' style='width: 150px; text-align: center' placeholder='奖金' v-decorator="['bonus']" />
</a-form-item>
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='上传房间小图' extra='尺寸建议宽160px高160px'>
<a-upload
v-decorator="['smallPic']"
list-type='picture-card'
class='avatar-uploader'
:show-upload-list='false'
:action='uploadUrl'
:headers='headers'
:before-upload='beforeUpload'
@change='handleChange'
>
<img v-if='imageUrl' :src='imageUrl' style='width: 102px; height: 102px' />
<div v-else>
<a-icon :type="loading ? 'loading' : 'plus'" />
<div class='ant-upload-text'> 上传</div>
</div>
</a-upload>
</a-form-item>
<!-- <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上传园区banner图" extra="尺寸建议宽750px高300px">-->
<!-- <a-upload-->
<!-- v-decorator="['bannerImages']"-->
<!-- list-type="picture-card"-->
<!-- class="avatar-uploader"-->
<!-- :file-list="fileList"-->
<!-- :action="uploadUrl"-->
<!-- :headers="headers"-->
<!-- @preview="handlePreview"-->
<!-- @change="handleChangeFileList"-->
<!-- >-->
<!-- <div v-if="fileList.length < 4">-->
<!-- <a-icon type="plus" />-->
<!-- <div class="ant-upload-text"> 上传 </div>-->
<!-- </div>-->
<!-- </a-upload>-->
<!-- <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">-->
<!-- <img style="width: 100%" :src="previewImage" />-->
<!-- </a-modal>-->
<!-- </a-form-item>-->
<a-form-item :labelCol='labelCol' :wrapperCol='wrapperCol' label='房间简介(可选)' extra='不要超过50个字符'>
<a-textarea placeholder='请输入房间简介' :rows='5' v-decorator="['briefIntro']" />
</a-form-item>
<a-form-item :wrapper-col='{ span: 12, offset: 12 }'>
<a-button htmlType='submit' type='primary'>提交</a-button>
<a-button icon='rollback' style='margin-left: 8px' @click='rollback'>关闭</a-button>
</a-form-item>
</a-form>
</a-card>
</template>
<script>
import storage from 'store'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import WangEditor from '@/components/Editor/WangEditor.vue'
import { getDistVOList } from '@/api/system'
import { getRoomById, saveRoom } from '@/api/admin/room'
import pick from 'lodash.pick'
import moment from 'moment'
import { getParkList } from '@/api/admin/park'
import { getBuildingList } from '@/api/admin/building'
import { getBuildingDetailList } from '@/api/admin/buildingDetail'
import { getInfo } from '@/api/login'
import { getTenantList } from '@/api/tenant'
export default {
name: 'BaseForm',
components: {
WangEditor
},
data() {
return {
labelCol: {
xs: { span: 24 },
sm: { span: 6 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
},
uploadUrl: process.env.VUE_APP_API_BASE_URL + '/api/dfs/upload',
headers: {
Authorization: 'Bearer ' + storage.get(ACCESS_TOKEN)
},
loading: false,
imageUrl: '',
previewVisible: false,
previewImage: '',
fileList: [],
options: [],
mdl: {},
// form
form: this.$form.createForm(this),
userDetail: {},
tenantList: [],
parkList: [],
buildingList: [],
buildingDetailList: [],
tenantEnable: false,
parkEnable: false
}
},
created() {
// 获取用户信息
this.getUserDetail()
// 初始化地区
getDistVOList().then(res => {
this.options = res.data
})
// 初始化form
this.handleInit()
},
methods: {
// 获取用户详细信息
getUserDetail() {
getInfo().then(res => {
console.log('getUserDetail', res)
this.userDetail = res
// 园区5
if (this.userDetail.roleIds && this.userDetail.roleIds.length > 0 && this.userDetail.roleIds[0] == 5) {
//
// 判断:是新增就查询园区
let { id } = this.$route.query
if (!id) {
// 选择地区 -> 查询园区
this.selectTenant(this.userDetail.tenantId)
// 选择园区 -> 查询楼宇
this.selectPark(this.userDetail.parkId)
}
//
// 不可编辑
this.tenantEnable = true
this.parkEnable = true
// 关联地区和园区
this.mdl.parkId = this.userDetail.parkId
this.mdl.tenantId = this.userDetail.tenantId
this.form.setFieldsValue({
parkId: this.mdl.parkId,
tenantId: this.mdl.tenantId
})
}
})
},
// 查询地区
getTenantData() {
getTenantList().then(res => {
this.tenantList = res.rows
})
},
// 选择地区 -> 查询园区
selectTenant(id) {
console.log('selectTenant', id)
// 清空数据
this.mdl.parkId = null
this.mdl.buildingId = null
this.mdl.buildingDetailId = null
this.form.setFieldsValue({
parkId: null,
buildingId: null,
buildingDetailId: null
})
// 查询园区
getParkList({
tenantId: id
}).then(res => {
this.parkList = res.rows
})
},
// 选择园区 -> 查询楼宇
selectPark(id) {
// 清空数据
this.mdl.buildingId = null
this.mdl.buildingDetailId = null
this.form.setFieldsValue({
buildingId: null,
buildingDetailId: null
})
// 查询楼宇
getBuildingList({
parkId: id
}).then(res => {
this.buildingList = res.rows
})
},
// 选择楼宇 -> 查询楼层
selectBuilding(id) {
// 清空数据
this.mdl.buildingDetailId = null
this.form.setFieldsValue({
buildingDetailId: null
})
// 查询楼层
getBuildingDetailList({
buildingId: id
}).then(res => {
this.buildingDetailList = res.rows
})
},
onChangeCheckBox(e) {
this.mdl.canBeDivided = e.target.checked
},
onChange(date, dateString) {
},
handleInit() {
const { id } = this.$route.query
this.form.resetFields()
// 查询地区
this.getTenantData()
// 详情
if (id) {
getRoomById(id).then(record => {
this.mdl = Object.assign(this.mdl, record)
let copyMdl = JSON.parse(JSON.stringify(this.mdl))
this.visible = true
// 房间图片
if (this.mdl.smallPic) {
this.imageUrl = process.env.VUE_APP_API_BASE_URL + this.mdl.smallPic
}
// banner图片
this.mdl.bannerImages.forEach((item, i) => {
item.url = process.env.VUE_APP_API_BASE_URL + item.url
})
this.fileList = this.mdl.bannerImages
this.$nextTick(() => {
this.form.setFieldsValue(pick(this.mdl, 'id', 'name', 'area', 'smallPic', 'bannerImages', 'rent', 'briefIntro', 'bonus',
'rentType', 'managementFee', 'managementFeeType', 'parkingFee', 'layout', 'floorHeight', 'availableFrom',
'decorationType', 'isMarketable', 'marketableTime', 'canBeDivided', 'tenantId', 'parkId', 'buildingId', 'buildingDetailId', 'rentArea', 'commonArea'))
})
//
// 选择地区 -> 查询园区
if (copyMdl.tenantId) {
this.mdl = JSON.parse(JSON.stringify(copyMdl))
this.selectTenant(copyMdl.tenantId)
}
// 选择园区 -> 查询楼宇
if (copyMdl.parkId) {
this.mdl = JSON.parse(JSON.stringify(copyMdl))
this.selectPark(copyMdl.parkId)
}
// 选择楼宇 -> 查询楼层
if (copyMdl.buildingId) {
this.mdl = JSON.parse(JSON.stringify(copyMdl))
this.selectBuilding(copyMdl.buildingId)
}
// 防止替换
this.mdl = JSON.parse(JSON.stringify(copyMdl))
})
}
},
beforeUpload(file) {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
if (!isJpgOrPng) {
this.$message.error('You can only upload JPG file!')
}
const isLt500KB = file.size / 1024 < 500
if (!isLt500KB) {
this.$message.error('图片必须小于 500KB!')
}
return isJpgOrPng && isLt500KB
},
handleChange(info) {
if (info.file.status === 'uploading') {
this.loading = true
return
}
if (info.file.status === 'done') {
const { form: { setFieldsValue } } = this
const result = info.file.response
// 设置值
this.$nextTick(() => {
setFieldsValue({
smallPic: result.fileName
})
})
// Get this url from response in real world.
getBase64(info.file.originFileObj, imageUrl => {
this.imageUrl = imageUrl
this.loading = false
})
}
},
async handlePreview(file) {
if (!file.url && !file.preview) {
file.preview = await getBase64FileList(file.originFileObj)
}
this.previewImage = file.url || file.preview
this.previewVisible = true
},
handleCancel() {
this.previewVisible = false
},
// 上传banner
handleChangeFileList({ fileList }) {
this.fileList = fileList
},
// handler
handleSubmit(e) {
e.preventDefault()
this.form.validateFields((err, values) => {
if (!err) {
// eslint-disable-next-line no-console
const bannerImages = []
this.fileList.forEach((file, index) => {
// 添加原来的
if (file.hasOwnProperty('name') && file.hasOwnProperty('url') && file.hasOwnProperty('uid')) {
bannerImages.push({ 'name': file.name, 'url': file.name, 'uid': index })
}
if (file.status === 'done' && file.response.code === 0) {
const data = file.response
bannerImages.push({ 'name': data.fileName, 'url': data.fileName, 'uid': index })
}
})
values.availableFrom = moment(values.availableFrom).format('YYYY-MM-DD')
// 园区banner图片
values.bannerImages = bannerImages
console.log('Received values of form: ', values)
this.confirmLoading = true
saveRoom(values).then(res => {
if (res.code === 0) {
this.$message.success('保存成功')
this.$emit('ok')
this.visible = false
this.rollback()
} else {
this.$message.error(res.msg)
}
}).catch(() => {
this.$message.error('系统错误,请稍后再试')
}).finally(() => {
this.confirmLoading = false
})
}
})
},
rollback() {
this.$router.push({ name: 'room', query: { type: this.$route.query.type } })
}
}
}
// 上传园区小图
function getBase64(img, callback) {
const reader = new FileReader()
reader.addEventListener('load', () => callback(reader.result))
reader.readAsDataURL(img)
}
// 上传园区banner图
function getBase64FileList(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => resolve(reader.result)
reader.onerror = error => reject(error)
})
}
</script>
<style>
.avatar-uploader > .ant-upload {
width: 102px;
height: 102px;
}
.ant-upload-select-picture-card i {
font-size: 32px;
color: #999;
}
.ant-upload-select-picture-card .ant-upload-text {
margin-top: 8px;
color: #666;
}
</style>