Commit 29e25b468524391b999c3a4eb83bd430fc5890de

Authored by wuxw
1 parent 08c01d85

开发完成运营费用明细功能

Showing 33 changed files with 1828 additions and 4 deletions
src/api/aCommunity/aFeeDetailConfigApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function queryAdminFeeConfigs(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/feeConfig.queryAdminFeeConfigs',
  7 + method: 'get',
  8 + params
  9 + }).then(response => {
  10 + const res = response.data
  11 + resolve(res)
  12 + }).catch(error => {
  13 + reject(error)
  14 + })
  15 + })
  16 +}
0 \ No newline at end of file 17 \ No newline at end of file
src/api/aCommunity/aFeeDetailDiscountApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function queryAdminApplyRoomDiscount(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/fee.queryAdminApplyRoomDiscount',
  7 + method: 'get',
  8 + params
  9 + }).then(response => {
  10 + const res = response.data
  11 + if (res.code === 0) {
  12 + resolve(res)
  13 + } else {
  14 + reject(new Error(res.msg || '获取费用折扣数据失败'))
  15 + }
  16 + }).catch(error => {
  17 + reject(error)
  18 + })
  19 + })
  20 +}
0 \ No newline at end of file 21 \ No newline at end of file
src/api/aCommunity/aFeeDetailFeeObjApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function listAdminConfigFeeObjs(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/feeConfig.listAdminConfigFeeObjs',
  7 + method: 'get',
  8 + params
  9 + }).then(response => {
  10 + const res = response.data
  11 + if (res.code === 0) {
  12 + resolve(res)
  13 + } else {
  14 + reject(new Error(res.msg || '获取费用对象数据失败'))
  15 + }
  16 + }).catch(error => {
  17 + reject(error)
  18 + })
  19 + })
  20 +}
0 \ No newline at end of file 21 \ No newline at end of file
src/api/aCommunity/aFeeDetailHisApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function queryAdminHisFee(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/fee.queryAdminHisFee',
  7 + method: 'get',
  8 + params
  9 + }).then(response => {
  10 + const res = response.data
  11 + if (res.code === 0) {
  12 + resolve(res)
  13 + } else {
  14 + reject(new Error(res.msg || '获取费用历史数据失败'))
  15 + }
  16 + }).catch(error => {
  17 + reject(error)
  18 + })
  19 + })
  20 +}
0 \ No newline at end of file 21 \ No newline at end of file
src/api/aCommunity/aFeeDetailImportApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +export function queryAdminImportFeeDetail(params) {
  4 + return new Promise((resolve, reject) => {
  5 + request({
  6 + url: '/fee.queryAdminImportFeeDetail',
  7 + method: 'get',
  8 + params
  9 + }).then(response => {
  10 + const res = response.data
  11 + if (res.code === 0) {
  12 + resolve(res)
  13 + } else {
  14 + reject(new Error(res.msg || '获取导入费用明细数据失败'))
  15 + }
  16 + }).catch(error => {
  17 + reject(error)
  18 + })
  19 + })
  20 +}
0 \ No newline at end of file 21 \ No newline at end of file
src/api/aCommunity/aFeeDetailSubApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取子费用列表
  4 +export function listAdminPayFeeSub(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/feeSub.listAdminPayFeeSub',
  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 listAdminFee(params) {
  25 + return new Promise((resolve, reject) => {
  26 + request({
  27 + url: '/fee.listAdminFee',
  28 + method: 'get',
  29 + params
  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/aCommunity/adminFeeDetailApi.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 获取费用详情列表
  4 +export function getFeeDetail(params) {
  5 + return new Promise((resolve, reject) => {
  6 + request({
  7 + url: '/fee.listAdminFee',
  8 + method: 'get',
  9 + params
  10 + }).then(response => {
  11 + const res = response.data
  12 + resolve(res)
  13 +
  14 + }).catch(error => {
  15 + reject(error)
  16 + })
  17 + })
  18 +}
  19 +
  20 +// 更新费用信息
  21 +export function updateFeeDetail(data) {
  22 + return new Promise((resolve, reject) => {
  23 + request({
  24 + url: '/fee.updateAdminFee',
  25 + method: 'post',
  26 + data
  27 + }).then(response => {
  28 + const res = response.data
  29 + if (res.code === 0) {
  30 + resolve(res)
  31 + } else {
  32 + reject(new Error(res.msg || '更新费用信息失败'))
  33 + }
  34 + }).catch(error => {
  35 + reject(error)
  36 + })
  37 + })
  38 +}
  39 +
  40 +// 删除费用信息
  41 +export function deleteFeeDetail(params) {
  42 + return new Promise((resolve, reject) => {
  43 + request({
  44 + url: '/fee.deleteAdminFee',
  45 + method: 'get',
  46 + params
  47 + }).then(response => {
  48 + const res = response.data
  49 + if (res.code === 0) {
  50 + resolve(res)
  51 + } else {
  52 + reject(new Error(res.msg || '删除费用信息失败'))
  53 + }
  54 + }).catch(error => {
  55 + reject(error)
  56 + })
  57 + })
  58 +}
0 \ No newline at end of file 59 \ No newline at end of file
src/components/aCommunity/aFeeDetailConfig.vue 0 → 100644
  1 +<template>
  2 + <div class="margin-top">
  3 + <el-table :data="aFeeDetailConfigInfo.feeConfigs" border style="width: 100%">
  4 + <el-table-column prop="feeTypeCdName" :label="$t('aFeeDetailConfig.feeType')" align="center"></el-table-column>
  5 + <el-table-column prop="feeName" :label="$t('aFeeDetailConfig.feeItem')" align="center"></el-table-column>
  6 + <el-table-column prop="feeFlagName" :label="$t('aFeeDetailConfig.feeFlag')" align="center"></el-table-column>
  7 + <el-table-column prop="billTypeName" :label="$t('aFeeDetailConfig.billType')" align="center"></el-table-column>
  8 + <el-table-column :label="$t('aFeeDetailConfig.paymentType')" align="center">
  9 + <template #default="{ row }">{{ row.paymentCd === '1200' ? $t('aFeeDetailConfig.prepay') :
  10 + $t('aFeeDetailConfig.postpay')}}</template>
  11 + </el-table-column>
  12 + <el-table-column prop="paymentCycle" :label="$t('aFeeDetailConfig.paymentCycle')"
  13 + align="center"></el-table-column>
  14 + <el-table-column prop="units" :label="$t('aFeeDetailConfig.unit')" align="center"></el-table-column>
  15 + <el-table-column prop="computingFormulaName" :label="$t('aFeeDetailConfig.formula')"
  16 + align="center"></el-table-column>
  17 + <el-table-column :label="$t('aFeeDetailConfig.unitPrice')" align="center">
  18 + <template #default="{ row }">{{ row.computingFormula === '2002' ? '-' : row.squarePrice }}</template>
  19 + </el-table-column>
  20 + <el-table-column prop="additionalAmount" :label="$t('aFeeDetailConfig.additionalFee')"
  21 + align="center"></el-table-column>
  22 + <el-table-column :label="$t('aFeeDetailConfig.accountDeduction')" align="center">
  23 + <template #default="{ row }">{{ row.deductFrom === 'Y' ? $t('aFeeDetailConfig.yes') :
  24 + $t('aFeeDetailConfig.no')}}</template>
  25 + </el-table-column>
  26 + <el-table-column :label="$t('aFeeDetailConfig.mobilePayment')" align="center">
  27 + <template #default="{ row }">{{ row.payOnline === 'Y' ? $t('aFeeDetailConfig.yes') :
  28 + $t('aFeeDetailConfig.no')}}</template>
  29 + </el-table-column>
  30 + <el-table-column prop="scale" :label="$t('aFeeDetailConfig.decimalPlaces')" align="center"></el-table-column>
  31 + </el-table>
  32 +
  33 + <el-row class="margin-top">
  34 + <el-col :span="12"></el-col>
  35 + <el-col :span="12">
  36 + <el-pagination @current-change="handlePageChange" :current-page="currentPage" :page-size="pageSize"
  37 + layout="total, prev, pager, next, jumper" :total="total">
  38 + </el-pagination>
  39 + </el-col>
  40 + </el-row>
  41 + </div>
  42 +</template>
  43 +
  44 +<script>
  45 +import { queryAdminFeeConfigs } from '@/api/aCommunity/aFeeDetailConfigApi'
  46 +
  47 +export default {
  48 + name: 'AFeeDetailConfig',
  49 + data() {
  50 + return {
  51 + aFeeDetailConfigInfo: {
  52 + feeConfigs: [],
  53 + configId: ''
  54 + },
  55 + currentPage: 1,
  56 + pageSize: 10,
  57 + total: 0
  58 + }
  59 + },
  60 + methods: {
  61 + open(data) {
  62 + this.aFeeDetailConfigInfo.configId = data.configId
  63 + this._loadAFeeDetailConfigData()
  64 + },
  65 + handleSwitch(data) {
  66 + this.aFeeDetailConfigInfo.configId = data.configId
  67 + this._loadAFeeDetailConfigData()
  68 + },
  69 + handleNotify() {
  70 + this._loadAFeeDetailConfigData()
  71 + },
  72 + handlePageChange(page) {
  73 + this.currentPage = page
  74 + this._loadAFeeDetailConfigData()
  75 + },
  76 + async _loadAFeeDetailConfigData() {
  77 + try {
  78 + const params = {
  79 + configId: this.aFeeDetailConfigInfo.configId,
  80 + page: this.currentPage,
  81 + row: this.pageSize
  82 + }
  83 +
  84 + const res = await queryAdminFeeConfigs(params)
  85 + this.aFeeDetailConfigInfo.feeConfigs = res.feeConfigs
  86 + this.total = res.records
  87 + } catch (error) {
  88 + console.error('加载费用配置数据失败:', error)
  89 + }
  90 + }
  91 + }
  92 +}
  93 +</script>
  94 +
  95 +<style scoped>
  96 +.margin-top {
  97 + margin-top: 20px;
  98 +}
  99 +</style>
