Commit 32a770b52980a7afdb559cf64bae85fb98391088

Authored by wuxw
1 parent 9b01bbd3

加入费用项明细功能

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
... ... @@ -156,6 +156,7 @@ export default {
156 156 overflow: hidden;
157 157 text-overflow: ellipsis;
158 158 white-space: nowrap;
  159 + text-align: left;
159 160 }
160 161  
161 162 .vc-index-notice-time {
... ...
src/i18n/index.js
... ... @@ -143,6 +143,7 @@ import { messages as ownerInvoiceMessages } from &#39;../views/fee/ownerInvoiceLang&#39;
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 &#39;@/api/fee/feeConfigManageApi&#39;
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) {
... ...