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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 123 | \ No newline at end of file | ... | ... |
src/components/index/indexRepairComplaint.vue
src/i18n/index.js
| ... | ... | @@ -118,6 +118,8 @@ import { messages as aStaffCommunityMessages } from '../views/staff/aStaffCommun |
| 118 | 118 | import { messages as communityWechatMessages } from '../views/community/communityWechatLang' |
| 119 | 119 | import { messages as communityMiniMessages } from '../views/community/communityMiniLang' |
| 120 | 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 | 124 | Vue.use(VueI18n) |
| 123 | 125 | |
| ... | ... | @@ -240,6 +242,8 @@ const messages = { |
| 240 | 242 | ...communityWechatMessages.en, |
| 241 | 243 | ...communityMiniMessages.en, |
| 242 | 244 | ...communityPaymentMessages.en, |
| 245 | + ...enterCommunityMessages.en, | |
| 246 | + ...roomRenovationManageMessages.en, | |
| 243 | 247 | }, |
| 244 | 248 | zh: { |
| 245 | 249 | ...loginMessages.zh, |
| ... | ... | @@ -358,6 +362,8 @@ const messages = { |
| 358 | 362 | ...communityWechatMessages.zh, |
| 359 | 363 | ...communityMiniMessages.zh, |
| 360 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 373 | \ No newline at end of file | ... | ... |