0 \ No newline at end of file 100 \ No newline at end of file
src/components/aCommunity/aFeeDetailConfigDemo.vue 0 → 100644
  1 +<template>
  2 + <a-fee-detail-config ref="feeConfigComponent" />
  3 +</template>
  4 +
  5 +<script>
  6 +import AFeeDetailConfig from './aFeeDetailConfig'
  7 +
  8 +export default {
  9 + components: {
  10 + AFeeDetailConfig
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.feeConfigComponent.handleSwitch(data)
  15 + },
  16 + refresh() {
  17 + this.$refs.feeConfigComponent.handleNotify()
  18 + }
  19 + }
  20 +}
  21 +</script>
0 \ No newline at end of file 22 \ No newline at end of file
src/components/aCommunity/aFeeDetailDiscount.vue 0 → 100644
  1 +<template>
  2 + <div class="margin-top">
  3 + <el-table :data="aFeeDetailDiscountInfo.applyRoomDiscounts" border style="width: 100%">
  4 + <el-table-column prop="roomName" :label="$t('aFeeDetailDiscount.roomName')" align="center"></el-table-column>
  5 + <el-table-column prop="discountId" :label="$t('aFeeDetailDiscount.discountId')" align="center"></el-table-column>
  6 + <el-table-column prop="discountName" :label="$t('aFeeDetailDiscount.discountName')" align="center"></el-table-column>
  7 + <el-table-column prop="applyTypeName" :label="$t('aFeeDetailDiscount.applyType')" align="center"></el-table-column>
  8 + <el-table-column prop="createUserName" :label="$t('aFeeDetailDiscount.applicant')" align="center"></el-table-column>
  9 + <el-table-column prop="createUserTel" :label="$t('aFeeDetailDiscount.applicantPhone')" align="center"></el-table-column>
  10 + <el-table-column prop="startTime" :label="$t('aFeeDetailDiscount.startTime')" align="center"></el-table-column>
  11 + <el-table-column prop="endTime" :label="$t('aFeeDetailDiscount.endTime')" align="center"></el-table-column>
  12 + <el-table-column prop="stateName" :label="$t('aFeeDetailDiscount.status')" align="center"></el-table-column>
  13 + <el-table-column prop="createTime" :label="$t('aFeeDetailDiscount.createTime')" align="center"></el-table-column>
  14 + <el-table-column :label="$t('aFeeDetailDiscount.useStatus')" align="center">
  15 + <template #default="{row}">{{row.inUse === '0' ? $t('aFeeDetailDiscount.notUsed') : $t('aFeeDetailDiscount.used')}}</template>
  16 + </el-table-column>
  17 + <el-table-column :label="$t('aFeeDetailDiscount.returnType')" align="center">
  18 + <template #default="{row}">
  19 + <span v-if="row.discountId">
  20 + {{row.returnWay === '1002' ? $t('aFeeDetailDiscount.accountBalance') : $t('aFeeDetailDiscount.discount')}}
  21 + </span>
  22 + <span v-else>-</span>
  23 + </template>
  24 + </el-table-column>
  25 + <el-table-column :label="$t('aFeeDetailDiscount.returnAmount')" align="center">
  26 + <template #default="{row}">{{row.returnAmount ? row.returnAmount : '-'}}</template>
  27 + </el-table-column>
  28 + </el-table>
  29 +
  30 + <el-row class="margin-top">
  31 + <el-col :span="12"></el-col>
  32 + <el-col :span="12">
  33 + <el-pagination
  34 + @current-change="handlePageChange"
  35 + :current-page="currentPage"
  36 + :page-size="pageSize"
  37 + layout="total, prev, pager, next, jumper"
  38 + :total="total">
  39 + </el-pagination>
  40 + </el-col>
  41 + </el-row>
  42 + </div>
  43 +</template>
  44 +
  45 +<script>
  46 +import { queryAdminApplyRoomDiscount } from '@/api/aCommunity/aFeeDetailDiscountApi'
  47 +
  48 +export default {
  49 + name: 'AFeeDetailDiscount',
  50 + data() {
  51 + return {
  52 + aFeeDetailDiscountInfo: {
  53 + applyRoomDiscounts: [],
  54 + feeId: ''
  55 + },
  56 + currentPage: 1,
  57 + pageSize: 10,
  58 + total: 0
  59 + }
  60 + },
  61 + methods: {
  62 + open(data) {
  63 + this.aFeeDetailDiscountInfo.feeId = data.feeId
  64 + this._loadAFeeDetailDiscountData()
  65 + },
  66 + handleSwitch(data) {
  67 + this.aFeeDetailDiscountInfo.feeId = data.feeId
  68 + this._loadAFeeDetailDiscountData()
  69 + },
  70 + handlePageChange(page) {
  71 + this.currentPage = page
  72 + this._loadAFeeDetailDiscountData()
  73 + },
  74 + async _loadAFeeDetailDiscountData() {
  75 + try {
  76 + const params = {
  77 + feeId: this.aFeeDetailDiscountInfo.feeId,
  78 + page: this.currentPage,
  79 + row: this.pageSize
  80 + }
  81 +
  82 + const res = await queryAdminApplyRoomDiscount(params)
  83 + this.aFeeDetailDiscountInfo.applyRoomDiscounts = res.data
  84 + this.total = res.records
  85 + } catch (error) {
  86 + console.error('加载费用折扣数据失败:', error)
  87 + }
  88 + }
  89 + }
  90 +}
  91 +</script>
  92 +
  93 +<style scoped>
  94 +.margin-top {
  95 + margin-top: 20px;
  96 +}
  97 +</style>
