Commit e4e314519b2077e09a40f5b50b1c2a51af525b3e
1 parent
6d9d3e27
完成物业首页功能
Showing
19 changed files
with
1915 additions
and
5 deletions
public/img/hc_use.png
0 → 100644
64.9 KB
src/api/community/enterCommunityApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 查询入驻小区列表 | ||
| 4 | +export function listMyCommunity(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/communitys/queryStoreCommunitys', | ||
| 8 | + method: 'get', | ||
| 9 | + params | ||
| 10 | + }).then(response => { | ||
| 11 | + const res = response.data | ||
| 12 | + if (res.code == 0) { | ||
| 13 | + resolve(res.data) | ||
| 14 | + } else { | ||
| 15 | + reject(new Error(res.msg || '查询小区列表失败')) | ||
| 16 | + } | ||
| 17 | + }).catch(error => { | ||
| 18 | + reject(error) | ||
| 19 | + }) | ||
| 20 | + }) | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +// 更新小区信息 | ||
| 24 | +export function updateCommunity(data) { | ||
| 25 | + return new Promise((resolve, reject) => { | ||
| 26 | + request({ | ||
| 27 | + url: '/community.updateCommunity', | ||
| 28 | + method: 'post', | ||
| 29 | + data | ||
| 30 | + }).then(response => { | ||
| 31 | + const res = response.data | ||
| 32 | + if (res.code == 0) { | ||
| 33 | + resolve(res) | ||
| 34 | + } else { | ||
| 35 | + reject(new Error(res.msg || '更新小区信息失败')) | ||
| 36 | + } | ||
| 37 | + }).catch(error => { | ||
| 38 | + reject(error) | ||
| 39 | + }) | ||
| 40 | + }) | ||
| 41 | +} | ||
| 0 | \ No newline at end of file | 42 | \ No newline at end of file |
src/api/community/roomRenovationManageApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 查询装修信息列表 | ||
| 4 | +export function listRoomRenovation(params) { | ||
| 5 | + return new Promise((resolve, reject) => { | ||
| 6 | + request({ | ||
| 7 | + url: '/roomRenovation/queryRoomRenovation', | ||
| 8 | + method: 'get', | ||
| 9 | + params | ||
| 10 | + }).then(response => { | ||
| 11 | + const res = response.data | ||
| 12 | + if (res.code === 0) { | ||
| 13 | + resolve(res) | ||
| 14 | + } else { | ||
| 15 | + reject(new Error(res.msg || '查询装修信息失败')) | ||
| 16 | + } | ||
| 17 | + }).catch(error => { | ||
| 18 | + reject(error) | ||
| 19 | + }) | ||
| 20 | + }) | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +// 添加装修信息 | ||
| 24 | +export function addRoomRenovation(data) { | ||
| 25 | + return new Promise((resolve, reject) => { | ||
| 26 | + request({ | ||
| 27 | + url: '/roomRenovation/saveRoomRenovation', | ||
| 28 | + method: 'post', | ||
| 29 | + data | ||
| 30 | + }).then(response => { | ||
| 31 | + const res = response.data | ||
| 32 | + if (res.code === 0) { | ||
| 33 | + resolve(res) | ||
| 34 | + } else { | ||
| 35 | + reject(new Error(res.msg || '添加装修信息失败')) | ||
| 36 | + } | ||
| 37 | + }).catch(error => { | ||
| 38 | + reject(error) | ||
| 39 | + }) | ||
| 40 | + }) | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +// 更新装修信息 | ||
| 44 | +export function updateRoomRenovation(data) { | ||
| 45 | + return new Promise((resolve, reject) => { | ||
| 46 | + request({ | ||
| 47 | + url: '/roomRenovation/updateRoomRenovation', | ||
| 48 | + method: 'post', | ||
| 49 | + data | ||
| 50 | + }).then(response => { | ||
| 51 | + const res = response.data | ||
| 52 | + if (res.code === 0) { | ||
| 53 | + resolve(res) | ||
| 54 | + } else { | ||
| 55 | + reject(new Error(res.msg || '更新装修信息失败')) | ||
| 56 | + } | ||
| 57 | + }).catch(error => { | ||
| 58 | + reject(error) | ||
| 59 | + }) | ||
| 60 | + }) | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | +// 删除装修信息 | ||
| 64 | +export function deleteRoomRenovation(data) { | ||
| 65 | + return new Promise((resolve, reject) => { | ||
| 66 | + request({ | ||
| 67 | + url: '/roomRenovation/deleteRoomRenovation', | ||
| 68 | + method: 'post', | ||
| 69 | + data | ||
| 70 | + }).then(response => { | ||
| 71 | + const res = response.data | ||
| 72 | + if (res.code === 0) { | ||
| 73 | + resolve(res) | ||
| 74 | + } else { | ||
| 75 | + reject(new Error(res.msg || '删除装修信息失败')) | ||
| 76 | + } | ||
| 77 | + }).catch(error => { | ||
| 78 | + reject(error) | ||
| 79 | + }) | ||
| 80 | + }) | ||
| 81 | +} | ||
| 82 | + | ||
| 83 | +// 更新装修状态 | ||
| 84 | +export function updateRoomRenovationState(data) { | ||
| 85 | + return new Promise((resolve, reject) => { | ||
| 86 | + request({ | ||
| 87 | + url: '/roomRenovation/updateRoomRenovationState', | ||
| 88 | + method: 'post', | ||
| 89 | + data | ||
| 90 | + }).then(response => { | ||
| 91 | + const res = response.data | ||
| 92 | + if (res.code === 0) { | ||
| 93 | + resolve(res) | ||
| 94 | + } else { | ||
| 95 | + reject(new Error(res.msg || '更新装修状态失败')) | ||
| 96 | + } | ||
| 97 | + }).catch(error => { | ||
| 98 | + reject(error) | ||
| 99 | + }) | ||
| 100 | + }) | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +// 更新装修审核状态 | ||
| 104 | +export function updateRoomToExamine(data) { | ||
| 105 | + return new Promise((resolve, reject) => { | ||
| 106 | + request({ | ||
| 107 | + url: '/roomRenovation/updateRoomToExamine', | ||
| 108 | + method: 'post', | ||
| 109 | + data | ||
| 110 | + }).then(response => { | ||
| 111 | + const res = response.data | ||
| 112 | + if (res.code === 0) { | ||
| 113 | + resolve(res) | ||
| 114 | + } else { | ||
| 115 | + reject(new Error(res.msg || '更新审核状态失败')) | ||
| 116 | + } | ||
| 117 | + }).catch(error => { | ||
| 118 | + reject(error) | ||
| 119 | + }) | ||
| 120 | + }) | ||
| 121 | +} | ||
| 122 | + | ||
| 123 | +// 保存装修验收信息 | ||
| 124 | +export function saveRoomRenovationDetail(data) { | ||
| 125 | + return new Promise((resolve, reject) => { | ||
| 126 | + request({ | ||
| 127 | + url: '/roomRenovation/saveRoomRenovationDetail', | ||
| 128 | + method: 'post', | ||
| 129 | + data | ||
| 130 | + }).then(response => { | ||
| 131 | + const res = response.data | ||
| 132 | + if (res.code === 0) { | ||
| 133 | + resolve(res) | ||
| 134 | + } else { | ||
| 135 | + reject(new Error(res.msg || '保存验收信息失败')) | ||
| 136 | + } | ||
| 137 | + }).catch(error => { | ||
| 138 | + reject(error) | ||
| 139 | + }) | ||
| 140 | + }) | ||
| 141 | +} | ||
| 0 | \ No newline at end of file | 142 | \ No newline at end of file |
src/components/community/AddRoomRenovation.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog :title="$t('roomRenovationManage.add')" :visible.sync="visible" width="50%" @close="resetForm"> | ||
| 3 | + <el-form :model="form" ref="form" label-width="120px"> | ||
| 4 | + <el-form-item :label="$t('roomRenovationManage.room')" prop="roomName" required> | ||
| 5 | + <el-input v-model.trim="form.roomName" :placeholder="$t('roomRenovationManage.roomNumberPlaceholder')" | ||
| 6 | + @blur="queryRoom" /> | ||
| 7 | + </el-form-item> | ||
| 8 | + | ||
| 9 | + <el-form-item :label="$t('roomRenovationManage.contactPerson')" prop="personName" required> | ||
| 10 | + <el-input v-model.trim="form.personName" :placeholder="$t('roomRenovationManage.contactPersonPlaceholder')" | ||
| 11 | + disabled /> | ||
| 12 | + </el-form-item> | ||
| 13 | + | ||
| 14 | + <el-form-item :label="$t('roomRenovationManage.phone')" prop="personTel" required> | ||
| 15 | + <el-input v-model.trim="form.personTel" :placeholder="$t('roomRenovationManage.phonePlaceholder')" disabled /> | ||
| 16 | + </el-form-item> | ||
| 17 | + | ||
| 18 | + <el-form-item :label="$t('roomRenovationManage.renovationStartTime')" prop="startTime" required> | ||
| 19 | + <el-date-picker v-model="form.startTime" type="date" | ||
| 20 | + :placeholder="$t('roomRenovationManage.startTimePlaceholder')" value-format="yyyy-MM-dd" /> | ||
| 21 | + </el-form-item> | ||
| 22 | + | ||
| 23 | + <el-form-item :label="$t('roomRenovationManage.renovationEndTime')" prop="endTime" required> | ||
| 24 | + <el-date-picker v-model="form.endTime" type="date" :placeholder="$t('roomRenovationManage.endTimePlaceholder')" | ||
| 25 | + value-format="yyyy-MM-dd" /> | ||
| 26 | + </el-form-item> | ||
| 27 | + | ||
| 28 | + <el-form-item :label="$t('roomRenovationManage.renovationCompany')" prop="renovationCompany" required> | ||
| 29 | + <el-input v-model.trim="form.renovationCompany" | ||
| 30 | + :placeholder="$t('roomRenovationManage.renovationCompanyPlaceholder')" /> | ||
| 31 | + </el-form-item> | ||
| 32 | + | ||
| 33 | + <el-form-item :label="$t('roomRenovationManage.renovationManager')" prop="personMain" required> | ||
| 34 | + <el-input v-model.trim="form.personMain" :placeholder="$t('roomRenovationManage.renovationManagerPlaceholder')" /> | ||
| 35 | + </el-form-item> | ||
| 36 | + | ||
| 37 | + <el-form-item :label="$t('roomRenovationManage.managerPhone')" prop="personMainTel" required> | ||
| 38 | + <el-input v-model.trim="form.personMainTel" :placeholder="$t('roomRenovationManage.managerPhonePlaceholder')" /> | ||
| 39 | + </el-form-item> | ||
| 40 | + | ||
| 41 | + <el-form-item :label="$t('roomRenovationManage.remark')" prop="remark"> | ||
| 42 | + <el-input v-model.trim="form.remark" type="textarea" | ||
| 43 | + :placeholder="$t('roomRenovationManage.remarkPlaceholder')" /> | ||
| 44 | + </el-form-item> | ||
| 45 | + </el-form> | ||
| 46 | + | ||
| 47 | + <div slot="footer" class="dialog-footer"> | ||
| 48 | + <el-button @click="visible = false"> | ||
| 49 | + {{ $t('roomRenovationManage.cancel') }} | ||
| 50 | + </el-button> | ||
| 51 | + <el-button type="primary" @click="saveRoomRenovation"> | ||
| 52 | + {{ $t('roomRenovationManage.save') }} | ||
| 53 | + </el-button> | ||
| 54 | + </div> | ||
| 55 | + </el-dialog> | ||
| 56 | +</template> | ||
| 57 | + | ||
| 58 | +<script> | ||
| 59 | +import { addRoomRenovation } from '@/api/community/roomRenovationManageApi' | ||
| 60 | + | ||
| 61 | +export default { | ||
| 62 | + name: 'AddRoomRenovation', | ||
| 63 | + data() { | ||
| 64 | + return { | ||
| 65 | + visible: false, | ||
| 66 | + form: { | ||
| 67 | + roomName: '', | ||
| 68 | + personName: '', | ||
| 69 | + personTel: '', | ||
| 70 | + startTime: '', | ||
| 71 | + endTime: '', | ||
| 72 | + renovationCompany: '', | ||
| 73 | + personMain: '', | ||
| 74 | + personMainTel: '', | ||
| 75 | + remark: '', | ||
| 76 | + isPostpone: 'N', | ||
| 77 | + communityId: '' | ||
| 78 | + } | ||
| 79 | + } | ||
| 80 | + }, | ||
| 81 | + methods: { | ||
| 82 | + open() { | ||
| 83 | + this.visible = true | ||
| 84 | + }, | ||
| 85 | + | ||
| 86 | + resetForm() { | ||
| 87 | + this.form = { | ||
| 88 | + roomName: '', | ||
| 89 | + personName: '', | ||
| 90 | + personTel: '', | ||
| 91 | + startTime: '', | ||
| 92 | + endTime: '', | ||
| 93 | + renovationCompany: '', | ||
| 94 | + personMain: '', | ||
| 95 | + personMainTel: '', | ||
| 96 | + remark: '', | ||
| 97 | + isPostpone: 'N', | ||
| 98 | + communityId: this.getCommunityId() | ||
| 99 | + } | ||
| 100 | + this.$refs.form && this.$refs.form.resetFields() | ||
| 101 | + }, | ||
| 102 | + | ||
| 103 | + async saveRoomRenovation() { | ||
| 104 | + try { | ||
| 105 | + this.form.communityId = this.getCommunityId() | ||
| 106 | + await addRoomRenovation(this.form) | ||
| 107 | + this.$message.success(this.$t('common.operationSuccess')) | ||
| 108 | + this.visible = false | ||
| 109 | + this.$emit('success') | ||
| 110 | + } catch (error) { | ||
| 111 | + console.error('添加装修信息失败:', error) | ||
| 112 | + this.$message.error(error.message || this.$t('common.operationFailed')) | ||
| 113 | + } | ||
| 114 | + }, | ||
| 115 | + | ||
| 116 | + async queryRoom() { | ||
| 117 | + if (!this.form.roomName) return | ||
| 118 | + | ||
| 119 | + try { | ||
| 120 | + // 这里需要根据实际API实现查询房屋信息 | ||
| 121 | + // const roomInfo = await getRoomInfo({ roomName: this.form.roomName }) | ||
| 122 | + // this.form.personName = roomInfo.ownerName | ||
| 123 | + // this.form.personTel = roomInfo.link | ||
| 124 | + } catch (error) { | ||
| 125 | + console.error('查询房屋信息失败:', error) | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | + } | ||
| 129 | +} | ||
| 130 | +</script> | ||
| 0 | \ No newline at end of file | 131 | \ No newline at end of file |
src/components/community/DeleteRoomRenovation.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog | ||
| 3 | + :title="$t('roomRenovationManage.confirmDelete')" | ||
| 4 | + :visible.sync="visible" | ||
| 5 | + width="30%" | ||
| 6 | + @close="resetForm" | ||
| 7 | + > | ||
| 8 | + <div> | ||
| 9 | + <p>{{ $t('roomRenovationManage.confirmDeleteMsg') }}</p> | ||
| 10 | + </div> | ||
| 11 | + | ||
| 12 | + <div slot="footer" class="dialog-footer"> | ||
| 13 | + <el-button @click="visible = false"> | ||
| 14 | + {{ $t('roomRenovationManage.cancelDelete') }} | ||
| 15 | + </el-button> | ||
| 16 | + <el-button type="danger" @click="deleteRoomRenovation"> | ||
| 17 | + {{ $t('roomRenovationManage.confirmDelete') }} | ||
| 18 | + </el-button> | ||
| 19 | + </div> | ||
| 20 | + </el-dialog> | ||
| 21 | +</template> | ||
| 22 | + | ||
| 23 | +<script> | ||
| 24 | +import { deleteRoomRenovation } from '@/api/community/roomRenovationManageApi' | ||
| 25 | + | ||
| 26 | +export default { | ||
| 27 | + name: 'DeleteRoomRenovation', | ||
| 28 | + data() { | ||
| 29 | + return { | ||
| 30 | + visible: false, | ||
| 31 | + form: { | ||
| 32 | + rId: '', | ||
| 33 | + communityId: '' | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + }, | ||
| 37 | + methods: { | ||
| 38 | + open(row) { | ||
| 39 | + this.form = { | ||
| 40 | + rId: row.rId, | ||
| 41 | + communityId: this.$store.getters.communityId | ||
| 42 | + } | ||
| 43 | + this.visible = true | ||
| 44 | + }, | ||
| 45 | + | ||
| 46 | + resetForm() { | ||
| 47 | + this.form = { | ||
| 48 | + rId: '', | ||
| 49 | + communityId: '' | ||
| 50 | + } | ||
| 51 | + }, | ||
| 52 | + | ||
| 53 | + async deleteRoomRenovation() { | ||
| 54 | + try { | ||
| 55 | + await deleteRoomRenovation(this.form) | ||
| 56 | + this.$message.success(this.$t('common.operationSuccess')) | ||
| 57 | + this.visible = false | ||
| 58 | + this.$emit('success') | ||
| 59 | + } catch (error) { | ||
| 60 | + console.error('删除装修信息失败:', error) | ||
| 61 | + this.$message.error(error.message || this.$t('common.operationFailed')) | ||
| 62 | + } | ||
| 63 | + } | ||
| 64 | + } | ||
| 65 | +} | ||
| 66 | +</script> | ||
| 0 | \ No newline at end of file | 67 | \ No newline at end of file |
src/components/community/EditRoomRenovation.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog | ||
| 3 | + :title="$t('roomRenovationManage.modify')" | ||
| 4 | + :visible.sync="visible" | ||
| 5 | + width="50%" | ||
| 6 | + @close="resetForm" | ||
| 7 | + > | ||
| 8 | + <el-form :model="form" ref="form" label-width="120px"> | ||
| 9 | + <el-form-item :label="$t('roomRenovationManage.room')" prop="roomName"> | ||
| 10 | + <el-input | ||
| 11 | + v-model.trim="form.roomName" | ||
| 12 | + disabled | ||
| 13 | + /> | ||
| 14 | + </el-form-item> | ||
| 15 | + | ||
| 16 | + <el-form-item :label="$t('roomRenovationManage.contactPerson')" prop="personName" required> | ||
| 17 | + <el-input | ||
| 18 | + v-model.trim="form.personName" | ||
| 19 | + :placeholder="$t('roomRenovationManage.contactPersonPlaceholder')" | ||
| 20 | + /> | ||
| 21 | + </el-form-item> | ||
| 22 | + | ||
| 23 | + <el-form-item :label="$t('roomRenovationManage.phone')" prop="personTel" required> | ||
| 24 | + <el-input | ||
| 25 | + v-model.trim="form.personTel" | ||
| 26 | + :placeholder="$t('roomRenovationManage.phonePlaceholder')" | ||
| 27 | + /> | ||
| 28 | + </el-form-item> | ||
| 29 | + | ||
| 30 | + <el-form-item :label="$t('roomRenovationManage.renovationStartTime')" prop="startTime" required> | ||
| 31 | + <el-date-picker | ||
| 32 | + v-model="form.startTime" | ||
| 33 | + type="date" | ||
| 34 | + :placeholder="$t('roomRenovationManage.startTimePlaceholder')" | ||
| 35 | + value-format="yyyy-MM-dd" | ||
| 36 | + /> | ||
| 37 | + </el-form-item> | ||
| 38 | + | ||
| 39 | + <el-form-item :label="$t('roomRenovationManage.renovationEndTime')" prop="endTime" required> | ||
| 40 | + <el-date-picker | ||
| 41 | + v-model="form.endTime" | ||
| 42 | + type="date" | ||
| 43 | + :placeholder="$t('roomRenovationManage.endTimePlaceholder')" | ||
| 44 | + value-format="yyyy-MM-dd" | ||
| 45 | + /> | ||
| 46 | + </el-form-item> | ||
| 47 | + | ||
| 48 | + <el-form-item :label="$t('roomRenovationManage.isPostponed')" prop="isPostpone" required> | ||
| 49 | + <el-select v-model="form.isPostpone"> | ||
| 50 | + <el-option :label="$t('roomRenovationManage.yes')" value="Y" /> | ||
| 51 | + <el-option :label="$t('roomRenovationManage.no')" value="N" /> | ||
| 52 | + </el-select> | ||
| 53 | + </el-form-item> | ||
| 54 | + | ||
| 55 | + <el-form-item | ||
| 56 | + v-if="form.isPostpone === 'Y'" | ||
| 57 | + :label="$t('roomRenovationManage.postponeTime')" | ||
| 58 | + prop="postponeTime" | ||
| 59 | + > | ||
| 60 | + <el-date-picker | ||
| 61 | + v-model="form.postponeTime" | ||
| 62 | + type="date" | ||
| 63 | + :placeholder="$t('roomRenovationManage.endTimePlaceholder')" | ||
| 64 | + value-format="yyyy-MM-dd" | ||
| 65 | + /> | ||
| 66 | + </el-form-item> | ||
| 67 | + | ||
| 68 | + <el-form-item :label="$t('roomRenovationManage.renovationCompany')" prop="renovationCompany" required> | ||
| 69 | + <el-input | ||
| 70 | + v-model.trim="form.renovationCompany" | ||
| 71 | + :placeholder="$t('roomRenovationManage.renovationCompanyPlaceholder')" | ||
| 72 | + /> | ||
| 73 | + </el-form-item> | ||
| 74 | + | ||
| 75 | + <el-form-item :label="$t('roomRenovationManage.renovationManager')" prop="personMain" required> | ||
| 76 | + <el-input | ||
| 77 | + v-model.trim="form.personMain" | ||
| 78 | + :placeholder="$t('roomRenovationManage.renovationManagerPlaceholder')" | ||
| 79 | + /> | ||
| 80 | + </el-form-item> | ||
| 81 | + | ||
| 82 | + <el-form-item :label="$t('roomRenovationManage.managerPhone')" prop="personMainTel" required> | ||
| 83 | + <el-input | ||
| 84 | + v-model.trim="form.personMainTel" | ||
| 85 | + :placeholder="$t('roomRenovationManage.managerPhonePlaceholder')" | ||
| 86 | + /> | ||
| 87 | + </el-form-item> | ||
| 88 | + | ||
| 89 | + <el-form-item :label="$t('roomRenovationManage.status')" prop="state" required> | ||
| 90 | + <el-select v-model="form.state"> | ||
| 91 | + <el-option | ||
| 92 | + v-for="(item, index) in states" | ||
| 93 | + :key="index" | ||
| 94 | + :label="item.name" | ||
| 95 | + :value="item.statusCd" | ||
| 96 | + /> | ||
| 97 | + </el-select> | ||
| 98 | + </el-form-item> | ||
| 99 | + | ||
| 100 | + <el-form-item :label="$t('roomRenovationManage.isViolation')" prop="isViolation" required> | ||
| 101 | + <el-select v-model="form.isViolation"> | ||
| 102 | + <el-option :label="$t('roomRenovationManage.yes')" value="Y" /> | ||
| 103 | + <el-option :label="$t('roomRenovationManage.no')" value="N" /> | ||
| 104 | + </el-select> | ||
| 105 | + </el-form-item> | ||
| 106 | + | ||
| 107 | + <el-form-item | ||
| 108 | + v-if="form.isViolation === 'Y'" | ||
| 109 | + :label="$t('roomRenovationManage.violationDesc')" | ||
| 110 | + prop="violationDesc" | ||
| 111 | + > | ||
| 112 | + <el-input | ||
| 113 | + v-model.trim="form.violationDesc" | ||
| 114 | + type="textarea" | ||
| 115 | + :placeholder="$t('roomRenovationManage.violationDescPlaceholder')" | ||
| 116 | + /> | ||
| 117 | + </el-form-item> | ||
| 118 | + | ||
| 119 | + <el-form-item :label="$t('roomRenovationManage.remark')" prop="remark"> | ||
| 120 | + <el-input | ||
| 121 | + v-model.trim="form.remark" | ||
| 122 | + type="textarea" | ||
| 123 | + :placeholder="$t('roomRenovationManage.remarkPlaceholder')" | ||
| 124 | + /> | ||
| 125 | + </el-form-item> | ||
| 126 | + </el-form> | ||
| 127 | + | ||
| 128 | + <div slot="footer" class="dialog-footer"> | ||
| 129 | + <el-button @click="visible = false"> | ||
| 130 | + {{ $t('roomRenovationManage.cancel') }} | ||
| 131 | + </el-button> | ||
| 132 | + <el-button type="primary" @click="editRoomRenovation"> | ||
| 133 | + {{ $t('roomRenovationManage.save') }} | ||
| 134 | + </el-button> | ||
| 135 | + </div> | ||
| 136 | + </el-dialog> | ||
| 137 | +</template> | ||
| 138 | + | ||
| 139 | +<script> | ||
| 140 | +import { updateRoomRenovation } from '@/api/community/roomRenovationManageApi' | ||
| 141 | + | ||
| 142 | +export default { | ||
| 143 | + name: 'EditRoomRenovation', | ||
| 144 | + data() { | ||
| 145 | + return { | ||
| 146 | + visible: false, | ||
| 147 | + states: [], | ||
| 148 | + form: { | ||
| 149 | + rId: '', | ||
| 150 | + roomName: '', | ||
| 151 | + personName: '', | ||
| 152 | + personTel: '', | ||
| 153 | + startTime: '', | ||
| 154 | + endTime: '', | ||
| 155 | + isPostpone: 'N', | ||
| 156 | + postponeTime: '', | ||
| 157 | + renovationCompany: '', | ||
| 158 | + personMain: '', | ||
| 159 | + personMainTel: '', | ||
| 160 | + state: '', | ||
| 161 | + isViolation: '', | ||
| 162 | + violationDesc: '', | ||
| 163 | + remark: '', | ||
| 164 | + communityId: '' | ||
| 165 | + } | ||
| 166 | + } | ||
| 167 | + }, | ||
| 168 | + watch: { | ||
| 169 | + 'form.isPostpone'(val) { | ||
| 170 | + if (val === 'N') { | ||
| 171 | + this.form.postponeTime = '' | ||
| 172 | + } | ||
| 173 | + } | ||
| 174 | + }, | ||
| 175 | + methods: { | ||
| 176 | + open(row) { | ||
| 177 | + this.getDictData() | ||
| 178 | + this.form = { | ||
| 179 | + ...row, | ||
| 180 | + communityId: this.$store.getters.communityId | ||
| 181 | + } | ||
| 182 | + this.visible = true | ||
| 183 | + }, | ||
| 184 | + | ||
| 185 | + resetForm() { | ||
| 186 | + this.form = { | ||
| 187 | + rId: '', | ||
| 188 | + roomName: '', | ||
| 189 | + personName: '', | ||
| 190 | + personTel: '', | ||
| 191 | + startTime: '', | ||
| 192 | + endTime: '', | ||
| 193 | + isPostpone: 'N', | ||
| 194 | + postponeTime: '', | ||
| 195 | + renovationCompany: '', | ||
| 196 | + personMain: '', | ||
| 197 | + personMainTel: '', | ||
| 198 | + state: '', | ||
| 199 | + isViolation: '', | ||
| 200 | + violationDesc: '', | ||
| 201 | + remark: '', | ||
| 202 | + communityId: '' | ||
| 203 | + } | ||
| 204 | + }, | ||
| 205 | + | ||
| 206 | + async getDictData() { | ||
| 207 | + try { | ||
| 208 | + const res = await this.$store.dispatch('dict/getDict', 'room_renovation') | ||
| 209 | + this.states = res.state || [] | ||
| 210 | + } catch (error) { | ||
| 211 | + console.error('获取字典数据失败:', error) | ||
| 212 | + } | ||
| 213 | + }, | ||
| 214 | + | ||
| 215 | + async editRoomRenovation() { | ||
| 216 | + try { | ||
| 217 | + await updateRoomRenovation(this.form) | ||
| 218 | + this.$message.success(this.$t('common.operationSuccess')) | ||
| 219 | + this.visible = false | ||
| 220 | + this.$emit('success') | ||
| 221 | + } catch (error) { | ||
| 222 | + console.error('更新装修信息失败:', error) | ||
| 223 | + this.$message.error(error.message || this.$t('common.operationFailed')) | ||
| 224 | + } | ||
| 225 | + } | ||
| 226 | + } | ||
| 227 | +} | ||
| 228 | +</script> | ||
| 0 | \ No newline at end of file | 229 | \ No newline at end of file |
src/components/community/RoomDecorationAcceptance.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog | ||
| 3 | + :title="$t('roomRenovationManage.renovationAcceptance')" | ||
| 4 | + :visible.sync="visible" | ||
| 5 | + width="40%" | ||
| 6 | + @close="resetForm" | ||
| 7 | + > | ||
| 8 | + <el-form :model="form" ref="form" label-width="120px"> | ||
| 9 | + <el-form-item :label="$t('roomRenovationManage.room')" prop="roomName"> | ||
| 10 | + <el-input | ||
| 11 | + v-model.trim="form.roomName" | ||
| 12 | + disabled | ||
| 13 | + /> | ||
| 14 | + </el-form-item> | ||
| 15 | + | ||
| 16 | + <el-form-item :label="$t('roomRenovationManage.status')" prop="state" required> | ||
| 17 | + <el-select v-model="form.state"> | ||
| 18 | + <el-option | ||
| 19 | + :label="$t('roomRenovationManage.acceptanceSuccess')" | ||
| 20 | + value="5000" | ||
| 21 | + /> | ||
| 22 | + <el-option | ||
| 23 | + :label="$t('roomRenovationManage.acceptanceFailed')" | ||
| 24 | + value="6000" | ||
| 25 | + /> | ||
| 26 | + </el-select> | ||
| 27 | + </el-form-item> | ||
| 28 | + | ||
| 29 | + <el-form-item :label="$t('roomRenovationManage.acceptanceOpinion')" prop="remark" required> | ||
| 30 | + <el-input | ||
| 31 | + v-model.trim="form.remark" | ||
| 32 | + type="textarea" | ||
| 33 | + /> | ||
| 34 | + </el-form-item> | ||
| 35 | + </el-form> | ||
| 36 | + | ||
| 37 | + <div slot="footer" class="dialog-footer"> | ||
| 38 | + <el-button @click="visible = false"> | ||
| 39 | + {{ $t('roomRenovationManage.cancel') }} | ||
| 40 | + </el-button> | ||
| 41 | + <el-button type="primary" @click="saveRoomDecorationAcceptance"> | ||
| 42 | + {{ $t('roomRenovationManage.save') }} | ||
| 43 | + </el-button> | ||
| 44 | + </div> | ||
| 45 | + </el-dialog> | ||
| 46 | +</template> | ||
| 47 | + | ||
| 48 | +<script> | ||
| 49 | +import { saveRoomRenovationDetail } from '@/api/community/roomRenovationManageApi' | ||
| 50 | + | ||
| 51 | +export default { | ||
| 52 | + name: 'RoomDecorationAcceptance', | ||
| 53 | + data() { | ||
| 54 | + return { | ||
| 55 | + visible: false, | ||
| 56 | + form: { | ||
| 57 | + rId: '', | ||
| 58 | + roomName: '', | ||
| 59 | + state: '', | ||
| 60 | + remark: '', | ||
| 61 | + detailType: '1001', | ||
| 62 | + communityId: '' | ||
| 63 | + } | ||
| 64 | + } | ||
| 65 | + }, | ||
| 66 | + methods: { | ||
| 67 | + open(row) { | ||
| 68 | + this.form = { | ||
| 69 | + rId: row.rId, | ||
| 70 | + roomName: row.roomName, | ||
| 71 | + state: '', | ||
| 72 | + remark: '', | ||
| 73 | + detailType: '1001', | ||
| 74 | + communityId: this.$store.getters.communityId | ||
| 75 | + } | ||
| 76 | + this.visible = true | ||
| 77 | + }, | ||
| 78 | + | ||
| 79 | + resetForm() { | ||
| 80 | + this.form = { | ||
| 81 | + rId: '', | ||
| 82 | + roomName: '', | ||
| 83 | + state: '', | ||
| 84 | + remark: '', | ||
| 85 | + detailType: '1001', | ||
| 86 | + communityId: this.$store.getters.communityId | ||
| 87 | + } | ||
| 88 | + }, | ||
| 89 | + | ||
| 90 | + async saveRoomDecorationAcceptance() { | ||
| 91 | + try { | ||
| 92 | + await saveRoomRenovationDetail(this.form) | ||
| 93 | + this.$message.success(this.$t('common.operationSuccess')) | ||
| 94 | + this.visible = false | ||
| 95 | + this.$emit('success') | ||
| 96 | + } catch (error) { | ||
| 97 | + console.error('保存验收信息失败:', error) | ||
| 98 | + this.$message.error(error.message || this.$t('common.operationFailed')) | ||
| 99 | + } | ||
| 100 | + } | ||
| 101 | + } | ||
| 102 | +} | ||
| 103 | +</script> | ||
| 0 | \ No newline at end of file | 104 | \ No newline at end of file |
src/components/community/RoomRenovationCompleted.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog | ||
| 3 | + :title="$t('roomRenovationManage.confirmComplete')" | ||
| 4 | + :visible.sync="visible" | ||
| 5 | + width="30%" | ||
| 6 | + @close="resetForm" | ||
| 7 | + > | ||
| 8 | + <div> | ||
| 9 | + <p>{{ $t('roomRenovationManage.confirmCompleteMsg') }}</p> | ||
| 10 | + </div> | ||
| 11 | + | ||
| 12 | + <div slot="footer" class="dialog-footer"> | ||
| 13 | + <el-button @click="visible = false"> | ||
| 14 | + {{ $t('roomRenovationManage.cancelComplete') }} | ||
| 15 | + </el-button> | ||
| 16 | + <el-button type="primary" @click="roomRenovationCompleted"> | ||
| 17 | + {{ $t('roomRenovationManage.confirmComplete') }} | ||
| 18 | + </el-button> | ||
| 19 | + </div> | ||
| 20 | + </el-dialog> | ||
| 21 | +</template> | ||
| 22 | + | ||
| 23 | +<script> | ||
| 24 | +import { updateRoomRenovationState } from '@/api/community/roomRenovationManageApi' | ||
| 25 | + | ||
| 26 | +export default { | ||
| 27 | + name: 'RoomRenovationCompleted', | ||
| 28 | + data() { | ||
| 29 | + return { | ||
| 30 | + visible: false, | ||
| 31 | + form: { | ||
| 32 | + rId: '', | ||
| 33 | + communityId: '' | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + }, | ||
| 37 | + methods: { | ||
| 38 | + open(row) { | ||
| 39 | + this.form = { | ||
| 40 | + rId: row.rId, | ||
| 41 | + communityId: this.$store.getters.communityId | ||
| 42 | + } | ||
| 43 | + this.visible = true | ||
| 44 | + }, | ||
| 45 | + | ||
| 46 | + resetForm() { | ||
| 47 | + this.form = { | ||
| 48 | + rId: '', | ||
| 49 | + communityId: '' | ||
| 50 | + } | ||
| 51 | + }, | ||
| 52 | + | ||
| 53 | + async roomRenovationCompleted() { | ||
| 54 | + try { | ||
| 55 | + await updateRoomRenovationState(this.form) | ||
| 56 | + this.$message.success(this.$t('common.operationSuccess')) | ||
| 57 | + this.visible = false | ||
| 58 | + this.$emit('success') | ||
| 59 | + } catch (error) { | ||
| 60 | + console.error('更新装修状态失败:', error) | ||
| 61 | + this.$message.error(error.message || this.$t('common.operationFailed')) | ||
| 62 | + } | ||
| 63 | + } | ||
| 64 | + } | ||
| 65 | +} | ||
| 66 | +</script> | ||
| 0 | \ No newline at end of file | 67 | \ No newline at end of file |
src/components/community/RoomToExamine.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog | ||
| 3 | + :title="$t('roomRenovationManage.review')" | ||
| 4 | + :visible.sync="visible" | ||
| 5 | + width="40%" | ||
| 6 | + @close="resetForm" | ||
| 7 | + > | ||
| 8 | + <el-form :model="form" ref="form" label-width="120px"> | ||
| 9 | + <el-form-item :label="$t('roomRenovationManage.room')" prop="roomName"> | ||
| 10 | + <el-input | ||
| 11 | + v-model.trim="form.roomName" | ||
| 12 | + disabled | ||
| 13 | + /> | ||
| 14 | + </el-form-item> | ||
| 15 | + | ||
| 16 | + <el-form-item :label="$t('roomRenovationManage.status')" prop="state" required> | ||
| 17 | + <el-select v-model="form.state"> | ||
| 18 | + <el-option | ||
| 19 | + :label="$t('roomRenovationManage.reviewPass')" | ||
| 20 | + value="3000" | ||
| 21 | + /> | ||
| 22 | + <el-option | ||
| 23 | + :label="$t('roomRenovationManage.reviewReject')" | ||
| 24 | + value="2000" | ||
| 25 | + /> | ||
| 26 | + </el-select> | ||
| 27 | + </el-form-item> | ||
| 28 | + | ||
| 29 | + <el-form-item :label="$t('roomRenovationManage.reviewOpinion')" prop="examineRemark" required> | ||
| 30 | + <el-input | ||
| 31 | + v-model.trim="form.examineRemark" | ||
| 32 | + type="textarea" | ||
| 33 | + /> | ||
| 34 | + </el-form-item> | ||
| 35 | + </el-form> | ||
| 36 | + | ||
| 37 | + <div slot="footer" class="dialog-footer"> | ||
| 38 | + <el-button @click="visible = false"> | ||
| 39 | + {{ $t('roomRenovationManage.cancel') }} | ||
| 40 | + </el-button> | ||
| 41 | + <el-button type="primary" @click="saveRoomToExamine"> | ||
| 42 | + {{ $t('roomRenovationManage.save') }} | ||
| 43 | + </el-button> | ||
| 44 | + </div> | ||
| 45 | + </el-dialog> | ||
| 46 | +</template> | ||
| 47 | + | ||
| 48 | +<script> | ||
| 49 | +import { updateRoomToExamine } from '@/api/community/roomRenovationManageApi' | ||
| 50 | + | ||
| 51 | +export default { | ||
| 52 | + name: 'RoomToExamine', | ||
| 53 | + data() { | ||
| 54 | + return { | ||
| 55 | + visible: false, | ||
| 56 | + form: { | ||
| 57 | + rId: '', | ||
| 58 | + roomName: '', | ||
| 59 | + state: '', | ||
| 60 | + examineRemark: '', | ||
| 61 | + communityId: '' | ||
| 62 | + } | ||
| 63 | + } | ||
| 64 | + }, | ||
| 65 | + methods: { | ||
| 66 | + open(row) { | ||
| 67 | + this.form = { | ||
| 68 | + rId: row.rId, | ||
| 69 | + roomName: row.roomName, | ||
| 70 | + state: '', | ||
| 71 | + examineRemark: '', | ||
| 72 | + communityId: this.$store.getters.communityId | ||
| 73 | + } | ||
| 74 | + this.visible = true | ||
| 75 | + }, | ||
| 76 | + | ||
| 77 | + resetForm() { | ||
| 78 | + this.form = { | ||
| 79 | + rId: '', | ||
| 80 | + roomName: '', | ||
| 81 | + state: '', | ||
| 82 | + examineRemark: '', | ||
| 83 | + communityId: '' | ||
| 84 | + } | ||
| 85 | + }, | ||
| 86 | + | ||
| 87 | + async saveRoomToExamine() { | ||
| 88 | + try { | ||
| 89 | + await updateRoomToExamine(this.form) | ||
| 90 | + this.$message.success(this.$t('common.operationSuccess')) | ||
| 91 | + this.visible = false | ||
| 92 | + this.$emit('success') | ||
| 93 | + } catch (error) { | ||
| 94 | + console.error('保存审核信息失败:', error) | ||
| 95 | + this.$message.error(error.message || this.$t('common.operationFailed')) | ||
| 96 | + } | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | +} | ||
| 100 | +</script> | ||
| 0 | \ No newline at end of file | 101 | \ No newline at end of file |
src/components/community/editCommunityArea.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <el-dialog :title="$t('enterCommunity.modifyCommunity')" :visible.sync="visible" width="800px" @close="resetForm"> | ||
| 3 | + <el-form ref="form" :model="form" :rules="rules" label-width="120px"> | ||
| 4 | + <el-form-item :label="$t('enterCommunity.communityName')" prop="name"> | ||
| 5 | + <el-input v-model="form.name" disabled /> | ||
| 6 | + </el-form-item> | ||
| 7 | + <el-form-item :label="$t('enterCommunity.communityAddress')" prop="address"> | ||
| 8 | + <el-input v-model="form.address" disabled /> | ||
| 9 | + </el-form-item> | ||
| 10 | + <el-form-item :label="$t('enterCommunity.communityLandmark')" prop="nearbyLandmarks"> | ||
| 11 | + <el-input v-model="form.nearbyLandmarks" disabled /> | ||
| 12 | + </el-form-item> | ||
| 13 | + <el-form-item :label="$t('enterCommunity.cityCode')" prop="cityCode"> | ||
| 14 | + <el-input v-model="form.cityCode" disabled /> | ||
| 15 | + </el-form-item> | ||
| 16 | + <el-form-item :label="$t('enterCommunity.xCoordinate')" prop="mapX"> | ||
| 17 | + <el-input v-model="form.mapX" disabled /> | ||
| 18 | + </el-form-item> | ||
| 19 | + <el-form-item :label="$t('enterCommunity.yCoordinate')" prop="mapY"> | ||
| 20 | + <el-input v-model="form.mapY" disabled /> | ||
| 21 | + </el-form-item> | ||
| 22 | + <el-form-item :label="$t('enterCommunity.servicePhone')" prop="tel"> | ||
| 23 | + <el-input v-model="form.tel" :placeholder="$t('enterCommunity.requiredPhone')" /> | ||
| 24 | + </el-form-item> | ||
| 25 | + <el-form-item :label="$t('enterCommunity.serviceQR')" prop="qrCode"> | ||
| 26 | + <upload-image-url ref="uploadImage" :limit="1" @notifyUploadCoverImage="handleQRUpdate" /> | ||
| 27 | + </el-form-item> | ||
| 28 | + <el-form-item :label="$t('enterCommunity.communityArea')" prop="communityArea"> | ||
| 29 | + <el-input v-model="form.communityArea" :placeholder="$t('enterCommunity.requiredArea')" /> | ||
| 30 | + </el-form-item> | ||
| 31 | + </el-form> | ||
| 32 | + <div slot="footer" class="dialog-footer"> | ||
| 33 | + <el-button @click="visible = false">{{ $t('enterCommunity.cancel') }}</el-button> | ||
| 34 | + <el-button type="primary" @click="submitForm">{{ $t('enterCommunity.save') }}</el-button> | ||
| 35 | + </div> | ||
| 36 | + </el-dialog> | ||
| 37 | +</template> | ||
| 38 | + | ||
| 39 | +<script> | ||
| 40 | +import { updateCommunity } from '@/api/community/enterCommunityApi' | ||
| 41 | +import UploadImageUrl from '@/components/upload/UploadImageUrl.vue' | ||
| 42 | + | ||
| 43 | +export default { | ||
| 44 | + name: 'EditCommunityArea', | ||
| 45 | + components: { UploadImageUrl }, | ||
| 46 | + data() { | ||
| 47 | + return { | ||
| 48 | + visible: false, | ||
| 49 | + form: { | ||
| 50 | + communityId: '', | ||
| 51 | + name: '', | ||
| 52 | + address: '', | ||
| 53 | + nearbyLandmarks: '', | ||
| 54 | + cityCode: '', | ||
| 55 | + mapX: '101.33', | ||
| 56 | + mapY: '101.33', | ||
| 57 | + tel: '', | ||
| 58 | + communityArea: '', | ||
| 59 | + qrCode: '' | ||
| 60 | + }, | ||
| 61 | + rules: { | ||
| 62 | + tel: [ | ||
| 63 | + { required: true, message: this.$t('enterCommunity.requiredPhone'), trigger: 'blur' } | ||
| 64 | + ], | ||
| 65 | + communityArea: [ | ||
| 66 | + { required: true, message: this.$t('enterCommunity.requiredArea'), trigger: 'blur' }, | ||
| 67 | + { pattern: /^\d+(\.\d{1,2})?$/, message: this.$t('enterCommunity.areaFormatError'), trigger: 'blur' } | ||
| 68 | + ] | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + }, | ||
| 72 | + methods: { | ||
| 73 | + open(community) { | ||
| 74 | + Object.keys(this.form).forEach(key => { | ||
| 75 | + if (community[key] !== undefined) { | ||
| 76 | + this.form[key] = community[key] | ||
| 77 | + } | ||
| 78 | + }) | ||
| 79 | + this.visible = true | ||
| 80 | + setTimeout(() => { | ||
| 81 | + this.$refs.uploadImage.setImages([community.qrCode]) | ||
| 82 | + }, 500) | ||
| 83 | + }, | ||
| 84 | + handleQRUpdate(photosUrl) { | ||
| 85 | + this.form.qrCode = photosUrl.length > 0 ? photosUrl[0] : '' | ||
| 86 | + }, | ||
| 87 | + submitForm() { | ||
| 88 | + this.$refs.form.validate(valid => { | ||
| 89 | + if (valid) { | ||
| 90 | + this.updateCommunity() | ||
| 91 | + } | ||
| 92 | + }) | ||
| 93 | + }, | ||
| 94 | + async updateCommunity() { | ||
| 95 | + try { | ||
| 96 | + await updateCommunity(this.form) | ||
| 97 | + this.$message.success(this.$t('enterCommunity.updateSuccess')) | ||
| 98 | + this.visible = false | ||
| 99 | + this.$emit('success') | ||
| 100 | + } catch (error) { | ||
| 101 | + this.$message.error(error.message || this.$t('enterCommunity.updateError')) | ||
| 102 | + } | ||
| 103 | + }, | ||
| 104 | + resetForm() { | ||
| 105 | + this.$refs.form.resetFields() | ||
| 106 | + Object.keys(this.form).forEach(key => { | ||
| 107 | + this.form[key] = key === 'mapX' || key === 'mapY' ? '101.33' : '' | ||
| 108 | + }) | ||
| 109 | + } | ||
| 110 | + } | ||
| 111 | +} | ||
| 112 | +</script> | ||
| 0 | \ No newline at end of file | 113 | \ No newline at end of file |
src/components/community/uploadImageUrl.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="uploadImage"> | ||
| 3 | + <div v-for="(image, index) in photos" :key="index" class="image-item"> | ||
| 4 | + <img :src="image" width="100" height="100" /> | ||
| 5 | + <i class="el-icon-close remove-icon" @click="removeImage(index)"></i> | ||
| 6 | + </div> | ||
| 7 | + <div v-if="photos.length < imageCount" class="upload-button" @click="triggerUpload"> | ||
| 8 | + <i class="el-icon-plus"></i> | ||
| 9 | + </div> | ||
| 10 | + <input type="file" ref="fileInput" accept="image/*" hidden @change="handleFileChange"> | ||
| 11 | + </div> | ||
| 12 | +</template> | ||
| 13 | + | ||
| 14 | +<script> | ||
| 15 | +export default { | ||
| 16 | + name: 'UploadImageUrl', | ||
| 17 | + props: { | ||
| 18 | + imageCount: { | ||
| 19 | + type: Number, | ||
| 20 | + default: 99 | ||
| 21 | + } | ||
| 22 | + }, | ||
| 23 | + data() { | ||
| 24 | + return { | ||
| 25 | + photos: [], | ||
| 26 | + photosUrl: [] | ||
| 27 | + } | ||
| 28 | + }, | ||
| 29 | + watch: { | ||
| 30 | + photosUrl: { | ||
| 31 | + handler(val) { | ||
| 32 | + this.$emit('update:photosUrl', val) | ||
| 33 | + }, | ||
| 34 | + deep: true | ||
| 35 | + } | ||
| 36 | + }, | ||
| 37 | + methods: { | ||
| 38 | + triggerUpload() { | ||
| 39 | + this.$refs.fileInput.click() | ||
| 40 | + }, | ||
| 41 | + handleFileChange(event) { | ||
| 42 | + const file = event.target.files[0] | ||
| 43 | + if (!file) return | ||
| 44 | + | ||
| 45 | + if (file.size > 2 * 1024 * 1024) { | ||
| 46 | + this.$message.error(this.$t('enterCommunity.fileSizeError')) | ||
| 47 | + return | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + const reader = new FileReader() | ||
| 51 | + reader.onload = (e) => { | ||
| 52 | + this.photos.push(e.target.result) | ||
| 53 | + this.uploadImage(file) | ||
| 54 | + } | ||
| 55 | + reader.readAsDataURL(file) | ||
| 56 | + | ||
| 57 | + // 重置input | ||
| 58 | + event.target.value = null | ||
| 59 | + }, | ||
| 60 | + removeImage(index) { | ||
| 61 | + this.photos.splice(index, 1) | ||
| 62 | + this.photosUrl.splice(index, 1) | ||
| 63 | + }, | ||
| 64 | + uploadImage(file) { | ||
| 65 | + const formData = new FormData() | ||
| 66 | + formData.append('uploadFile', file) | ||
| 67 | + formData.append('communityId', this.$store.getters.currentCommunity.communityId) | ||
| 68 | + | ||
| 69 | + this.$http.upload('uploadFile', 'uploadImage', formData, { | ||
| 70 | + headers: { 'Content-Type': 'multipart/form-data' } | ||
| 71 | + }).then(res => { | ||
| 72 | + const data = JSON.parse(res.data) | ||
| 73 | + this.photosUrl.push({ | ||
| 74 | + fileId: data.fileId, | ||
| 75 | + url: `/callComponent/download/getFile/file?fileId=${data.fileId}` | ||
| 76 | + }) | ||
| 77 | + }).catch(err => { | ||
| 78 | + this.$message.error(this.$t('enterCommunity.uploadError')) | ||
| 79 | + }) | ||
| 80 | + }, | ||
| 81 | + setPhotos(photos) { | ||
| 82 | + this.photos = photos | ||
| 83 | + } | ||
| 84 | + } | ||
| 85 | +} | ||
| 86 | +</script> | ||
| 87 | + | ||
| 88 | +<style scoped> | ||
| 89 | +.uploadImage { | ||
| 90 | + display: flex; | ||
| 91 | + flex-wrap: wrap; | ||
| 92 | + gap: 10px; | ||
| 93 | +} | ||
| 94 | +.image-item { | ||
| 95 | + position: relative; | ||
| 96 | + display: inline-block; | ||
| 97 | +} | ||
| 98 | +.remove-icon { | ||
| 99 | + position: absolute; | ||
| 100 | + top: -10px; | ||
| 101 | + right: -10px; | ||
| 102 | + color: #f56c6c; | ||
| 103 | + cursor: pointer; | ||
| 104 | + background: white; | ||
| 105 | + border-radius: 50%; | ||
| 106 | +} | ||
| 107 | +.upload-button { | ||
| 108 | + width: 100px; | ||
| 109 | + height: 100px; | ||
| 110 | + border: 1px dashed #dcdfe6; | ||
| 111 | + border-radius: 4px; | ||
| 112 | + display: flex; | ||
| 113 | + align-items: center; | ||
| 114 | + justify-content: center; | ||
| 115 | + font-size: 24px; | ||
| 116 | + color: #8c939d; | ||
| 117 | + cursor: pointer; | ||
| 118 | +} | ||
| 119 | +.upload-button:hover { | ||
| 120 | + border-color: #409eff; | ||
| 121 | +} | ||
| 122 | +</style> | ||
| 0 | \ No newline at end of file | 123 | \ No newline at end of file |
src/components/index/indexRepairComplaint.vue
| @@ -212,9 +212,7 @@ export default { | @@ -212,9 +212,7 @@ export default { | ||
| 212 | </script> | 212 | </script> |
| 213 | 213 | ||
| 214 | <style lang="scss" scoped> | 214 | <style lang="scss" scoped> |
| 215 | -.repair-complaint-container { | ||
| 216 | 215 | ||
| 217 | -} | ||
| 218 | 216 | ||
| 219 | .index-1-left-item { | 217 | .index-1-left-item { |
| 220 | background: #fff; | 218 | background: #fff; |
src/i18n/index.js
| @@ -118,6 +118,8 @@ import { messages as aStaffCommunityMessages } from '../views/staff/aStaffCommun | @@ -118,6 +118,8 @@ import { messages as aStaffCommunityMessages } from '../views/staff/aStaffCommun | ||
| 118 | import { messages as communityWechatMessages } from '../views/community/communityWechatLang' | 118 | import { messages as communityWechatMessages } from '../views/community/communityWechatLang' |
| 119 | import { messages as communityMiniMessages } from '../views/community/communityMiniLang' | 119 | import { messages as communityMiniMessages } from '../views/community/communityMiniLang' |
| 120 | import { messages as communityPaymentMessages } from '../views/fee/communityPaymentLang' | 120 | import { messages as communityPaymentMessages } from '../views/fee/communityPaymentLang' |
| 121 | +import { messages as enterCommunityMessages } from '../views/community/enterCommunityLang' | ||
| 122 | +import { messages as roomRenovationManageMessages } from '../views/community/roomRenovationManageLang' | ||
| 121 | 123 | ||
| 122 | Vue.use(VueI18n) | 124 | Vue.use(VueI18n) |
| 123 | 125 | ||
| @@ -240,6 +242,8 @@ const messages = { | @@ -240,6 +242,8 @@ const messages = { | ||
| 240 | ...communityWechatMessages.en, | 242 | ...communityWechatMessages.en, |
| 241 | ...communityMiniMessages.en, | 243 | ...communityMiniMessages.en, |
| 242 | ...communityPaymentMessages.en, | 244 | ...communityPaymentMessages.en, |
| 245 | + ...enterCommunityMessages.en, | ||
| 246 | + ...roomRenovationManageMessages.en, | ||
| 243 | }, | 247 | }, |
| 244 | zh: { | 248 | zh: { |
| 245 | ...loginMessages.zh, | 249 | ...loginMessages.zh, |
| @@ -358,6 +362,8 @@ const messages = { | @@ -358,6 +362,8 @@ const messages = { | ||
| 358 | ...communityWechatMessages.zh, | 362 | ...communityWechatMessages.zh, |
| 359 | ...communityMiniMessages.zh, | 363 | ...communityMiniMessages.zh, |
| 360 | ...communityPaymentMessages.zh, | 364 | ...communityPaymentMessages.zh, |
| 365 | + ...enterCommunityMessages.zh, | ||
| 366 | + ...roomRenovationManageMessages.zh, | ||
| 361 | } | 367 | } |
| 362 | } | 368 | } |
| 363 | 369 |
src/router/index.js
| @@ -572,10 +572,20 @@ const routes = [ | @@ -572,10 +572,20 @@ const routes = [ | ||
| 572 | component: () => import('@/views/community/communityMiniList.vue') | 572 | component: () => import('@/views/community/communityMiniList.vue') |
| 573 | }, | 573 | }, |
| 574 | { | 574 | { |
| 575 | - path:'/pages/fee/communityPayment', | ||
| 576 | - name:'/pages/fee/communityPayment', | 575 | + path: '/pages/fee/communityPayment', |
| 576 | + name: '/pages/fee/communityPayment', | ||
| 577 | component: () => import('@/views/fee/communityPaymentList.vue') | 577 | component: () => import('@/views/fee/communityPaymentList.vue') |
| 578 | - }, | 578 | + }, |
| 579 | + { | ||
| 580 | + path: '/pages/common/enterCommunity', | ||
| 581 | + name: '/pages/common/enterCommunity', | ||
| 582 | + component: () => import('@/views/community/enterCommunityList.vue') | ||
| 583 | + }, | ||
| 584 | + { | ||
| 585 | + path: '/pages/property/roomRenovationManage', | ||
| 586 | + name: '/pages/property/roomRenovationManage', | ||
| 587 | + component: () => import('@/views/community/roomRenovationManageList.vue') | ||
| 588 | + }, | ||
| 579 | // 其他子路由可以在这里添加 | 589 | // 其他子路由可以在这里添加 |
| 580 | ] | 590 | ] |
| 581 | }, | 591 | }, |
src/src/locale/lang/community/enterCommunityLang.js
0 → 100644
| 1 | +export default { | ||
| 2 | + en: { | ||
| 3 | + enterCommunity: { | ||
| 4 | + myCommunity: 'My Community', | ||
| 5 | + commercialProcess: 'Commercial Process', | ||
| 6 | + province: 'Province', | ||
| 7 | + city: 'City', | ||
| 8 | + district: 'District', | ||
| 9 | + communityName: 'Community Name', | ||
| 10 | + communityCode: 'Community Code', | ||
| 11 | + servicePhone: 'Service Phone', | ||
| 12 | + area: 'Area', | ||
| 13 | + startTime: 'Start Time', | ||
| 14 | + endTime: 'End Time', | ||
| 15 | + status: 'Status', | ||
| 16 | + operation: 'Operation', | ||
| 17 | + modify: 'Modify', | ||
| 18 | + back: 'Back', | ||
| 19 | + communityAddress: 'Community Address', | ||
| 20 | + communityLandmark: 'Community Landmark', | ||
| 21 | + cityCode: 'City Code', | ||
| 22 | + xCoordinate: 'X Coordinate', | ||
| 23 | + yCoordinate: 'Y Coordinate', | ||
| 24 | + serviceQR: 'Service QR Code', | ||
| 25 | + communityArea: 'Community Area', | ||
| 26 | + save: 'Save', | ||
| 27 | + cancel: 'Cancel', | ||
| 28 | + statusOptions: { | ||
| 29 | + '1000': 'Under Review', | ||
| 30 | + '1100': 'Approved', | ||
| 31 | + '1200': 'Rejected' | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | + }, | ||
| 35 | + zh: { | ||
| 36 | + enterCommunity: { | ||
| 37 | + myCommunity: '我的小区', | ||
| 38 | + commercialProcess: '商用流程', | ||
| 39 | + province: '省份', | ||
| 40 | + city: '市/州', | ||
| 41 | + district: '区/县', | ||
| 42 | + communityName: '小区名称', | ||
| 43 | + communityCode: '小区编码', | ||
| 44 | + servicePhone: '客服电话', | ||
| 45 | + area: '面积', | ||
| 46 | + startTime: '开始时间', | ||
| 47 | + endTime: '结束时间', | ||
| 48 | + status: '状态', | ||
| 49 | + operation: '操作', | ||
| 50 | + modify: '修改', | ||
| 51 | + back: '返回', | ||
| 52 | + communityAddress: '小区地址', | ||
| 53 | + communityLandmark: '小区地标', | ||
| 54 | + cityCode: '城市编码', | ||
| 55 | + xCoordinate: 'X坐标', | ||
| 56 | + yCoordinate: 'Y坐标', | ||
| 57 | + serviceQR: '客服二维码', | ||
| 58 | + communityArea: '小区面积', | ||
| 59 | + save: '保存', | ||
| 60 | + cancel: '取消', | ||
| 61 | + statusOptions: { | ||
| 62 | + '1000': '入驻审核', | ||
| 63 | + '1100': '入驻成功', | ||
| 64 | + '1200': '入驻失败' | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | +} | ||
| 0 | \ No newline at end of file | 69 | \ No newline at end of file |
src/views/community/enterCommunityLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + enterCommunity: { | ||
| 4 | + myCommunity: 'My Community', | ||
| 5 | + commercialProcess: 'Commercial Process', | ||
| 6 | + province: 'Province', | ||
| 7 | + city: 'City', | ||
| 8 | + district: 'District', | ||
| 9 | + communityName: 'Community Name', | ||
| 10 | + communityCode: 'Community Code', | ||
| 11 | + servicePhone: 'Service Phone', | ||
| 12 | + area: 'Area', | ||
| 13 | + startTime: 'Start Time', | ||
| 14 | + endTime: 'End Time', | ||
| 15 | + status: 'Status', | ||
| 16 | + operation: 'Operation', | ||
| 17 | + modify: 'Modify', | ||
| 18 | + back: 'Back', | ||
| 19 | + communityAddress: 'Community Address', | ||
| 20 | + communityLandmark: 'Community Landmark', | ||
| 21 | + cityCode: 'City Code', | ||
| 22 | + xCoordinate: 'X Coordinate', | ||
| 23 | + yCoordinate: 'Y Coordinate', | ||
| 24 | + serviceQR: 'Service QR Code', | ||
| 25 | + communityArea: 'Community Area', | ||
| 26 | + save: 'Save', | ||
| 27 | + cancel: 'Cancel', | ||
| 28 | + statusOptions: { | ||
| 29 | + '1000': 'Under Review', | ||
| 30 | + '1100': 'Approved', | ||
| 31 | + '1200': 'Rejected' | ||
| 32 | + } | ||
| 33 | + } | ||
| 34 | + }, | ||
| 35 | + zh: { | ||
| 36 | + enterCommunity: { | ||
| 37 | + myCommunity: '我的小区', | ||
| 38 | + commercialProcess: '商用流程', | ||
| 39 | + province: '省份', | ||
| 40 | + city: '市/州', | ||
| 41 | + district: '区/县', | ||
| 42 | + communityName: '小区名称', | ||
| 43 | + communityCode: '小区编码', | ||
| 44 | + servicePhone: '客服电话', | ||
| 45 | + area: '面积', | ||
| 46 | + startTime: '开始时间', | ||
| 47 | + endTime: '结束时间', | ||
| 48 | + status: '状态', | ||
| 49 | + operation: '操作', | ||
| 50 | + modify: '修改', | ||
| 51 | + back: '返回', | ||
| 52 | + communityAddress: '小区地址', | ||
| 53 | + communityLandmark: '小区地标', | ||
| 54 | + cityCode: '城市编码', | ||
| 55 | + xCoordinate: 'X坐标', | ||
| 56 | + yCoordinate: 'Y坐标', | ||
| 57 | + serviceQR: '客服二维码', | ||
| 58 | + communityArea: '小区面积', | ||
| 59 | + save: '保存', | ||
| 60 | + cancel: '取消', | ||
| 61 | + statusOptions: { | ||
| 62 | + '1000': '入驻审核', | ||
| 63 | + '1100': '入驻成功', | ||
| 64 | + '1200': '入驻失败' | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + } | ||
| 0 | \ No newline at end of file | 69 | \ No newline at end of file |
src/views/community/enterCommunityList.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="enter-community-container"> | ||
| 3 | + <el-card v-if="showPage === 'myCommunity'"> | ||
| 4 | + <div slot="header" class=" flex justify-between"> | ||
| 5 | + <span>{{ $t('enterCommunity.myCommunity') }}</span> | ||
| 6 | + <el-button type="primary" size="small" @click="showHcUse"> | ||
| 7 | + <i class="el-icon-plus"></i> | ||
| 8 | + {{ $t('enterCommunity.commercialProcess') }} | ||
| 9 | + </el-button> | ||
| 10 | + </div> | ||
| 11 | + | ||
| 12 | + <el-table :data="communityList" border v-loading="loading"> | ||
| 13 | + <el-table-column prop="provName" :label="$t('enterCommunity.province')" align="center" /> | ||
| 14 | + <el-table-column prop="cityName" :label="$t('enterCommunity.city')" align="center" /> | ||
| 15 | + <el-table-column prop="areaName" :label="$t('enterCommunity.district')" align="center" width="150" /> | ||
| 16 | + <el-table-column prop="name" :label="$t('enterCommunity.communityName')" align="center" width="200" /> | ||
| 17 | + <el-table-column prop="communityId" :label="$t('enterCommunity.communityCode')" align="center" /> | ||
| 18 | + <el-table-column prop="tel" :label="$t('enterCommunity.servicePhone')" align="center" /> | ||
| 19 | + <el-table-column prop="communityArea" :label="$t('enterCommunity.area')" align="center" /> | ||
| 20 | + <el-table-column prop="startTime" :label="$t('enterCommunity.startTime')" align="center" /> | ||
| 21 | + <el-table-column prop="endTime" :label="$t('enterCommunity.endTime')" align="center" /> | ||
| 22 | + <el-table-column :label="$t('enterCommunity.status')" align="center"> | ||
| 23 | + <template slot-scope="{ row }"> | ||
| 24 | + {{ statusMap[row.auditStatusCd] || row.auditStatusCd }} | ||
| 25 | + </template> | ||
| 26 | + </el-table-column> | ||
| 27 | + <el-table-column :label="$t('enterCommunity.operation')" align="center" width="120"> | ||
| 28 | + <template slot-scope="{ row }"> | ||
| 29 | + <el-button v-if="row.auditStatusCd === '1100'" type="text" size="small" @click="openEditDialog(row)"> | ||
| 30 | + {{ $t('enterCommunity.modify') }} | ||
| 31 | + </el-button> | ||
| 32 | + </template> | ||
| 33 | + </el-table-column> | ||
| 34 | + </el-table> | ||
| 35 | + | ||
| 36 | + <el-pagination class="pagination" :current-page="pagination.current" :page-sizes="[10, 20, 30, 50]" | ||
| 37 | + :page-size="pagination.size" :total="pagination.total" layout="total, sizes, prev, pager, next, jumper" | ||
| 38 | + @size-change="handleSizeChange" @current-change="handlePageChange" /> | ||
| 39 | + </el-card> | ||
| 40 | + | ||
| 41 | + <el-card v-else> | ||
| 42 | + <div slot="header" class=" flex justify-between"> | ||
| 43 | + <div>{{ $t('enterCommunity.commercialProcess') }}</div> | ||
| 44 | + <el-button type="primary" size="small" @click="goBack"> | ||
| 45 | + <i class="el-icon-close"></i> | ||
| 46 | + {{ $t('enterCommunity.back') }} | ||
| 47 | + </el-button> | ||
| 48 | + </div> | ||
| 49 | + | ||
| 50 | + <div class="commercial-content"> | ||
| 51 | + <img src="/img/hc_use.png" alt="Commercial Process"> | ||
| 52 | + </div> | ||
| 53 | + </el-card> | ||
| 54 | + | ||
| 55 | + <edit-community-area ref="editDialog" @success="fetchCommunityList" /> | ||
| 56 | + </div> | ||
| 57 | +</template> | ||
| 58 | + | ||
| 59 | +<script> | ||
| 60 | +import { listMyCommunity } from '@/api/community/enterCommunityApi' | ||
| 61 | +import EditCommunityArea from '@/components/community/editCommunityArea.vue' | ||
| 62 | + | ||
| 63 | +export default { | ||
| 64 | + name: 'EnterCommunityList', | ||
| 65 | + components: { EditCommunityArea }, | ||
| 66 | + data() { | ||
| 67 | + return { | ||
| 68 | + showPage: 'myCommunity', | ||
| 69 | + loading: false, | ||
| 70 | + communityList: [], | ||
| 71 | + pagination: { | ||
| 72 | + current: 1, | ||
| 73 | + size: 10, | ||
| 74 | + total: 0 | ||
| 75 | + }, | ||
| 76 | + statusMap: { | ||
| 77 | + '1000': this.$t('enterCommunity.statusOptions.1000'), | ||
| 78 | + '1100': this.$t('enterCommunity.statusOptions.1100'), | ||
| 79 | + '1200': this.$t('enterCommunity.statusOptions.1200') | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + }, | ||
| 83 | + mounted() { | ||
| 84 | + this.fetchCommunityList() | ||
| 85 | + }, | ||
| 86 | + methods: { | ||
| 87 | + async fetchCommunityList() { | ||
| 88 | + this.loading = true | ||
| 89 | + try { | ||
| 90 | + const params = { | ||
| 91 | + page: this.pagination.current, | ||
| 92 | + row: this.pagination.size, | ||
| 93 | + communityId: this.getCommunityId() | ||
| 94 | + } | ||
| 95 | + const data = await listMyCommunity(params) | ||
| 96 | + this.communityList = data | ||
| 97 | + this.pagination.total = data.length | ||
| 98 | + } catch (error) { | ||
| 99 | + this.$message.error(error.message || this.$t('enterCommunity.fetchError')) | ||
| 100 | + } finally { | ||
| 101 | + this.loading = false | ||
| 102 | + } | ||
| 103 | + }, | ||
| 104 | + openEditDialog(community) { | ||
| 105 | + this.$refs.editDialog.open(community) | ||
| 106 | + }, | ||
| 107 | + showHcUse() { | ||
| 108 | + this.showPage = 'hcUse' | ||
| 109 | + }, | ||
| 110 | + goBack() { | ||
| 111 | + this.showPage = 'myCommunity' | ||
| 112 | + }, | ||
| 113 | + handlePageChange(page) { | ||
| 114 | + this.pagination.current = page | ||
| 115 | + this.fetchCommunityList() | ||
| 116 | + }, | ||
| 117 | + handleSizeChange(size) { | ||
| 118 | + this.pagination.size = size | ||
| 119 | + this.fetchCommunityList() | ||
| 120 | + } | ||
| 121 | + } | ||
| 122 | +} | ||
| 123 | +</script> | ||
| 124 | + | ||
| 125 | +<style scoped> | ||
| 126 | +.enter-community-container { | ||
| 127 | + padding: 20px; | ||
| 128 | +} | ||
| 129 | + | ||
| 130 | +.clearfix:after { | ||
| 131 | + content: ""; | ||
| 132 | + display: table; | ||
| 133 | + clear: both; | ||
| 134 | +} | ||
| 135 | + | ||
| 136 | +.float-right { | ||
| 137 | + float: right; | ||
| 138 | +} | ||
| 139 | + | ||
| 140 | +.commercial-content { | ||
| 141 | + text-align: center; | ||
| 142 | + padding: 20px 0; | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +.commercial-content img { | ||
| 146 | + max-width: 100%; | ||
| 147 | +} | ||
| 148 | + | ||
| 149 | +.pagination { | ||
| 150 | + margin-top: 20px; | ||
| 151 | + text-align: right; | ||
| 152 | +} | ||
| 153 | +</style> | ||
| 0 | \ No newline at end of file | 154 | \ No newline at end of file |
src/views/community/roomRenovationManageLang.js
0 → 100644
| 1 | +export const messages = { | ||
| 2 | + en: { | ||
| 3 | + roomRenovationManage: { | ||
| 4 | + queryCondition: "Query Condition", | ||
| 5 | + hide: "Hide", | ||
| 6 | + more: "More", | ||
| 7 | + roomNumberPlaceholder: "Please enter room number (e.g. 1-1-101)", | ||
| 8 | + contactPersonPlaceholder: "Please enter contact person", | ||
| 9 | + phonePlaceholder: "Please enter phone number", | ||
| 10 | + search: "Search", | ||
| 11 | + reset: "Reset", | ||
| 12 | + statusPlaceholder: "Please select status", | ||
| 13 | + postponePlaceholder: "Please select if postponed", | ||
| 14 | + renovationTimePlaceholder: "Please select renovation time", | ||
| 15 | + startTimePlaceholder: "Please select start time", | ||
| 16 | + endTimePlaceholder: "Please select end time", | ||
| 17 | + renovationInfo: "Renovation Information", | ||
| 18 | + add: "Add", | ||
| 19 | + room: "Room", | ||
| 20 | + contactPerson: "Contact Person", | ||
| 21 | + phone: "Phone", | ||
| 22 | + renovationTime: "Renovation Time", | ||
| 23 | + applyTime: "Apply Time", | ||
| 24 | + renovationCompany: "Renovation Company", | ||
| 25 | + renovationManager: "Renovation Manager", | ||
| 26 | + managerPhone: "Manager Phone", | ||
| 27 | + status: "Status", | ||
| 28 | + isPostponed: "Is Postponed", | ||
| 29 | + postponeTime: "Postpone Time", | ||
| 30 | + isViolation: "Is Violation", | ||
| 31 | + violationDesc: "Violation Description", | ||
| 32 | + remark: "Remark", | ||
| 33 | + operation: "Operation", | ||
| 34 | + fee: "Fee", | ||
| 35 | + review: "Review", | ||
| 36 | + completeRenovation: "Complete Renovation", | ||
| 37 | + renovationAcceptance: "Renovation Acceptance", | ||
| 38 | + acceptanceDetail: "Acceptance Detail", | ||
| 39 | + modify: "Modify", | ||
| 40 | + delete: "Delete", | ||
| 41 | + trackRecord: "Track Record", | ||
| 42 | + yes: "Yes", | ||
| 43 | + no: "No", | ||
| 44 | + confirmDelete: "Confirm Delete", | ||
| 45 | + confirmDeleteMsg: "Are you sure to delete this renovation record?", | ||
| 46 | + cancelDelete: "Cancel", | ||
| 47 | + confirmComplete: "Confirm Complete", | ||
| 48 | + confirmCompleteMsg: "Are you sure to mark this renovation as completed?", | ||
| 49 | + cancelComplete: "Cancel", | ||
| 50 | + save: "Save", | ||
| 51 | + cancel: "Cancel", | ||
| 52 | + renovationStartTime: "Renovation Start Time", | ||
| 53 | + renovationEndTime: "Renovation End Time", | ||
| 54 | + renovationCompanyPlaceholder: "Please enter renovation company", | ||
| 55 | + renovationManagerPlaceholder: "Please enter renovation manager", | ||
| 56 | + managerPhonePlaceholder: "Please enter manager phone", | ||
| 57 | + remarkPlaceholder: "Optional remarks", | ||
| 58 | + acceptanceOpinion: "Acceptance Opinion", | ||
| 59 | + reviewOpinion: "Review Opinion", | ||
| 60 | + violationPlaceholder: "Please select if violation", | ||
| 61 | + violationDescPlaceholder: "Please enter violation description" | ||
| 62 | + } | ||
| 63 | + }, | ||
| 64 | + zh: { | ||
| 65 | + roomRenovationManage: { | ||
| 66 | + queryCondition: "查询条件", | ||
| 67 | + hide: "隐藏", | ||
| 68 | + more: "更多", | ||
| 69 | + roomNumberPlaceholder: "请输入房屋编号 (如1-1-101)", | ||
| 70 | + contactPersonPlaceholder: "请输入联系人", | ||
| 71 | + phonePlaceholder: "请输入联系电话", | ||
| 72 | + search: "查询", | ||
| 73 | + reset: "重置", | ||
| 74 | + statusPlaceholder: "请选择状态", | ||
| 75 | + postponePlaceholder: "请选择是否延期", | ||
| 76 | + renovationTimePlaceholder: "请选择装修时间", | ||
| 77 | + startTimePlaceholder: "请选择开始时间", | ||
| 78 | + endTimePlaceholder: "请选择结束时间", | ||
| 79 | + renovationInfo: "装修信息", | ||
| 80 | + add: "添加", | ||
| 81 | + room: "房屋", | ||
| 82 | + contactPerson: "联系人", | ||
| 83 | + phone: "联系电话", | ||
| 84 | + renovationTime: "装修时间", | ||
| 85 | + applyTime: "申请时间", | ||
| 86 | + renovationCompany: "装修单位", | ||
| 87 | + renovationManager: "装修负责人", | ||
| 88 | + managerPhone: "负责人电话", | ||
| 89 | + status: "状态", | ||
| 90 | + isPostponed: "是否延期", | ||
| 91 | + postponeTime: "延期时间", | ||
| 92 | + isViolation: "是否违规", | ||
| 93 | + violationDesc: "违规说明", | ||
| 94 | + remark: "备注", | ||
| 95 | + operation: "操作", | ||
| 96 | + fee: "费用", | ||
| 97 | + review: "审核", | ||
| 98 | + completeRenovation: "装修完成", | ||
| 99 | + renovationAcceptance: "装修验收", | ||
| 100 | + acceptanceDetail: "验收明细", | ||
| 101 | + modify: "修改", | ||
| 102 | + delete: "删除", | ||
| 103 | + trackRecord: "跟踪记录", | ||
| 104 | + yes: "是", | ||
| 105 | + no: "否", | ||
| 106 | + confirmDelete: "确认删除", | ||
| 107 | + confirmDeleteMsg: "确定删除该装修记录吗?", | ||
| 108 | + cancelDelete: "点错了", | ||
| 109 | + confirmComplete: "确认完成", | ||
| 110 | + confirmCompleteMsg: "确定完成该装修记录吗?", | ||
| 111 | + cancelComplete: "点错了", | ||
| 112 | + save: "保存", | ||
| 113 | + cancel: "取消", | ||
| 114 | + renovationStartTime: "装修开始时间", | ||
| 115 | + renovationEndTime: "装修结束时间", | ||
| 116 | + renovationCompanyPlaceholder: "请输入装修单位", | ||
| 117 | + renovationManagerPlaceholder: "请输入装修负责人", | ||
| 118 | + managerPhonePlaceholder: "请输入负责人电话", | ||
| 119 | + remarkPlaceholder: "选填备注", | ||
| 120 | + acceptanceOpinion: "验收意见", | ||
| 121 | + reviewOpinion: "审核意见", | ||
| 122 | + violationPlaceholder: "请选择是否违规", | ||
| 123 | + violationDescPlaceholder: "请输入违规说明" | ||
| 124 | + } | ||
| 125 | + } | ||
| 126 | +} | ||
| 0 | \ No newline at end of file | 127 | \ No newline at end of file |
src/views/community/roomRenovationManageList.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div class="room-renovation-container"> | ||
| 3 | + <!-- 查询条件 --> | ||
| 4 | + <el-card class="box-card"> | ||
| 5 | + <div slot="header" class=" flex justify-between"> | ||
| 6 | + <span>{{ $t('roomRenovationManage.queryCondition') }}</span> | ||
| 7 | + <el-button type="text" style="float: right; padding: 3px 0" @click="toggleMoreCondition"> | ||
| 8 | + {{ roomRenovationManageInfo.moreCondition ? $t('roomRenovationManage.hide') : $t('roomRenovationManage.more') }} | ||
| 9 | + </el-button> | ||
| 10 | + </div> | ||
| 11 | + <div> | ||
| 12 | + <el-row :gutter="20"> | ||
| 13 | + <el-col :span="6"> | ||
| 14 | + <el-input v-model.trim="roomRenovationManageInfo.conditions.roomName" | ||
| 15 | + :placeholder="$t('roomRenovationManage.roomNumberPlaceholder')" clearable /> | ||
| 16 | + </el-col> | ||
| 17 | + <el-col :span="6"> | ||
| 18 | + <el-input v-model.trim="roomRenovationManageInfo.conditions.personName" | ||
| 19 | + :placeholder="$t('roomRenovationManage.contactPersonPlaceholder')" clearable /> | ||
| 20 | + </el-col> | ||
| 21 | + <el-col :span="6"> | ||
| 22 | + <el-input v-model.trim="roomRenovationManageInfo.conditions.personTel" | ||
| 23 | + :placeholder="$t('roomRenovationManage.phonePlaceholder')" clearable maxlength="11" /> | ||
| 24 | + </el-col> | ||
| 25 | + <el-col :span="6"> | ||
| 26 | + <el-button type="primary" @click="queryRoomRenovationMethod"> | ||
| 27 | + <i class="el-icon-search"></i> | ||
| 28 | + {{ $t('roomRenovationManage.search') }} | ||
| 29 | + </el-button> | ||
| 30 | + <el-button @click="resetRoomRenovationMethod" style="margin-left: 20px;"> | ||
| 31 | + <i class="el-icon-refresh"></i> | ||
| 32 | + {{ $t('roomRenovationManage.reset') }} | ||
| 33 | + </el-button> | ||
| 34 | + </el-col> | ||
| 35 | + </el-row> | ||
| 36 | + | ||
| 37 | + <div v-show="roomRenovationManageInfo.moreCondition"> | ||
| 38 | + <el-row :gutter="20" style="margin-top: 20px;"> | ||
| 39 | + <el-col :span="6"> | ||
| 40 | + <el-select v-model="roomRenovationManageInfo.conditions.state" | ||
| 41 | + :placeholder="$t('roomRenovationManage.statusPlaceholder')" clearable> | ||
| 42 | + <el-option v-for="(item, index) in roomRenovationManageInfo.states" :key="index" :label="item.name" | ||
| 43 | + :value="item.statusCd" /> | ||
| 44 | + </el-select> | ||
| 45 | + </el-col> | ||
| 46 | + <el-col :span="6"> | ||
| 47 | + <el-select v-model="roomRenovationManageInfo.conditions.isPostpone" | ||
| 48 | + :placeholder="$t('roomRenovationManage.postponePlaceholder')" clearable> | ||
| 49 | + <el-option :label="$t('roomRenovationManage.yes')" value="Y" /> | ||
| 50 | + <el-option :label="$t('roomRenovationManage.no')" value="N" /> | ||
| 51 | + </el-select> | ||
| 52 | + </el-col> | ||
| 53 | + <el-col :span="6"> | ||
| 54 | + <el-date-picker v-model="roomRenovationManageInfo.conditions.renovationTime" type="date" | ||
| 55 | + :placeholder="$t('roomRenovationManage.renovationTimePlaceholder')" value-format="yyyy-MM-dd" /> | ||
| 56 | + </el-col> | ||
| 57 | + </el-row> | ||
| 58 | + | ||
| 59 | + <el-row :gutter="20" style="margin-top: 20px;"> | ||
| 60 | + <el-col :span="6"> | ||
| 61 | + <el-date-picker v-model="roomRenovationManageInfo.conditions.startTime" type="date" | ||
| 62 | + :placeholder="$t('roomRenovationManage.startTimePlaceholder')" value-format="yyyy-MM-dd" /> | ||
| 63 | + </el-col> | ||
| 64 | + <el-col :span="6"> | ||
| 65 | + <el-date-picker v-model="roomRenovationManageInfo.conditions.endTime" type="date" | ||
| 66 | + :placeholder="$t('roomRenovationManage.endTimePlaceholder')" value-format="yyyy-MM-dd" /> | ||
| 67 | + </el-col> | ||
| 68 | + </el-row> | ||
| 69 | + </div> | ||
| 70 | + </div> | ||
| 71 | + </el-card> | ||
| 72 | + | ||
| 73 | + <!-- 装修信息 --> | ||
| 74 | + <el-card class="box-card" style="margin-top: 20px;"> | ||
| 75 | + <div slot="header" class=" flex justify-between"> | ||
| 76 | + <span>{{ $t('roomRenovationManage.renovationInfo') }}</span> | ||
| 77 | + <el-button type="primary" size="small" style="float: right;" @click="openAddRoomRenovationModal"> | ||
| 78 | + <i class="el-icon-plus"></i> | ||
| 79 | + {{ $t('roomRenovationManage.add') }} | ||
| 80 | + </el-button> | ||
| 81 | + </div> | ||
| 82 | + <div> | ||
| 83 | + <el-table :data="roomRenovationManageInfo.roomRenovations" border style="width: 100%" v-loading="loading"> | ||
| 84 | + <el-table-column prop="roomName" :label="$t('roomRenovationManage.room')" align="center" /> | ||
| 85 | + <el-table-column prop="personName" :label="$t('roomRenovationManage.contactPerson')" align="center" /> | ||
| 86 | + <el-table-column prop="personTel" :label="$t('roomRenovationManage.phone')" align="center" /> | ||
| 87 | + <el-table-column :label="$t('roomRenovationManage.renovationTime')" align="center"> | ||
| 88 | + <template slot-scope="scope"> | ||
| 89 | + <div>{{ scope.row.startTime }}</div> | ||
| 90 | + <div>{{ scope.row.endTime }}</div> | ||
| 91 | + </template> | ||
| 92 | + </el-table-column> | ||
| 93 | + <el-table-column prop="createTime" :label="$t('roomRenovationManage.applyTime')" align="center" /> | ||
| 94 | + <el-table-column prop="renovationCompany" :label="$t('roomRenovationManage.renovationCompany')" | ||
| 95 | + align="center" /> | ||
| 96 | + <el-table-column prop="personMain" :label="$t('roomRenovationManage.renovationManager')" align="center" /> | ||
| 97 | + <el-table-column prop="personMainTel" :label="$t('roomRenovationManage.managerPhone')" align="center" /> | ||
| 98 | + <el-table-column prop="stateName" :label="$t('roomRenovationManage.status')" align="center" /> | ||
| 99 | + <el-table-column :label="$t('roomRenovationManage.isPostponed')" align="center"> | ||
| 100 | + <template slot-scope="scope"> | ||
| 101 | + {{ scope.row.isPostpone === 'Y' ? $t('roomRenovationManage.yes') : $t('roomRenovationManage.no') }} | ||
| 102 | + </template> | ||
| 103 | + </el-table-column> | ||
| 104 | + <el-table-column prop="postponeTime" :label="$t('roomRenovationManage.postponeTime')" align="center" /> | ||
| 105 | + <el-table-column :label="$t('roomRenovationManage.isViolation')" align="center"> | ||
| 106 | + <template slot-scope="scope"> | ||
| 107 | + {{ scope.row.isViolation === 'Y' ? $t('roomRenovationManage.yes') : $t('roomRenovationManage.no') }} | ||
| 108 | + </template> | ||
| 109 | + </el-table-column> | ||
| 110 | + <el-table-column prop="violationDesc" :label="$t('roomRenovationManage.violationDesc')" align="center" /> | ||
| 111 | + <el-table-column prop="remark" :label="$t('roomRenovationManage.remark')" align="center" /> | ||
| 112 | + <el-table-column :label="$t('roomRenovationManage.operation')" align="center" width="350"> | ||
| 113 | + <template slot-scope="scope"> | ||
| 114 | + <div v-if="scope.row.state === '1000'"> | ||
| 115 | + <el-button size="mini" @click="openRoomRenovationFee(scope.row)"> | ||
| 116 | + {{ $t('roomRenovationManage.fee') }} | ||
| 117 | + </el-button> | ||
| 118 | + </div> | ||
| 119 | + <div v-if="scope.row.state === '1000' && scope.row.isViolation === 'N'"> | ||
| 120 | + <el-button size="mini" type="primary" @click="openToExamine(scope.row)"> | ||
| 121 | + {{ $t('roomRenovationManage.review') }} | ||
| 122 | + </el-button> | ||
| 123 | + </div> | ||
| 124 | + <div v-if="scope.row.state === '3000' && scope.row.isViolation === 'N'"> | ||
| 125 | + <el-button size="mini" type="success" @click="openDecorationCompleted(scope.row)"> | ||
| 126 | + {{ $t('roomRenovationManage.completeRenovation') }} | ||
| 127 | + </el-button> | ||
| 128 | + </div> | ||
| 129 | + <div v-if="scope.row.state === '4000' && scope.row.isViolation === 'N'"> | ||
| 130 | + <el-button size="mini" type="warning" @click="openDecorationAcceptanceModel(scope.row)"> | ||
| 131 | + {{ $t('roomRenovationManage.renovationAcceptance') }} | ||
| 132 | + </el-button> | ||
| 133 | + </div> | ||
| 134 | + <div v-if="scope.row.state === '5000' || scope.row.state === '6000'"> | ||
| 135 | + <el-button size="mini" @click="openRoomRenovationDetail(scope.row)"> | ||
| 136 | + {{ $t('roomRenovationManage.acceptanceDetail') }} | ||
| 137 | + </el-button> | ||
| 138 | + </div> | ||
| 139 | + <el-button size="mini" @click="openEditRoomRenovationModel(scope.row)"> | ||
| 140 | + {{ $t('roomRenovationManage.modify') }} | ||
| 141 | + </el-button> | ||
| 142 | + <el-button size="mini" type="danger" @click="openDeleteRoomRenovationModel(scope.row)"> | ||
| 143 | + {{ $t('roomRenovationManage.delete') }} | ||
| 144 | + </el-button> | ||
| 145 | + <el-button size="mini" @click="openRoomDecorationRecord(scope.row)"> | ||
| 146 | + {{ $t('roomRenovationManage.trackRecord') }} | ||
| 147 | + </el-button> | ||
| 148 | + </template> | ||
| 149 | + </el-table-column> | ||
| 150 | + </el-table> | ||
| 151 | + | ||
| 152 | + <!-- 分页 --> | ||
| 153 | + <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page.current" | ||
| 154 | + :page-sizes="[10, 20, 50]" :page-size="page.size" layout="total, sizes, prev, pager, next, jumper" | ||
| 155 | + :total="page.total" style="margin-top: 20px;" /> | ||
| 156 | + </div> | ||
| 157 | + </el-card> | ||
| 158 | + | ||
| 159 | + <!-- 子组件 --> | ||
| 160 | + <add-room-renovation ref="addRoomRenovation" @success="listRoomRenovation" /> | ||
| 161 | + <room-decoration-acceptance ref="roomDecorationAcceptance" @success="listRoomRenovation" /> | ||
| 162 | + <room-to-examine ref="roomToExamine" @success="listRoomRenovation" /> | ||
| 163 | + <edit-room-renovation ref="editRoomRenovation" @success="listRoomRenovation" /> | ||
| 164 | + <delete-room-renovation ref="deleteRoomRenovation" @success="listRoomRenovation" /> | ||
| 165 | + <room-renovation-completed ref="roomRenovationCompleted" @success="listRoomRenovation" /> | ||
| 166 | + </div> | ||
| 167 | +</template> | ||
| 168 | + | ||
| 169 | +<script> | ||
| 170 | +import { listRoomRenovation } from '@/api/community/roomRenovationManageApi' | ||
| 171 | +import AddRoomRenovation from '@/components/community/AddRoomRenovation' | ||
| 172 | +import RoomDecorationAcceptance from '@/components/community/RoomDecorationAcceptance' | ||
| 173 | +import RoomToExamine from '@/components/community/RoomToExamine' | ||
| 174 | +import EditRoomRenovation from '@/components/community/EditRoomRenovation' | ||
| 175 | +import DeleteRoomRenovation from '@/components/community/DeleteRoomRenovation' | ||
| 176 | +import RoomRenovationCompleted from '@/components/community/RoomRenovationCompleted' | ||
| 177 | +import {getDict} from '@/api/community/communityApi' | ||
| 178 | + | ||
| 179 | +export default { | ||
| 180 | + name: 'RoomRenovationManageList', | ||
| 181 | + components: { | ||
| 182 | + AddRoomRenovation, | ||
| 183 | + RoomDecorationAcceptance, | ||
| 184 | + RoomToExamine, | ||
| 185 | + EditRoomRenovation, | ||
| 186 | + DeleteRoomRenovation, | ||
| 187 | + RoomRenovationCompleted | ||
| 188 | + }, | ||
| 189 | + data() { | ||
| 190 | + return { | ||
| 191 | + loading: false, | ||
| 192 | + roomRenovationManageInfo: { | ||
| 193 | + roomRenovations: [], | ||
| 194 | + moreCondition: false, | ||
| 195 | + states: [], | ||
| 196 | + conditions: { | ||
| 197 | + roomName: '', | ||
| 198 | + personName: '', | ||
| 199 | + personTel: '', | ||
| 200 | + state: '', | ||
| 201 | + isPostpone: '', | ||
| 202 | + renovationTime: '', | ||
| 203 | + startTime: '', | ||
| 204 | + endTime: '', | ||
| 205 | + communityId: '' | ||
| 206 | + } | ||
| 207 | + }, | ||
| 208 | + page: { | ||
| 209 | + current: 1, | ||
| 210 | + size: 10, | ||
| 211 | + total: 0 | ||
| 212 | + } | ||
| 213 | + } | ||
| 214 | + }, | ||
| 215 | + created() { | ||
| 216 | + this.getDictData() | ||
| 217 | + this.listRoomRenovation() | ||
| 218 | + }, | ||
| 219 | + methods: { | ||
| 220 | + // 获取字典数据 | ||
| 221 | + async getDictData() { | ||
| 222 | + try { | ||
| 223 | + const res = await getDict('room_renovation','state') | ||
| 224 | + this.roomRenovationManageInfo.states = res || [] | ||
| 225 | + } catch (error) { | ||
| 226 | + console.error('获取字典数据失败:', error) | ||
| 227 | + } | ||
| 228 | + }, | ||
| 229 | + | ||
| 230 | + // 查询装修信息 | ||
| 231 | + async listRoomRenovation() { | ||
| 232 | + this.loading = true | ||
| 233 | + try { | ||
| 234 | + const params = { | ||
| 235 | + ...this.roomRenovationManageInfo.conditions, | ||
| 236 | + page: this.page.current, | ||
| 237 | + row: this.page.size, | ||
| 238 | + communityId: this.getCommunityId() | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + const { data, total } = await listRoomRenovation(params) | ||
| 242 | + this.roomRenovationManageInfo.roomRenovations = data | ||
| 243 | + this.page.total = total | ||
| 244 | + } catch (error) { | ||
| 245 | + console.error('查询装修信息失败:', error) | ||
| 246 | + } finally { | ||
| 247 | + this.loading = false | ||
| 248 | + } | ||
| 249 | + }, | ||
| 250 | + | ||
| 251 | + // 切换更多条件 | ||
| 252 | + toggleMoreCondition() { | ||
| 253 | + this.roomRenovationManageInfo.moreCondition = !this.roomRenovationManageInfo.moreCondition | ||
| 254 | + }, | ||
| 255 | + | ||
| 256 | + // 查询 | ||
| 257 | + queryRoomRenovationMethod() { | ||
| 258 | + this.page.current = 1 | ||
| 259 | + this.listRoomRenovation() | ||
| 260 | + }, | ||
| 261 | + | ||
| 262 | + // 重置 | ||
| 263 | + resetRoomRenovationMethod() { | ||
| 264 | + this.roomRenovationManageInfo.conditions = { | ||
| 265 | + roomName: '', | ||
| 266 | + personName: '', | ||
| 267 | + personTel: '', | ||
| 268 | + state: '', | ||
| 269 | + isPostpone: '', | ||
| 270 | + renovationTime: '', | ||
| 271 | + startTime: '', | ||
| 272 | + endTime: '', | ||
| 273 | + communityId: this.$store.getters.communityId | ||
| 274 | + } | ||
| 275 | + this.page.current = 1 | ||
| 276 | + this.listRoomRenovation() | ||
| 277 | + }, | ||
| 278 | + | ||
| 279 | + // 分页大小改变 | ||
| 280 | + handleSizeChange(val) { | ||
| 281 | + this.page.size = val | ||
| 282 | + this.listRoomRenovation() | ||
| 283 | + }, | ||
| 284 | + | ||
| 285 | + // 当前页改变 | ||
| 286 | + handleCurrentChange(val) { | ||
| 287 | + this.page.current = val | ||
| 288 | + this.listRoomRenovation() | ||
| 289 | + }, | ||
| 290 | + | ||
| 291 | + // 打开添加模态框 | ||
| 292 | + openAddRoomRenovationModal() { | ||
| 293 | + this.$refs.addRoomRenovation.open() | ||
| 294 | + }, | ||
| 295 | + | ||
| 296 | + // 打开修改模态框 | ||
| 297 | + openEditRoomRenovationModel(row) { | ||
| 298 | + this.$refs.editRoomRenovation.open(row) | ||
| 299 | + }, | ||
| 300 | + | ||
| 301 | + // 打开删除模态框 | ||
| 302 | + openDeleteRoomRenovationModel(row) { | ||
| 303 | + this.$refs.deleteRoomRenovation.open(row) | ||
| 304 | + }, | ||
| 305 | + | ||
| 306 | + // 打开审核模态框 | ||
| 307 | + openToExamine(row) { | ||
| 308 | + this.$refs.roomToExamine.open(row) | ||
| 309 | + }, | ||
| 310 | + | ||
| 311 | + // 打开验收模态框 | ||
| 312 | + openDecorationAcceptanceModel(row) { | ||
| 313 | + this.$refs.roomDecorationAcceptance.open(row) | ||
| 314 | + }, | ||
| 315 | + | ||
| 316 | + // 打开装修完成模态框 | ||
| 317 | + openDecorationCompleted(row) { | ||
| 318 | + this.$refs.roomRenovationCompleted.open(row) | ||
| 319 | + }, | ||
| 320 | + | ||
| 321 | + // 打开费用页面 | ||
| 322 | + openRoomRenovationFee(row) { | ||
| 323 | + this.$router.push({ | ||
| 324 | + path: '/fee/room-fee', | ||
| 325 | + query: { roomId: row.roomId } | ||
| 326 | + }) | ||
| 327 | + }, | ||
| 328 | + | ||
| 329 | + // 打开跟踪记录 | ||
| 330 | + openRoomDecorationRecord(row) { | ||
| 331 | + this.$router.push({ | ||
| 332 | + path: '/property/room-decoration-record', | ||
| 333 | + query: { | ||
| 334 | + roomId: row.roomId, | ||
| 335 | + rId: row.rId | ||
| 336 | + } | ||
| 337 | + }) | ||
| 338 | + }, | ||
| 339 | + | ||
| 340 | + // 打开验收明细 | ||
| 341 | + openRoomRenovationDetail(row) { | ||
| 342 | + this.$router.push({ | ||
| 343 | + path: '/property/room-renovation-detail', | ||
| 344 | + query: { | ||
| 345 | + rId: row.rId, | ||
| 346 | + roomName: row.roomName | ||
| 347 | + } | ||
| 348 | + }) | ||
| 349 | + } | ||
| 350 | + } | ||
| 351 | +} | ||
| 352 | +</script> | ||
| 353 | + | ||
| 354 | +<style lang="scss" scoped> | ||
| 355 | +.room-renovation-container { | ||
| 356 | + padding: 20px; | ||
| 357 | + | ||
| 358 | + .box-card { | ||
| 359 | + margin-bottom: 20px; | ||
| 360 | + } | ||
| 361 | + | ||
| 362 | + .clearfix:before, | ||
| 363 | + .clearfix:after { | ||
| 364 | + display: table; | ||
| 365 | + content: ""; | ||
| 366 | + } | ||
| 367 | + | ||
| 368 | + .clearfix:after { | ||
| 369 | + clear: both; | ||
| 370 | + } | ||
| 371 | +} | ||
| 372 | +</style> | ||
| 0 | \ No newline at end of file | 373 | \ No newline at end of file |