Commit 32a770b52980a7afdb559cf64bae85fb98391088
1 parent
9b01bbd3
加入费用项明细功能
Showing
10 changed files
with
865 additions
and
18 deletions
src/api/fee/feeConfigDetailApi.js
0 → 100644
| 1 | +import request from '@/utils/request' | |
| 2 | + | |
| 3 | +// 获取费用项详情 | |
| 4 | +export function getFeeConfigDetail(params) { | |
| 5 | + return new Promise((resolve, reject) => { | |
| 6 | + request({ | |
| 7 | + url: '/feeConfig.listFeeConfigs', | |
| 8 | + method: 'get', | |
| 9 | + params | |
| 10 | + }).then(response => { | |
| 11 | + const res = response.data | |
| 12 | + resolve(res) | |
| 13 | + }).catch(error => { | |
| 14 | + reject(error) | |
| 15 | + }) | |
| 16 | + }) | |
| 17 | +} | |
| 18 | + | |
| 19 | +// 查询费用项历史记录 | |
| 20 | +export function queryHisFeeConfig(params) { | |
| 21 | + return new Promise((resolve, reject) => { | |
| 22 | + request({ | |
| 23 | + url: '/fee.queryHisFeeConfig', | |
| 24 | + method: 'get', | |
| 25 | + params | |
| 26 | + }).then(response => { | |
| 27 | + const res = response.data | |
| 28 | + if (res.code === 0) { | |
| 29 | + resolve({ | |
| 30 | + data: res.data, | |
| 31 | + total: res.records, | |
| 32 | + records: res.total | |
| 33 | + }) | |
| 34 | + } else { | |
| 35 | + reject(new Error(res.msg || '查询历史记录失败')) | |
| 36 | + } | |
| 37 | + }).catch(error => { | |
| 38 | + reject(error) | |
| 39 | + }) | |
| 40 | + }) | |
| 41 | +} | |
| 42 | + | |
| 43 | +// 查询费用项对象列表 | |
| 44 | +export function listConfigFeeObjs(params) { | |
| 45 | + return new Promise((resolve, reject) => { | |
| 46 | + request({ | |
| 47 | + url: '/feeConfig.listConfigFeeObjs', | |
| 48 | + method: 'get', | |
| 49 | + params | |
| 50 | + }).then(response => { | |
| 51 | + const res = response.data | |
| 52 | + if (res.code === 0) { | |
| 53 | + resolve({ | |
| 54 | + data: res.data, | |
| 55 | + total: res.records, | |
| 56 | + records: res.total | |
| 57 | + }) | |
| 58 | + } else { | |
| 59 | + reject(new Error(res.msg || '查询费用对象失败')) | |
| 60 | + } | |
| 61 | + }).catch(error => { | |
| 62 | + reject(error) | |
| 63 | + }) | |
| 64 | + }) | |
| 65 | +} | |
| 66 | + | |
| 67 | +// 查询费用项折扣 | |
| 68 | +export function queryPayFeeConfigDiscount(params) { | |
| 69 | + return new Promise((resolve, reject) => { | |
| 70 | + request({ | |
| 71 | + url: '/payFeeConfigDiscount/queryPayFeeConfigDiscount', | |
| 72 | + method: 'get', | |
| 73 | + params | |
| 74 | + }).then(response => { | |
| 75 | + const res = response.data | |
| 76 | + if (res.code === 0) { | |
| 77 | + resolve({ | |
| 78 | + data: res.data, | |
| 79 | + total: res.records, | |
| 80 | + records: res.total | |
| 81 | + }) | |
| 82 | + } else { | |
| 83 | + reject(new Error(res.msg || '查询折扣信息失败')) | |
| 84 | + } | |
| 85 | + }).catch(error => { | |
| 86 | + reject(error) | |
| 87 | + }) | |
| 88 | + }) | |
| 89 | +} | |
| 90 | + | |
| 91 | +// 删除费用项折扣 | |
| 92 | +export function deletePayFeeConfigDiscount(data) { | |
| 93 | + return new Promise((resolve, reject) => { | |
| 94 | + request({ | |
| 95 | + url: '/payFeeConfigDiscount/deletePayFeeConfigDiscount', | |
| 96 | + method: 'post', | |
| 97 | + data | |
| 98 | + }).then(response => { | |
| 99 | + const res = response.data | |
| 100 | + if (res.code === 0) { | |
| 101 | + resolve(res) | |
| 102 | + } else { | |
| 103 | + reject(new Error(res.msg || '删除折扣失败')) | |
| 104 | + } | |
| 105 | + }).catch(error => { | |
| 106 | + reject(error) | |
| 107 | + }) | |
| 108 | + }) | |
| 109 | +} | |
| 0 | 110 | \ No newline at end of file | ... | ... |
src/components/fee/FeeConfigDetailDiscount.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div> | |
| 3 | + <el-table :data="discounts" border style="width: 100%"> | |
| 4 | + <el-table-column prop="discountName" :label="$t('feeConfigDetail.discountName')" align="center"></el-table-column> | |
| 5 | + <el-table-column :label="$t('feeConfigDetail.rule')" align="center"> | |
| 6 | + <template slot-scope="scope"> | |
| 7 | + <div v-for="(item, index) in scope.row.feeDiscountSpecs" :key="index"> | |
| 8 | + {{ item.specName }}:{{ item.specValue }} | |
| 9 | + </div> | |
| 10 | + </template> | |
| 11 | + </el-table-column> | |
| 12 | + <el-table-column :label="$t('feeConfigDetail.discountType')" align="center"> | |
| 13 | + <template slot-scope="scope"> | |
| 14 | + {{ scope.row.discountType == '1001' ? $t('feeConfigDetail.discount') : $t('feeConfigDetail.breach') }} | |
| 15 | + </template> | |
| 16 | + </el-table-column> | |
| 17 | + <el-table-column prop="startTime" :label="$t('feeConfigDetail.payStartTime')" align="center"></el-table-column> | |
| 18 | + <el-table-column prop="endTime" :label="$t('feeConfigDetail.payEndTime')" align="center"></el-table-column> | |
| 19 | + <el-table-column prop="payMaxEndTime" :label="$t('feeConfigDetail.discountEndTime')" align="center"></el-table-column> | |
| 20 | + <el-table-column :label="$t('common.operation')" align="center"> | |
| 21 | + <template slot-scope="scope"> | |
| 22 | + <el-button type="danger" size="mini" @click="openDeleteModel(scope.row)"> | |
| 23 | + {{ $t('common.delete') }} | |
| 24 | + </el-button> | |
| 25 | + </template> | |
| 26 | + </el-table-column> | |
| 27 | + </el-table> | |
| 28 | + | |
| 29 | + <el-pagination | |
| 30 | + class="pagination-wrapper" | |
| 31 | + @size-change="handleSizeChange" | |
| 32 | + @current-change="handleCurrentChange" | |
| 33 | + :current-page="pagination.current" | |
| 34 | + :page-sizes="[10, 20, 30, 50]" | |
| 35 | + :page-size="pagination.size" | |
| 36 | + layout="total, sizes, prev, pager, next, jumper" | |
| 37 | + :total="pagination.total"> | |
| 38 | + </el-pagination> | |
| 39 | + | |
| 40 | + <div class="tip-wrapper"> | |
| 41 | + <p>{{ $t('feeConfigDetail.tip1') }}</p> | |
| 42 | + <p>{{ $t('feeConfigDetail.tip2') }}</p> | |
| 43 | + <p>{{ $t('feeConfigDetail.tip3') }}</p> | |
| 44 | + <p>{{ $t('feeConfigDetail.tip4') }}</p> | |
| 45 | + </div> | |
| 46 | + | |
| 47 | + <el-dialog | |
| 48 | + :title="$t('feeConfigDetail.confirmDelete')" | |
| 49 | + :visible.sync="deleteDialogVisible" | |
| 50 | + width="30%"> | |
| 51 | + <span>{{ $t('feeConfigDetail.confirmDeleteDiscount') }}</span> | |
| 52 | + <span slot="footer" class="dialog-footer"> | |
| 53 | + <el-button @click="deleteDialogVisible = false">{{ $t('common.cancel') }}</el-button> | |
| 54 | + <el-button type="danger" @click="confirmDelete">{{ $t('common.confirm') }}</el-button> | |
| 55 | + </span> | |
| 56 | + </el-dialog> | |
| 57 | + </div> | |
| 58 | +</template> | |
| 59 | + | |
| 60 | +<script> | |
| 61 | +import { queryPayFeeConfigDiscount, deletePayFeeConfigDiscount } from '@/api/fee/feeConfigDetailApi' | |
| 62 | + | |
| 63 | +export default { | |
| 64 | + name: 'FeeConfigDetailDiscount', | |
| 65 | + data() { | |
| 66 | + return { | |
| 67 | + discounts: [], | |
| 68 | + pagination: { | |
| 69 | + current: 1, | |
| 70 | + size: 10, | |
| 71 | + total: 0 | |
| 72 | + }, | |
| 73 | + configId: '', | |
| 74 | + deleteDialogVisible: false, | |
| 75 | + currentDiscount: null | |
| 76 | + } | |
| 77 | + }, | |
| 78 | + methods: { | |
| 79 | + switchTab(params) { | |
| 80 | + this.configId = params.configId | |
| 81 | + this.loadData() | |
| 82 | + }, | |
| 83 | + async loadData() { | |
| 84 | + try { | |
| 85 | + const params = { | |
| 86 | + configId: this.configId, | |
| 87 | + page: this.pagination.current, | |
| 88 | + row: this.pagination.size, | |
| 89 | + communityId: this.getCommunityId() | |
| 90 | + } | |
| 91 | + const response = await queryPayFeeConfigDiscount(params) | |
| 92 | + this.discounts = response.data | |
| 93 | + this.pagination.total = response.total | |
| 94 | + } catch (error) { | |
| 95 | + console.error('Failed to load discounts:', error) | |
| 96 | + } | |
| 97 | + }, | |
| 98 | + openDeleteModel(discount) { | |
| 99 | + this.currentDiscount = discount | |
| 100 | + this.deleteDialogVisible = true | |
| 101 | + }, | |
| 102 | + async confirmDelete() { | |
| 103 | + try { | |
| 104 | + await deletePayFeeConfigDiscount({ | |
| 105 | + configDiscountId: this.currentDiscount.configDiscountId, | |
| 106 | + communityId: this.$store.getters.communityId | |
| 107 | + }) | |
| 108 | + this.$message.success(this.$t('feeConfigDetail.deleteSuccess')) | |
| 109 | + this.loadData() | |
| 110 | + this.deleteDialogVisible = false | |
| 111 | + } catch (error) { | |
| 112 | + console.error('Failed to delete discount:', error) | |
| 113 | + this.$message.error(this.$t('feeConfigDetail.deleteFailed')) | |
| 114 | + } | |
| 115 | + }, | |
| 116 | + handleSizeChange(val) { | |
| 117 | + this.pagination.size = val | |
| 118 | + this.loadData() | |
| 119 | + }, | |
| 120 | + handleCurrentChange(val) { | |
| 121 | + this.pagination.current = val | |
| 122 | + this.loadData() | |
| 123 | + } | |
| 124 | + } | |
| 125 | +} | |
| 126 | +</script> | |
| 127 | + | |
| 128 | +<style scoped> | |
| 129 | +.pagination-wrapper { | |
| 130 | + margin-top: 20px; | |
| 131 | + text-align: right; | |
| 132 | +} | |
| 133 | +.tip-wrapper { | |
| 134 | + margin-top: 20px; | |
| 135 | + color: #909399; | |
| 136 | + font-size: 14px; | |
| 137 | + line-height: 1.5; | |
| 138 | +} | |
| 139 | +</style> | |
| 0 | 140 | \ No newline at end of file | ... | ... |
src/components/fee/FeeConfigDetailHis.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div> | |
| 3 | + <el-table :data="feeDetails" border style="width: 100%"> | |
| 4 | + <el-table-column prop="feeTypeCdName" :label="$t('feeConfigDetail.feeType')" align="center"></el-table-column> | |
| 5 | + <el-table-column prop="feeName" :label="$t('feeConfigDetail.feeItem')" align="center"></el-table-column> | |
| 6 | + <el-table-column prop="feeFlagName" :label="$t('feeConfigDetail.feeFlag')" align="center"></el-table-column> | |
| 7 | + <el-table-column prop="billTypeName" :label="$t('feeConfigDetail.billType')" align="center"></el-table-column> | |
| 8 | + <el-table-column :label="$t('feeConfigDetail.paymentType')" align="center"> | |
| 9 | + <template slot-scope="scope"> | |
| 10 | + {{ scope.row.paymentCd == '1200' ? $t('feeConfigDetail.prePayment') : $t('feeConfigDetail.postPayment') }} | |
| 11 | + </template> | |
| 12 | + </el-table-column> | |
| 13 | + <el-table-column prop="paymentCycle" :label="$t('feeConfigDetail.paymentCycle')" align="center"></el-table-column> | |
| 14 | + <el-table-column :label="$t('feeConfigDetail.validity')" align="center"> | |
| 15 | + <template slot-scope="scope"> | |
| 16 | + {{ scope.row.startTime }}<br>{{ scope.row.endTime }} | |
| 17 | + </template> | |
| 18 | + </el-table-column> | |
| 19 | + <el-table-column :label="$t('feeConfigDetail.squarePrice')" align="center"> | |
| 20 | + <template slot-scope="scope"> | |
| 21 | + {{ scope.row.computingFormula == '2002' ? '-' : scope.row.squarePrice }} | |
| 22 | + </template> | |
| 23 | + </el-table-column> | |
| 24 | + <el-table-column prop="additionalAmount" :label="$t('feeConfigDetail.additionalAmount')" | |
| 25 | + align="center"></el-table-column> | |
| 26 | + <el-table-column :label="$t('feeConfigDetail.deductFrom')" align="center"> | |
| 27 | + <template slot-scope="scope"> | |
| 28 | + {{ scope.row.deductFrom == 'Y' ? $t('common.yes') : $t('common.no') }} | |
| 29 | + </template> | |
| 30 | + </el-table-column> | |
| 31 | + <el-table-column :label="$t('feeConfigDetail.payOnline')" align="center"> | |
| 32 | + <template slot-scope="scope"> | |
| 33 | + {{ scope.row.payOnline == 'Y' ? $t('common.yes') : $t('common.no') }} | |
| 34 | + </template> | |
| 35 | + </el-table-column> | |
| 36 | + <el-table-column :label="$t('feeConfigDetail.scale')" align="center"> | |
| 37 | + <template slot-scope="scope"> | |
| 38 | + <div v-if="scope.row.scale == '1'">{{ $t('feeConfigDetail.rounding') }}</div> | |
| 39 | + <div v-if="scope.row.scale == '3'">{{ $t('feeConfigDetail.upRound') }}</div> | |
| 40 | + <div v-if="scope.row.scale == '4'">{{ $t('feeConfigDetail.downRound') }}</div> | |
| 41 | + </template> | |
| 42 | + </el-table-column> | |
| 43 | + <el-table-column prop="decimalPlace" :label="$t('feeConfigDetail.decimalPlace')" align="center"></el-table-column> | |
| 44 | + <el-table-column :label="$t('feeConfigDetail.action')" align="center"> | |
| 45 | + <template slot-scope="scope"> | |
| 46 | + {{ getHisConfigOperate(scope.row) }} | |
| 47 | + </template> | |
| 48 | + </el-table-column> | |
| 49 | + <el-table-column prop="userName" :label="$t('feeConfigDetail.operator')" align="center"></el-table-column> | |
| 50 | + <el-table-column prop="createTime" :label="$t('feeConfigDetail.operateTime')" align="center"></el-table-column> | |
| 51 | + </el-table> | |
| 52 | + | |
| 53 | + <el-pagination class="pagination-wrapper" @size-change="handleSizeChange" @current-change="handleCurrentChange" | |
| 54 | + :current-page="pagination.current" :page-sizes="[10, 20, 30, 50]" :page-size="pagination.size" | |
| 55 | + layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"> | |
| 56 | + </el-pagination> | |
| 57 | + </div> | |
| 58 | +</template> | |
| 59 | + | |
| 60 | +<script> | |
| 61 | +import { queryHisFeeConfig } from '@/api/fee/feeConfigDetailApi' | |
| 62 | + | |
| 63 | +export default { | |
| 64 | + name: 'FeeConfigDetailHis', | |
| 65 | + data() { | |
| 66 | + return { | |
| 67 | + feeDetails: [], | |
| 68 | + pagination: { | |
| 69 | + current: 1, | |
| 70 | + size: 10, | |
| 71 | + total: 0 | |
| 72 | + }, | |
| 73 | + queryParams: { | |
| 74 | + configId: '', | |
| 75 | + staffNameLike: '', | |
| 76 | + feeNameLike: '', | |
| 77 | + logStartTime: '', | |
| 78 | + logEndTime: '' | |
| 79 | + } | |
| 80 | + } | |
| 81 | + }, | |
| 82 | + methods: { | |
| 83 | + switchTab(params) { | |
| 84 | + this.queryParams.configId = params.configId | |
| 85 | + this.loadData() | |
| 86 | + }, | |
| 87 | + async loadData() { | |
| 88 | + try { | |
| 89 | + const params = { | |
| 90 | + ...this.queryParams, | |
| 91 | + page: this.pagination.current, | |
| 92 | + row: this.pagination.size, | |
| 93 | + communityId: this.getCommunityId() | |
| 94 | + } | |
| 95 | + const response = await queryHisFeeConfig(params) | |
| 96 | + this.feeDetails = response.data | |
| 97 | + this.pagination.total = response.total | |
| 98 | + } catch (error) { | |
| 99 | + console.error('Failed to load fee config history:', error) | |
| 100 | + } | |
| 101 | + }, | |
| 102 | + getHisConfigOperate(fee) { | |
| 103 | + const feeCount = this.feeDetails.filter(item => item.bId === fee.bId).length | |
| 104 | + if (feeCount <= 1) { | |
| 105 | + if (fee.operate === 'ADD') return this.$t('feeConfigDetail.add') | |
| 106 | + if (fee.operate === 'DEL') return this.$t('feeConfigDetail.delete') | |
| 107 | + return '-' | |
| 108 | + } | |
| 109 | + if (fee.operate === 'ADD') return this.$t('feeConfigDetail.modifyNew') | |
| 110 | + if (fee.operate === 'DEL') return this.$t('feeConfigDetail.modifyOld') | |
| 111 | + return '-' | |
| 112 | + }, | |
| 113 | + handleSizeChange(val) { | |
| 114 | + this.pagination.size = val | |
| 115 | + this.loadData() | |
| 116 | + }, | |
| 117 | + handleCurrentChange(val) { | |
| 118 | + this.pagination.current = val | |
| 119 | + this.loadData() | |
| 120 | + } | |
| 121 | + } | |
| 122 | +} | |
| 123 | +</script> | |
| 124 | + | |
| 125 | +<style scoped> | |
| 126 | +.pagination-wrapper { | |
| 127 | + margin-top: 20px; | |
| 128 | + text-align: right; | |
| 129 | +} | |
| 130 | +</style> | |
| 0 | 131 | \ No newline at end of file | ... | ... |
src/components/fee/FeeDetailFeeObj.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div> | |
| 3 | + <el-row :gutter="20" class="filter-wrapper"> | |
| 4 | + <el-col :span="8"> | |
| 5 | + <el-select v-model="payerObjType" :placeholder="$t('feeConfigDetail.selectFeeObject')" class="filter-item"> | |
| 6 | + <el-option :label="$t('feeConfigDetail.house')" value="3333"></el-option> | |
| 7 | + <el-option :label="$t('feeConfigDetail.car')" value="6666"></el-option> | |
| 8 | + <el-option :label="$t('feeConfigDetail.contract')" value="7777"></el-option> | |
| 9 | + </el-select> | |
| 10 | + </el-col> | |
| 11 | + <el-col :span="4"> | |
| 12 | + <el-button type="primary" @click="loadData">{{ $t('common.search') }}</el-button> | |
| 13 | + </el-col> | |
| 14 | + </el-row> | |
| 15 | + | |
| 16 | + <el-table :data="feeObjs" border style="width: 100%"> | |
| 17 | + <el-table-column prop="feeId" :label="$t('feeConfigDetail.feeId')" align="center"></el-table-column> | |
| 18 | + <el-table-column :label="$t('feeConfigDetail.objectType')" align="center"> | |
| 19 | + <template slot-scope="scope"> | |
| 20 | + <span v-if="scope.row.payerObjType === '3333'">{{ $t('feeConfigDetail.house') }}</span> | |
| 21 | + <span v-else-if="scope.row.payerObjType === '6666'">{{ $t('feeConfigDetail.car') }}</span> | |
| 22 | + <span v-else>{{ $t('feeConfigDetail.contract') }}</span> | |
| 23 | + </template> | |
| 24 | + </el-table-column> | |
| 25 | + <el-table-column prop="payerObjName" :label="$t('feeConfigDetail.objectName')" align="center"></el-table-column> | |
| 26 | + <el-table-column prop="ownerName" :label="$t('feeConfigDetail.ownerName')" align="center"></el-table-column> | |
| 27 | + <el-table-column prop="ownerTel" :label="$t('feeConfigDetail.phone')" align="center"></el-table-column> | |
| 28 | + <el-table-column prop="createTime" :label="$t('feeConfigDetail.createTime')" align="center"></el-table-column> | |
| 29 | + </el-table> | |
| 30 | + | |
| 31 | + <el-pagination class="pagination-wrapper" @size-change="handleSizeChange" @current-change="handleCurrentChange" | |
| 32 | + :current-page="pagination.current" :page-sizes="[10, 20, 30, 50]" :page-size="pagination.size" | |
| 33 | + layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"> | |
| 34 | + </el-pagination> | |
| 35 | + </div> | |
| 36 | +</template> | |
| 37 | + | |
| 38 | +<script> | |
| 39 | +import { listConfigFeeObjs } from '@/api/fee/feeConfigDetailApi' | |
| 40 | + | |
| 41 | +export default { | |
| 42 | + name: 'FeeDetailFeeObj', | |
| 43 | + data() { | |
| 44 | + return { | |
| 45 | + payerObjType: '', | |
| 46 | + feeObjs: [], | |
| 47 | + pagination: { | |
| 48 | + current: 1, | |
| 49 | + size: 10, | |
| 50 | + total: 0 | |
| 51 | + }, | |
| 52 | + configId: '' | |
| 53 | + } | |
| 54 | + }, | |
| 55 | + methods: { | |
| 56 | + switchTab(params) { | |
| 57 | + this.configId = params.configId | |
| 58 | + this.loadData() | |
| 59 | + }, | |
| 60 | + async loadData() { | |
| 61 | + try { | |
| 62 | + const params = { | |
| 63 | + configId: this.configId, | |
| 64 | + payerObjType: this.payerObjType, | |
| 65 | + page: this.pagination.current, | |
| 66 | + row: this.pagination.size, | |
| 67 | + communityId: this.getCommunityId() | |
| 68 | + } | |
| 69 | + const response = await listConfigFeeObjs(params) | |
| 70 | + this.feeObjs = response.data | |
| 71 | + this.pagination.total = response.total | |
| 72 | + } catch (error) { | |
| 73 | + console.error('Failed to load fee objects:', error) | |
| 74 | + } | |
| 75 | + }, | |
| 76 | + handleSizeChange(val) { | |
| 77 | + this.pagination.size = val | |
| 78 | + this.loadData() | |
| 79 | + }, | |
| 80 | + handleCurrentChange(val) { | |
| 81 | + this.pagination.current = val | |
| 82 | + this.loadData() | |
| 83 | + } | |
| 84 | + } | |
| 85 | +} | |
| 86 | +</script> | |
| 87 | + | |
| 88 | +<style scoped> | |
| 89 | +.filter-wrapper { | |
| 90 | + margin-bottom: 20px; | |
| 91 | +} | |
| 92 | + | |
| 93 | +.filter-item { | |
| 94 | + width: 100%; | |
| 95 | +} | |
| 96 | + | |
| 97 | +.pagination-wrapper { | |
| 98 | + margin-top: 20px; | |
| 99 | + text-align: right; | |
| 100 | +} | |
| 101 | +</style> | |
| 0 | 102 | \ No newline at end of file | ... | ... |
src/components/index/indexNotice.vue
src/i18n/index.js
| ... | ... | @@ -143,6 +143,7 @@ import { messages as ownerInvoiceMessages } from '../views/fee/ownerInvoiceLang' |
| 143 | 143 | import { messages as invoiceApplyMessages } from '../views/fee/invoiceApplyLang' |
| 144 | 144 | import { messages as ownerApplyInvoiceMessages } from '../views/fee/ownerApplyInvoiceLang' |
| 145 | 145 | import { messages as invoiceApplyDetailMessages } from '../views/fee/invoiceApplyDetailLang' |
| 146 | +import { messages as feeConfigDetailMessages } from '../views/fee/feeConfigDetailLang' | |
| 146 | 147 | |
| 147 | 148 | Vue.use(VueI18n) |
| 148 | 149 | |
| ... | ... | @@ -290,6 +291,7 @@ const messages = { |
| 290 | 291 | ...invoiceApplyMessages.en, |
| 291 | 292 | ...ownerApplyInvoiceMessages.en, |
| 292 | 293 | ...invoiceApplyDetailMessages.en, |
| 294 | + ...feeConfigDetailMessages.en, | |
| 293 | 295 | }, |
| 294 | 296 | zh: { |
| 295 | 297 | ...loginMessages.zh, |
| ... | ... | @@ -433,6 +435,7 @@ const messages = { |
| 433 | 435 | ...invoiceApplyMessages.zh, |
| 434 | 436 | ...ownerApplyInvoiceMessages.zh, |
| 435 | 437 | ...invoiceApplyDetailMessages.zh, |
| 438 | + ...feeConfigDetailMessages.zh, | |
| 436 | 439 | } |
| 437 | 440 | } |
| 438 | 441 | ... | ... |
src/router/index.js
| ... | ... | @@ -697,20 +697,25 @@ const routes = [ |
| 697 | 697 | component: () => import('@/views/fee/addOwnerInvoiceList.vue') |
| 698 | 698 | }, |
| 699 | 699 | { |
| 700 | - path:'/pages/fee/invoiceApply', | |
| 701 | - name:'/pages/fee/invoiceApply', | |
| 700 | + path: '/pages/fee/invoiceApply', | |
| 701 | + name: '/pages/fee/invoiceApply', | |
| 702 | 702 | component: () => import('@/views/fee/invoiceApplyList.vue') |
| 703 | - }, | |
| 704 | - { | |
| 705 | - path:'/views/fee/ownerApplyInvoice', | |
| 706 | - name:'/views/fee/ownerApplyInvoice', | |
| 707 | - component: () => import('@/views/fee/ownerApplyInvoiceList.vue') | |
| 708 | - }, | |
| 709 | - { | |
| 710 | - path:'/views/fee/invoiceApplyDetail', | |
| 711 | - name:'/views/fee/invoiceApplyDetail', | |
| 712 | - component: () => import('@/views/fee/invoiceApplyDetailList.vue') | |
| 713 | - }, | |
| 703 | + }, | |
| 704 | + { | |
| 705 | + path: '/views/fee/ownerApplyInvoice', | |
| 706 | + name: '/views/fee/ownerApplyInvoice', | |
| 707 | + component: () => import('@/views/fee/ownerApplyInvoiceList.vue') | |
| 708 | + }, | |
| 709 | + { | |
| 710 | + path: '/views/fee/invoiceApplyDetail', | |
| 711 | + name: '/views/fee/invoiceApplyDetail', | |
| 712 | + component: () => import('@/views/fee/invoiceApplyDetailList.vue') | |
| 713 | + }, | |
| 714 | + { | |
| 715 | + path: '/views/fee/feeConfigDetail', | |
| 716 | + name: '/views/fee/feeConfigDetail', | |
| 717 | + component: () => import('@/views/fee/feeConfigDetailList.vue') | |
| 718 | + }, | |
| 714 | 719 | // 其他子路由可以在这里添加 |
| 715 | 720 | ] |
| 716 | 721 | }, | ... | ... |
src/views/fee/feeConfigDetailLang.js
0 → 100644
| 1 | +export const messages = { | |
| 2 | + en: { | |
| 3 | + feeConfigDetail: { | |
| 4 | + feeItemInfo: 'Fee Item Information', | |
| 5 | + feeType: 'Fee Type', | |
| 6 | + feeItem: 'Fee Item', | |
| 7 | + feeFlag: 'Fee Flag', | |
| 8 | + paymentCycle: 'Payment Cycle', | |
| 9 | + billType: 'Reminder Type', | |
| 10 | + startTime: 'Start Time', | |
| 11 | + endTime: 'End Time', | |
| 12 | + deductFrom: 'Account Deduction', | |
| 13 | + payOnline: 'Mobile Payment', | |
| 14 | + scale: 'Rounding Method', | |
| 15 | + rounding: 'Rounding', | |
| 16 | + upRound: 'Up Round', | |
| 17 | + downRound: 'Down Round', | |
| 18 | + decimalPlace: 'Decimal Places', | |
| 19 | + computingFormula: 'Calculation Formula', | |
| 20 | + squarePrice: 'Unit Price', | |
| 21 | + additionalAmount: 'Additional Fee', | |
| 22 | + modifyRecord: 'Modification Record', | |
| 23 | + createObject: 'Created Objects', | |
| 24 | + discount: 'Discount', | |
| 25 | + paymentType: 'Payment Type', | |
| 26 | + validity: 'Validity Period', | |
| 27 | + action: 'Action', | |
| 28 | + operator: 'Operator', | |
| 29 | + operateTime: 'Operate Time', | |
| 30 | + add: 'Add', | |
| 31 | + delete: 'Delete', | |
| 32 | + modifyNew: 'Modify (New)', | |
| 33 | + modifyOld: 'Modify (Old)', | |
| 34 | + feeId: 'Fee ID', | |
| 35 | + objectType: 'Object Type', | |
| 36 | + objectName: 'Object Name', | |
| 37 | + ownerName: 'Owner Name', | |
| 38 | + phone: 'Phone', | |
| 39 | + createTime: 'Create Time', | |
| 40 | + selectFeeObject: 'Select Fee Object', | |
| 41 | + house: 'House', | |
| 42 | + car: 'Car', | |
| 43 | + contract: 'Contract', | |
| 44 | + discountName: 'Discount Name', | |
| 45 | + rule: 'Rule', | |
| 46 | + discountType: 'Discount Type', | |
| 47 | + breach: 'Breach', | |
| 48 | + payStartTime: 'Payment Start Time', | |
| 49 | + payEndTime: 'Payment End Time', | |
| 50 | + discountEndTime: 'Discount End Time', | |
| 51 | + prePayment: 'Prepayment', | |
| 52 | + postPayment: 'Postpayment', | |
| 53 | + confirmDelete: 'Confirm Delete', | |
| 54 | + confirmDeleteDiscount: 'Are you sure to delete this discount?', | |
| 55 | + deleteSuccess: 'Delete successfully', | |
| 56 | + deleteFailed: 'Delete failed', | |
| 57 | + tip1: 'Payment start and end time: Constraints on payment time, i.e. the time when the cashier operates', | |
| 58 | + tip2: 'Discount end time: Indicates the maximum payment time', | |
| 59 | + tip3: 'If the current year fee cannot enjoy the discount, select the "No Arrears" rule in discount settings with arrears duration 0', | |
| 60 | + tip4: 'Then all arrears fees will not enjoy the discount, and the current year fee belongs to arrears so it does not enjoy the discount' | |
| 61 | + }, | |
| 62 | + }, | |
| 63 | + zh: { | |
| 64 | + feeConfigDetail: { | |
| 65 | + feeItemInfo: '费用项信息', | |
| 66 | + feeType: '费用类型', | |
| 67 | + feeItem: '费用项', | |
| 68 | + feeFlag: '费用标识', | |
| 69 | + paymentCycle: '缴费周期', | |
| 70 | + billType: '催缴类型', | |
| 71 | + startTime: '开始时间', | |
| 72 | + endTime: '结束时间', | |
| 73 | + deductFrom: '账户抵扣', | |
| 74 | + payOnline: '手机缴费', | |
| 75 | + scale: '进位方式', | |
| 76 | + rounding: '四舍五入', | |
| 77 | + upRound: '向上进位', | |
| 78 | + downRound: '向下进位', | |
| 79 | + decimalPlace: '保留小数', | |
| 80 | + computingFormula: '计算公式', | |
| 81 | + squarePrice: '计费单价', | |
| 82 | + additionalAmount: '附加费', | |
| 83 | + modifyRecord: '修改记录', | |
| 84 | + createObject: '创建对象', | |
| 85 | + discount: '优惠折扣', | |
| 86 | + paymentType: '付费类型', | |
| 87 | + validity: '有效期', | |
| 88 | + action: '动作', | |
| 89 | + operator: '操作人', | |
| 90 | + operateTime: '操作时间', | |
| 91 | + add: '添加', | |
| 92 | + delete: '删除', | |
| 93 | + modifyNew: '修改(新)', | |
| 94 | + modifyOld: '修改(旧)', | |
| 95 | + feeId: '费用编号', | |
| 96 | + objectType: '对象类型', | |
| 97 | + objectName: '对象名称', | |
| 98 | + ownerName: '业主名称', | |
| 99 | + phone: '手机号', | |
| 100 | + createTime: '创建时间', | |
| 101 | + selectFeeObject: '请选择费用对象', | |
| 102 | + house: '房屋', | |
| 103 | + car: '车辆', | |
| 104 | + contract: '合同', | |
| 105 | + discountName: '折扣名称', | |
| 106 | + rule: '规则', | |
| 107 | + discountType: '折扣类型', | |
| 108 | + breach: '违约', | |
| 109 | + payStartTime: '缴费起始时间', | |
| 110 | + payEndTime: '缴费结束时间', | |
| 111 | + discountEndTime: '折扣终止时间', | |
| 112 | + prePayment: '预付费', | |
| 113 | + postPayment: '后付费', | |
| 114 | + confirmDelete: '确认删除', | |
| 115 | + confirmDeleteDiscount: '确定要删除此折扣吗?', | |
| 116 | + deleteSuccess: '删除成功', | |
| 117 | + deleteFailed: '删除失败', | |
| 118 | + tip1: '缴费起始时间和缴费结束时间:这个约束缴费的时间,也就是前台收银员操作缴费的时间', | |
| 119 | + tip2: '折扣终止时间:这个表示最大缴费到什么时候', | |
| 120 | + tip3: '如果本年度费用不能享受优惠 那么在折扣设置中规则选择打折无欠费规则,并且欠费时长为0', | |
| 121 | + tip4: '这样所有欠费的费用则不享受优惠,本年度的费用属于欠费所以不享受优惠' | |
| 122 | + }, | |
| 123 | + } | |
| 124 | +} | |
| 0 | 125 | \ No newline at end of file | ... | ... |
src/views/fee/feeConfigDetailList.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div class="app-container"> | |
| 3 | + <el-card class="box-card"> | |
| 4 | + <div slot="header" class="clearfix"> | |
| 5 | + <div class="flex justify-between"> | |
| 6 | + <div class="text-title">{{ $t('feeConfigDetail.feeItemInfo') }}</div> | |
| 7 | + </div> | |
| 8 | + </div> | |
| 9 | + | |
| 10 | + <div class="form-wrapper"> | |
| 11 | + <el-row :gutter="20" class="text-left"> | |
| 12 | + <el-col :span="8"> | |
| 13 | + <div class="form-group"> | |
| 14 | + <label class="col-form-label">{{ $t('feeConfigDetail.feeType') }}:</label> | |
| 15 | + <label>{{ feeDetailInfo.feeTypeCdName }}</label> | |
| 16 | + </div> | |
| 17 | + </el-col> | |
| 18 | + <el-col :span="8"> | |
| 19 | + <div class="form-group"> | |
| 20 | + <label class="col-form-label">{{ $t('feeConfigDetail.feeItem') }}:</label> | |
| 21 | + <label>{{ feeDetailInfo.feeName }}</label> | |
| 22 | + </div> | |
| 23 | + </el-col> | |
| 24 | + <el-col :span="8"> | |
| 25 | + <div class="form-group"> | |
| 26 | + <label class="col-form-label">{{ $t('feeConfigDetail.feeFlag') }}:</label> | |
| 27 | + <label>{{ feeDetailInfo.feeFlagName || '-' }}</label> | |
| 28 | + </div> | |
| 29 | + </el-col> | |
| 30 | + </el-row> | |
| 31 | + | |
| 32 | + <el-row :gutter="20" class="text-left"> | |
| 33 | + <el-col :span="8"> | |
| 34 | + <div class="form-group"> | |
| 35 | + <label class="col-form-label">{{ $t('feeConfigDetail.paymentCycle') }}:</label> | |
| 36 | + <label>{{ feeDetailInfo.paymentCycle }}</label> | |
| 37 | + </div> | |
| 38 | + </el-col> | |
| 39 | + <el-col :span="8"> | |
| 40 | + <div class="form-group"> | |
| 41 | + <label class="col-form-label">{{ $t('feeConfigDetail.billType') }}:</label> | |
| 42 | + <label>{{ feeDetailInfo.billTypeName }}</label> | |
| 43 | + </div> | |
| 44 | + </el-col> | |
| 45 | + <el-col :span="8"> | |
| 46 | + <div class="form-group"> | |
| 47 | + <label class="col-form-label">{{ $t('feeConfigDetail.startTime') }}:</label> | |
| 48 | + <label>{{ feeDetailInfo.startTime }}</label> | |
| 49 | + </div> | |
| 50 | + </el-col> | |
| 51 | + </el-row> | |
| 52 | + | |
| 53 | + <el-row :gutter="20" class="text-left"> | |
| 54 | + <el-col :span="8"> | |
| 55 | + <div class="form-group"> | |
| 56 | + <label class="col-form-label">{{ $t('feeConfigDetail.endTime') }}:</label> | |
| 57 | + <label>{{ feeDetailInfo.endTime }}</label> | |
| 58 | + </div> | |
| 59 | + </el-col> | |
| 60 | + <el-col :span="8"> | |
| 61 | + <div class="form-group"> | |
| 62 | + <label class="col-form-label">{{ $t('feeConfigDetail.deductFrom') }}:</label> | |
| 63 | + <label>{{ feeDetailInfo.deductFrom == 'Y' ? $t('common.yes') : $t('common.no') }}</label> | |
| 64 | + </div> | |
| 65 | + </el-col> | |
| 66 | + <el-col :span="8"> | |
| 67 | + <div class="form-group"> | |
| 68 | + <label class="col-form-label">{{ $t('feeConfigDetail.payOnline') }}:</label> | |
| 69 | + <label>{{ feeDetailInfo.payOnline == 'Y' ? $t('common.yes') : $t('common.no') }}</label> | |
| 70 | + </div> | |
| 71 | + </el-col> | |
| 72 | + </el-row> | |
| 73 | + | |
| 74 | + <el-row :gutter="20" class="text-left"> | |
| 75 | + <el-col :span="8"> | |
| 76 | + <div class="form-group"> | |
| 77 | + <label class="col-form-label">{{ $t('feeConfigDetail.scale') }}:</label> | |
| 78 | + <label v-if="feeDetailInfo.scale == '1'">{{ $t('feeConfigDetail.rounding') }}</label> | |
| 79 | + <label v-if="feeDetailInfo.scale == '3'">{{ $t('feeConfigDetail.upRound') }}</label> | |
| 80 | + <label v-if="feeDetailInfo.scale == '4'">{{ $t('feeConfigDetail.downRound') }}</label> | |
| 81 | + </div> | |
| 82 | + </el-col> | |
| 83 | + <el-col :span="8"> | |
| 84 | + <div class="form-group"> | |
| 85 | + <label class="col-form-label">{{ $t('feeConfigDetail.decimalPlace') }}:</label> | |
| 86 | + <label>{{ feeDetailInfo.decimalPlace }}</label> | |
| 87 | + </div> | |
| 88 | + </el-col> | |
| 89 | + <el-col :span="8"> | |
| 90 | + <div class="form-group"> | |
| 91 | + <label class="col-form-label">{{ $t('feeConfigDetail.computingFormula') }}:</label> | |
| 92 | + <label>{{ feeDetailInfo.computingFormulaName }}</label> | |
| 93 | + </div> | |
| 94 | + </el-col> | |
| 95 | + </el-row> | |
| 96 | + | |
| 97 | + <el-row :gutter="20" class="text-left"> | |
| 98 | + <el-col :span="8"> | |
| 99 | + <div class="form-group"> | |
| 100 | + <label class="col-form-label">{{ $t('feeConfigDetail.squarePrice') }}:</label> | |
| 101 | + <label>{{ feeDetailInfo.squarePrice }}</label> | |
| 102 | + </div> | |
| 103 | + </el-col> | |
| 104 | + <el-col :span="8"> | |
| 105 | + <div class="form-group"> | |
| 106 | + <label class="col-form-label">{{ $t('feeConfigDetail.additionalAmount') }}:</label> | |
| 107 | + <label>{{ feeDetailInfo.additionalAmount }}</label> | |
| 108 | + </div> | |
| 109 | + </el-col> | |
| 110 | + </el-row> | |
| 111 | + </div> | |
| 112 | + | |
| 113 | + <el-divider></el-divider> | |
| 114 | + | |
| 115 | + <div class="tab-wrapper"> | |
| 116 | + <el-tabs v-model="feeDetailInfo.currentTab" @tab-click="changeTab(feeDetailInfo.currentTab)"> | |
| 117 | + <el-tab-pane :label="$t('feeConfigDetail.modifyRecord')" name="feeConfigDetailHis"> | |
| 118 | + <fee-config-detail-his ref="feeConfigDetailHis" | |
| 119 | + v-if="feeDetailInfo.currentTab === 'feeConfigDetailHis'"></fee-config-detail-his> | |
| 120 | + </el-tab-pane> | |
| 121 | + <el-tab-pane :label="$t('feeConfigDetail.createObject')" name="feeDetailFeeObj"> | |
| 122 | + <fee-detail-fee-obj ref="feeDetailFeeObj" | |
| 123 | + v-if="feeDetailInfo.currentTab === 'feeDetailFeeObj'"></fee-detail-fee-obj> | |
| 124 | + </el-tab-pane> | |
| 125 | + <el-tab-pane :label="$t('feeConfigDetail.discount')" name="feeConfigDetailDiscount"> | |
| 126 | + <fee-config-detail-discount ref="feeConfigDetailDiscount" | |
| 127 | + v-if="feeDetailInfo.currentTab === 'feeConfigDetailDiscount'"></fee-config-detail-discount> | |
| 128 | + </el-tab-pane> | |
| 129 | + </el-tabs> | |
| 130 | + </div> | |
| 131 | + </el-card> | |
| 132 | + </div> | |
| 133 | +</template> | |
| 134 | + | |
| 135 | +<script> | |
| 136 | +import { getFeeConfigDetail } from '@/api/fee/feeConfigDetailApi' | |
| 137 | +import FeeConfigDetailHis from '@/components/fee/FeeConfigDetailHis' | |
| 138 | +import FeeDetailFeeObj from '@/components/fee/FeeDetailFeeObj' | |
| 139 | +import FeeConfigDetailDiscount from '@/components/fee/FeeConfigDetailDiscount' | |
| 140 | + | |
| 141 | +export default { | |
| 142 | + name: 'FeeConfigDetailList', | |
| 143 | + components: { | |
| 144 | + FeeConfigDetailHis, | |
| 145 | + FeeDetailFeeObj, | |
| 146 | + FeeConfigDetailDiscount | |
| 147 | + }, | |
| 148 | + data() { | |
| 149 | + return { | |
| 150 | + feeDetailInfo: { | |
| 151 | + configId: '', | |
| 152 | + feeTypeCdName: '', | |
| 153 | + feeName: '', | |
| 154 | + feeFlagName: '', | |
| 155 | + startTime: '', | |
| 156 | + endTime: '', | |
| 157 | + computingFormulaName: '', | |
| 158 | + squarePrice: '', | |
| 159 | + additionalAmount: '0.00', | |
| 160 | + isDefault: '', | |
| 161 | + billTypeName: '', | |
| 162 | + paymentCycle: '', | |
| 163 | + paymentCd: '', | |
| 164 | + computingFormulaText: '', | |
| 165 | + deductFrom: '', | |
| 166 | + payOnline: 'Y', | |
| 167 | + scale: '1', | |
| 168 | + decimalPlace: '2', | |
| 169 | + units: '元', | |
| 170 | + currentTab: 'feeConfigDetailHis', | |
| 171 | + needBack: false | |
| 172 | + } | |
| 173 | + } | |
| 174 | + }, | |
| 175 | + created() { | |
| 176 | + this.feeDetailInfo.configId = this.$route.query.configId | |
| 177 | + if (this.feeDetailInfo.configId) { | |
| 178 | + this.loadFeeDetailInfo() | |
| 179 | + } | |
| 180 | + }, | |
| 181 | + methods: { | |
| 182 | + async loadFeeDetailInfo() { | |
| 183 | + try { | |
| 184 | + const params = { | |
| 185 | + configId: this.feeDetailInfo.configId, | |
| 186 | + communityId: this.getCommunityId(), | |
| 187 | + page: 1, | |
| 188 | + row: 1 | |
| 189 | + } | |
| 190 | + const { feeConfigs } = await getFeeConfigDetail(params) | |
| 191 | + Object.assign(this.feeDetailInfo, feeConfigs[0]) | |
| 192 | + this.changeTab(this.feeDetailInfo.currentTab) | |
| 193 | + } catch (error) { | |
| 194 | + console.error('Failed to load fee detail info:', error) | |
| 195 | + } | |
| 196 | + }, | |
| 197 | + changeTab(tab) { | |
| 198 | + this.feeDetailInfo.currentTab = tab | |
| 199 | + setTimeout(() => { | |
| 200 | + this.$nextTick(() => { | |
| 201 | + this.$refs[tab].switchTab({ | |
| 202 | + configId: this.feeDetailInfo.configId | |
| 203 | + }) | |
| 204 | + }) | |
| 205 | + },500) | |
| 206 | + } | |
| 207 | + } | |
| 208 | +} | |
| 209 | +</script> | |
| 210 | + | |
| 211 | +<style lang="scss" scoped> | |
| 212 | +.app-container { | |
| 213 | + padding: 20px; | |
| 214 | +} | |
| 215 | + | |
| 216 | +.form-wrapper { | |
| 217 | + margin-top: 20px; | |
| 218 | + | |
| 219 | + .form-group { | |
| 220 | + margin-bottom: 20px; | |
| 221 | + | |
| 222 | + .col-form-label { | |
| 223 | + margin-right: 10px; | |
| 224 | + } | |
| 225 | + } | |
| 226 | +} | |
| 227 | + | |
| 228 | +.tab-wrapper { | |
| 229 | + margin-top: 20px; | |
| 230 | +}</style> | |
| 0 | 231 | \ No newline at end of file | ... | ... |
src/views/fee/feeConfigManageList.vue
| ... | ... | @@ -6,7 +6,8 @@ |
| 6 | 6 | <div class="margin-xs-r treeview"> |
| 7 | 7 | <ul class="list-group text-center border-radius"> |
| 8 | 8 | <li v-for="(item, index) in feeTypeCds" :key="index" @click="swatchFeeTypeCd(item)" |
| 9 | - :class="{ 'vc-node-selected': conditions.feeTypeCd == item.statusCd }" class="list-group-item node-orgTree"> | |
| 9 | + :class="{ 'vc-node-selected': conditions.feeTypeCd == item.statusCd }" | |
| 10 | + class="list-group-item node-orgTree"> | |
| 10 | 11 | {{ item.name }} |
| 11 | 12 | </li> |
| 12 | 13 | </ul> |
| ... | ... | @@ -173,7 +174,7 @@ import { listFeeConfigs } from '@/api/fee/feeConfigManageApi' |
| 173 | 174 | import AddFeeConfig from '@/components/fee/addFeeConfig' |
| 174 | 175 | import EditFeeConfig from '@/components/fee/editFeeConfig' |
| 175 | 176 | import DeleteFeeConfig from '@/components/fee/deleteFeeConfig' |
| 176 | -import {getDict} from '@/api/community/communityApi' | |
| 177 | +import { getDict } from '@/api/community/communityApi' | |
| 177 | 178 | |
| 178 | 179 | export default { |
| 179 | 180 | name: 'FeeConfigManageList', |
| ... | ... | @@ -211,8 +212,12 @@ export default { |
| 211 | 212 | methods: { |
| 212 | 213 | async loadDicts() { |
| 213 | 214 | |
| 214 | - const data = await getDict('pay_fee_config', 'fee_type_cd') | |
| 215 | - this.feeTypeCds = data | |
| 215 | + const data = await getDict('pay_fee_config', 'fee_type_cd') | |
| 216 | + let _feeTypeCds = { | |
| 217 | + name: this.$t('common.all'), | |
| 218 | + value: '' | |
| 219 | + } | |
| 220 | + this.feeTypeCds = [_feeTypeCds, ...data] | |
| 216 | 221 | }, |
| 217 | 222 | |
| 218 | 223 | async _listFeeConfigs() { |
| ... | ... | @@ -283,7 +288,7 @@ export default { |
| 283 | 288 | }, |
| 284 | 289 | |
| 285 | 290 | _openFeeConfigDetail(feeConfig) { |
| 286 | - window.open(`/#/fee/feeConfigDetail?configId=${feeConfig.configId}`) | |
| 291 | + window.open(`/#/views/fee/feeConfigDetail?configId=${feeConfig.configId}`) | |
| 287 | 292 | }, |
| 288 | 293 | |
| 289 | 294 | handlePageChange(page) { | ... | ... |