0 \ No newline at end of file 98 \ No newline at end of file
src/components/aCommunity/aFeeDetailDiscountDemo.vue 0 → 100644
  1 +<template>
  2 + <a-fee-detail-discount ref="feeDiscountComponent" />
  3 +</template>
  4 +
  5 +<script>
  6 +import AFeeDetailDiscount from './aFeeDetailDiscount'
  7 +
  8 +export default {
  9 + components: {
  10 + AFeeDetailDiscount
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.feeDiscountComponent.handleSwitch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/aCommunity/aFeeDetailFeeObj.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <el-row class="margin-top">
  4 + <el-col :span="4">
  5 + <el-select v-model="aFeeDetailFeeObjInfo.payerObjType" class="w-100" :placeholder="$t('aFeeDetailFeeObj.selectFeeObj')">
  6 + <el-option :label="$t('aFeeDetailFeeObj.house')" value="3333"></el-option>
  7 + <el-option :label="$t('aFeeDetailFeeObj.car')" value="6666"></el-option>
  8 + <el-option :label="$t('aFeeDetailFeeObj.contract')" value="7777"></el-option>
  9 + </el-select>
  10 + </el-col>
  11 + <el-col :span="4" class="pl-10">
  12 + <el-button type="primary" size="small" @click="_qureyAFeeDetailFeeObj">
  13 + {{$t('aFeeDetailFeeObj.query')}}
  14 + </el-button>
  15 + </el-col>
  16 + </el-row>
  17 +
  18 + <div class="margin-top">
  19 + <el-table :data="aFeeDetailFeeObjInfo.feeObjs" border style="width: 100%">
  20 + <el-table-column prop="feeId" :label="$t('aFeeDetailFeeObj.feeId')" align="center"></el-table-column>
  21 + <el-table-column :label="$t('aFeeDetailFeeObj.objType')" align="center">
  22 + <template #default="{row}">
  23 + <span v-if="row.payerObjType === '3333'">{{$t('aFeeDetailFeeObj.house')}}</span>
  24 + <span v-else-if="row.payerObjType === '6666'">{{$t('aFeeDetailFeeObj.car')}}</span>
  25 + <span v-else>{{$t('aFeeDetailFeeObj.contract')}}</span>
  26 + </template>
  27 + </el-table-column>
  28 + <el-table-column prop="payerObjName" :label="$t('aFeeDetailFeeObj.objName')" align="center"></el-table-column>
  29 + <el-table-column prop="ownerName" :label="$t('aFeeDetailFeeObj.ownerName')" align="center"></el-table-column>
  30 + <el-table-column prop="ownerTel" :label="$t('aFeeDetailFeeObj.phone')" align="center"></el-table-column>
  31 + <el-table-column prop="createTime" :label="$t('aFeeDetailFeeObj.createTime')" align="center"></el-table-column>
  32 + </el-table>
  33 +
  34 + <el-row class="margin-top">
  35 + <el-col :span="12"></el-col>
  36 + <el-col :span="12">
  37 + <el-pagination
  38 + @current-change="handlePageChange"
  39 + :current-page="currentPage"
  40 + :page-size="pageSize"
  41 + layout="total, prev, pager, next, jumper"
  42 + :total="total">
  43 + </el-pagination>
  44 + </el-col>
  45 + </el-row>
  46 + </div>
  47 + </div>
  48 +</template>
  49 +
  50 +<script>
  51 +import { listAdminConfigFeeObjs } from '@/api/aCommunity/aFeeDetailFeeObjApi'
  52 +
  53 +export default {
  54 + name: 'AFeeDetailFeeObj',
  55 + data() {
  56 + return {
  57 + aFeeDetailFeeObjInfo: {
  58 + feeObjs: [],
  59 + configId: '',
  60 + payerObjType: ''
  61 + },
  62 + currentPage: 1,
  63 + pageSize: 10,
  64 + total: 0
  65 + }
  66 + },
  67 + methods: {
  68 + open(data) {
  69 + this.aFeeDetailFeeObjInfo.configId = data.configId
  70 + this._loadAFeeDetailFeeObjData()
  71 + },
  72 + handleSwitch(data) {
  73 + this.aFeeDetailFeeObjInfo.configId = data.configId
  74 + this._loadAFeeDetailFeeObjData()
  75 + },
  76 + handlePageChange(page) {
  77 + this.currentPage = page
  78 + this._loadAFeeDetailFeeObjData()
  79 + },
  80 + async _loadAFeeDetailFeeObjData() {
  81 + try {
  82 + const params = {
  83 + configId: this.aFeeDetailFeeObjInfo.configId,
  84 + payerObjType: this.aFeeDetailFeeObjInfo.payerObjType,
  85 + page: this.currentPage,
  86 + row: this.pageSize
  87 + }
  88 +
  89 + const res = await listAdminConfigFeeObjs(params)
  90 + this.aFeeDetailFeeObjInfo.feeObjs = res.data
  91 + this.total = res.records
  92 + } catch (error) {
  93 + console.error('加载费用对象数据失败:', error)
  94 + }
  95 + },
  96 + _qureyAFeeDetailFeeObj() {
  97 + this.currentPage = 1
  98 + this._loadAFeeDetailFeeObjData()
  99 + }
  100 + }
  101 +}
  102 +</script>
  103 +
  104 +<style scoped>
  105 +.margin-top {
  106 + margin-top: 20px;
  107 +}
  108 +.pl-10 {
  109 + padding-left: 10px;
  110 +}
  111 +.w-100 {
  112 + width: 100%;
  113 +}
  114 +</style>
0 \ No newline at end of file 115 \ No newline at end of file
src/components/aCommunity/aFeeDetailFeeObjDemo.vue 0 → 100644
  1 +<template>
  2 + <a-fee-detail-fee-obj ref="feeObjComponent" />
  3 +</template>
  4 +
  5 +<script>
  6 +import AFeeDetailFeeObj from './aFeeDetailFeeObj'
  7 +
  8 +export default {
  9 + components: {
  10 + AFeeDetailFeeObj
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.feeObjComponent.handleSwitch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/aCommunity/aFeeDetailHis.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <el-row>
  4 + <el-col :span="24" class="text-right"></el-col>
  5 + </el-row>
  6 + <div class="margin-top">
  7 + <el-table :data="aFeeDetailHisInfo.fees" border style="width: 100%">
  8 + <el-table-column prop="feeName" :label="$t('aFeeDetailHis.feeName')" align="center">
  9 + <template #default="{ row }">
  10 + {{ row.feeName }}
  11 + <span v-if="row.payerObjName">({{ row.payerObjName }})</span>
  12 + </template>
  13 + </el-table-column>
  14 + <el-table-column prop="startTime" :label="$t('aFeeDetailHis.startTime')" align="center">
  15 + <template #default="{ row }">{{ row.startTime || '-' }}</template>
  16 + </el-table-column>
  17 + <el-table-column prop="endTime" :label="$t('aFeeDetailHis.endTime')" align="center">
  18 + <template #default="{ row }">{{ row.endTime || '-' }}</template>
  19 + </el-table-column>
  20 + <el-table-column :label="$t('aFeeDetailHis.operation')" align="center">
  21 + <template #default="{ row }">{{ _getFeeHisOperate(row) }}</template>
  22 + </el-table-column>
  23 + <el-table-column prop="userName" :label="$t('aFeeDetailHis.operator')" align="center">
  24 + <template #default="{ row }">{{ row.userName || '-' }}</template>
  25 + </el-table-column>
  26 + <el-table-column prop="createTime" :label="$t('aFeeDetailHis.operationTime')" align="center"></el-table-column>
  27 + </el-table>
  28 +
  29 + <el-row class="margin-top">
  30 + <el-col :span="12"></el-col>
  31 + <el-col :span="12">
  32 + <el-pagination @current-change="handlePageChange" :current-page="currentPage" :page-size="pageSize"
  33 + layout="total, prev, pager, next, jumper" :total="total">
  34 + </el-pagination>
  35 + </el-col>
  36 + </el-row>
  37 + </div>
  38 + </div>
  39 +</template>
  40 +
  41 +<script>
  42 +import { queryAdminHisFee } from '@/api/aCommunity/aFeeDetailHisApi'
  43 +
  44 +export default {
  45 + name: 'AFeeDetailHis',
  46 + data() {
  47 + return {
  48 + aFeeDetailHisInfo: {
  49 + fees: [],
  50 + feeId: '',
  51 + staffNameLike: '',
  52 + feeNameLike: '',
  53 + payerObjName: '',
  54 + logStartTime: '',
  55 + logEndTime: ''
  56 + },
  57 + currentPage: 1,
  58 + pageSize: 10,
  59 + total: 0
  60 + }
  61 + },
  62 + methods: {
  63 + open(data) {
  64 + this.aFeeDetailHisInfo.feeId = data.feeId
  65 + this.aFeeDetailHisInfo.staffNameLike = data.staffNameLike
  66 + this.aFeeDetailHisInfo.feeNameLike = data.feeNameLike
  67 + this.aFeeDetailHisInfo.payerObjName = data.payerObjName
  68 + this.aFeeDetailHisInfo.logStartTime = data.logStartTime
  69 + this.aFeeDetailHisInfo.logEndTime = data.logEndTime
  70 + this._loadAFeeDetailHisData()
  71 + },
  72 + handleSwitch(data) {
  73 + this.aFeeDetailHisInfo.feeId = data.feeId
  74 + this.aFeeDetailHisInfo.staffNameLike = data.staffNameLike
  75 + this.aFeeDetailHisInfo.feeNameLike = data.feeNameLike
  76 + this.aFeeDetailHisInfo.payerObjName = data.payerObjName
  77 + this.aFeeDetailHisInfo.logStartTime = data.logStartTime
  78 + this.aFeeDetailHisInfo.logEndTime = data.logEndTime
  79 + this._loadAFeeDetailHisData()
  80 + },
  81 + handleNotify() {
  82 + this._loadAFeeDetailHisData()
  83 + },
  84 + handlePageChange(page) {
  85 + this.currentPage = page
  86 + this._loadAFeeDetailHisData()
  87 + },
  88 + async _loadAFeeDetailHisData() {
  89 + try {
  90 + const params = {
  91 + feeId: this.aFeeDetailHisInfo.feeId,
  92 + staffNameLike: this.aFeeDetailHisInfo.staffNameLike,
  93 + feeNameLike: this.aFeeDetailHisInfo.feeNameLike,
  94 + payerObjName: this.aFeeDetailHisInfo.payerObjName,
  95 + logStartTime: this.aFeeDetailHisInfo.logStartTime,
  96 + logEndTime: this.aFeeDetailHisInfo.logEndTime,
  97 + page: this.currentPage,
  98 + row: this.pageSize
  99 + }
  100 +
  101 + const res = await queryAdminHisFee(params)
  102 + this.aFeeDetailHisInfo.fees = res.data
  103 + this.total = res.records
  104 + } catch (error) {
  105 + console.error('加载费用历史数据失败:', error)
  106 + }
  107 + },
  108 + _getFeeHisOperate(fee) {
  109 + let feeCount = 0
  110 + this.aFeeDetailHisInfo.fees.forEach(item => {
  111 + if (fee.bId === item.bId) {
  112 + feeCount += 1
  113 + }
  114 + })
  115 +
  116 + if (feeCount <= 1) {
  117 + if (fee.operate === 'ADD') return this.$t('aFeeDetailHis.add')
  118 + if (fee.operate === 'DEL') return this.$t('aFeeDetailHis.delete')
  119 + return '-'
  120 + }
  121 +
  122 + if (fee.operate === 'ADD') return this.$t('aFeeDetailHis.modifyNew')
  123 + if (fee.operate === 'DEL') return this.$t('aFeeDetailHis.modifyOld')
  124 + return '-'
  125 + }
  126 + }
  127 +}
  128 +</script>
  129 +
  130 +<style scoped>
  131 +.margin-top {
  132 + margin-top: 20px;
  133 +}
  134 +
  135 +.text-right {
  136 + text-align: right;
  137 +}
  138 +</style>
0 \ No newline at end of file 139 \ No newline at end of file
src/components/aCommunity/aFeeDetailHisDemo.vue 0 → 100644
  1 +<template>
  2 + <a-fee-detail-his ref="feeHisComponent" />
  3 +</template>
  4 +
  5 +<script>
  6 +import AFeeDetailHis from './aFeeDetailHis'
  7 +
  8 +export default {
  9 + components: {
  10 + AFeeDetailHis
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.feeHisComponent.handleSwitch(data)
  15 + },
  16 + refresh() {
  17 + this.$refs.feeHisComponent.handleNotify()
  18 + }
  19 + }
  20 +}
  21 +</script>
0 \ No newline at end of file 22 \ No newline at end of file
src/components/aCommunity/aFeeDetailImport.vue 0 → 100644
  1 +<template>
  2 + <div class="margin-top">
  3 + <el-table :data="aFeeDetailImportInfo.importFeeDetails" border style="width: 100%">
  4 + <el-table-column prop="floorNum" :label="$t('aFeeDetailImport.floorNum')" align="center"></el-table-column>
  5 + <el-table-column prop="unitNum" :label="$t('aFeeDetailImport.unitNum')" align="center"></el-table-column>
  6 + <el-table-column prop="roomNum" :label="$t('aFeeDetailImport.roomNum')" align="center"></el-table-column>
  7 + <el-table-column prop="feeName" :label="$t('aFeeDetailImport.feeName')" align="center"></el-table-column>
  8 + <el-table-column prop="startTime" :label="$t('aFeeDetailImport.startTime')" align="center"></el-table-column>
  9 + <el-table-column prop="endTime" :label="$t('aFeeDetailImport.endTime')" align="center"></el-table-column>
  10 + <el-table-column prop="amount" :label="$t('aFeeDetailImport.totalAmount')" align="center"></el-table-column>
  11 + <el-table-column prop="remark" :label="$t('aFeeDetailImport.remark')" align="center"></el-table-column>
  12 + <el-table-column :label="$t('aFeeDetailImport.status')" align="center">
  13 + <template #default="{row}">
  14 + <el-tag :type="row.state === '1000' ? 'success' : 'danger'">
  15 + {{row.state === '1000' ? $t('aFeeDetailImport.importSuccess') : $t('aFeeDetailImport.importFailed')}}
  16 + </el-tag>
  17 + </template>
  18 + </el-table-column>
  19 + </el-table>
  20 +
  21 + <el-row class="margin-top">
  22 + <el-col :span="12"></el-col>
  23 + <el-col :span="12">
  24 + <el-pagination
  25 + @current-change="handlePageChange"
  26 + :current-page="currentPage"
  27 + :page-size="pageSize"
  28 + layout="total, prev, pager, next, jumper"
  29 + :total="total">
  30 + </el-pagination>
  31 + </el-col>
  32 + </el-row>
  33 + </div>
  34 +</template>
  35 +
  36 +<script>
  37 +import { queryAdminImportFeeDetail } from '@/api/aCommunity/aFeeDetailImportApi'
  38 +
  39 +export default {
  40 + name: 'AFeeDetailImport',
  41 + data() {
  42 + return {
  43 + aFeeDetailImportInfo: {
  44 + importFeeDetails: [],
  45 + feeId: ''
  46 + },
  47 + currentPage: 1,
  48 + pageSize: 10,
  49 + total: 0
  50 + }
  51 + },
  52 + methods: {
  53 + open(data) {
  54 + this.aFeeDetailImportInfo.feeId = data.feeId
  55 + this._loadAFeeDetailImportData()
  56 + },
  57 + handleSwitch(data) {
  58 + this.aFeeDetailImportInfo.feeId = data.feeId
  59 + this._loadAFeeDetailImportData()
  60 + },
  61 + handlePageChange(page) {
  62 + this.currentPage = page
  63 + this._loadAFeeDetailImportData()
  64 + },
  65 + async _loadAFeeDetailImportData() {
  66 + try {
  67 + const params = {
  68 + feeId: this.aFeeDetailImportInfo.feeId,
  69 + page: this.currentPage,
  70 + row: this.pageSize
  71 + }
  72 +
  73 + const res = await queryAdminImportFeeDetail(params)
  74 + this.aFeeDetailImportInfo.importFeeDetails = res.data
  75 + this.total = res.records
  76 + } catch (error) {
  77 + console.error('加载导入费用明细数据失败:', error)
  78 + }
  79 + }
  80 + }
  81 +}
  82 +</script>
  83 +
  84 +<style scoped>
  85 +.margin-top {
  86 + margin-top: 20px;
  87 +}
  88 +</style>
0 \ No newline at end of file 89 \ No newline at end of file
src/components/aCommunity/aFeeDetailImportDemo.vue 0 → 100644
  1 +<template>
  2 + <a-fee-detail-import ref="feeImportComponent" />
  3 +</template>
  4 +
  5 +<script>
  6 +import AFeeDetailImport from './aFeeDetailImport'
  7 +
  8 +export default {
  9 + components: {
  10 + AFeeDetailImport
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.feeImportComponent.handleSwitch(data)
  15 + }
  16 + }
  17 +}
  18 +</script>
0 \ No newline at end of file 19 \ No newline at end of file
src/components/aCommunity/aFeeDetailSub.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <el-row>
  4 + <el-col :span="24" class="text-right">
  5 + </el-col>
  6 + </el-row>
  7 + <el-table :data="aFeeDetailSubInfo.subs" border style="width: 100%" class="margin-top">
  8 + <el-table-column prop="preFeeId" :label="$t('aFeeDetailSub.parentFeeId')" align="center">
  9 + <template slot-scope="scope">
  10 + <router-link :to="{ path: '/pages/fee/adminFeeDetail', query: { feeId: scope.row.preFeeId } }"
  11 + target="_blank">
  12 + {{ scope.row.preFeeId }}
  13 + </router-link>
  14 + </template>
  15 + </el-table-column>
  16 + <el-table-column prop="feeId" :label="$t('aFeeDetailSub.childFeeId')" align="center">
  17 + <template slot-scope="scope">
  18 + <router-link :to="{ path: '/pages/fee/adminFeeDetail', query: { feeId: scope.row.feeId } }" target="_blank">
  19 + {{ scope.row.feeId }}
  20 + </router-link>
  21 + </template>
  22 + </el-table-column>
  23 + <el-table-column prop="feeName" :label="$t('aFeeDetailSub.feeName')" align="center" />
  24 + <el-table-column prop="payerObjName" :label="$t('aFeeDetailSub.feeObject')" align="center" />
  25 + <el-table-column :label="$t('aFeeDetailSub.billingPeriod')" align="center">
  26 + <template slot-scope="scope">
  27 + {{ $dateFormat(scope.row.endTime) }}<br>
  28 + ~{{ $dateFormat(scope.row.maxTime) }}
  29 + </template>
  30 + </el-table-column>
  31 + <el-table-column prop="createTime" :label="$t('aFeeDetailSub.splitTime')" align="center" />
  32 + </el-table>
  33 + <el-row>
  34 + <el-col :span="24" class="float-right">
  35 + <el-pagination :current-page="currentPage" :page-size="pageSize" :total="aFeeDetailSubInfo.total"
  36 + layout="total, prev, pager, next" @current-change="handlePageChange" />
  37 + </el-col>
  38 + </el-row>
  39 + </div>
  40 +</template>
  41 +
  42 +<script>
  43 +import { listAdminPayFeeSub, listAdminFee } from '@/api/aCommunity/aFeeDetailSubApi'
  44 +import { getCommunityId } from '@/api/community/communityApi'
  45 +
  46 +export default {
  47 + name: 'AFeeDetailSub',
  48 + data() {
  49 + return {
  50 + aFeeDetailSubInfo: {
  51 + subs: [],
  52 + feeId: '',
  53 + total: 0,
  54 + records: 0,
  55 + fee: {}
  56 + },
  57 + currentPage: 1,
  58 + pageSize: 10,
  59 + communityId: ''
  60 + }
  61 + },
  62 + created() {
  63 + this.communityId = getCommunityId()
  64 + this.initEvents()
  65 + },
  66 + methods: {
  67 + open(data) {
  68 + if (!data.feeId) return
  69 + Object.assign(this.aFeeDetailSubInfo, data)
  70 + this.listAFeeDetailSub(1, this.pageSize)
  71 + this.loadAFeeDetailSubFeeInfo()
  72 + },
  73 + initEvents() {
  74 + this.$on('switch', this.handleSwitch)
  75 + this.$on('loadSub', this.handleLoadSub)
  76 + },
  77 + handleSwitch(param) {
  78 + if (!param.feeId) return
  79 + Object.assign(this.aFeeDetailSubInfo, param)
  80 + this.listAFeeDetailSub(1, this.pageSize)
  81 + this.loadAFeeDetailSubFeeInfo()
  82 + },
  83 + handleLoadSub() {
  84 + this.listAFeeDetailSub(this.currentPage, this.pageSize)
  85 + this.loadAFeeDetailSubFeeInfo()
  86 + },
  87 + handlePageChange(currentPage) {
  88 + this.currentPage = currentPage
  89 + this.listAFeeDetailSub(currentPage, this.pageSize)
  90 + },
  91 + async listAFeeDetailSub(page, rows) {
  92 + try {
  93 + const params = {
  94 + page,
  95 + row: rows,
  96 + pcFeeId: this.aFeeDetailSubInfo.feeId,
  97 + communityId: this.communityId
  98 + }
  99 + const res = await listAdminPayFeeSub(params)
  100 + this.aFeeDetailSubInfo.total = res.total
  101 + this.aFeeDetailSubInfo.records = res.records
  102 + this.aFeeDetailSubInfo.subs = res.data
  103 + } catch (error) {
  104 + console.error('获取子费用列表失败:', error)
  105 + }
  106 + },
  107 + async loadAFeeDetailSubFeeInfo() {
  108 + try {
  109 + const params = {
  110 + page: 1,
  111 + row: 1,
  112 + feeId: this.aFeeDetailSubInfo.feeId,
  113 + communityId: this.communityId
  114 + }
  115 + const res = await listAdminFee(params)
  116 + this.aFeeDetailSubInfo.fee = res.fees[0]
  117 + } catch (error) {
  118 + console.error('获取费用信息失败:', error)
  119 + }
  120 + },
  121 + mergeFee(fee) {
  122 + this.$emit('openMergeFeeModal', fee)
  123 + },
  124 + splitPayFee(fee) {
  125 + console.log(fee)
  126 + this.$emit('openSplitFeeModal', this.aFeeDetailSubInfo.fee)
  127 + }
  128 + }
  129 +}
  130 +</script>
  131 +
  132 +<style scoped>
  133 +.margin-top {
  134 + margin-top: 20px;
  135 +}
  136 +
  137 +.text-right {
  138 + text-align: right;
  139 +}
  140 +
  141 +.float-right {
  142 + float: right;
  143 +}
  144 +</style>
0 \ No newline at end of file 145 \ No newline at end of file
src/components/aCommunity/aFeeDetailSubDemo.vue 0 → 100644
  1 +<template>
  2 + <a-fee-detail-sub ref="feeSubComponent" />
  3 +</template>
  4 +
  5 +<script>
  6 +import AFeeDetailSub from './aFeeDetailSub'
  7 +
  8 +export default {
  9 + components: {
  10 + AFeeDetailSub
  11 + },
  12 + methods: {
  13 + open(data) {
  14 + this.$refs.feeSubComponent.handleSwitch(data)
  15 + },
  16 + refresh() {
  17 + this.$refs.feeSubComponent.handleLoadSub()
  18 + }
  19 + }
  20 +}
  21 +</script>
0 \ No newline at end of file 22 \ No newline at end of file
src/components/fee/aRoomDetailMeterWaterLog.vue
@@ -47,7 +47,9 @@ export default { @@ -47,7 +47,9 @@ export default {
47 } 47 }
48 }, 48 },
49 methods: { 49 methods: {
50 - open() { 50 + open(params) {
  51 + this.roomId = params.roomId
  52 + this.feeId = params.feeId
51 this.page.current = 1 53 this.page.current = 1
52 this.loadData() 54 this.loadData()
53 }, 55 },
src/components/fee/aRoomDetailOwner.vue
@@ -63,7 +63,8 @@ export default { @@ -63,7 +63,8 @@ export default {
63 } 63 }
64 }, 64 },
65 methods: { 65 methods: {
66 - open() { 66 + open(params) {
  67 + this.roomId = params.roomId
67 this.loadData() 68 this.loadData()
68 }, 69 },
69 async loadData() { 70 async loadData() {
src/components/index/index-admin.vue
1 <template> 1 <template>
2 - <div> 2 + <div class="admin-index-container">
3 <div class="vc-index-nav"> 3 <div class="vc-index-nav">
4 <span><i class="fa fa-home margin-right-sm"></i>{{ $t('adminIndex.home') }}</span> 4 <span><i class="fa fa-home margin-right-sm"></i>{{ $t('adminIndex.home') }}</span>
5 <span class="margin-left-sm margin-right-sm">/</span> 5 <span class="margin-left-sm margin-right-sm">/</span>
@@ -150,6 +150,10 @@ export default { @@ -150,6 +150,10 @@ export default {
150 </script> 150 </script>
151 151
152 <style lang="scss" scoped> 152 <style lang="scss" scoped>
  153 +.admin-index-container {
  154 + padding: 0 10px; // 添加左右内边距
  155 +}
  156 +
153 .vc-index-nav { 157 .vc-index-nav {
154 padding: 10px; 158 padding: 10px;
155 font-size: 16px; 159 font-size: 16px;
src/i18n/communityI18n.js
@@ -10,6 +10,7 @@ import { messages as ownerExitRoomMessages } from &#39;../views/room/ownerExitRoomLa @@ -10,6 +10,7 @@ import { messages as ownerExitRoomMessages } from &#39;../views/room/ownerExitRoomLa
10 import { messages as adminRoomDetailMessages } from '../views/aCommunity/adminRoomDetailLang.js' 10 import { messages as adminRoomDetailMessages } from '../views/aCommunity/adminRoomDetailLang.js'
11 import { messages as adminOwnerDetailMessages } from '../views/aCommunity/adminOwnerDetailLang.js' 11 import { messages as adminOwnerDetailMessages } from '../views/aCommunity/adminOwnerDetailLang.js'
12 import { messages as adminCarDetailMessages } from '../views/aCommunity/adminCarDetailLang.js' 12 import { messages as adminCarDetailMessages } from '../views/aCommunity/adminCarDetailLang.js'
  13 +import { messages as adminFeeDetailMessages } from '../views/aCommunity/adminFeeDetailLang.js'
13 export const messages = { 14 export const messages = {
14 en: { 15 en: {
15 ...roomStructureMessages.en, 16 ...roomStructureMessages.en,
@@ -24,6 +25,7 @@ export const messages = { @@ -24,6 +25,7 @@ export const messages = {
24 ...adminRoomDetailMessages.en, 25 ...adminRoomDetailMessages.en,
25 ...adminOwnerDetailMessages.en, 26 ...adminOwnerDetailMessages.en,
26 ...adminCarDetailMessages.en, 27 ...adminCarDetailMessages.en,
  28 + ...adminFeeDetailMessages.en,
27 }, 29 },
28 zh: { 30 zh: {
29 ...roomStructureMessages.zh, 31 ...roomStructureMessages.zh,
@@ -38,5 +40,6 @@ export const messages = { @@ -38,5 +40,6 @@ export const messages = {
38 ...adminRoomDetailMessages.zh, 40 ...adminRoomDetailMessages.zh,
39 ...adminOwnerDetailMessages.zh, 41 ...adminOwnerDetailMessages.zh,
40 ...adminCarDetailMessages.zh, 42 ...adminCarDetailMessages.zh,
  43 + ...adminFeeDetailMessages.zh,
41 } 44 }
42 } 45 }
43 \ No newline at end of file 46 \ No newline at end of file
src/router/communityRouter.js
@@ -59,4 +59,9 @@ export default [ @@ -59,4 +59,9 @@ export default [
59 name: '/pages/car/adminCarDetail', 59 name: '/pages/car/adminCarDetail',
60 component: () => import('@/views/aCommunity/adminCarDetailList.vue') 60 component: () => import('@/views/aCommunity/adminCarDetailList.vue')
61 }, 61 },
  62 + {
  63 + path:'/pages/fee/adminFeeDetail',
  64 + name:'/pages/fee/adminFeeDetail',
  65 + component: () => import('@/views/aCommunity/adminFeeDetailList.vue')
  66 + },
62 ] 67 ]
63 \ No newline at end of file 68 \ No newline at end of file
src/views/aCommunity/aFeeDetailConfigLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + aFeeDetailConfig: {
  4 + feeType: 'Fee Type',
  5 + feeItem: 'Fee Item',
  6 + feeFlag: 'Fee Flag',
  7 + billType: 'Bill Type',
  8 + paymentType: 'Payment Type',
  9 + prepay: 'Prepay',
  10 + postpay: 'Postpay',
  11 + paymentCycle: 'Payment Cycle',
  12 + unit: 'Unit',
  13 + formula: 'Formula',
  14 + unitPrice: 'Unit Price',
  15 + additionalFee: 'Additional Fee',
  16 + accountDeduction: 'Account Deduction',
  17 + mobilePayment: 'Mobile Payment',
  18 + decimalPlaces: 'Decimal Places',
  19 + yes: 'Yes',
  20 + no: 'No'
  21 + }
  22 + },
  23 + zh: {
  24 + aFeeDetailConfig: {
  25 + feeType: '费用类型',
  26 + feeItem: '收费项目',
  27 + feeFlag: '费用标识',
  28 + billType: '催缴类型',
  29 + paymentType: '付费类型',
  30 + prepay: '预付费',
  31 + postpay: '后付费',
  32 + paymentCycle: '缴费周期',
  33 + unit: '单位',
  34 + formula: '公式',
  35 + unitPrice: '计费单价',
  36 + additionalFee: '附加/固定费用',
  37 + accountDeduction: '账户抵扣',
  38 + mobilePayment: '手机缴费',
  39 + decimalPlaces: '保留小数位',
  40 + yes: '是',
  41 + no: '否'
  42 + }
  43 + }
  44 +}
0 \ No newline at end of file 45 \ No newline at end of file
src/views/aCommunity/aFeeDetailDiscountLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + aFeeDetailDiscount: {
  4 + roomName: 'Room(Building-Unit-Room)',
  5 + discountId: 'Discount ID',
  6 + discountName: 'Discount Name',
  7 + applyType: 'Apply Type',
  8 + applicant: 'Applicant',
  9 + applicantPhone: 'Applicant Phone',
  10 + startTime: 'Start Time',
  11 + endTime: 'End Time',
  12 + status: 'Status',
  13 + createTime: 'Create Time',
  14 + useStatus: 'Use Status',
  15 + notUsed: 'Not Used',
  16 + used: 'Used',
  17 + returnType: 'Return Type',
  18 + accountBalance: 'Account Balance',
  19 + discount: 'Discount',
  20 + returnAmount: 'Return Amount'
  21 + }
  22 + },
  23 + zh: {
  24 + aFeeDetailDiscount: {
  25 + roomName: '房屋(楼栋-单元-房屋)',
  26 + discountId: '折扣ID',
  27 + discountName: '折扣名称',
  28 + applyType: '申请类型',
  29 + applicant: '申请人',
  30 + applicantPhone: '申请电话',
  31 + startTime: '开始时间',
  32 + endTime: '结束时间',
  33 + status: '状态',
  34 + createTime: '创建时间',
  35 + useStatus: '使用状态',
  36 + notUsed: '未使用',
  37 + used: '已使用',
  38 + returnType: '返还类型',
  39 + accountBalance: '账户余额',
  40 + discount: '折扣',
  41 + returnAmount: '返还金额'
  42 + }
  43 + }
  44 +}
0 \ No newline at end of file 45 \ No newline at end of file
src/views/aCommunity/aFeeDetailFeeObjLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + aFeeDetailFeeObj: {
  4 + selectFeeObj: 'Please select fee object',
  5 + house: 'House',
  6 + car: 'Car',
  7 + contract: 'Contract',
  8 + feeId: 'Fee ID',
  9 + objType: 'Object Type',
  10 + objName: 'Object Name',
  11 + ownerName: 'Owner Name',
  12 + phone: 'Phone',
  13 + createTime: 'Create Time',
  14 + query: 'Query'
  15 + }
  16 + },
  17 + zh: {
  18 + aFeeDetailFeeObj: {
  19 + selectFeeObj: '请选择费用对象',
  20 + house: '房屋',
  21 + car: '车辆',
  22 + contract: '合同',
  23 + feeId: '费用编号',
  24 + objType: '对象类型',
  25 + objName: '对象名称',
  26 + ownerName: '业主名称',
  27 + phone: '手机号',
  28 + createTime: '创建时间',
  29 + query: '查询'
  30 + }
  31 + }
  32 +}
0 \ No newline at end of file 33 \ No newline at end of file
src/views/aCommunity/aFeeDetailHisLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + aFeeDetailHis: {
  4 + feeName: 'Fee Item',
  5 + startTime: 'Account Time',
  6 + endTime: 'Billing Start Time',
  7 + operation: 'Action',
  8 + operator: 'Operator',
  9 + operationTime: 'Operation Time',
  10 + add: 'Add',
  11 + delete: 'Delete',
  12 + modifyNew: 'Modify(New)',
  13 + modifyOld: 'Modify(Old)'
  14 + }
  15 + },
  16 + zh: {
  17 + aFeeDetailHis: {
  18 + feeName: '费用项',
  19 + startTime: '建账时间',
  20 + endTime: '计费起始时间',
  21 + operation: '动作',
  22 + operator: '操作人',
  23 + operationTime: '操作时间',
  24 + add: '添加',
  25 + delete: '删除',
  26 + modifyNew: '修改(新)',
  27 + modifyOld: '修改(旧)'
  28 + }
  29 + }
  30 +}
0 \ No newline at end of file 31 \ No newline at end of file
src/views/aCommunity/aFeeDetailImportLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + aFeeDetailImport: {
  4 + floorNum: 'Building Number',
  5 + unitNum: 'Unit Number',
  6 + roomNum: 'Room Number',
  7 + feeName: 'Fee Name',
  8 + startTime: 'Start Time',
  9 + endTime: 'End Time',
  10 + totalAmount: 'Total Amount',
  11 + remark: 'Remark',
  12 + status: 'Status',
  13 + importSuccess: 'Import Success',
  14 + importFailed: 'Import Failed'
  15 + }
  16 + },
  17 + zh: {
  18 + aFeeDetailImport: {
  19 + floorNum: '楼栋编号',
  20 + unitNum: '单元编号',
  21 + roomNum: '房屋编号',
  22 + feeName: '费用名称',
  23 + startTime: '开始时间',
  24 + endTime: '结束时间',
  25 + totalAmount: '总金额',
  26 + remark: '备注',
  27 + status: '状态',
  28 + importSuccess: '导入成功',
  29 + importFailed: '导入失败'
  30 + }
  31 + }
  32 +}
