Commit e4e314519b2077e09a40f5b50b1c2a51af525b3e

Authored by wuxw
1 parent 6d9d3e27

完成物业首页功能

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 &#39;../views/staff/aStaffCommun @@ -118,6 +118,8 @@ import { messages as aStaffCommunityMessages } from &#39;../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