0 \ No newline at end of file 33 \ No newline at end of file
src/views/aCommunity/aFeeDetailSubLang.js 0 → 100644
  1 +export const messages = {
  2 + en: {
  3 + aFeeDetailSub: {
  4 + parentFeeId: 'Parent Fee ID',
  5 + childFeeId: 'Child Fee ID',
  6 + feeName: 'Fee Name',
  7 + feeObject: 'Fee Object',
  8 + billingPeriod: 'Billing Period',
  9 + splitTime: 'Split Time'
  10 + }
  11 + },
  12 + zh: {
  13 + aFeeDetailSub: {
  14 + parentFeeId: '父费用ID',
  15 + childFeeId: '子费用ID',
  16 + feeName: '费用名称',
  17 + feeObject: '费用对象',
  18 + billingPeriod: '计费时间段',
  19 + splitTime: '拆分时间'
  20 + }
  21 + }
  22 +}
0 \ No newline at end of file 23 \ No newline at end of file
src/views/aCommunity/adminFeeDetailLang.js 0 → 100644
  1 +
  2 +export const messages = {
  3 + en: {
  4 + adminFeeDetail: {
  5 + feeInfo: 'Fee Information',
  6 + paymentRecord: 'Payment Record',
  7 + relatedRoom: 'Related Room',
  8 + relatedCar: 'Related Car',
  9 + relatedContract: 'Related Contract',
  10 + modifyRecord: 'Modify Record',
  11 + feeItem: 'Fee Item',
  12 + owner: 'Owner',
  13 + sameFeeObj: 'Same Fee Object',
  14 + relatedMeter: 'Related Meter',
  15 + relatedImport: 'Related Import',
  16 + discountApply: 'Discount Application',
  17 + reprintReceipt: 'Reprint Receipt',
  18 + feeSplit: 'Fee Split'
  19 + },
  20 + adminFeeDetailInfo: {
  21 + feeId: 'Fee ID',
  22 + feeFlag: 'Fee Flag',
  23 + feeType: 'Fee Type',
  24 + payerObj: 'Payer Object',
  25 + feeItem: 'Fee Item',
  26 + feeState: 'Fee State',
  27 + createTime: 'Create Time',
  28 + batchId: 'Batch ID',
  29 + startTime: 'Start Time',
  30 + endTime: 'End Time',
  31 + owedAmount: 'Owed Amount'
  32 + },
  33 + aRoomDetailCar: {
  34 + placeholderCarNum: 'Please enter license plate number',
  35 + carNum: 'License Plate',
  36 + leaseType: 'Plate Type',
  37 + tempCar: 'Temporary Car',
  38 + carType: 'Vehicle Type',
  39 + color: 'Color',
  40 + owner: 'Owner',
  41 + parkingSpace: 'Parking Space',
  42 + released: 'Released',
  43 + validity: 'Validity'
  44 + },
  45 + aFeeDetailHis: {
  46 + feeName: 'Fee Item',
  47 + startTime: 'Account Time',
  48 + endTime: 'Billing Start Time',
  49 + operation: 'Action',
  50 + operator: 'Operator',
  51 + operationTime: 'Operation Time',
  52 + add: 'Add',
  53 + delete: 'Delete',
  54 + modifyNew: 'Modify(New)',
  55 + modifyOld: 'Modify(Old)'
  56 + },
  57 + aFeeDetailConfig: {
  58 + feeType: 'Fee Type',
  59 + feeItem: 'Fee Item',
  60 + feeFlag: 'Fee Flag',
  61 + billType: 'Bill Type',
  62 + paymentType: 'Payment Type',
  63 + prepay: 'Prepay',
  64 + postpay: 'Postpay',
  65 + paymentCycle: 'Payment Cycle',
  66 + unit: 'Unit',
  67 + formula: 'Formula',
  68 + unitPrice: 'Unit Price',
  69 + additionalFee: 'Additional Fee',
  70 + accountDeduction: 'Account Deduction',
  71 + mobilePayment: 'Mobile Payment',
  72 + decimalPlaces: 'Decimal Places',
  73 + yes: 'Yes',
  74 + no: 'No'
  75 + },
  76 + aFeeDetailFeeObj: {
  77 + selectFeeObj: 'Please select fee object',
  78 + house: 'House',
  79 + car: 'Car',
  80 + contract: 'Contract',
  81 + feeId: 'Fee ID',
  82 + objType: 'Object Type',
  83 + objName: 'Object Name',
  84 + ownerName: 'Owner Name',
  85 + phone: 'Phone',
  86 + createTime: 'Create Time',
  87 + query: 'Query'
  88 + },
  89 + aFeeDetailImport: {
  90 + floorNum: 'Building Number',
  91 + unitNum: 'Unit Number',
  92 + roomNum: 'Room Number',
  93 + feeName: 'Fee Name',
  94 + startTime: 'Start Time',
  95 + endTime: 'End Time',
  96 + totalAmount: 'Total Amount',
  97 + remark: 'Remark',
  98 + status: 'Status',
  99 + importSuccess: 'Import Success',
  100 + importFailed: 'Import Failed'
  101 + },
  102 + aFeeDetailDiscount: {
  103 + roomName: 'Room(Building-Unit-Room)',
  104 + discountId: 'Discount ID',
  105 + discountName: 'Discount Name',
  106 + applyType: 'Apply Type',
  107 + applicant: 'Applicant',
  108 + applicantPhone: 'Applicant Phone',
  109 + startTime: 'Start Time',
  110 + endTime: 'End Time',
  111 + status: 'Status',
  112 + createTime: 'Create Time',
  113 + useStatus: 'Use Status',
  114 + notUsed: 'Not Used',
  115 + used: 'Used',
  116 + returnType: 'Return Type',
  117 + accountBalance: 'Account Balance',
  118 + discount: 'Discount',
  119 + returnAmount: 'Return Amount'
  120 + },
  121 + aFeeDetailSub: {
  122 + parentFeeId: 'Parent Fee ID',
  123 + childFeeId: 'Child Fee ID',
  124 + feeName: 'Fee Name',
  125 + feeObject: 'Fee Object',
  126 + billingPeriod: 'Billing Period',
  127 + splitTime: 'Split Time'
  128 + }
  129 + },
  130 + zh: {
  131 + adminFeeDetail: {
  132 + feeInfo: '费用信息',
  133 + paymentRecord: '缴费记录',
  134 + relatedRoom: '关联房屋',
  135 + relatedCar: '关联车辆',
  136 + relatedContract: '关联合同',
  137 + modifyRecord: '修改记录',
  138 + feeItem: '费用项',
  139 + owner: '业主',
  140 + sameFeeObj: '同费用对象',
  141 + relatedMeter: '关联抄表',
  142 + relatedImport: '关联导入',
  143 + discountApply: '优惠申请',
  144 + reprintReceipt: '补打收据',
  145 + feeSplit: '费用拆分'
  146 + },
  147 + adminFeeDetailInfo: {
  148 + feeId: '费用ID',
  149 + feeFlag: '费用标识',
  150 + feeType: '费用类型',
  151 + payerObj: '付费对象',
  152 + feeItem: '费用项',
  153 + feeState: '费用状态',
  154 + createTime: '建账时间',
  155 + batchId: '批次',
  156 + startTime: '应收开始时间',
  157 + endTime: '应收结束时间',
  158 + owedAmount: '欠费金额'
  159 + },
  160 + aRoomDetailCar: {
  161 + placeholderCarNum: '请填写车牌号',
  162 + carNum: '车牌号',
  163 + leaseType: '车牌类型',
  164 + tempCar: '临时车',
  165 + carType: '车辆类型',
  166 + color: '颜色',
  167 + owner: '业主',
  168 + parkingSpace: '车位',
  169 + released: '车位已释放',
  170 + validity: '有效期'
  171 + },
  172 + aFeeDetailHis: {
  173 + feeName: '费用项',
  174 + startTime: '建账时间',
  175 + endTime: '计费起始时间',
  176 + operation: '动作',
  177 + operator: '操作人',
  178 + operationTime: '操作时间',
  179 + add: '添加',
  180 + delete: '删除',
  181 + modifyNew: '修改(新)',
  182 + modifyOld: '修改(旧)'
  183 + },
  184 + aFeeDetailConfig: {
  185 + feeType: '费用类型',
  186 + feeItem: '收费项目',
  187 + feeFlag: '费用标识',
  188 + billType: '催缴类型',
  189 + paymentType: '付费类型',
  190 + prepay: '预付费',
  191 + postpay: '后付费',
  192 + paymentCycle: '缴费周期',
  193 + unit: '单位',
  194 + formula: '公式',
  195 + unitPrice: '计费单价',
  196 + additionalFee: '附加/固定费用',
  197 + accountDeduction: '账户抵扣',
  198 + mobilePayment: '手机缴费',
  199 + decimalPlaces: '保留小数位',
  200 + yes: '是',
  201 + no: '否'
  202 + },
  203 + aFeeDetailFeeObj: {
  204 + selectFeeObj: '请选择费用对象',
  205 + house: '房屋',
  206 + car: '车辆',
  207 + contract: '合同',
  208 + feeId: '费用编号',
  209 + objType: '对象类型',
  210 + objName: '对象名称',
  211 + ownerName: '业主名称',
  212 + phone: '手机号',
  213 + createTime: '创建时间',
  214 + query: '查询'
  215 + },
  216 + aFeeDetailImport: {
  217 + floorNum: '楼栋编号',
  218 + unitNum: '单元编号',
  219 + roomNum: '房屋编号',
  220 + feeName: '费用名称',
  221 + startTime: '开始时间',
  222 + endTime: '结束时间',
  223 + totalAmount: '总金额',
  224 + remark: '备注',
  225 + status: '状态',
  226 + importSuccess: '导入成功',
  227 + importFailed: '导入失败'
  228 + },
  229 + aFeeDetailDiscount: {
  230 + roomName: '房屋(楼栋-单元-房屋)',
  231 + discountId: '折扣ID',
  232 + discountName: '折扣名称',
  233 + applyType: '申请类型',
  234 + applicant: '申请人',
  235 + applicantPhone: '申请电话',
  236 + startTime: '开始时间',
  237 + endTime: '结束时间',
  238 + status: '状态',
  239 + createTime: '创建时间',
  240 + useStatus: '使用状态',
  241 + notUsed: '未使用',
  242 + used: '已使用',
  243 + returnType: '返还类型',
  244 + accountBalance: '账户余额',
  245 + discount: '折扣',
  246 + returnAmount: '返还金额'
  247 + },
  248 + aFeeDetailSub: {
  249 + parentFeeId: '父费用ID',
  250 + childFeeId: '子费用ID',
  251 + feeName: '费用名称',
  252 + feeObject: '费用对象',
  253 + billingPeriod: '计费时间段',
  254 + splitTime: '拆分时间'
  255 + }
  256 + }
  257 +}
0 \ No newline at end of file 258 \ No newline at end of file
src/views/aCommunity/adminFeeDetailList.vue 0 → 100644
  1 +<template>
  2 + <div class="admin-fee-detail-container">
  3 + <div class="white-bg padding-left padding-right padding-top border-radius-top">
  4 + <div class="flex justify-between">
  5 + <div class="text-title">
  6 + {{ $t('adminFeeDetail.feeInfo') }}
  7 + </div>
  8 + </div>
  9 +
  10 + <!-- 费用信息 -->
  11 + <div class="margin-top">
  12 + <el-row :gutter="20">
  13 + <el-col :span="24">
  14 + <el-row :gutter="20">
  15 + <el-col :span="6">
  16 + <div class="form-group">
  17 + <label class="col-form-label">
  18 + {{ $t('adminFeeDetailInfo.feeId') }}:
  19 + </label>
  20 + <label>{{ adminFeeDetailInfo.feeId }}</label>
  21 + </div>
  22 + </el-col>
  23 + <el-col :span="6">
  24 + <div class="form-group">
  25 + <label class="col-form-label">
  26 + {{ $t('adminFeeDetailInfo.feeFlag') }}:
  27 + </label>
  28 + <label>{{ adminFeeDetailInfo.feeFlagName || '-' }}</label>
  29 + </div>
  30 + </el-col>
  31 + <el-col :span="6">
  32 + <div class="form-group">
  33 + <label class="col-form-label">
  34 + {{ $t('adminFeeDetailInfo.feeType') }}:
  35 + </label>
  36 + <label>{{ adminFeeDetailInfo.feeTypeCdName }}</label>
  37 + </div>
  38 + </el-col>
  39 + <el-col :span="6">
  40 + <div class="form-group">
  41 + <label class="col-form-label">
  42 + {{ $t('adminFeeDetailInfo.payerObj') }}:
  43 + </label>
  44 + <label>{{ adminFeeDetailInfo.payerObjName || '-' }}</label>
  45 + </div>
  46 + </el-col>
  47 + </el-row>
  48 +
  49 + <el-row :gutter="20">
  50 + <el-col :span="6">
  51 + <div class="form-group">
  52 + <label class="col-form-label">
  53 + {{ $t('adminFeeDetailInfo.feeItem') }}:
  54 + </label>
  55 + <label>{{ adminFeeDetailInfo.feeName }}</label>
  56 + </div>
  57 + </el-col>
  58 + <el-col :span="6">
  59 + <div class="form-group">
  60 + <label class="col-form-label">
  61 + {{ $t('adminFeeDetailInfo.feeState') }}:
  62 + </label>
  63 + <label>{{ adminFeeDetailInfo.stateName }}</label>
  64 + </div>
  65 + </el-col>
  66 + <el-col :span="6">
  67 + <div class="form-group">
  68 + <label class="col-form-label">
  69 + {{ $t('adminFeeDetailInfo.createTime') }}:
  70 + </label>
  71 + <label>{{ adminFeeDetailInfo.startTime }}</label>
  72 + </div>
  73 + </el-col>
  74 + <el-col :span="6">
  75 + <div class="form-group">
  76 + <label class="col-form-label">
  77 + {{ $t('adminFeeDetailInfo.batchId') }}:
  78 + </label>
  79 + <label>{{ adminFeeDetailInfo.batchId }}</label>
  80 + </div>
  81 + </el-col>
  82 + </el-row>
  83 +
  84 + <el-row :gutter="20">
  85 + <el-col :span="6">
  86 + <div class="form-group">
  87 + <label class="col-form-label">
  88 + {{ $t('adminFeeDetailInfo.startTime') }}:
  89 + </label>
  90 + <label>{{ getEndTime(adminFeeDetailInfo) }}</label>
  91 + </div>
  92 + </el-col>
  93 + <el-col :span="6">
  94 + <div class="form-group">
  95 + <label class="col-form-label">
  96 + {{ $t('adminFeeDetailInfo.endTime') }}:
  97 + </label>
  98 + <label>{{ getDeadlineTime(adminFeeDetailInfo) }}</label>
  99 + </div>
  100 + </el-col>
  101 + <el-col :span="6">
  102 + <div class="form-group">
  103 + <label class="col-form-label">
  104 + {{ $t('adminFeeDetailInfo.owedAmount') }}:
  105 + </label>
  106 + <label>{{ adminFeeDetailInfo.amountOwed }}</label>
  107 + </div>
  108 + </el-col>
  109 + </el-row>
  110 +
  111 + <el-row :gutter="20">
  112 + <el-col :span="6" v-for="(item, index) in adminFeeDetailInfo.attrs" :key="index">
  113 + <div class="form-group">
  114 + <label class="col-form-label">
  115 + {{ item.specCdName }}:
  116 + </label>
  117 + <label>{{ item.value }}</label>
  118 + </div>
  119 + </el-col>
  120 + </el-row>
  121 + </el-col>
  122 + </el-row>
  123 + </div>
  124 +
  125 + <divider />
  126 + <div class="margin-top-sm">
  127 + <el-tabs v-model="adminFeeDetailInfo._currentTab" @tab-click="changeTab(adminFeeDetailInfo._currentTab)">
  128 + <el-tab-pane :label="$t('adminFeeDetail.paymentRecord')" name="aRoomDetailHisFee"></el-tab-pane>
  129 + <el-tab-pane v-if="adminFeeDetailInfo.payerObjType == '3333'" :label="$t('adminFeeDetail.relatedRoom')"
  130 + name="aRoomDetailRoom">
  131 + </el-tab-pane>
  132 + <el-tab-pane v-if="adminFeeDetailInfo.payerObjType == '6666'" :label="$t('adminFeeDetail.relatedCar')"
  133 + name="aRoomDetailCar">
  134 + </el-tab-pane>
  135 + <el-tab-pane v-if="adminFeeDetailInfo.payerObjType == '7777'" :label="$t('adminFeeDetail.relatedContract')"
  136 + name="adminFeeDetailContract">
  137 + </el-tab-pane>
  138 + <el-tab-pane :label="$t('adminFeeDetail.modifyRecord')" name="aFeeDetailHis"></el-tab-pane>
  139 + <el-tab-pane :label="$t('adminFeeDetail.feeItem')" name="aFeeDetailConfig"></el-tab-pane>
  140 + <el-tab-pane :label="$t('adminFeeDetail.owner')" name="aRoomDetailOwner"></el-tab-pane>
  141 + <el-tab-pane :label="$t('adminFeeDetail.sameFeeObj')" name="aFeeDetailFeeObj"></el-tab-pane>
  142 + <el-tab-pane :label="$t('adminFeeDetail.relatedMeter')" name="aRoomDetailMeterWaterLog"></el-tab-pane>
  143 + <el-tab-pane :label="$t('adminFeeDetail.relatedImport')" name="aFeeDetailImport"></el-tab-pane>
  144 + <el-tab-pane :label="$t('adminFeeDetail.discountApply')" name="aFeeDetailDiscount"></el-tab-pane>
  145 + <el-tab-pane :label="$t('adminFeeDetail.reprintReceipt')" name="aRoomDetailReceipt"></el-tab-pane>
  146 + <el-tab-pane v-if="adminFeeDetailInfo.feeFlag != '2006012'" :label="$t('adminFeeDetail.feeSplit')"
  147 + name="aFeeDetailSub">
  148 + </el-tab-pane>
  149 + </el-tabs>
  150 + </div>
  151 + </div>
  152 +
  153 + <div class="white-bg padding-left padding-right padding-top border-radius-bottom">
  154 + <component :is="adminFeeDetailInfo._currentTab" :ref="adminFeeDetailInfo._currentTab"
  155 + @refresh="loadAdminFeeDetailInfo">
  156 + </component>
  157 + </div>
  158 + </div>
  159 +</template>
  160 +
  161 +<script>
  162 +import { getFeeDetail } from '@/api/aCommunity/adminFeeDetailApi'
  163 +import { getCommunityId } from '@/api/community/communityApi'
  164 +//import { getDict } from '@/api/community/communityApi'
  165 +
  166 +// 导入所有子组件
  167 +import ARoomDetailHisFee from '@/components/fee/aRoomDetailHisFee.vue'
  168 +import ARoomDetailRoom from '@/components/fee/aRoomDetailRoom.vue'
  169 +import ARoomDetailCar from '@/components/aCommunity/aRoomDetailCar.vue'
  170 +import AFeeDetailHis from '@/components/aCommunity/aFeeDetailHis.vue'
  171 +import AFeeDetailConfig from '@/components/aCommunity/aFeeDetailConfig.vue'
  172 +import ARoomDetailOwner from '@/components/fee/aRoomDetailOwner.vue'
  173 +import AFeeDetailFeeObj from '@/components/aCommunity/aFeeDetailFeeObj.vue'
  174 +import ARoomDetailMeterWaterLog from '@/components/fee/aRoomDetailMeterWaterLog.vue'
  175 +import AFeeDetailImport from '@/components/aCommunity/aFeeDetailImport.vue'
  176 +import AFeeDetailDiscount from '@/components/aCommunity/aFeeDetailDiscount.vue'
  177 +import ARoomDetailReceipt from '@/components/fee/aRoomDetailReceipt.vue'
  178 +import AFeeDetailSub from '@/components/aCommunity/aFeeDetailSub.vue'
  179 +import divider from '@/components/system/divider.vue'
  180 +
  181 +export default {
  182 + name: 'AdminFeeDetailList',
  183 + components: {
  184 + ARoomDetailHisFee,
  185 + ARoomDetailRoom,
  186 + ARoomDetailCar,
  187 + AFeeDetailHis,
  188 + AFeeDetailConfig,
  189 + ARoomDetailOwner,
  190 + AFeeDetailFeeObj,
  191 + ARoomDetailMeterWaterLog,
  192 + AFeeDetailImport,
  193 + AFeeDetailDiscount,
  194 + ARoomDetailReceipt,
  195 + AFeeDetailSub,
  196 + divider
  197 + },
  198 + data() {
  199 + return {
  200 + adminFeeDetailInfo: {
  201 + feeId: '',
  202 + configId: '',
  203 + feeFlag: '',
  204 + feeFlagName: '',
  205 + feeTypeCdName: '',
  206 + payerObjName: '',
  207 + payerObjId: '',
  208 + payerObjType: '',
  209 + feeName: '',
  210 + stateName: '',
  211 + state: '',
  212 + startTime: '',
  213 + batchId: '',
  214 + endTime: '',
  215 + deadlineTime: '',
  216 + amountOwed: '',
  217 + attrs: [],
  218 + _currentTab: 'aRoomDetailHisFee',
  219 + needBack: false
  220 + },
  221 + communityId: ''
  222 + }
  223 + },
  224 + created() {
  225 + this.communityId = getCommunityId()
  226 + this.adminFeeDetailInfo.feeId = this.$route.query.feeId || ''
  227 + if (this.adminFeeDetailInfo.feeId) {
  228 + this.loadAdminFeeDetailInfo()
  229 + }
  230 + },
  231 + methods: {
  232 + async loadAdminFeeDetailInfo() {
  233 + try {
  234 + const params = {
  235 + page: 1,
  236 + row: 1,
  237 + feeId: this.adminFeeDetailInfo.feeId
  238 + }
  239 + const response = await getFeeDetail(params)
  240 + const feeInfo = response.fees[0]
  241 + Object.assign(this.adminFeeDetailInfo, feeInfo)
  242 + this.adminFeeDetailInfo.attrs = feeInfo.feeAttrs
  243 + this.changeTab(this.adminFeeDetailInfo._currentTab)
  244 + } catch (error) {
  245 + console.error('加载费用详情失败:', error)
  246 + }
  247 + },
  248 + changeTab(tab) {
  249 + this.adminFeeDetailInfo._currentTab = tab
  250 + let ownerId = ''
  251 + this.adminFeeDetailInfo.attrs.forEach(item => {
  252 + if (item.specCd === '390007') {
  253 + ownerId = item.value
  254 + }
  255 + })
  256 +
  257 + setTimeout(() => {
  258 + if (this.$refs[tab] && this.$refs[tab].open) {
  259 + this.$refs[tab].open({
  260 + feeId: this.adminFeeDetailInfo.feeId,
  261 + payerObjId: this.adminFeeDetailInfo.payerObjId,
  262 + roomId: this.adminFeeDetailInfo.payerObjId,
  263 + carId: this.adminFeeDetailInfo.payerObjId,
  264 + configId: this.adminFeeDetailInfo.configId,
  265 + state: this.adminFeeDetailInfo.state,
  266 + ownerId: ownerId
  267 + })
  268 + }
  269 + }, 500)
  270 + },
  271 + getDeadlineTime(fee) {
  272 + if (fee.amountOwed == 0 && fee.endTime == fee.deadlineTime) {
  273 + return '-'
  274 + }
  275 + if (fee.state == '2009001') {
  276 + return '-'
  277 + }
  278 + return fee.deadlineTime
  279 + },
  280 + getEndTime(fee) {
  281 + if (fee.state == '2009001') {
  282 + return '-'
  283 + }
  284 + return fee.endTime
  285 + }
  286 + }
  287 +}
  288 +</script>
  289 +
  290 +<style scoped>
  291 +.admin-fee-detail-container {
  292 + background-color: #f5f5f5;
  293 + padding: 20px;
  294 +}
  295 +
  296 +.white-bg {
  297 + background-color: #fff;
  298 +}
  299 +
  300 +.padding-left {
  301 + padding-left: 20px;
  302 +}
  303 +
  304 +.padding-right {
  305 + padding-right: 20px;
  306 +}
  307 +
  308 +.padding-top {
  309 + padding-top: 20px;
  310 +}
  311 +
  312 +.border-radius-top {
  313 + border-radius: 4px 4px 0 0;
  314 +}
  315 +
  316 +.border-radius-bottom {
  317 + border-radius: 0 0 4px 4px;
  318 +}
  319 +
  320 +.margin-top {
  321 + margin-top: 20px;
  322 +}
  323 +
  324 +.margin-top-sm {
  325 + margin-top: 10px;
  326 +}
  327 +
  328 +.text-title {
  329 + font-size: 18px;
  330 + font-weight: bold;
  331 +}
  332 +
  333 +.flex {
  334 + display: flex;
  335 +}
  336 +
  337 +.justify-between {
  338 + justify-content: space-between;
  339 +}
  340 +
  341 +.vc-line-primary {
  342 + height: 1px;
  343 + background-color: #ebeef5;
  344 +}
  345 +
  346 +.form-group {
  347 + margin-bottom: 15px;
  348 + text-align: left;
  349 +}
  350 +
  351 +.col-form-label {
  352 + margin-bottom: 5px;
  353 + color: #606266;
  354 + margin-right: 10px;
  355 +}
  356 +</style>
0 \ No newline at end of file 357 \ No newline at end of file
src/views/community/cityAreaList.vue
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 </el-col> 6 </el-col>
7 <el-col :span="20"> 7 <el-col :span="20">
8 <el-card class="box-card"> 8 <el-card class="box-card">
9 - <div slot="header" class="clearfix"> 9 + <div slot="header" class="flex justify-between">
10 <span>{{ $t('cityArea.detailTitle') }}</span> 10 <span>{{ $t('cityArea.detailTitle') }}</span>
11 </div> 11 </div>
12 <div class="margin-top"> 12 <div class="margin-top">